changes for keyword arguments and fast function call; added abstract.c

This commit is contained in:
Guido van Rossum 1995-07-18 14:30:34 +00:00
parent 884afd654a
commit 2271bf7187
3 changed files with 81 additions and 68 deletions

View file

@ -26,14 +26,14 @@ SHELL= /bin/sh
# === Fixed definitions === # === Fixed definitions ===
OBJS= accessobject.o \ OBJS= abstract.o accessobject.o \
classobject.o fileobject.o floatobject.o \ classobject.o fileobject.o floatobject.o \
frameobject.o funcobject.o intobject.o listobject.o \ frameobject.o funcobject.o intobject.o listobject.o \
longobject.o mappingobject.o methodobject.o \ longobject.o mappingobject.o methodobject.o \
moduleobject.o object.o rangeobject.o stringobject.o \ moduleobject.o object.o rangeobject.o stringobject.o \
tupleobject.o typeobject.o tupleobject.o typeobject.o
SRCS= accessobject.c \ SRCS= abstract.c accessobject.c \
classobject.c fileobject.c floatobject.c \ classobject.c fileobject.c floatobject.c \
frameobject.c funcobject.c intobject.c listobject.c \ frameobject.c funcobject.c intobject.c listobject.c \
longobject.c mappingobject.c methodobject.c \ longobject.c mappingobject.c methodobject.c \
@ -68,6 +68,7 @@ depend:
.PRECIOUS: Makefile .PRECIOUS: Makefile
abstract.o: abstract.c
accessobject.o: accessobject.c accessobject.o: accessobject.c
classobject.o: classobject.c classobject.o: classobject.c
fileobject.o: fileobject.c fileobject.o: fileobject.c

View file

@ -44,7 +44,6 @@ static struct memberlist frame_memberlist[] = {
#if 0 #if 0
{"f_fastlocals",T_OBJECT, OFF(f_fastlocals),RO}, /* XXX Unsafe */ {"f_fastlocals",T_OBJECT, OFF(f_fastlocals),RO}, /* XXX Unsafe */
#endif #endif
{"f_localmap", T_OBJECT, OFF(f_localmap),RO},
{"f_lasti", T_INT, OFF(f_lasti), RO}, {"f_lasti", T_INT, OFF(f_lasti), RO},
{"f_lineno", T_INT, OFF(f_lineno), RO}, {"f_lineno", T_INT, OFF(f_lineno), RO},
{"f_restricted",T_INT, OFF(f_restricted),RO}, {"f_restricted",T_INT, OFF(f_restricted),RO},
@ -105,7 +104,6 @@ frame_dealloc(f)
XDECREF(f->f_locals); XDECREF(f->f_locals);
XDECREF(f->f_owner); XDECREF(f->f_owner);
XDECREF(f->f_fastlocals); XDECREF(f->f_fastlocals);
XDECREF(f->f_localmap);
XDECREF(f->f_trace); XDECREF(f->f_trace);
f->f_back = free_list; f->f_back = free_list;
free_list = f; free_list = f;
@ -149,7 +147,7 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks)
if ((back != NULL && !is_frameobject(back)) || if ((back != NULL && !is_frameobject(back)) ||
code == NULL || !is_codeobject(code) || code == NULL || !is_codeobject(code) ||
globals == NULL || !is_dictobject(globals) || globals == NULL || !is_dictobject(globals) ||
locals == NULL || !is_dictobject(locals) || locals != NULL && !is_dictobject(locals) ||
nvalues < 0 || nblocks < 0) { nvalues < 0 || nblocks < 0) {
err_badcall(); err_badcall();
return NULL; return NULL;
@ -163,6 +161,8 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks)
} }
if (free_list == NULL) { if (free_list == NULL) {
f = NEWOBJ(frameobject, &Frametype); f = NEWOBJ(frameobject, &Frametype);
if (f == NULL)
return NULL;
f->f_nvalues = f->f_nblocks = 0; f->f_nvalues = f->f_nblocks = 0;
f->f_valuestack = NULL; f->f_valuestack = NULL;
f->f_blockstack = NULL; f->f_blockstack = NULL;
@ -173,42 +173,57 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks)
f->ob_type = &Frametype; f->ob_type = &Frametype;
NEWREF(f); NEWREF(f);
} }
if (f != NULL) { XINCREF(back);
XINCREF(back); f->f_back = back;
f->f_back = back; INCREF(code);
INCREF(code); f->f_code = code;
f->f_code = code; XINCREF(builtins);
XINCREF(builtins); f->f_builtins = builtins;
f->f_builtins = builtins; INCREF(globals);
INCREF(globals); f->f_globals = globals;
f->f_globals = globals; if ((code->co_flags & (CO_NEWLOCALS|CO_OPTIMIZED)) == CO_NEWLOCALS) {
INCREF(locals); locals = newdictobject();
f->f_locals = locals; if (locals == NULL) {
XINCREF(owner);
f->f_owner = owner;
f->f_fastlocals = NULL;
f->f_localmap = NULL;
if (nvalues > f->f_nvalues || f->f_valuestack == NULL) {
XDEL(f->f_valuestack);
f->f_valuestack = NEW(object *, nvalues+1);
f->f_nvalues = nvalues;
}
if (nblocks > f->f_nblocks || f->f_blockstack == NULL) {
XDEL(f->f_blockstack);
f->f_blockstack = NEW(block, nblocks+1);
f->f_nblocks = nblocks;
}
f->f_iblock = 0;
f->f_lasti = 0;
f->f_lineno = -1;
f->f_restricted = (builtins != getbuiltindict());
f->f_trace = NULL;
if (f->f_valuestack == NULL || f->f_blockstack == NULL) {
err_nomem();
DECREF(f); DECREF(f);
f = NULL; return NULL;
} }
} }
else {
if (locals == NULL)
locals = globals;
INCREF(locals);
}
f->f_locals = locals;
XINCREF(owner);
f->f_owner = owner;
f->f_fastlocals = NULL;
if (code->co_nlocals > 0) {
f->f_fastlocals = newlistobject(code->co_nlocals);
if (f->f_fastlocals == NULL) {
DECREF(f);
return NULL;
}
}
if (nvalues > f->f_nvalues || f->f_valuestack == NULL) {
XDEL(f->f_valuestack);
f->f_valuestack = NEW(object *, nvalues+1);
f->f_nvalues = nvalues;
}
if (nblocks > f->f_nblocks || f->f_blockstack == NULL) {
XDEL(f->f_blockstack);
f->f_blockstack = NEW(block, nblocks+1);
f->f_nblocks = nblocks;
}
f->f_iblock = 0;
f->f_lasti = 0;
f->f_lineno = -1;
f->f_restricted = (builtins != getbuiltindict());
f->f_trace = NULL;
if (f->f_valuestack == NULL || f->f_blockstack == NULL) {
err_nomem();
DECREF(f);
return NULL;
}
return f; return f;
} }
@ -270,11 +285,18 @@ fast_2_locals(f)
int j; int j;
if (f == NULL) if (f == NULL)
return; return;
locals = f->f_locals;
fast = f->f_fastlocals; fast = f->f_fastlocals;
map = f->f_localmap; if (fast == NULL || f->f_code->co_nlocals == 0)
if (locals == NULL || fast == NULL || map == NULL)
return; return;
map = f->f_code->co_varnames;
locals = f->f_locals;
if (locals == NULL) {
locals = f->f_locals = newdictobject();
if (locals == NULL) {
err_clear(); /* Can't report it :-( */
return;
}
}
if (!is_dictobject(locals) || !is_listobject(fast) || if (!is_dictobject(locals) || !is_listobject(fast) ||
!is_tupleobject(map)) !is_tupleobject(map))
return; return;
@ -308,8 +330,8 @@ locals_2_fast(f, clear)
return; return;
locals = f->f_locals; locals = f->f_locals;
fast = f->f_fastlocals; fast = f->f_fastlocals;
map = f->f_localmap; map = f->f_code->co_varnames;
if (locals == NULL || fast == NULL || map == NULL) if (locals == NULL || fast == NULL || f->f_code->co_nlocals == 0)
return; return;
if (!is_dictobject(locals) || !is_listobject(fast) || if (!is_dictobject(locals) || !is_listobject(fast) ||
!is_tupleobject(map)) !is_tupleobject(map))

View file

@ -43,8 +43,7 @@ newfuncobject(code, globals)
op->func_globals = globals; op->func_globals = globals;
op->func_name = ((codeobject *)code)->co_name; op->func_name = ((codeobject *)code)->co_name;
INCREF(op->func_name); INCREF(op->func_name);
op->func_argcount = -1; /* Unknown */ op->func_defaults = NULL; /* No default arguments */
op->func_argdefs = NULL; /* No default arguments */
consts = ((codeobject *)code)->co_consts; consts = ((codeobject *)code)->co_consts;
if (gettuplesize(consts) >= 1) { if (gettuplesize(consts) >= 1) {
doc = gettupleitem(consts, 0); doc = gettupleitem(consts, 0);
@ -82,40 +81,35 @@ getfuncglobals(op)
} }
object * object *
getfuncargstuff(op, argcount_return) PyFunction_GetDefaults(op)
object *op; object *op;
int *argcount_return;
{ {
if (!is_funcobject(op)) { if (!is_funcobject(op)) {
err_badcall(); err_badcall();
return NULL; return NULL;
} }
*argcount_return = ((funcobject *) op) -> func_argcount; return ((funcobject *) op) -> func_defaults;
return ((funcobject *) op) -> func_argdefs;
} }
int int
setfuncargstuff(op, argcount, argdefs) PyFunction_SetDefaults(op, defaults)
object *op; object *op;
int argcount; object *defaults;
object *argdefs;
{ {
if (!is_funcobject(op) || if (!is_funcobject(op)) {
argdefs != NULL && !is_tupleobject(argdefs)) {
err_badcall(); err_badcall();
return -1; return -1;
} }
if (argdefs == None) if (defaults == None)
argdefs = NULL; defaults = NULL;
else if (is_tupleobject(argdefs)) else if (is_tupleobject(defaults))
XINCREF(argdefs); XINCREF(defaults);
else { else {
err_setstr(SystemError, "non-tuple default args"); err_setstr(SystemError, "non-tuple default args");
return -1; return -1;
} }
((funcobject *) op) -> func_argcount = argcount; XDECREF(((funcobject *) op) -> func_defaults);
XDECREF(((funcobject *) op) -> func_argdefs); ((funcobject *) op) -> func_defaults = defaults;
((funcobject *) op) -> func_argdefs = argdefs;
return 0; return 0;
} }
@ -128,8 +122,7 @@ static struct memberlist func_memberlist[] = {
{"func_globals",T_OBJECT, OFF(func_globals), READONLY}, {"func_globals",T_OBJECT, OFF(func_globals), READONLY},
{"func_name", T_OBJECT, OFF(func_name), READONLY}, {"func_name", T_OBJECT, OFF(func_name), READONLY},
{"__name__", T_OBJECT, OFF(func_name), READONLY}, {"__name__", T_OBJECT, OFF(func_name), READONLY},
{"func_argcount",T_INT, OFF(func_argcount), READONLY}, {"func_defaults",T_OBJECT, OFF(func_defaults), READONLY},
{"func_argdefs",T_OBJECT, OFF(func_argdefs), READONLY},
{"func_doc", T_OBJECT, OFF(func_doc)}, {"func_doc", T_OBJECT, OFF(func_doc)},
{"__doc__", T_OBJECT, OFF(func_doc)}, {"__doc__", T_OBJECT, OFF(func_doc)},
{NULL} /* Sentinel */ {NULL} /* Sentinel */
@ -155,7 +148,7 @@ func_dealloc(op)
DECREF(op->func_code); DECREF(op->func_code);
DECREF(op->func_globals); DECREF(op->func_globals);
DECREF(op->func_name); DECREF(op->func_name);
XDECREF(op->func_argdefs); XDECREF(op->func_defaults);
XDECREF(op->func_doc); XDECREF(op->func_doc);
DEL(op); DEL(op);
} }
@ -181,10 +174,7 @@ func_compare(f, g)
int c; int c;
if (f->func_globals != g->func_globals) if (f->func_globals != g->func_globals)
return (f->func_globals < g->func_globals) ? -1 : 1; return (f->func_globals < g->func_globals) ? -1 : 1;
c = f->func_argcount < g->func_argcount; c = cmpobject(f->func_defaults, g->func_defaults);
if (c != 0)
return c < 0 ? -1 : 1;
c = cmpobject(f->func_argdefs, g->func_argdefs);
if (c != 0) if (c != 0)
return c; return c;
return cmpobject(f->func_code, g->func_code); return cmpobject(f->func_code, g->func_code);