Skip to content

Commit

Permalink
* classobject.c: in instance_getattr, don't make a method out of a
Browse files Browse the repository at this point in the history
  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.)
  • Loading branch information
gvanrossum committed May 25, 1993
1 parent 23301a9 commit eb6b33a
Show file tree
Hide file tree
Showing 9 changed files with 125 additions and 101 deletions.
2 changes: 1 addition & 1 deletion Include/ceval.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ object *call_object PROTO((object *, object *));

object *getglobals PROTO((void));
object *getlocals PROTO((void));
object *getclass PROTO((void));
object *getowner PROTO((void));
void mergelocals PROTO((void));

void printtraceback PROTO((object *));
Expand Down
2 changes: 1 addition & 1 deletion Include/frameobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ typedef struct _frame {
codeobject *f_code; /* code segment */
object *f_globals; /* global 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_localmap; /* local variable names (dictobject) */
object **f_valuestack; /* malloc'ed array */
Expand Down
57 changes: 30 additions & 27 deletions Modules/socketmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ This module provides an interface to Berkeley socket IPC.
- only AF_INET and AF_UNIX address families are supported
- no asynchronous I/O (but read polling: avail)
- 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
Interface:
Expand Down Expand Up @@ -61,10 +61,10 @@ Socket methods:
- s.getpeername() --> sockaddr
- s.listen(n) --> None
- s.makefile(mode) --> file object
- s.recv(nbytes) --> string
- s.recv(nbytes [,flags]) --> string
- s.recvfrom(nbytes) --> string, sockaddr
- s.send(string) --> None
- s.sendto(string, sockaddr) --> None
- s.send(string [,flags]) --> None
- s.sendto(string, [flags,] sockaddr) --> None
- s.shutdown(how) --> None
- s.close() --> None
Expand Down Expand Up @@ -669,7 +669,7 @@ sock_makefile(s, args)
}


/* s.recv(nbytes) method */
/* s.recv(nbytes [,flags]) method */

static object *
sock_recv(s, args)
Expand All @@ -678,11 +678,11 @@ sock_recv(s, args)
{
int len, n, flags;
object *buf;
if (!getintintarg(args, &len, &flags)) {
flags = 0;
if (!getargs(args, "i", &len)) {
err_clear();
if (!getintarg(args, &len))
if (!getargs(args, "(ii)", &len, &flags))
return NULL;
flags = 0;
}
buf = newsizedstringobject((char *) 0, len);
if (buf == NULL)
Expand All @@ -698,7 +698,7 @@ sock_recv(s, args)
}


/* s.recvfrom(nbytes) method */
/* s.recvfrom(nbytes [,flags]) method */

static object *
sock_recvfrom(s, args)
Expand All @@ -707,14 +707,16 @@ sock_recvfrom(s, args)
{
char addrbuf[256];
object *buf, *addr, *ret;
int addrlen, len, n;
if (!getintarg(args, &len))
return NULL;
if (!getsockaddrlen(s, &addrlen))
return NULL;
int addrlen, len, n, flags;
flags = 0;
if (!getargs(args, "i", &len)) {
err_clear();
if (!getargs(args, "(ii)", &len, &flags))
return NULL;
}
buf = newsizedstringobject((char *) 0, len);
BGN_SAVE
n = recvfrom(s->sock_fd, getstringvalue(buf), len, 0,
n = recvfrom(s->sock_fd, getstringvalue(buf), len, flags,
addrbuf, &addrlen);
END_SAVE
if (n < 0)
Expand All @@ -729,7 +731,7 @@ sock_recvfrom(s, args)
}


/* s.send(data) method */
/* s.send(data [,flags]) method */

static object *
sock_send(s, args)
Expand All @@ -738,11 +740,11 @@ sock_send(s, args)
{
char *buf;
int len, n, flags;
if (!getargs(args, "(s#i)", &buf, &len, &flags)) {
flags = 0;
if (!getargs(args, "(s#)", &buf, &len)) {
err_clear();
if (!getargs(args, "s#", &buf, &len))
if (!getargs(args, "s#", &buf, &len, &flags))
return NULL;
flags = 0;
}
BGN_SAVE
n = send(s->sock_fd, buf, len, flags);
Expand All @@ -754,7 +756,7 @@ sock_send(s, args)
}


/* s.sendto(data, sockaddr) method */
/* s.sendto(data, [flags,] sockaddr) method */

static object *
sock_sendto(s, args)
Expand All @@ -764,16 +766,17 @@ sock_sendto(s, args)
object *addro;
char *buf;
struct sockaddr *addr;
int addrlen, len, n;
if (args == NULL || !is_tupleobject(args) || gettuplesize(args) != 2) {
err_badarg();
return NULL;
int addrlen, len, n, flags;
flags = 0;
if (!getargs(args, "(s#O)", &buf, &len, &addro)) {
err_clear();
if (!getargs(args, "(s#iO)", &buf, &len, &flags, &addro))
return NULL;
}
if (!getargs(args, "(s#O)", &buf, &len, &addro) ||
!getsockaddrarg(s, addro, &addr, &addrlen))
if (!getsockaddrarg(s, addro, &addr, &addrlen))
return NULL;
BGN_SAVE
n = sendto(s->sock_fd, buf, len, 0, addr, addrlen);
n = sendto(s->sock_fd, buf, len, flags, addr, addrlen);
END_SAVE
if (n < 0)
return socket_error();
Expand Down
79 changes: 44 additions & 35 deletions Objects/accessobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,27 +32,23 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
typedef struct {
OB_HEAD
object *ac_value;
object *ac_class;
object *ac_owner;
typeobject *ac_type;
int ac_mode;
} accessobject;

/* Forward */
static int typecheck PROTO((object *, typeobject *));
static int classcheck PROTO((object *, object *, int, int));
static int ownercheck PROTO((object *, object *, int, int));

object *
newaccessobject(value, class, type, mode)
newaccessobject(value, owner, type, mode)
object *value;
object *class;
object *owner;
typeobject *type;
int mode;
{
accessobject *ap;
if (class != NULL && !is_classobject(class)) {
err_badcall();
return NULL;
}
if (!typecheck(value, type)) {
err_setstr(AccessError,
"access: initial value has inappropriate type");
Expand All @@ -63,8 +59,8 @@ newaccessobject(value, class, type, mode)
return NULL;
XINCREF(value);
ap->ac_value = value;
XINCREF(class);
ap->ac_class = class;
XINCREF(owner);
ap->ac_owner = owner;
XINCREF(type);
ap->ac_type = (typeobject *)type;
ap->ac_mode = mode;
Expand All @@ -81,22 +77,22 @@ cloneaccessobject(op)
return NULL;
}
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);
}

void
setaccessowner(op, class)
setaccessowner(op, owner)
object *op;
object *class;
object *owner;
{
register accessobject *ap;
if (!is_accessobject(op) || class != NULL && !is_classobject(class))
if (!is_accessobject(op))
return; /* XXX no error */
ap = (accessobject *)op;
XDECREF(ap->ac_class);
XINCREF(class);
ap->ac_class = class;
XDECREF(ap->ac_owner);
XINCREF(owner);
ap->ac_owner = owner;
}

int
Expand All @@ -109,9 +105,9 @@ hasaccessvalue(op)
}

object *
getaccessvalue(op, class)
getaccessvalue(op, owner)
object *op;
object *class;
object *owner;
{
register accessobject *ap;
if (!is_accessobject(op)) {
Expand All @@ -120,7 +116,7 @@ getaccessvalue(op, class)
}
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");
return NULL;
}
Expand All @@ -134,9 +130,9 @@ getaccessvalue(op, class)
}

int
setaccessvalue(op, class, value)
setaccessvalue(op, owner, value)
object *op;
object *class;
object *owner;
object *value;
{
register accessobject *ap;
Expand All @@ -146,7 +142,7 @@ setaccessvalue(op, class, value)
}
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");
return -1;
}
Expand Down Expand Up @@ -227,17 +223,20 @@ typecheck(value, type)
}

static int
classcheck(caller, owner, access, mode)
ownercheck(caller, owner, access, mode)
object *caller;
object *owner;
int access;
int mode;
{
if (caller == owner && owner != NULL)
return access & mode & (AC_PRIVATE|AC_PROTECTED|AC_PUBLIC);
if (caller != NULL && owner != NULL && issubclass(caller, owner))
return access & mode & (AC_PROTECTED|AC_PUBLIC);
return access & mode & AC_PUBLIC;
int mask = AC_PUBLIC;
if (owner != NULL) {
if (caller == owner)
mask |= AC_PRIVATE | AC_PROTECTED;
else if (is_classobject(owner) && issubclass(caller, owner))
mask |= AC_PROTECTED;
}
return access & mode & mask;
}

/* Access methods */
Expand All @@ -247,7 +246,7 @@ access_dealloc(ap)
accessobject *ap;
{
XDECREF(ap->ac_value);
XDECREF(ap->ac_class);
XDECREF(ap->ac_owner);
XDECREF(ap->ac_type);
DEL(ap);
}
Expand All @@ -256,7 +255,7 @@ access_dealloc(ap)

static struct memberlist access_memberlist[] = {
{"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_mode", T_INT, OFF(ac_mode)},
{NULL} /* Sentinel */
Expand All @@ -275,12 +274,21 @@ access_repr(ap)
accessobject *ap;
{
char buf[300];
classobject *class = (classobject *)ap->ac_class;
char buf2[20];
char *ownername;
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,
"<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),
class ? getstringvalue(class->cl_name) : "-",
ownername,
type ? type->tp_name : "-",
ap->ac_mode);
return newstringobject(buf);
Expand All @@ -305,7 +313,8 @@ typeobject Accesstype = {
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 mechanism for type objects... */
Expand Down
Loading

0 comments on commit eb6b33a

Please sign in to comment.