]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
changes for keyword arguments and fast function call; added abstract.c
authorGuido van Rossum <guido@python.org>
Tue, 18 Jul 1995 14:30:34 +0000 (14:30 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 18 Jul 1995 14:30:34 +0000 (14:30 +0000)
Objects/Makefile.in
Objects/frameobject.c
Objects/funcobject.c

index 60a71cade071c6bdd731c16be4d478f05b649629..cdf485295d955d899eb45b42d340575085c97282 100644 (file)
@@ -26,14 +26,14 @@ SHELL=              /bin/sh
 
 # === Fixed definitions ===
 
-OBJS=          accessobject.o \
+OBJS=          abstract.o accessobject.o \
                classobject.o fileobject.o floatobject.o \
                frameobject.o funcobject.o intobject.o listobject.o \
                longobject.o mappingobject.o methodobject.o \
                moduleobject.o object.o rangeobject.o stringobject.o \
                tupleobject.o typeobject.o
 
-SRCS=          accessobject.c \
+SRCS=          abstract.c accessobject.c \
                classobject.c fileobject.c floatobject.c \
                frameobject.c funcobject.c intobject.c listobject.c \
                longobject.c mappingobject.c methodobject.c \
@@ -68,6 +68,7 @@ depend:
 
 .PRECIOUS:     Makefile
 
+abstract.o: abstract.c
 accessobject.o: accessobject.c
 classobject.o: classobject.c
 fileobject.o: fileobject.c
index db02924b62f65f9c2a38aaef9ec5a0e94b563341..b2884080bcd96c2018b2c80aae47aeec68813b14 100644 (file)
@@ -44,7 +44,6 @@ static struct memberlist frame_memberlist[] = {
 #if 0
        {"f_fastlocals",T_OBJECT,       OFF(f_fastlocals),RO}, /* XXX Unsafe */
 #endif
-       {"f_localmap",  T_OBJECT,       OFF(f_localmap),RO},
        {"f_lasti",     T_INT,          OFF(f_lasti),   RO},
        {"f_lineno",    T_INT,          OFF(f_lineno),  RO},
        {"f_restricted",T_INT,          OFF(f_restricted),RO},
@@ -105,7 +104,6 @@ frame_dealloc(f)
        XDECREF(f->f_locals);
        XDECREF(f->f_owner);
        XDECREF(f->f_fastlocals);
-       XDECREF(f->f_localmap);
        XDECREF(f->f_trace);
        f->f_back = free_list;
        free_list = f;
@@ -149,7 +147,7 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks)
        if ((back != NULL && !is_frameobject(back)) ||
                code == NULL || !is_codeobject(code) ||
                globals == NULL || !is_dictobject(globals) ||
-               locals == NULL || !is_dictobject(locals) ||
+               locals != NULL && !is_dictobject(locals) ||
                nvalues < 0 || nblocks < 0) {
                err_badcall();
                return NULL;
@@ -163,6 +161,8 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks)
        }
        if (free_list == NULL) {
                f = NEWOBJ(frameobject, &Frametype);
+               if (f == NULL)
+                       return NULL;
                f->f_nvalues = f->f_nblocks = 0;
                f->f_valuestack = NULL;
                f->f_blockstack = NULL;
@@ -173,42 +173,57 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks)
                f->ob_type = &Frametype;
                NEWREF(f);
        }
-       if (f != NULL) {
-               XINCREF(back);
-               f->f_back = back;
-               INCREF(code);
-               f->f_code = code;
-               XINCREF(builtins);
-               f->f_builtins = builtins;
-               INCREF(globals);
-               f->f_globals = globals;
-               INCREF(locals);
-               f->f_locals = locals;
-               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;
+       XINCREF(back);
+       f->f_back = back;
+       INCREF(code);
+       f->f_code = code;
+       XINCREF(builtins);
+       f->f_builtins = builtins;
+       INCREF(globals);
+       f->f_globals = globals;
+       if ((code->co_flags & (CO_NEWLOCALS|CO_OPTIMIZED)) == CO_NEWLOCALS) {
+               locals = newdictobject();
+               if (locals == NULL) {
+                       DECREF(f);
+                       return NULL;
                }
-               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();
+       }
+       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);
-                       f = NULL;
+                       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;
 }
 
@@ -270,11 +285,18 @@ fast_2_locals(f)
        int j;
        if (f == NULL)
                return;
-       locals = f->f_locals;
        fast = f->f_fastlocals;
-       map = f->f_localmap;
-       if (locals == NULL || fast == NULL || map == NULL)
+       if (fast == NULL || f->f_code->co_nlocals == 0)
                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) ||
            !is_tupleobject(map))
                return;
@@ -308,8 +330,8 @@ locals_2_fast(f, clear)
                return;
        locals = f->f_locals;
        fast = f->f_fastlocals;
-       map = f->f_localmap;
-       if (locals == NULL || fast == NULL || map == NULL)
+       map = f->f_code->co_varnames;
+       if (locals == NULL || fast == NULL || f->f_code->co_nlocals == 0)
                return;
        if (!is_dictobject(locals) || !is_listobject(fast) ||
            !is_tupleobject(map))
index dcceb72c5d44975745e4e7bd460f1adda1a198f3..f6ec71ee73c09614efac6bcc1857089b5901539b 100644 (file)
@@ -43,8 +43,7 @@ newfuncobject(code, globals)
                op->func_globals = globals;
                op->func_name = ((codeobject *)code)->co_name;
                INCREF(op->func_name);
-               op->func_argcount = -1; /* Unknown */
-               op->func_argdefs = NULL; /* No default arguments */
+               op->func_defaults = NULL; /* No default arguments */
                consts = ((codeobject *)code)->co_consts;
                if (gettuplesize(consts) >= 1) {
                        doc = gettupleitem(consts, 0);
@@ -82,40 +81,35 @@ getfuncglobals(op)
 }
 
 object *
-getfuncargstuff(op, argcount_return)
+PyFunction_GetDefaults(op)
        object *op;
-       int *argcount_return;
 {
        if (!is_funcobject(op)) {
                err_badcall();
                return NULL;
        }
-       *argcount_return = ((funcobject *) op) -> func_argcount;
-       return ((funcobject *) op) -> func_argdefs;
+       return ((funcobject *) op) -> func_defaults;
 }
 
 int
-setfuncargstuff(op, argcount, argdefs)
+PyFunction_SetDefaults(op, defaults)
        object *op;
-       int argcount;
-       object *argdefs;
+       object *defaults;
 {
-       if (!is_funcobject(op) ||
-           argdefs != NULL && !is_tupleobject(argdefs)) {
+       if (!is_funcobject(op)) {
                err_badcall();
                return -1;
        }
-       if (argdefs == None)
-               argdefs = NULL;
-       else if (is_tupleobject(argdefs))
-               XINCREF(argdefs);
+       if (defaults == None)
+               defaults = NULL;
+       else if (is_tupleobject(defaults))
+               XINCREF(defaults);
        else {
                err_setstr(SystemError, "non-tuple default args");
                return -1;
        }
-       ((funcobject *) op) -> func_argcount = argcount;
-       XDECREF(((funcobject *) op) -> func_argdefs);
-       ((funcobject *) op) -> func_argdefs = argdefs;
+       XDECREF(((funcobject *) op) -> func_defaults);
+       ((funcobject *) op) -> func_defaults = defaults;
        return 0;
 }
 
@@ -128,8 +122,7 @@ static struct memberlist func_memberlist[] = {
        {"func_globals",T_OBJECT,       OFF(func_globals),      READONLY},
        {"func_name",   T_OBJECT,       OFF(func_name),         READONLY},
        {"__name__",    T_OBJECT,       OFF(func_name),         READONLY},
-       {"func_argcount",T_INT,         OFF(func_argcount),     READONLY},
-       {"func_argdefs",T_OBJECT,       OFF(func_argdefs),      READONLY},
+       {"func_defaults",T_OBJECT,      OFF(func_defaults),     READONLY},
        {"func_doc",    T_OBJECT,       OFF(func_doc)},
        {"__doc__",     T_OBJECT,       OFF(func_doc)},
        {NULL}  /* Sentinel */
@@ -155,7 +148,7 @@ func_dealloc(op)
        DECREF(op->func_code);
        DECREF(op->func_globals);
        DECREF(op->func_name);
-       XDECREF(op->func_argdefs);
+       XDECREF(op->func_defaults);
        XDECREF(op->func_doc);
        DEL(op);
 }
@@ -181,10 +174,7 @@ func_compare(f, g)
        int c;
        if (f->func_globals != g->func_globals)
                return (f->func_globals < g->func_globals) ? -1 : 1;
-       c = f->func_argcount < g->func_argcount;
-       if (c != 0)
-               return c < 0 ? -1 : 1;
-       c = cmpobject(f->func_argdefs, g->func_argdefs);
+       c = cmpobject(f->func_defaults, g->func_defaults);
        if (c != 0)
                return c;
        return cmpobject(f->func_code, g->func_code);