diff options
-rw-r--r-- | Objects/frameobject.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 29cb171..52b4e52 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -30,12 +30,14 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "frameobject.h" #include "opcode.h" #include "structmember.h" +#include "bltinmodule.h" #define OFF(x) offsetof(frameobject, x) static struct memberlist frame_memberlist[] = { {"f_back", T_OBJECT, OFF(f_back), RO}, {"f_code", T_OBJECT, OFF(f_code), RO}, + {"f_builtins", T_OBJECT, OFF(f_builtins),RO}, {"f_globals", T_OBJECT, OFF(f_globals), RO}, {"f_locals", T_OBJECT, OFF(f_locals), RO}, {"f_owner", T_OBJECT, OFF(f_owner), RO}, @@ -45,6 +47,7 @@ static struct memberlist frame_memberlist[] = { {"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}, {"f_trace", T_OBJECT, OFF(f_trace)}, {NULL} /* Sentinel */ }; @@ -97,6 +100,7 @@ frame_dealloc(f) { XDECREF(f->f_back); XDECREF(f->f_code); + XDECREF(f->f_builtins); XDECREF(f->f_globals); XDECREF(f->f_locals); XDECREF(f->f_owner); @@ -135,6 +139,7 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks) int nblocks; { frameobject *f; + object *builtins; if ((back != NULL && !is_frameobject(back)) || code == NULL || !is_codeobject(code) || globals == NULL || !is_dictobject(globals) || @@ -143,6 +148,11 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks) err_badcall(); return NULL; } + builtins = dictlookup(globals, "__builtins__"); + if (builtins == NULL || !is_mappingobject(builtins)) { + err_setstr(TypeError, "bad __builtins__ dictionary"); + return NULL; + } if (free_list == NULL) { f = NEWOBJ(frameobject, &Frametype); f->f_nvalues = f->f_nblocks = 0; @@ -156,11 +166,12 @@ newframeobject(back, code, globals, locals, owner, nvalues, nblocks) NEWREF(f); } if (f != NULL) { - if (back) - INCREF(back); + 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); @@ -182,6 +193,7 @@ newframeobject(back, code, globals, locals, owner, nvalues, 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(); |