summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-08-25 13:55:15 +0000
committerGustavo J. A. M. Carneiro <gjc@src.gnome.org>2005-08-25 13:55:15 +0000
commitbb3fd87e80190212fc0ae4d629d286015a5d2de6 (patch)
treeb9d50ee1f14ca9b1633104a2d49b2fb6596af689
parentf0ea5354d8b616022928b45c6dd4d76e15301347 (diff)
downloadpygobject-bb3fd87e80190212fc0ae4d629d286015a5d2de6.tar.gz
pygobject-bb3fd87e80190212fc0ae4d629d286015a5d2de6.tar.xz
pygobject-bb3fd87e80190212fc0ae4d629d286015a5d2de6.zip
some memory fixes in type registration
-rw-r--r--gobject/gobjectmodule.c15
-rw-r--r--gobject/pygobject-private.h2
-rw-r--r--gobject/pygobject.c13
3 files changed, 19 insertions, 11 deletions
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index c6420ab..c4b5e9c 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 1055011..17546c2 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 84f6ef7..1a16e37 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;
}