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

Use getargs() everywhere now. Standardize lay-out yet more (an ongoing

project :-).  Change object administration: objects are removed from the
list of known objects as soon as their form is destroyed.
parent 3d1e1460
...@@ -120,6 +120,30 @@ findgeneric(generic) ...@@ -120,6 +120,30 @@ findgeneric(generic)
return NULL; /* Unknown object */ return NULL; /* Unknown object */
} }
/* Remove an object from the list of known objects */
static void
forgetgeneric(g)
genericobject *g;
{
int i, n;
XDECREF(g->ob_callback);
g->ob_callback = NULL;
XDECREF(g->ob_callback_arg);
g->ob_callback_arg = NULL;
if (allgenerics == NULL)
return; /* No objects known yet */
n = getlistsize(allgenerics);
for (i = 0; i < n; i++) {
if (g == (genericobject *)getlistitem(allgenerics, i)) {
setlistitem(allgenerics, i, (object *)NULL);
nfreeslots++;
break;
}
}
}
/* Called when a form is about to be freed -- /* Called when a form is about to be freed --
remove all the objects that we know about from it. */ remove all the objects that we know about from it. */
...@@ -137,15 +161,17 @@ releaseobjects(form) ...@@ -137,15 +161,17 @@ releaseobjects(form)
g = (genericobject *)getlistitem(allgenerics, i); g = (genericobject *)getlistitem(allgenerics, i);
if (g != NULL && g->ob_generic->form == form) { if (g != NULL && g->ob_generic->form == form) {
fl_delete_object(g->ob_generic); fl_delete_object(g->ob_generic);
if (g->ob_refcnt == 1) { /* The object is now unreachable for
/* The object is now unreachable: do_forms and check_forms, so
delete it from the list of known objects */ delete it from the list of known objects */
XDECREF(g->ob_callback);
g->ob_callback = NULL;
XDECREF(g->ob_callback_arg);
g->ob_callback_arg = NULL;
setlistitem(allgenerics, i, (object *)NULL); setlistitem(allgenerics, i, (object *)NULL);
nfreeslots++; nfreeslots++;
} }
} }
}
/* XXX Should also get rid of objects with refcnt==1 */
} }
...@@ -198,7 +224,8 @@ generic_delete_object(g, args) ...@@ -198,7 +224,8 @@ generic_delete_object(g, args)
{ {
object *res; object *res;
res = generic_call(g, args, fl_delete_object); res = generic_call(g, args, fl_delete_object);
/* XXX Should remove it from the list of known objects */ if (res != NULL)
forgetgeneric(g);
return res; return res;
} }
...@@ -262,6 +289,8 @@ generic_dealloc(g) ...@@ -262,6 +289,8 @@ generic_dealloc(g)
genericobject *g; genericobject *g;
{ {
fl_free_object(g->ob_generic); fl_free_object(g->ob_generic);
XDECREF(g->ob_callback);
XDECREF(g->ob_callback_arg);
DEL(g); DEL(g);
} }
...@@ -358,10 +387,20 @@ generic_setattr(g, name, v) ...@@ -358,10 +387,20 @@ generic_setattr(g, name, v)
return ret; return ret;
} }
static object *
generic_repr(g)
genericobject *g;
{
char buf[100];
sprintf(buf, "<FORMS_object at %lx, objclass=%d>",
(long)g, g->ob_generic->objclass);
return newstringobject(buf);
}
typeobject GenericObjecttype = { typeobject GenericObjecttype = {
OB_HEAD_INIT(&Typetype) OB_HEAD_INIT(&Typetype)
0, /*ob_size*/ 0, /*ob_size*/
"generic FORMS object", /*tp_name*/ "FORMS_object", /*tp_name*/
sizeof(genericobject), /*tp_size*/ sizeof(genericobject), /*tp_size*/
0, /*tp_itemsize*/ 0, /*tp_itemsize*/
/* methods */ /* methods */
...@@ -370,7 +409,7 @@ typeobject GenericObjecttype = { ...@@ -370,7 +409,7 @@ typeobject GenericObjecttype = {
generic_getattr, /*tp_getattr*/ generic_getattr, /*tp_getattr*/
generic_setattr, /*tp_setattr*/ generic_setattr, /*tp_setattr*/
0, /*tp_compare*/ 0, /*tp_compare*/
0, /*tp_repr*/ generic_repr, /*tp_repr*/
}; };
static object * static object *
...@@ -1306,7 +1345,8 @@ set_positioner_xbounds (g, args) ...@@ -1306,7 +1345,8 @@ set_positioner_xbounds (g, args)
genericobject *g; genericobject *g;
object *args; object *args;
{ {
return call_forms_INfINf (fl_set_positioner_xbounds, g-> ob_generic, args); return call_forms_INfINf (fl_set_positioner_xbounds,
g-> ob_generic, args);
} }
static object * static object *
...@@ -1322,7 +1362,8 @@ set_positioner_ybounds (g, args) ...@@ -1322,7 +1362,8 @@ set_positioner_ybounds (g, args)
genericobject *g; genericobject *g;
object *args; object *args;
{ {
return call_forms_INfINf (fl_set_positioner_ybounds, g-> ob_generic, args); return call_forms_INfINf (fl_set_positioner_ybounds,
g-> ob_generic, args);
} }
static object * static object *
...@@ -1338,7 +1379,8 @@ get_positioner_xbounds (g, args) ...@@ -1338,7 +1379,8 @@ get_positioner_xbounds (g, args)
genericobject *g; genericobject *g;
object *args; object *args;
{ {
return call_forms_OUTfOUTf (fl_get_positioner_xbounds, g-> ob_generic, args); return call_forms_OUTfOUTf (fl_get_positioner_xbounds,
g-> ob_generic, args);
} }
static object * static object *
...@@ -1354,7 +1396,8 @@ get_positioner_ybounds (g, args) ...@@ -1354,7 +1396,8 @@ get_positioner_ybounds (g, args)
genericobject *g; genericobject *g;
object *args; object *args;
{ {
return call_forms_OUTfOUTf (fl_get_positioner_ybounds, g-> ob_generic, args); return call_forms_OUTfOUTf (fl_get_positioner_ybounds,
g-> ob_generic, args);
} }
static struct methodlist positioner_methods[] = { static struct methodlist positioner_methods[] = {
...@@ -1469,12 +1512,19 @@ form_add_object(f, args) ...@@ -1469,12 +1512,19 @@ form_add_object(f, args)
formobject *f; formobject *f;
object *args; object *args;
{ {
genericobject *g;
if (args == NULL || !is_genericobject(args)) { if (args == NULL || !is_genericobject(args)) {
err_badarg(); err_badarg();
return NULL; return NULL;
} }
g = (genericobject *)args;
fl_add_object(f->ob_form, ((genericobject *)args) -> ob_generic); if (findgeneric(g->ob_generic) != NULL) {
err_setstr(RuntimeError,
"add_object of object already in a form");
return NULL;
}
fl_add_object(f->ob_form, g->ob_generic);
knowgeneric(g);
INCREF(None); INCREF(None);
return None; return None;
...@@ -1877,10 +1927,20 @@ form_setattr(f, name, v) ...@@ -1877,10 +1927,20 @@ form_setattr(f, name, v)
return setmember((char *)f->ob_form, form_memberlist, name, v); return setmember((char *)f->ob_form, form_memberlist, name, v);
} }
static object *
form_repr(f)
formobject *f;
{
char buf[100];
sprintf(buf, "<FORMS_form at %lx, window=%ld>",
(long)f, f->ob_form->window);
return newstringobject(buf);
}
typeobject Formtype = { typeobject Formtype = {
OB_HEAD_INIT(&Typetype) OB_HEAD_INIT(&Typetype)
0, /*ob_size*/ 0, /*ob_size*/
"form", /*tp_name*/ "FORMS_form", /*tp_name*/
sizeof(formobject), /*tp_size*/ sizeof(formobject), /*tp_size*/
0, /*tp_itemsize*/ 0, /*tp_itemsize*/
/* methods */ /* methods */
...@@ -1889,7 +1949,7 @@ typeobject Formtype = { ...@@ -1889,7 +1949,7 @@ typeobject Formtype = {
form_getattr, /*tp_getattr*/ form_getattr, /*tp_getattr*/
form_setattr, /*tp_setattr*/ form_setattr, /*tp_setattr*/
0, /*tp_compare*/ 0, /*tp_compare*/
0, /*tp_repr*/ form_repr, /*tp_repr*/
}; };
static object * static object *
...@@ -2090,8 +2150,8 @@ forms_qdevice(self, args) ...@@ -2090,8 +2150,8 @@ forms_qdevice(self, args)
object *self; object *self;
object *args; object *args;
{ {
short arg1 ; short arg1;
if (!getishortarg(args, 1, 0, &arg1)) if (!getargs(args, "h", &arg1))
return NULL; return NULL;
fl_qdevice(arg1); fl_qdevice(arg1);
INCREF(None); INCREF(None);
...@@ -2103,8 +2163,8 @@ forms_unqdevice(self, args) ...@@ -2103,8 +2163,8 @@ forms_unqdevice(self, args)
object *self; object *self;
object *args; object *args;
{ {
short arg1 ; short arg1;
if (!getishortarg(args, 1, 0, &arg1)) if (!getargs(args, "h", &arg1))
return NULL; return NULL;
fl_unqdevice(arg1); fl_unqdevice(arg1);
INCREF(None); INCREF(None);
...@@ -2117,8 +2177,8 @@ forms_isqueued(self, args) ...@@ -2117,8 +2177,8 @@ forms_isqueued(self, args)
object *args; object *args;
{ {
long retval; long retval;
short arg1 ; short arg1;
if (!getishortarg(args, 1, 0, &arg1)) if (!getargs(args, "h", &arg1))
return NULL; return NULL;
retval = fl_isqueued(arg1); retval = fl_isqueued(arg1);
...@@ -2142,11 +2202,12 @@ forms_qread(self, args) ...@@ -2142,11 +2202,12 @@ forms_qread(self, args)
object *args; object *args;
{ {
long retval; long retval;
short arg1 ; short arg1;
BGN_SAVE BGN_SAVE
retval = fl_qread(&arg1); retval = fl_qread(&arg1);
END_SAVE END_SAVE
{ object *v = newtupleobject(2); {
object *v = newtupleobject(2);
if (v == NULL) return NULL; if (v == NULL) return NULL;
settupleitem(v, 0, newintobject(retval)); settupleitem(v, 0, newintobject(retval));
settupleitem(v, 1, newintobject((long)arg1)); settupleitem(v, 1, newintobject((long)arg1));
...@@ -2171,11 +2232,8 @@ forms_qenter(self, args) ...@@ -2171,11 +2232,8 @@ forms_qenter(self, args)
object *self; object *self;
object *args; object *args;
{ {
short arg1 ; short arg1, arg2;
short arg2 ; if (!getargs(args, "(hh)", &arg1, &arg2))
if (!getishortarg(args, 2, 0, &arg1))
return NULL;
if (!getishortarg(args, 2, 1, &arg2))
return NULL; return NULL;
fl_qenter(arg1, arg2); fl_qenter(arg1, arg2);
INCREF(None); INCREF(None);
...@@ -2264,14 +2322,8 @@ forms_tie(self, args) ...@@ -2264,14 +2322,8 @@ forms_tie(self, args)
object *self; object *self;
object *args; object *args;
{ {
short arg1 ; short arg1, arg2, arg3;
short arg2 ; if (!getargs(args, "(hhh)", &arg1, &arg2, &arg3))
short arg3 ;
if (!getishortarg(args, 3, 0, &arg1))
return NULL;
if (!getishortarg(args, 3, 1, &arg2))
return NULL;
if (!getishortarg(args, 3, 2, &arg3))
return NULL; return NULL;
fl_tie(arg1, arg2, arg3); fl_tie(arg1, arg2, arg3);
INCREF(None); INCREF(None);
......
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