Change the Don Beaudry hack into the Don B + Jim F hack; now, if *any*

base class is special it gets invoked.

Make gcc -Wall happy.
This commit is contained in:
Guido van Rossum 1996-12-05 23:17:11 +00:00
parent 3afb5959aa
commit 150b2df682
1 changed files with 26 additions and 28 deletions

View File

@ -319,8 +319,8 @@ eval_code2(co, globals, locals,
object *owner;
{
register unsigned char *next_instr;
register int opcode; /* Current opcode */
register int oparg; /* Current opcode argument, if any */
register int opcode = 0; /* Current opcode */
register int oparg = 0; /* Current opcode argument, if any */
register object **stack_pointer;
register enum why_code why; /* Reason for block stack unwind */
register int err; /* Error status -- nonzero if error */
@ -330,8 +330,8 @@ eval_code2(co, globals, locals,
register object *u;
register object *t;
register frameobject *f; /* Current frame */
register object **fastlocals;
object *retval; /* Return value */
register object **fastlocals = NULL;
object *retval = NULL; /* Return value */
#ifdef SUPPORT_OBSOLETE_ACCESS
int defmode = 0; /* Default access mode for new variables */
#endif
@ -1793,8 +1793,8 @@ eval_code2(co, globals, locals,
break;
}
if (b->b_type == SETUP_FINALLY ||
b->b_type == SETUP_EXCEPT &&
why == WHY_EXCEPTION) {
(b->b_type == SETUP_EXCEPT &&
why == WHY_EXCEPTION)) {
if (why == WHY_EXCEPTION) {
object *exc, *val, *tb;
err_fetch(&exc, &val, &tb);
@ -2055,7 +2055,7 @@ or(v, w)
{
BINOP("__or__", "__ror__", or);
if (v->ob_type->tp_as_number != NULL) {
object *x;
object *x = NULL;
object * (*f) FPROTO((object *, object *));
if (coerce(&v, &w) != 0)
return NULL;
@ -2076,7 +2076,7 @@ xor(v, w)
{
BINOP("__xor__", "__rxor__", xor);
if (v->ob_type->tp_as_number != NULL) {
object *x;
object *x = NULL;
object * (*f) FPROTO((object *, object *));
if (coerce(&v, &w) != 0)
return NULL;
@ -2097,7 +2097,7 @@ and(v, w)
{
BINOP("__and__", "__rand__", and);
if (v->ob_type->tp_as_number != NULL) {
object *x;
object *x = NULL;
object * (*f) FPROTO((object *, object *));
if (coerce(&v, &w) != 0)
return NULL;
@ -2118,7 +2118,7 @@ lshift(v, w)
{
BINOP("__lshift__", "__rlshift__", lshift);
if (v->ob_type->tp_as_number != NULL) {
object *x;
object *x = NULL;
object * (*f) FPROTO((object *, object *));
if (coerce(&v, &w) != 0)
return NULL;
@ -2139,7 +2139,7 @@ rshift(v, w)
{
BINOP("__rshift__", "__rrshift__", rshift);
if (v->ob_type->tp_as_number != NULL) {
object *x;
object *x = NULL;
object * (*f) FPROTO((object *, object *));
if (coerce(&v, &w) != 0)
return NULL;
@ -2379,7 +2379,7 @@ PyEval_CallObjectWithKeywords(func, arg, kw)
return NULL;
}
if (call = func->ob_type->tp_call)
if ((call = func->ob_type->tp_call) != NULL)
result = (*call)(func, arg, kw);
else if (is_instancemethodobject(func) || is_funcobject(func))
result = call_function(func, arg, kw);
@ -2890,22 +2890,6 @@ build_class(methods, bases, name)
err_setstr(SystemError, "build_class with non-tuple bases");
return NULL;
}
if (gettuplesize(bases) > 0) {
object *base;
base = GETTUPLEITEM(bases, 0);
/* Call the base's *type*, if it is callable.
This code is a hook for Donald Beaudry's type extensions.
In unexended Python it will never be triggered since its
types are not callable. */
if (base->ob_type->ob_type->tp_call) {
object *args;
object *class;
args = mkvalue("(OOO)", name, bases, methods);
class = call_object((object *)base->ob_type, args);
DECREF(args);
return class;
}
}
if (!is_dictobject(methods)) {
err_setstr(SystemError, "build_class with non-dictionary");
return NULL;
@ -2917,6 +2901,20 @@ build_class(methods, bases, name)
for (i = gettuplesize(bases); --i >= 0; ) {
object *base = GETTUPLEITEM(bases, i);
if (!is_classobject(base)) {
/* Call the base's *type*, if it is callable.
This code is a hook for Donald Beaudry's
and Jim Fulton's type extensions. In
unexended Python it will never be triggered
since its types are not callable. */
if (base->ob_type->ob_type->tp_call) {
object *args;
object *class;
args = mkvalue("(OOO)", name, bases, methods);
class = call_object((object *)base->ob_type,
args);
DECREF(args);
return class;
}
err_setstr(TypeError,
"base is not a class object");
return NULL;