mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
changes for keyword arguments and fast function call; added abstract.c
This commit is contained in:
parent
884afd654a
commit
2271bf7187
3 changed files with 81 additions and 68 deletions
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue