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.
This commit is contained in:
Guido van Rossum 1992-09-03 20:37:02 +00:00
parent 3d1e146086
commit aa7ca2dc1a
1 changed files with 248 additions and 196 deletions

View File

@ -120,6 +120,30 @@ findgeneric(generic)
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 --
remove all the objects that we know about from it. */
@ -137,15 +161,17 @@ releaseobjects(form)
g = (genericobject *)getlistitem(allgenerics, i);
if (g != NULL && g->ob_generic->form == form) {
fl_delete_object(g->ob_generic);
if (g->ob_refcnt == 1) {
/* The object is now unreachable:
/* The object is now unreachable for
do_forms and check_forms, so
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);
nfreeslots++;
}
}
}
/* XXX Should also get rid of objects with refcnt==1 */
}
@ -198,7 +224,8 @@ generic_delete_object(g, args)
{
object *res;
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;
}
@ -262,6 +289,8 @@ generic_dealloc(g)
genericobject *g;
{
fl_free_object(g->ob_generic);
XDECREF(g->ob_callback);
XDECREF(g->ob_callback_arg);
DEL(g);
}
@ -358,10 +387,20 @@ generic_setattr(g, name, v)
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 = {
OB_HEAD_INIT(&Typetype)
0, /*ob_size*/
"generic FORMS object", /*tp_name*/
"FORMS_object", /*tp_name*/
sizeof(genericobject), /*tp_size*/
0, /*tp_itemsize*/
/* methods */
@ -370,7 +409,7 @@ typeobject GenericObjecttype = {
generic_getattr, /*tp_getattr*/
generic_setattr, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
generic_repr, /*tp_repr*/
};
static object *
@ -1306,7 +1345,8 @@ set_positioner_xbounds (g, args)
genericobject *g;
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 *
@ -1322,7 +1362,8 @@ set_positioner_ybounds (g, args)
genericobject *g;
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 *
@ -1338,7 +1379,8 @@ get_positioner_xbounds (g, args)
genericobject *g;
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 *
@ -1354,7 +1396,8 @@ get_positioner_ybounds (g, args)
genericobject *g;
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[] = {
@ -1469,12 +1512,19 @@ form_add_object(f, args)
formobject *f;
object *args;
{
genericobject *g;
if (args == NULL || !is_genericobject(args)) {
err_badarg();
return NULL;
}
fl_add_object(f->ob_form, ((genericobject *)args) -> ob_generic);
g = (genericobject *)args;
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);
return None;
@ -1877,10 +1927,20 @@ form_setattr(f, 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 = {
OB_HEAD_INIT(&Typetype)
0, /*ob_size*/
"form", /*tp_name*/
"FORMS_form", /*tp_name*/
sizeof(formobject), /*tp_size*/
0, /*tp_itemsize*/
/* methods */
@ -1889,7 +1949,7 @@ typeobject Formtype = {
form_getattr, /*tp_getattr*/
form_setattr, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
form_repr, /*tp_repr*/
};
static object *
@ -2090,8 +2150,8 @@ forms_qdevice(self, args)
object *self;
object *args;
{
short arg1 ;
if (!getishortarg(args, 1, 0, &arg1))
short arg1;
if (!getargs(args, "h", &arg1))
return NULL;
fl_qdevice(arg1);
INCREF(None);
@ -2103,8 +2163,8 @@ forms_unqdevice(self, args)
object *self;
object *args;
{
short arg1 ;
if (!getishortarg(args, 1, 0, &arg1))
short arg1;
if (!getargs(args, "h", &arg1))
return NULL;
fl_unqdevice(arg1);
INCREF(None);
@ -2117,8 +2177,8 @@ forms_isqueued(self, args)
object *args;
{
long retval;
short arg1 ;
if (!getishortarg(args, 1, 0, &arg1))
short arg1;
if (!getargs(args, "h", &arg1))
return NULL;
retval = fl_isqueued(arg1);
@ -2142,11 +2202,12 @@ forms_qread(self, args)
object *args;
{
long retval;
short arg1 ;
short arg1;
BGN_SAVE
retval = fl_qread(&arg1);
END_SAVE
{ object *v = newtupleobject(2);
{
object *v = newtupleobject(2);
if (v == NULL) return NULL;
settupleitem(v, 0, newintobject(retval));
settupleitem(v, 1, newintobject((long)arg1));
@ -2171,11 +2232,8 @@ forms_qenter(self, args)
object *self;
object *args;
{
short arg1 ;
short arg2 ;
if (!getishortarg(args, 2, 0, &arg1))
return NULL;
if (!getishortarg(args, 2, 1, &arg2))
short arg1, arg2;
if (!getargs(args, "(hh)", &arg1, &arg2))
return NULL;
fl_qenter(arg1, arg2);
INCREF(None);
@ -2264,14 +2322,8 @@ forms_tie(self, args)
object *self;
object *args;
{
short arg1 ;
short arg2 ;
short arg3 ;
if (!getishortarg(args, 3, 0, &arg1))
return NULL;
if (!getishortarg(args, 3, 1, &arg2))
return NULL;
if (!getishortarg(args, 3, 2, &arg3))
short arg1, arg2, arg3;
if (!getargs(args, "(hhh)", &arg1, &arg2, &arg3))
return NULL;
fl_tie(arg1, arg2, arg3);
INCREF(None);