mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
Access checks now work, at least for instance data (not for methods
yet). The class is now passed to eval_code and stored in the current frame. It is also stored in instance method objects. An "unbound" instance method is now returned when a function is retrieved through "classname.funcname", which when called passes the class to eval_code.
This commit is contained in:
parent
25831652fd
commit
81daa32c15
14 changed files with 655 additions and 150 deletions
|
|
@ -38,6 +38,7 @@ static struct memberlist frame_memberlist[] = {
|
|||
{"f_code", T_OBJECT, OFF(f_code)},
|
||||
{"f_globals", T_OBJECT, OFF(f_globals)},
|
||||
{"f_locals", T_OBJECT, OFF(f_locals)},
|
||||
{"f_class", T_OBJECT, OFF(f_class)},
|
||||
/* {"f_fastlocals",T_OBJECT, OFF(f_fastlocals)}, /* XXX Unsafe */
|
||||
{"f_localmap", T_OBJECT, OFF(f_localmap)},
|
||||
{"f_lasti", T_INT, OFF(f_lasti)},
|
||||
|
|
@ -84,6 +85,7 @@ frame_dealloc(f)
|
|||
XDECREF(f->f_code);
|
||||
XDECREF(f->f_globals);
|
||||
XDECREF(f->f_locals);
|
||||
XDECREF(f->f_class);
|
||||
XDECREF(f->f_fastlocals);
|
||||
XDECREF(f->f_localmap);
|
||||
f->f_back = free_list;
|
||||
|
|
@ -108,11 +110,12 @@ typeobject Frametype = {
|
|||
};
|
||||
|
||||
frameobject *
|
||||
newframeobject(back, code, globals, locals, nvalues, nblocks)
|
||||
newframeobject(back, code, globals, locals, class, nvalues, nblocks)
|
||||
frameobject *back;
|
||||
codeobject *code;
|
||||
object *globals;
|
||||
object *locals;
|
||||
object *class;
|
||||
int nvalues;
|
||||
int nblocks;
|
||||
{
|
||||
|
|
@ -121,6 +124,7 @@ newframeobject(back, code, globals, locals, nvalues, nblocks)
|
|||
code == NULL || !is_codeobject(code) ||
|
||||
globals == NULL || !is_dictobject(globals) ||
|
||||
locals == NULL || !is_dictobject(locals) ||
|
||||
(class != NULL && !is_classobject(class)) ||
|
||||
nvalues < 0 || nblocks < 0) {
|
||||
err_badcall();
|
||||
return NULL;
|
||||
|
|
@ -146,6 +150,8 @@ newframeobject(back, code, globals, locals, nvalues, nblocks)
|
|||
f->f_globals = globals;
|
||||
INCREF(locals);
|
||||
f->f_locals = locals;
|
||||
XINCREF(class);
|
||||
f->f_class = class;
|
||||
f->f_fastlocals = NULL;
|
||||
f->f_localmap = NULL;
|
||||
if (nvalues > f->f_nvalues || f->f_valuestack == NULL) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue