@@ -50,73 +50,62 @@ static PyObject*
5050update_bases (PyObject * bases , PyObject * * args , int nargs , int * modified_bases )
5151{
5252 int i , ind , tot_nones ;
53- PyObject * new_bases ;
53+ PyObject * base , * new_base , * new_base_meth , * new_bases ;
54+ PyObject * stack [1 ] = {bases };
5455 assert (PyTuple_Check (bases ));
5556
5657 /* We have a separate cycle to calculate replacements with the idea that in
5758 most cases we just scroll quickly though it and return original bases */
5859 for (i = 2 ; i < nargs ; i ++ ){
59- PyObject * base , * new_base , * new_base_meth ;
60- PyObject * stack [1 ];
6160 base = args [i ];
6261 if (PyType_Check (base )) {
6362 continue ;
6463 }
6564 new_base_meth = PyObject_GetAttrString (base , "__base_subclass__" );
66- if (new_base_meth == NULL ) {
65+ if (! new_base_meth ) {
6766 if (PyErr_ExceptionMatches (PyExc_AttributeError )) {
6867 PyErr_Clear ();
68+ continue ;
6969 }
70- else {
71- return NULL ;
72- }
73- }
74- else {
75- if (!PyCallable_Check (new_base_meth )) {
76- PyErr_SetString (PyExc_TypeError ,
77- "__base_subclass__ must be callable" );
78- return NULL ;
79- }
80- stack [0 ] = bases ;
81- new_base = _PyObject_FastCall (new_base_meth , stack , 1 );
82- if (new_base == NULL ){
83- return NULL ;
84- }
85- Py_INCREF (new_base );
86- args [i ] = new_base ;
87- * modified_bases = 1 ;
70+ return NULL ;
8871 }
89- }
90-
91- if (* modified_bases ){
92- /* Find out have many bases wants to be removed to pre-allocate
93- the tuple for new bases */
94- tot_nones = 0 ;
95- for (i = 2 ; i < nargs ; i ++ ) {
96- if (args [i ] == Py_None ) {
97- tot_nones ++ ;
98- }
72+ if (!PyCallable_Check (new_base_meth )) {
73+ PyErr_SetString (PyExc_TypeError ,
74+ "__base_subclass__ must be callable" );
75+ return NULL ;
9976 }
100- new_bases = PyTuple_New (nargs - 2 - tot_nones );
101- /* Remove all None's from base classes */
102- ind = 0 ;
103- for (i = 2 ; i < nargs ; i ++ ) {
104- PyObject * base ;
105- base = args [i ];
106- if (base != Py_None ) {
107- Py_INCREF (base );
108- PyTuple_SET_ITEM (new_bases , ind , base );
109- ind ++ ;
110- }
77+ new_base = _PyObject_FastCall (new_base_meth , stack , 1 );
78+ if (!new_base ){
79+ return NULL ;
11180 }
112- return new_bases ;
81+ Py_INCREF (new_base );
82+ args [i ] = new_base ;
83+ * modified_bases = 1 ;
11384 }
114- else {
85+ if (! * modified_bases ) {
11586 return bases ;
11687 }
88+ /* Find out have many bases wants to be removed to pre-allocate
89+ the tuple for new bases, then keep only non-None's in bases.*/
90+ tot_nones = 0 ;
91+ for (i = 2 ; i < nargs ; i ++ ) {
92+ if (args [i ] == Py_None ) {
93+ tot_nones ++ ;
94+ }
95+ }
96+ new_bases = PyTuple_New (nargs - 2 - tot_nones );
97+ ind = 0 ;
98+ for (i = 2 ; i < nargs ; i ++ ) {
99+ base = args [i ];
100+ if (base != Py_None ) {
101+ Py_INCREF (base );
102+ PyTuple_SET_ITEM (new_bases , ind , base );
103+ ind ++ ;
104+ }
105+ }
106+ return new_bases ;
117107}
118108
119-
120109/* AC: cannot convert yet, waiting for *args support */
121110static PyObject *
122111builtin___build_class__ (PyObject * self , PyObject * * args , Py_ssize_t nargs ,
0 commit comments