diff options
author | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-08-25 13:55:15 +0000 |
---|---|---|
committer | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-08-25 13:55:15 +0000 |
commit | bb3fd87e80190212fc0ae4d629d286015a5d2de6 (patch) | |
tree | b9d50ee1f14ca9b1633104a2d49b2fb6596af689 | |
parent | f0ea5354d8b616022928b45c6dd4d76e15301347 (diff) | |
download | pygobject-bb3fd87e80190212fc0ae4d629d286015a5d2de6.tar.gz |
some memory fixes in type registration
-rw-r--r-- | gobject/gobjectmodule.c | 15 | ||||
-rw-r--r-- | gobject/pygobject-private.h | 2 | ||||
-rw-r--r-- | gobject/pygobject.c | 13 |
3 files changed, 19 insertions, 11 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index c6420aba..c4b5e9ce 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -1099,7 +1099,7 @@ pygobject__g_instance_init(GTypeInstance *instance, } int -pyg_type_register(PyTypeObject *class, char *type_name) +pyg_type_register(PyTypeObject *class, const char *type_name) { PyObject *gtype, *gsignals, *gproperties, *overridden_signals; GType parent_type, instance_type; @@ -1121,7 +1121,7 @@ pyg_type_register(PyTypeObject *class, char *type_name) 0, /* n_preallocs */ (GInstanceInitFunc) pygobject__g_instance_init }; - + gchar *new_type_name; /* find the GType of the parent */ parent_type = pyg_type_from_object((PyObject *)class); @@ -1129,8 +1129,10 @@ pyg_type_register(PyTypeObject *class, char *type_name) return -1; } - if (!type_name) - type_name = get_type_name_for_class(class); + if (type_name) + new_type_name = (gchar *) type_name; /* care is taken below not to free this */ + else + new_type_name = get_type_name_for_class(class); /* set class_data that will be passed to the class_init function. */ type_info.class_data = class; @@ -1141,9 +1143,10 @@ pyg_type_register(PyTypeObject *class, char *type_name) type_info.instance_size = query.instance_size; /* create new typecode */ - instance_type = g_type_register_static(parent_type, type_name, + instance_type = g_type_register_static(parent_type, new_type_name, &type_info, 0); - g_free(type_name); + if (type_name == NULL) + g_free(new_type_name); if (instance_type == 0) { PyErr_SetString(PyExc_RuntimeError, "could not create new GType"); return -1; diff --git a/gobject/pygobject-private.h b/gobject/pygobject-private.h index 10550112..17546c21 100644 --- a/gobject/pygobject-private.h +++ b/gobject/pygobject-private.h @@ -119,7 +119,7 @@ void pygobject_watch_closure (PyObject *self, GClosure *closure); void pygobject_register_sinkfunc(GType type, void (* sinkfunc)(GObject *object)); int pyg_type_register (PyTypeObject *class, - char *typename); + const gchar *typename); /* from pygboxed.c */ extern PyTypeObject PyGBoxed_Type; diff --git a/gobject/pygobject.c b/gobject/pygobject.c index 84f6ef79..1a16e371 100644 --- a/gobject/pygobject.c +++ b/gobject/pygobject.c @@ -558,6 +558,8 @@ pygobject_new_with_interfaces(GType gtype) PyObject *modules, *module; gchar *type_name, *mod_name, *gtype_name; + state = pyg_gil_state_ensure(); + interfaces = g_type_interfaces (gtype, &n_interfaces); bases = PyTuple_New(n_interfaces+1); @@ -566,6 +568,7 @@ pygobject_new_with_interfaces(GType gtype) py_parent_type = pygobject_lookup_class(parent_type); /* We will always put the parent at the first position in bases */ + Py_INCREF(py_parent_type); /* PyTuple_SetItem steals a reference */ PyTuple_SetItem(bases, 0, (PyObject*)py_parent_type); /* And traverse interfaces */ @@ -573,6 +576,7 @@ pygobject_new_with_interfaces(GType gtype) for (i = 0; i < n_interfaces; i++) { interface_type = interfaces[i]; py_interface_type = pygobject_lookup_class(interface_type); + Py_INCREF(py_interface_type); /* PyTuple_SetItem steals a reference */ PyTuple_SetItem(bases, i+1, (PyObject*)py_interface_type); } @@ -611,16 +615,14 @@ pygobject_new_with_interfaces(GType gtype) type_name = g_strconcat(mod_name, ".", gtype_name, NULL); } - state = pyg_gil_state_ensure(); - type = (PyTypeObject*)PyObject_CallFunction((PyObject*)&PyType_Type, "sOO", + type = (PyTypeObject*)PyObject_CallFunction((PyObject*)&PyType_Type, "sNN", type_name, bases, dict); g_free(type_name); - pyg_gil_state_release(state); - if (type == NULL) { PyErr_Print(); + pyg_gil_state_release(state); return NULL; } @@ -637,6 +639,7 @@ pygobject_new_with_interfaces(GType gtype) if (PyType_Ready(type) < 0) { g_warning ("couldn't make the type `%s' ready", type->tp_name); + pyg_gil_state_release(state); return NULL; } @@ -651,6 +654,8 @@ pygobject_new_with_interfaces(GType gtype) Py_INCREF(type); g_type_set_qdata(gtype, pygobject_class_key, type); + pyg_gil_state_release(state); + return type; } |