Commit d0272a90 authored by Guido van Rossum's avatar Guido van Rossum

* classobject.c: in instance_getattr, don't make a method out of a

  function found as instance data.
* socketmodule.c: added 'flags' argument sendto/recvfrom, rewrite
  argument parsing in send/recv.
* More changes related to access (terminology change: owner instead of
  class; allow any object as owner; local/global variables are owned
  by their dictionary, only class/instance data is owned by the class;
  "from...import *" now only imports objects with public access; etc.)
parent a3a3d3df
...@@ -28,7 +28,7 @@ object *call_object PROTO((object *, object *)); ...@@ -28,7 +28,7 @@ object *call_object PROTO((object *, object *));
object *getglobals PROTO((void)); object *getglobals PROTO((void));
object *getlocals PROTO((void)); object *getlocals PROTO((void));
object *getclass PROTO((void)); object *getowner PROTO((void));
void mergelocals PROTO((void)); void mergelocals PROTO((void));
void printtraceback PROTO((object *)); void printtraceback PROTO((object *));
......
...@@ -36,7 +36,7 @@ typedef struct _frame { ...@@ -36,7 +36,7 @@ typedef struct _frame {
codeobject *f_code; /* code segment */ codeobject *f_code; /* code segment */
object *f_globals; /* global symbol table (dictobject) */ object *f_globals; /* global symbol table (dictobject) */
object *f_locals; /* local symbol table (dictobject) */ object *f_locals; /* local symbol table (dictobject) */
object *f_class; /* class context (classobject or NULL) */ object *f_owner; /* owner (e.g. class or module) or NULL */
object *f_fastlocals; /* fast local variables (listobject) */ object *f_fastlocals; /* fast local variables (listobject) */
object *f_localmap; /* local variable names (dictobject) */ object *f_localmap; /* local variable names (dictobject) */
object **f_valuestack; /* malloc'ed array */ object **f_valuestack; /* malloc'ed array */
......
...@@ -32,7 +32,7 @@ Limitations: ...@@ -32,7 +32,7 @@ Limitations:
- only AF_INET and AF_UNIX address families are supported - only AF_INET and AF_UNIX address families are supported
- no asynchronous I/O (but read polling: avail) - no asynchronous I/O (but read polling: avail)
- no read/write operations (use send/recv or makefile instead) - no read/write operations (use send/recv or makefile instead)
- no flags on sendto/recvfrom operations - no flags on recvfrom operations
- setsockopt() and getsockopt() only support integer options - setsockopt() and getsockopt() only support integer options
Interface: Interface:
...@@ -61,10 +61,10 @@ Socket methods: ...@@ -61,10 +61,10 @@ Socket methods:
- s.getpeername() --> sockaddr - s.getpeername() --> sockaddr
- s.listen(n) --> None - s.listen(n) --> None
- s.makefile(mode) --> file object - s.makefile(mode) --> file object
- s.recv(nbytes) --> string - s.recv(nbytes [,flags]) --> string
- s.recvfrom(nbytes) --> string, sockaddr - s.recvfrom(nbytes) --> string, sockaddr
- s.send(string) --> None - s.send(string [,flags]) --> None
- s.sendto(string, sockaddr) --> None - s.sendto(string, [flags,] sockaddr) --> None
- s.shutdown(how) --> None - s.shutdown(how) --> None
- s.close() --> None - s.close() --> None
...@@ -669,7 +669,7 @@ sock_makefile(s, args) ...@@ -669,7 +669,7 @@ sock_makefile(s, args)
} }
/* s.recv(nbytes) method */ /* s.recv(nbytes [,flags]) method */
static object * static object *
sock_recv(s, args) sock_recv(s, args)
...@@ -678,11 +678,11 @@ sock_recv(s, args) ...@@ -678,11 +678,11 @@ sock_recv(s, args)
{ {
int len, n, flags; int len, n, flags;
object *buf; object *buf;
if (!getintintarg(args, &len, &flags)) { flags = 0;
if (!getargs(args, "i", &len)) {
err_clear(); err_clear();
if (!getintarg(args, &len)) if (!getargs(args, "(ii)", &len, &flags))
return NULL; return NULL;
flags = 0;
} }
buf = newsizedstringobject((char *) 0, len); buf = newsizedstringobject((char *) 0, len);
if (buf == NULL) if (buf == NULL)
...@@ -698,7 +698,7 @@ sock_recv(s, args) ...@@ -698,7 +698,7 @@ sock_recv(s, args)
} }
/* s.recvfrom(nbytes) method */ /* s.recvfrom(nbytes [,flags]) method */
static object * static object *
sock_recvfrom(s, args) sock_recvfrom(s, args)
...@@ -707,14 +707,16 @@ sock_recvfrom(s, args) ...@@ -707,14 +707,16 @@ sock_recvfrom(s, args)
{ {
char addrbuf[256]; char addrbuf[256];
object *buf, *addr, *ret; object *buf, *addr, *ret;
int addrlen, len, n; int addrlen, len, n, flags;
if (!getintarg(args, &len)) flags = 0;
return NULL; if (!getargs(args, "i", &len)) {
if (!getsockaddrlen(s, &addrlen)) err_clear();
return NULL; if (!getargs(args, "(ii)", &len, &flags))
return NULL;
}
buf = newsizedstringobject((char *) 0, len); buf = newsizedstringobject((char *) 0, len);
BGN_SAVE BGN_SAVE
n = recvfrom(s->sock_fd, getstringvalue(buf), len, 0, n = recvfrom(s->sock_fd, getstringvalue(buf), len, flags,
addrbuf, &addrlen); addrbuf, &addrlen);
END_SAVE END_SAVE
if (n < 0) if (n < 0)
...@@ -729,7 +731,7 @@ sock_recvfrom(s, args) ...@@ -729,7 +731,7 @@ sock_recvfrom(s, args)
} }
/* s.send(data) method */ /* s.send(data [,flags]) method */
static object * static object *
sock_send(s, args) sock_send(s, args)
...@@ -738,11 +740,11 @@ sock_send(s, args) ...@@ -738,11 +740,11 @@ sock_send(s, args)
{ {
char *buf; char *buf;
int len, n, flags; int len, n, flags;
if (!getargs(args, "(s#i)", &buf, &len, &flags)) { flags = 0;
if (!getargs(args, "(s#)", &buf, &len)) {
err_clear(); err_clear();
if (!getargs(args, "s#", &buf, &len)) if (!getargs(args, "s#", &buf, &len, &flags))
return NULL; return NULL;
flags = 0;
} }
BGN_SAVE BGN_SAVE
n = send(s->sock_fd, buf, len, flags); n = send(s->sock_fd, buf, len, flags);
...@@ -754,7 +756,7 @@ sock_send(s, args) ...@@ -754,7 +756,7 @@ sock_send(s, args)
} }
/* s.sendto(data, sockaddr) method */ /* s.sendto(data, [flags,] sockaddr) method */
static object * static object *
sock_sendto(s, args) sock_sendto(s, args)
...@@ -764,16 +766,17 @@ sock_sendto(s, args) ...@@ -764,16 +766,17 @@ sock_sendto(s, args)
object *addro; object *addro;
char *buf; char *buf;
struct sockaddr *addr; struct sockaddr *addr;
int addrlen, len, n; int addrlen, len, n, flags;
if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) { flags = 0;
err_badarg(); if (!getargs(args, "(s#O)", &buf, &len, &addro)) {
return NULL; err_clear();
if (!getargs(args, "(s#iO)", &buf, &len, &flags, &addro))
return NULL;
} }
if (!getargs(args, "(s#O)", &buf, &len, &addro) || if (!getsockaddrarg(s, addro, &addr, &addrlen))
!getsockaddrarg(s, addro, &addr, &addrlen))
return NULL; return NULL;
BGN_SAVE BGN_SAVE
n = sendto(s->sock_fd, buf, len, 0, addr, addrlen); n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
END_SAVE END_SAVE
if (n < 0) if (n < 0)
return socket_error(); return socket_error();
......
...@@ -32,27 +32,23 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ...@@ -32,27 +32,23 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
typedef struct { typedef struct {
OB_HEAD OB_HEAD
object *ac_value; object *ac_value;
object *ac_class; object *ac_owner;
typeobject *ac_type; typeobject *ac_type;
int ac_mode; int ac_mode;
} accessobject; } accessobject;
/* Forward */ /* Forward */
static int typecheck PROTO((object *, typeobject *)); static int typecheck PROTO((object *, typeobject *));
static int classcheck PROTO((object *, object *, int, int)); static int ownercheck PROTO((object *, object *, int, int));
object * object *
newaccessobject(value, class, type, mode) newaccessobject(value, owner, type, mode)
object *value; object *value;
object *class; object *owner;
typeobject *type; typeobject *type;
int mode; int mode;
{ {
accessobject *ap; accessobject *ap;
if (class != NULL && !is_classobject(class)) {
err_badcall();
return NULL;
}
if (!typecheck(value, type)) { if (!typecheck(value, type)) {
err_setstr(AccessError, err_setstr(AccessError,
"access: initial value has inappropriate type"); "access: initial value has inappropriate type");
...@@ -63,8 +59,8 @@ newaccessobject(value, class, type, mode) ...@@ -63,8 +59,8 @@ newaccessobject(value, class, type, mode)
return NULL; return NULL;
XINCREF(value); XINCREF(value);
ap->ac_value = value; ap->ac_value = value;
XINCREF(class); XINCREF(owner);
ap->ac_class = class; ap->ac_owner = owner;
XINCREF(type); XINCREF(type);
ap->ac_type = (typeobject *)type; ap->ac_type = (typeobject *)type;
ap->ac_mode = mode; ap->ac_mode = mode;
...@@ -81,22 +77,22 @@ cloneaccessobject(op) ...@@ -81,22 +77,22 @@ cloneaccessobject(op)
return NULL; return NULL;
} }
ap = (accessobject *)op; ap = (accessobject *)op;
return newaccessobject(ap->ac_value, ap->ac_class, return newaccessobject(ap->ac_value, ap->ac_owner,
ap->ac_type, ap->ac_mode); ap->ac_type, ap->ac_mode);
} }
void void
setaccessowner(op, class) setaccessowner(op, owner)
object *op; object *op;
object *class; object *owner;
{ {
register accessobject *ap; register accessobject *ap;
if (!is_accessobject(op) || class != NULL && !is_classobject(class)) if (!is_accessobject(op))
return; /* XXX no error */ return; /* XXX no error */
ap = (accessobject *)op; ap = (accessobject *)op;
XDECREF(ap->ac_class); XDECREF(ap->ac_owner);
XINCREF(class); XINCREF(owner);
ap->ac_class = class; ap->ac_owner = owner;
} }
int int
...@@ -109,9 +105,9 @@ hasaccessvalue(op) ...@@ -109,9 +105,9 @@ hasaccessvalue(op)
} }
object * object *
getaccessvalue(op, class) getaccessvalue(op, owner)
object *op; object *op;
object *class; object *owner;
{ {
register accessobject *ap; register accessobject *ap;
if (!is_accessobject(op)) { if (!is_accessobject(op)) {
...@@ -120,7 +116,7 @@ getaccessvalue(op, class) ...@@ -120,7 +116,7 @@ getaccessvalue(op, class)
} }
ap = (accessobject *)op; ap = (accessobject *)op;
if (!classcheck(class, ap->ac_class, AC_R, ap->ac_mode)) { if (!ownercheck(owner, ap->ac_owner, AC_R, ap->ac_mode)) {
err_setstr(AccessError, "read access denied"); err_setstr(AccessError, "read access denied");
return NULL; return NULL;
} }
...@@ -134,9 +130,9 @@ getaccessvalue(op, class) ...@@ -134,9 +130,9 @@ getaccessvalue(op, class)
} }
int int
setaccessvalue(op, class, value) setaccessvalue(op, owner, value)
object *op; object *op;
object *class; object *owner;
object *value; object *value;
{ {
register accessobject *ap; register accessobject *ap;
...@@ -146,7 +142,7 @@ setaccessvalue(op, class, value) ...@@ -146,7 +142,7 @@ setaccessvalue(op, class, value)
} }
ap = (accessobject *)op; ap = (accessobject *)op;
if (!classcheck(class, ap->ac_class, AC_W, ap->ac_mode)) { if (!ownercheck(owner, ap->ac_owner, AC_W, ap->ac_mode)) {
err_setstr(AccessError, "write access denied"); err_setstr(AccessError, "write access denied");
return -1; return -1;
} }
...@@ -227,17 +223,20 @@ typecheck(value, type) ...@@ -227,17 +223,20 @@ typecheck(value, type)
} }
static int static int
classcheck(caller, owner, access, mode) ownercheck(caller, owner, access, mode)
object *caller; object *caller;
object *owner; object *owner;
int access; int access;
int mode; int mode;
{ {
if (caller == owner && owner != NULL) int mask = AC_PUBLIC;
return access & mode & (AC_PRIVATE|AC_PROTECTED|AC_PUBLIC); if (owner != NULL) {
if (caller != NULL && owner != NULL && issubclass(caller, owner)) if (caller == owner)
return access & mode & (AC_PROTECTED|AC_PUBLIC); mask |= AC_PRIVATE | AC_PROTECTED;
return access & mode & AC_PUBLIC; else if (is_classobject(owner) && issubclass(caller, owner))
mask |= AC_PROTECTED;
}
return access & mode & mask;
} }
/* Access methods */ /* Access methods */
...@@ -247,7 +246,7 @@ access_dealloc(ap) ...@@ -247,7 +246,7 @@ access_dealloc(ap)
accessobject *ap; accessobject *ap;
{ {
XDECREF(ap->ac_value); XDECREF(ap->ac_value);
XDECREF(ap->ac_class); XDECREF(ap->ac_owner);
XDECREF(ap->ac_type); XDECREF(ap->ac_type);
DEL(ap); DEL(ap);
} }
...@@ -256,7 +255,7 @@ access_dealloc(ap) ...@@ -256,7 +255,7 @@ access_dealloc(ap)
static struct memberlist access_memberlist[] = { static struct memberlist access_memberlist[] = {
{"ac_value", T_OBJECT, OFF(ac_value)}, {"ac_value", T_OBJECT, OFF(ac_value)},
{"ac_class", T_OBJECT, OFF(ac_class)}, {"ac_owner", T_OBJECT, OFF(ac_owner)},
{"ac_type", T_OBJECT, OFF(ac_type)}, {"ac_type", T_OBJECT, OFF(ac_type)},
{"ac_mode", T_INT, OFF(ac_mode)}, {"ac_mode", T_INT, OFF(ac_mode)},
{NULL} /* Sentinel */ {NULL} /* Sentinel */
...@@ -275,12 +274,21 @@ access_repr(ap) ...@@ -275,12 +274,21 @@ access_repr(ap)
accessobject *ap; accessobject *ap;
{ {
char buf[300]; char buf[300];
classobject *class = (classobject *)ap->ac_class; char buf2[20];
char *ownername;
typeobject *type = ap->ac_type; typeobject *type = ap->ac_type;
if (is_classobject(ap->ac_owner)) {
ownername =
getstringvalue(((classobject *)ap->ac_owner)->cl_name);
}
else {
sprintf(buf2, "0x%lx", (long)ap->ac_owner);
ownername = buf2;
}
sprintf(buf, sprintf(buf,
"<access object, value 0x%lx, class %.100s, type %.100s, mode %04o>", "<access object, value 0x%lx, owner %.100s, type %.100s, mode %04o>",
(long)(ap->ac_value), (long)(ap->ac_value),
class ? getstringvalue(class->cl_name) : "-", ownername,
type ? type->tp_name : "-", type ? type->tp_name : "-",
ap->ac_mode); ap->ac_mode);
return newstringobject(buf); return newstringobject(buf);
...@@ -305,7 +313,8 @@ typeobject Accesstype = { ...@@ -305,7 +313,8 @@ typeobject Accesstype = {
0, /*tp_hash*/ 0, /*tp_hash*/
}; };
/* Dummy type objects to indicate classes of types */
/* Pseudo type objects to indicate collections of types */
/* XXX This should be replaced by a more general "subclassing" /* XXX This should be replaced by a more general "subclassing"
XXX mechanism for type objects... */ XXX mechanism for type objects... */
......
...@@ -126,7 +126,7 @@ class_getattr(op, name) ...@@ -126,7 +126,7 @@ class_getattr(op, name)
return NULL; return NULL;
} }
if (is_accessobject(v)) { if (is_accessobject(v)) {
v = getaccessvalue(v, getclass()); v = getaccessvalue(v, getowner());
if (v == NULL) if (v == NULL)
return NULL; return NULL;
} }
...@@ -157,7 +157,7 @@ class_setattr(op, name, v) ...@@ -157,7 +157,7 @@ class_setattr(op, name, v)
} }
ac = dictlookup(op->cl_dict, name); ac = dictlookup(op->cl_dict, name);
if (ac != NULL && is_accessobject(ac)) if (ac != NULL && is_accessobject(ac))
return setaccessvalue(ac, getclass(), v); return setaccessvalue(ac, getowner(), v);
if (v == NULL) { if (v == NULL) {
int rv = dictremove(op->cl_dict, name); int rv = dictremove(op->cl_dict, name);
if (rv < 0) if (rv < 0)
...@@ -207,10 +207,10 @@ issubclass(class, base) ...@@ -207,10 +207,10 @@ issubclass(class, base)
{ {
int i, n; int i, n;
classobject *cp; classobject *cp;
if (class == NULL || !is_classobject(class))
return 0;
if (class == base) if (class == base)
return 1; return 1;
if (class == NULL || !is_classobject(class))
return 0;
cp = (classobject *)class; cp = (classobject *)class;
n = gettuplesize(cp->cl_bases); n = gettuplesize(cp->cl_bases);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
...@@ -363,6 +363,7 @@ instance_getattr(inst, name) ...@@ -363,6 +363,7 @@ instance_getattr(inst, name)
INCREF(inst->in_class); INCREF(inst->in_class);
return (object *)inst->in_class; return (object *)inst->in_class;
} }
class = NULL;
v = dictlookup(inst->in_dict, name); v = dictlookup(inst->in_dict, name);
if (v == NULL) { if (v == NULL) {
v = class_lookup(inst->in_class, name, &class); v = class_lookup(inst->in_class, name, &class);
...@@ -372,13 +373,13 @@ instance_getattr(inst, name) ...@@ -372,13 +373,13 @@ instance_getattr(inst, name)
} }
} }
if (is_accessobject(v)) { if (is_accessobject(v)) {
v = getaccessvalue(v, getclass()); v = getaccessvalue(v, getowner());
if (v == NULL) if (v == NULL)
return NULL; return NULL;
} }
else else
INCREF(v); INCREF(v);
if (is_funcobject(v)) { if (is_funcobject(v) && class != NULL) {
object *w = newinstancemethodobject(v, (object *)inst, object *w = newinstancemethodobject(v, (object *)inst,
(object *)class); (object *)class);
DECREF(v); DECREF(v);
...@@ -403,7 +404,7 @@ instance_setattr(inst, name, v) ...@@ -403,7 +404,7 @@ instance_setattr(inst, name, v)
} }
ac = dictlookup(inst->in_dict, name); ac = dictlookup(inst->in_dict, name);
if (ac != NULL && is_accessobject(ac)) if (ac != NULL && is_accessobject(ac))
return setaccessvalue(ac, getclass(), v); return setaccessvalue(ac, getowner(), v);
if (v == NULL) { if (v == NULL) {
int rv = dictremove(inst->in_dict, name); int rv = dictremove(inst->in_dict, name);
if (rv < 0) if (rv < 0)
......
...@@ -38,7 +38,7 @@ static struct memberlist frame_memberlist[] = { ...@@ -38,7 +38,7 @@ static struct memberlist frame_memberlist[] = {
{"f_code", T_OBJECT, OFF(f_code)}, {"f_code", T_OBJECT, OFF(f_code)},
{"f_globals", T_OBJECT, OFF(f_globals)}, {"f_globals", T_OBJECT, OFF(f_globals)},
{"f_locals", T_OBJECT, OFF(f_locals)}, {"f_locals", T_OBJECT, OFF(f_locals)},
{"f_class", T_OBJECT, OFF(f_class)}, {"f_owner", T_OBJECT, OFF(f_owner)},
/* {"f_fastlocals",T_OBJECT, OFF(f_fastlocals)}, /* XXX Unsafe */ /* {"f_fastlocals",T_OBJECT, OFF(f_fastlocals)}, /* XXX Unsafe */
{"f_localmap", T_OBJECT, OFF(f_localmap)}, {"f_localmap", T_OBJECT, OFF(f_localmap)},
{"f_lasti", T_INT, OFF(f_lasti)}, {"f_lasti", T_INT, OFF(f_lasti)},
...@@ -85,7 +85,7 @@ frame_dealloc(f) ...@@ -85,7 +85,7 @@ frame_dealloc(f)
XDECREF(f->f_code); XDECREF(f->f_code);
XDECREF(f->f_globals); XDECREF(f->f_globals);
XDECREF(f->f_locals); XDECREF(f->f_locals);
XDECREF(f->f_class); XDECREF(f->f_owner);
XDECREF(f->f_fastlocals); XDECREF(f->f_fastlocals);
XDECREF(f->f_localmap); XDECREF(f->f_localmap);
f->f_back = free_list; f->f_back = free_list;
...@@ -110,12 +110,12 @@ typeobject Frametype = { ...@@ -110,12 +110,12 @@ typeobject Frametype = {
}; };
frameobject * frameobject *
newframeobject(back, code, globals, locals, class, nvalues, nblocks) newframeobject(back, code, globals, locals, owner, nvalues, nblocks)
frameobject *back; frameobject *back;
codeobject *code; codeobject *code;
object *globals; object *globals;
object *locals; object *locals;
object *class; object *owner;
int nvalues; int nvalues;
int nblocks; int nblocks;
{ {
...@@ -124,7 +124,6 @@ newframeobject(back, code, globals, locals, class, nvalues, nblocks) ...@@ -124,7 +124,6 @@ newframeobject(back, code, globals, locals, class, nvalues, nblocks)
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) ||
(class != NULL && !is_classobject(class)) ||
nvalues < 0 || nblocks < 0) { nvalues < 0 || nblocks < 0) {
err_badcall(); err_badcall();
return NULL; return NULL;
...@@ -150,8 +149,8 @@ newframeobject(back, code, globals, locals, class, nvalues, nblocks) ...@@ -150,8 +149,8 @@ newframeobject(back, code, globals, locals, class, nvalues, nblocks)
f->f_globals = globals; f->f_globals = globals;
INCREF(locals); INCREF(locals);
f->f_locals = locals; f->f_locals = locals;
XINCREF(class); XINCREF(owner);
f->f_class = class; f->f_owner = owner;
f->f_fastlocals = NULL; f->f_fastlocals = NULL;
f->f_localmap = NULL; f->f_localmap = NULL;
if (nvalues > f->f_nvalues || f->f_valuestack == NULL) { if (nvalues > f->f_nvalues || f->f_valuestack == NULL) {
......
...@@ -112,7 +112,7 @@ module_getattr(m, name) ...@@ -112,7 +112,7 @@ module_getattr(m, name)
err_setstr(AttributeError, name); err_setstr(AttributeError, name);
else { else {
if (is_accessobject(res)) if (is_accessobject(res))
res = getaccessvalue(res, getclass()); res = getaccessvalue(res, getglobals());
else else
INCREF(res); INCREF(res);
} }
...@@ -135,7 +135,7 @@ module_setattr(m, name, v) ...@@ -135,7 +135,7 @@ module_setattr(m, name, v)
} }
ac = dictlookup(m->md_dict, name); ac = dictlookup(m->md_dict, name);
if (ac != NULL && is_accessobject(ac)) if (ac != NULL && is_accessobject(ac))
return setaccessvalue(ac, getclass(), v); return setaccessvalue(ac, getglobals(), v);
if (v == NULL) { if (v == NULL) {
int rv = dictremove(m->md_dict, name); int rv = dictremove(m->md_dict, name);
if (rv < 0) if (rv < 0)
......
...@@ -161,11 +161,11 @@ enum why_code { ...@@ -161,11 +161,11 @@ enum why_code {
/* Interpreter main loop */ /* Interpreter main loop */
object * object *
eval_code(co, globals, locals, class, arg) eval_code(co, globals, locals, owner, arg)
codeobject *co; codeobject *co;
object *globals; object *globals;
object *locals; object *locals;
object *class; object *owner;
object *arg; object *arg;
{ {
register unsigned char *next_instr; register unsigned char *next_instr;
...@@ -246,7 +246,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -246,7 +246,7 @@ eval_code(co, globals, locals, class, arg)
co, /*code*/ co, /*code*/
globals, /*globals*/ globals, /*globals*/
locals, /*locals*/ locals, /*locals*/
class, /*class*/ owner, /*owner*/
50, /*nvalues*/ 50, /*nvalues*/
20); /*nblocks*/ 20); /*nblocks*/
if (f == NULL) if (f == NULL)
...@@ -767,7 +767,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -767,7 +767,7 @@ eval_code(co, globals, locals, class, arg)
u = (object *)v->ob_type; u = (object *)v->ob_type;
else else
u = NULL; u = NULL;
x = newaccessobject(v, class, x = newaccessobject(v, f->f_locals,
(typeobject *)u, (typeobject *)u,
defmode); defmode);
DECREF(v); DECREF(v);
...@@ -777,7 +777,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -777,7 +777,7 @@ eval_code(co, globals, locals, class, arg)
} }
} }
else if (is_accessobject(u)) { else if (is_accessobject(u)) {
err = setaccessvalue(u, class, v); err = setaccessvalue(u, f->f_locals, v);
DECREF(v); DECREF(v);
break; break;
} }
...@@ -789,7 +789,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -789,7 +789,7 @@ eval_code(co, globals, locals, class, arg)
w = GETNAMEV(oparg); w = GETNAMEV(oparg);
u = dict2lookup(f->f_locals, w); u = dict2lookup(f->f_locals, w);
if (u != NULL && is_accessobject(u)) { if (u != NULL && is_accessobject(u)) {
err = setaccessvalue(u, class, err = setaccessvalue(u, f->f_locals,
(object *)NULL); (object *)NULL);
break; break;
} }
...@@ -987,7 +987,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -987,7 +987,7 @@ eval_code(co, globals, locals, class, arg)
v = POP(); v = POP();
u = dict2lookup(f->f_locals, w); u = dict2lookup(f->f_locals, w);
if (u != NULL && is_accessobject(u)) { if (u != NULL && is_accessobject(u)) {
err = setaccessvalue(u, class, v); err = setaccessvalue(u, f->f_globals, v);
DECREF(v); DECREF(v);
break; break;
} }
...@@ -999,7 +999,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -999,7 +999,7 @@ eval_code(co, globals, locals, class, arg)
w = GETNAMEV(oparg); w = GETNAMEV(oparg);
u = dict2lookup(f->f_locals, w); u = dict2lookup(f->f_locals, w);
if (u != NULL && is_accessobject(u)) { if (u != NULL && is_accessobject(u)) {
err = setaccessvalue(u, class, err = setaccessvalue(u, f->f_globals,
(object *)NULL); (object *)NULL);
break; break;
} }
...@@ -1030,7 +1030,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -1030,7 +1030,7 @@ eval_code(co, globals, locals, class, arg)
} }
} }
if (is_accessobject(x)) { if (is_accessobject(x)) {
x = getaccessvalue(x, class); x = getaccessvalue(x, f->f_globals /* XXX */);
if (x == NULL) if (x == NULL)
break; break;
} }
...@@ -1052,7 +1052,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -1052,7 +1052,7 @@ eval_code(co, globals, locals, class, arg)
} }
} }
if (is_accessobject(x)) { if (is_accessobject(x)) {
x = getaccessvalue(x, class); x = getaccessvalue(x, f->f_globals);
if (x == NULL) if (x == NULL)
break; break;
} }
...@@ -1069,7 +1069,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -1069,7 +1069,7 @@ eval_code(co, globals, locals, class, arg)
break; break;
} }
if (is_accessobject(x)) { if (is_accessobject(x)) {
x = getaccessvalue(x, class); x = getaccessvalue(x, f->f_locals);
if (x == NULL) if (x == NULL)
break; break;
} }
...@@ -1105,7 +1105,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -1105,7 +1105,7 @@ eval_code(co, globals, locals, class, arg)
break; break;
} }
if (is_accessobject(x)) { if (is_accessobject(x)) {
x = getaccessvalue(x, class); x = getaccessvalue(x, f->f_locals);
if (x == NULL) if (x == NULL)
break; break;
} }
...@@ -1118,7 +1118,7 @@ eval_code(co, globals, locals, class, arg) ...@@ -1118,7 +1118,7 @@ eval_code(co, globals, locals, class, arg)
v = POP(); v = POP();
w = GETLISTITEM(fastlocals, oparg); w = GETLISTITEM(fastlocals, oparg);
if (w != NULL && is_accessobject(w)) { if (w != NULL && is_accessobject(w)) {
err = setaccessvalue(w, class, v); err = setaccessvalue(w, f->f_locals, v);
DECREF(v); DECREF(v);
break; break;
} }
...@@ -1134,7 +1134,8 @@ eval_code(co, globals, locals, class, arg) ...@@ -1134,7 +1134,8 @@ eval_code(co, globals, locals, class, arg)
break; break;
} }
if (w != NULL && is_accessobject(w)) { if (w != NULL && is_accessobject(w)) {
err = setaccessvalue(w, class, (object *)NULL); err = setaccessvalue(w, f->f_locals,
(object *)NULL);
break; break;
} }
DECREF(x); DECREF(x);
...@@ -1668,12 +1669,12 @@ getglobals() ...@@ -1668,12 +1669,12 @@ getglobals()
} }
object * object *
getclass() getowner()
{ {
if (current_frame == NULL) if (current_frame == NULL)
return NULL; return NULL;
else else
return current_frame->f_class; return current_frame->f_owner;
} }
void void
...@@ -2363,14 +2364,25 @@ import_from(locals, v, name) ...@@ -2363,14 +2364,25 @@ import_from(locals, v, name)
object *w, *x; object *w, *x;
w = getmoduledict(v); w = getmoduledict(v);
if (getstringvalue(name)[0] == '*') { if (getstringvalue(name)[0] == '*') {
int pos; int pos, err;
object *name, *value; object *name, *value;
pos = 0; pos = 0;
while (mappinggetnext(w, &pos, &name, &value)) { while (mappinggetnext(w, &pos, &name, &value)) {
if (!is_stringobject(name) || if (!is_stringobject(name) ||
getstringvalue(name)[0] == '_') getstringvalue(name)[0] == '_')
continue; continue;
if (dict2insert(locals, name, value) != 0) if (is_accessobject(value)) {
value = getaccessvalue(value, (object *)NULL);
if (value == NULL) {
err_clear();
continue;
}
}
else
INCREF(value);
err = dict2insert(locals, name, value);
DECREF(value);
if (err != 0)
return -1; return -1;
} }
return 0; return 0;
...@@ -2456,7 +2468,7 @@ access_statement(name, vmode, f) ...@@ -2456,7 +2468,7 @@ access_statement(name, vmode, f)
type = value->ob_type; type = value->ob_type;
else else
type = NULL; type = NULL;
ac = newaccessobject(value, f->f_class, type, mode); ac = newaccessobject(value, f->f_locals, type, mode);
if (ac == NULL) if (ac == NULL)
return -1; return -1;
if (fastind >= 0) if (fastind >= 0)
......
...@@ -303,7 +303,7 @@ get_module(m, name, m_ret) ...@@ -303,7 +303,7 @@ get_module(m, name, m_ret)
} }
} }
} }
v = eval_code(co, d, d, (object *)NULL, (object *)NULL); v = eval_code(co, d, d, d, (object *)NULL);
DECREF(co); DECREF(co);
return v; return v;
} }
...@@ -422,7 +422,7 @@ init_frozen(name) ...@@ -422,7 +422,7 @@ init_frozen(name)
return -1; return -1;
if ((m = add_module(name)) == NULL || if ((m = add_module(name)) == NULL ||
(d = getmoduledict(m)) == NULL || (d = getmoduledict(m)) == NULL ||
(v = eval_code(co, d, d, (object*)NULL, (object*)NULL)) == NULL) { (v = eval_code(co, d, d, d, (object*)NULL)) == NULL) {
DECREF(co); DECREF(co);
return -1; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment