Modified:
trunk/gom/ChangeLog
trunk/gom/include/gom/gomgcmanager.h
trunk/gom/include/gom/gomglist.h
trunk/gom/src/gom/gom.c
trunk/gom/src/libgom/gomdoc.c
trunk/gom/src/libgom/gomgcmanager.c
trunk/gom/src/libgom/gomglist.c
trunk/gom/src/libgom/gomjseventlistener.c
trunk/gom/src/libgom/gomjseventtarget.c
trunk/gom/src/libgom/gomjsobject.c
trunk/gom/src/libgom/gomjswindow.c
trunk/gom/src/libgom/gomnoodle.c
trunk/gom/src/libgom/gomwidget.c
Log:
2008-07-19 jacob berkman <ja...@ilovegome.org>
* src/libgom/gomjseventlistener.c (gom_js_event_listener_set_property):
don't add a named root for our JSObject
(gom_js_event_listener_mark_live_objects): mark our JSObject
(gom_js_event_listener_class_init): remove dispose handler; our
JSObject will just get GCd now
* src/libgom/gomwidget.c (gom_widget_get_property): don't leak a
NodeList
* src/libgom/gomdoc.c (gom_doc_get_elements_by_tag_name_ns): clean
up our list of nodes when we're done with it
* src/libgom/gomjswindow.c (gom_js_window_parser_start_element):
unref the DomImplementation when we're done with it
* src/libgom/gomjseventtarget.c (gom_js_event_target_add_event_listener):
if we have created a GomJSEventListener, unref it before we return
* src/libgom/gomglist.c (gom_g_list_set_property): copy the
passed-in list, and ref each item ourselves
(gom_g_list_class_init): add a construct-only nodes property
* src/libgom/gomnoodle.c (gom_noodle_get_property): don't leak the
node list, and free the glist too
* src/libgom/gomjsobject.c (gom_js_object_set_g_object):
* src/gom/gom.c (main): use the gc manager for fun and profit
* src/libgom/gomgcmanager.c (gom_gc_manager_mark_live_objects):
* include/gom/gomgcmanager.h (gom_gc_manager_mark_live_objects):
remove ill-concieved function
* include/gom/gomglist.h (gom_g_list_new): remove superfluous api
Modified: trunk/gom/ChangeLog
==============================================================================
--- trunk/gom/ChangeLog (original)
+++ trunk/gom/ChangeLog Sat Jul 19 15:59:59 2008
@@ -1,3 +1,39 @@
+2008-07-19 jacob berkman <ja...@ilovegome.org>
+
+ * src/libgom/gomjseventlistener.c (gom_js_event_listener_set_property):
+ don't add a named root for our JSObject
+ (gom_js_event_listener_mark_live_objects): mark our JSObject
+ (gom_js_event_listener_class_init): remove dispose handler; our
+ JSObject will just get GCd now
+
+ * src/libgom/gomwidget.c (gom_widget_get_property): don't leak a
+ NodeList
+
+ * src/libgom/gomdoc.c (gom_doc_get_elements_by_tag_name_ns): clean
+ up our list of nodes when we're done with it
+
+ * src/libgom/gomjswindow.c (gom_js_window_parser_start_element):
+ unref the DomImplementation when we're done with it
+
+ * src/libgom/gomjseventtarget.c (gom_js_event_target_add_event_listener):
+ if we have created a GomJSEventListener, unref it before we return
+
+ * src/libgom/gomglist.c (gom_g_list_set_property): copy the
+ passed-in list, and ref each item ourselves
+ (gom_g_list_class_init): add a construct-only nodes property
+
+ * src/libgom/gomnoodle.c (gom_noodle_get_property): don't leak the
+ node list, and free the glist too
+
+ * src/libgom/gomjsobject.c (gom_js_object_set_g_object):
+ * src/gom/gom.c (main): use the gc manager for fun and profit
+
+ * src/libgom/gomgcmanager.c (gom_gc_manager_mark_live_objects):
+ * include/gom/gomgcmanager.h (gom_gc_manager_mark_live_objects):
+ remove ill-concieved function
+
+ * include/gom/gomglist.h (gom_g_list_new): remove superfluous api
+
2008-07-18 jacob berkman <ja...@ilovegom.org>
* configure.ac: bump version to 0.2, tweak mozilla checks for latest
js tarball
Modified: trunk/gom/include/gom/gomgcmanager.h
==============================================================================
--- trunk/gom/include/gom/gomgcmanager.h (original)
+++ trunk/gom/include/gom/gomgcmanager.h Sat Jul 19 15:59:59 2008
@@ -29,12 +29,7 @@
G_BEGIN_DECLS
void gom_gc_manager_manage_runtime (JSRuntime *runtime);
-
-void gom_gc_manager_manage_object (JSContext *cx, GomGCManaged *obj);
-
-void gom_gc_manager_mark_live_objects (GomGCManaged *managed,
- JSContext *cx,
- JSGCStatus status);
+void gom_gc_manager_manage_object (JSContext *cx, GomGCManaged *obj);
G_END_DECLS
Modified: trunk/gom/include/gom/gomglist.h
==============================================================================
--- trunk/gom/include/gom/gomglist.h (original)
+++ trunk/gom/include/gom/gomglist.h Sat Jul 19 15:59:59 2008
@@ -56,8 +56,6 @@
GType gom_g_list_get_type (void);
-GomNodeList *gom_g_list_new (GList *glist);
-
G_END_DECLS
#endif /* GOM_G_LIST_H */
Modified: trunk/gom/src/gom/gom.c
==============================================================================
--- trunk/gom/src/gom/gom.c (original)
+++ trunk/gom/src/gom/gom.c Sat Jul 19 15:59:59 2008
@@ -23,9 +23,7 @@
*/
#include "config.h"
-#ifdef GOM_USE_GC_MANAGER
#include "gom/gomgcmanager.h"
-#endif
#include "gom/gomjscontext.h"
#include "gom/gomjswindow.h"
#include "gom/gomjsobject.h"
@@ -106,9 +104,7 @@
rt = JS_NewRuntime (0x100000);
-#ifdef GOM_GC_MANAGER_H
gom_gc_manager_manage_runtime (rt);
-#endif
d.cx = JS_NewContext (rt, 0x1000);
Modified: trunk/gom/src/libgom/gomdoc.c
==============================================================================
--- trunk/gom/src/libgom/gomdoc.c (original)
+++ trunk/gom/src/libgom/gomdoc.c Sat Jul 19 15:59:59 2008
@@ -392,16 +392,22 @@
const char *namespace_uri,
const char *qualified_name)
{
- GomNode *node;
- GList *li;
+ GomNodeList *ret;
+ GomNode *node;
+ GList *li;
g_object_get (doc, "document-element", &node, NULL);
- li = get_elements_by_tag_name (NULL, node, namespace_uri, qualified_name);
+ li = g_list_reverse (get_elements_by_tag_name (NULL, node,
namespace_uri, qualified_name));
g_object_unref (node);
- return gom_g_list_new (g_list_reverse (li));
+ ret = GOM_NODE_LIST (g_object_new (GOM_TYPE_G_LIST, "nodes", li, NULL));
+
+ g_list_foreach (li, (GFunc)g_object_unref, NULL);
+ g_list_free (li);
+
+ return ret;
}
static GomNodeList *
Modified: trunk/gom/src/libgom/gomgcmanager.c
==============================================================================
--- trunk/gom/src/libgom/gomgcmanager.c (original)
+++ trunk/gom/src/libgom/gomgcmanager.c Sat Jul 19 15:59:59 2008
@@ -23,7 +23,6 @@
*/
#include "config.h"
-#ifdef GOM_USE_GC_MANAGER
#include "gom/gomgcmanager.h"
#include "gom/gomjscontext.h"
@@ -62,6 +61,7 @@
void
gom_gc_manager_manage_runtime (JSRuntime *runtime)
{
+ g_message (G_STRLOC": managing runtime %p", runtime);
JS_SetGCCallbackRT (runtime, gom_gc_manager_run);
}
@@ -90,27 +90,8 @@
g_object_weak_ref (G_OBJECT (obj), gom_gc_manager_unregister, cx);
}
-void
-gom_gc_manager_mark_live_objects (GomGCManaged *managed,
- JSContext *cx,
- JSGCStatus status)
-{
- JSObject *jsobj;
-
- jsobj = gom_js_object_get_js_object (cx, managed);
- if (!jsobj) {
- g_warning(G_STRLOC": could not get a js object while marking
live objects for %p",
- managed);
- } else if (!JS_IsAboutToBeFinalized (cx, jsobj)) {
- g_message (G_STRLOC": Marking a %s live...",
- g_type_name (G_TYPE_FROM_INSTANCE (managed)));
- JS_MarkGCThing (cx, jsobj, g_type_name (G_TYPE_FROM_INSTANCE
(managed)), NULL);
- }
-}
-
GOM_DEFINE_INTERFACE (GomGCManaged, gom_gc_managed, {});
GOM_STUB_VOID(GOM_GC_MANAGED, gom_gc_managed, mark_live_objects,
(GomGCManaged *gom_gc_managed, JSContext *cx, JSGCStatus status),
(gom_gc_managed, cx, status));
-#endif /* GOM_USE_GC_MANAGER */
Modified: trunk/gom/src/libgom/gomglist.c
==============================================================================
--- trunk/gom/src/libgom/gomglist.c (original)
+++ trunk/gom/src/libgom/gomglist.c Sat Jul 19 15:59:59 2008
@@ -30,7 +30,8 @@
#include "gommacros.h"
enum {
- PROP_LENGTH = 1
+ PROP_NODES = 1,
+ PROP_LENGTH
};
typedef struct {
@@ -44,6 +45,26 @@
#define PRIV(i) (G_TYPE_INSTANCE_GET_PRIVATE ((i), GOM_TYPE_G_LIST, GomGListPrivate))
static void
+gom_g_list_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GomGListPrivate *priv = PRIV (object);
+ switch (property_id) {
+ case PROP_NODES:
+ priv->glist = priv->last_node = g_list_copy (g_value_get_pointer (value));
+ g_list_foreach (priv->glist, (GFunc)g_object_ref, NULL);
+ priv->length = g_list_length (priv->glist);
+ priv->last_index = 0;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
gom_g_list_get_property (GObject *object,
guint property_id,
GValue *value,
@@ -75,22 +96,6 @@
G_DEFINE_TYPE_WITH_CODE (GomGList, gom_g_list, G_TYPE_OBJECT,
GOM_IMPLEMENT_INTERFACE (NODE_LIST,
node_list, gom_g_list));
-GomNodeList *
-gom_g_list_new (GList *glist)
-{
- GomGList *list;
- GomGListPrivate *priv;
-
- list = g_object_new (GOM_TYPE_G_LIST, NULL);
- priv = PRIV (list);
-
- priv->glist = priv->last_node = glist;
- priv->length = g_list_length (glist);
- priv->last_index = 0;
-
- return GOM_NODE_LIST (list);
-}
-
static void gom_g_list_init (GomGList *self) { }
static void
@@ -116,7 +121,13 @@
g_type_class_add_private (klass, sizeof (GomGListPrivate));
g_class->get_property = gom_g_list_get_property;
+ g_class->set_property = gom_g_list_set_property;
g_class->dispose = gom_g_list_dispose;
+
+ g_object_class_install_property (g_class, PROP_NODES,
+ g_param_spec_pointer ("nodes", NULL,
+ "The list of nodes.",
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
g_object_class_override_property (g_class, PROP_LENGTH, "length");
}
Modified: trunk/gom/src/libgom/gomjseventlistener.c
==============================================================================
--- trunk/gom/src/libgom/gomjseventlistener.c (original)
+++ trunk/gom/src/libgom/gomjseventlistener.c Sat Jul 19 15:59:59 2008
@@ -27,6 +27,7 @@
#include "gom/dom/gomeventlistener.h"
#include "gom/dom/gomeventtarget.h"
+#include "gom/gomgcmanaged.h"
#include "gom/gomjsobject.h"
#include "gommacros.h"
@@ -66,10 +67,8 @@
g_warning (G_STRLOC": Object is already set on %p", object);
} else if (!priv->cx) {
g_warning (G_STRLOC": Context needs to be set on %p before
object", object);
- } else {
- priv->obj = g_value_get_pointer (value);
- JS_AddNamedRoot (priv->cx, &priv->obj, "EventListener.obj");
}
+ priv->obj = g_value_get_pointer (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -120,32 +119,33 @@
}
}
+static void
+gom_js_event_listener_mark_live_objects (GomGCManaged *managed,
+ JSContext *cx,
+ JSGCStatus status)
+{
+ GomJSEventListenerPrivate *priv = PRIV (managed);
+
+ g_assert (priv->cx == cx);
+
+ if (!JS_IsAboutToBeFinalized (cx, priv->obj)) {
+ g_message (G_STRLOC": Marking a %s live...", JS_GET_CLASS (cx, priv->obj)->name);
+ JS_MarkGCThing (cx, priv->obj, g_type_name
(G_TYPE_FROM_INSTANCE (managed)), NULL);
+ }
+}
+
GOM_IMPLEMENT (EVENT_LISTENER, event_listener, gom_js_event_listener);
+GOM_IMPLEMENT (GC_MANAGED, gc_managed, gom_js_event_listener);
G_DEFINE_TYPE_WITH_CODE (GomJSEventListener, gom_js_event_listener, G_TYPE_OBJECT,
- GOM_IMPLEMENT_INTERFACE (EVENT_LISTENER,
event_listener, gom_js_event_listener));
+ {
+ GOM_IMPLEMENT_INTERFACE (EVENT_LISTENER, event_listener, gom_js_event_listener);
+ GOM_IMPLEMENT_INTERFACE (GC_MANAGED, gc_managed, gom_js_event_listener);
+ });
static void gom_js_event_listener_init (GomJSEventListener *listener)
{ }
static void
-gom_js_event_listener_dispose (GObject *obj)
-{
- GomJSEventListenerPrivate *priv = PRIV (obj);
- g_print (G_STRLOC": %s %p\n", g_type_name (G_TYPE_FROM_INSTANCE
(obj)), obj);
- if (priv->obj) {
- if (!priv->cx) {
- g_warning (G_STRLOC": %p has an Object but no Context", obj);
- } else {
- JS_RemoveRoot (priv->cx, &priv->obj);
- priv->cx = NULL;
- }
- priv->obj = NULL;
- }
-
- G_OBJECT_CLASS (gom_js_event_listener_parent_class)->dispose (obj);
-}
-
-static void
gom_js_event_listener_class_init (GomJSEventListenerClass *klass)
{
GObjectClass *oclass = G_OBJECT_CLASS (klass);
@@ -153,7 +153,6 @@
g_type_class_add_private (klass, sizeof (GomJSEventListenerPrivate));
oclass->set_property = gom_js_event_listener_set_property;
- oclass->dispose = gom_js_event_listener_dispose;
g_object_class_install_property (
oclass, PROP_JS_CONTEXT,
Modified: trunk/gom/src/libgom/gomjseventtarget.c
==============================================================================
--- trunk/gom/src/libgom/gomjseventtarget.c (original)
+++ trunk/gom/src/libgom/gomjseventtarget.c Sat Jul 19 15:59:59 2008
@@ -64,6 +64,7 @@
char *type_name;
GomEventListener *listener;
JSBool use_capture;
+ gboolean unref_listener = FALSE;
target = gom_js_object_get_g_object (cx, obj);
if (!GOM_IS_EVENT_TARGET (target)) {
@@ -79,11 +80,16 @@
"js-context", cx,
"js-object", js_listener,
NULL);
+ unref_listener = TRUE;
} else if (!GOM_IS_EVENT_LISTENER (listener)) {
return JS_FALSE;
}
gom_event_target_add_event_listener (target, type_name, listener, use_capture);
+
+ if (unref_listener) {
+ g_object_unref (listener);
+ }
return JS_TRUE;
}
Modified: trunk/gom/src/libgom/gomjsobject.c
==============================================================================
--- trunk/gom/src/libgom/gomjsobject.c (original)
+++ trunk/gom/src/libgom/gomjsobject.c Sat Jul 19 15:59:59 2008
@@ -26,9 +26,8 @@
#include "gom/gomjsobject.h"
#include "gom/gomcamel.h"
-#ifdef GOM_USE_GC_MANAGER
+
#include "gom/gomgcmanager.h"
-#endif
#include "gom/gomjscontext.h"
#include "gom/gomobject.h"
#include "gom/gomvalue.h"
@@ -566,11 +565,9 @@
#endif
g_hash_table_insert (JS2G (cx), jsobj, g_object_ref (gobject));
g_hash_table_insert (G2JS (cx), gobject, jsobj);
-#ifdef GOM_GC_MANAGER_H
if (GOM_IS_GC_MANAGED (gobject)) {
gom_gc_manager_manage_object (cx, gobject);
}
-#endif
}
gpointer
Modified: trunk/gom/src/libgom/gomjswindow.c
==============================================================================
--- trunk/gom/src/libgom/gomjswindow.c (original)
+++ trunk/gom/src/libgom/gomjswindow.c Sat Jul 19 15:59:59 2008
@@ -428,6 +428,7 @@
GomDOMImplementation *dom;
dom = g_object_new (GOM_TYPE_DOM, NULL);
data->doc = gom_dom_implementation_create_document (dom,
namespace, element_name, NULL, error);
+ g_object_unref (dom);
if (data->doc) {
data->jsdoc = gom_js_object_get_or_create_js_object
(data->cx, data->doc);
JS_DefineProperty (data->cx, data->window, "document",
Modified: trunk/gom/src/libgom/gomnoodle.c
==============================================================================
--- trunk/gom/src/libgom/gomnoodle.c (original)
+++ trunk/gom/src/libgom/gomnoodle.c Sat Jul 19 15:59:59 2008
@@ -95,9 +95,13 @@
case PROP_PARENT_NODE:
g_value_set_object (value, priv->parent_node);
break;
- case PROP_CHILD_NODES:
- g_value_set_object (value, priv->children ? gom_g_list_new
(priv->children) : NULL);
+ case PROP_CHILD_NODES: {
+ GomNodeList *nodes;
+ nodes = g_object_new (GOM_TYPE_G_LIST, "nodes", priv->children, NULL);
+ g_value_set_object (value, nodes);
+ g_object_unref (nodes);
break;
+ }
case PROP_FIRST_CHILD:
g_value_set_object (value, priv->children ?
priv->children->data : NULL);
break;
Modified: trunk/gom/src/libgom/gomwidget.c
==============================================================================
--- trunk/gom/src/libgom/gomwidget.c (original)
+++ trunk/gom/src/libgom/gomwidget.c Sat Jul 19 15:59:59 2008
@@ -457,12 +457,18 @@
case PROP_PARENT_NODE:
g_value_set_object (value, priv->parent_node);
break;
- case PROP_CHILD_NODES:
- g_value_set_object (value,
- GTK_IS_CONTAINER (object)
- ? gom_g_list_new
(gtk_container_get_children (GTK_CONTAINER (object)))
- : NULL);
- break;
+ case PROP_CHILD_NODES: {
+ GomNodeList *nodes;
+ GList *li;
+ li = GTK_IS_CONTAINER (object)
+ ? gtk_container_get_children (GTK_CONTAINER (object))
+ : NULL;
+ nodes = g_object_new (GOM_TYPE_G_LIST, "nodes", li, NULL);
+ g_value_set_object (value, nodes);
+ g_object_unref (nodes);
+ g_list_free (li);
+ break;
+ }
case PROP_FIRST_CHILD:
if (GTK_IS_CONTAINER (object)) {
children = gtk_container_get_children (GTK_CONTAINER (object));