mirror of https://github.com/python/cpython
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:
parent
3d1e146086
commit
aa7ca2dc1a
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue