From 10153690d1eafad2f3bdbedda1e00d2d6b1b16dc Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 20 Aug 2007 21:49:21 +0200 Subject: [PATCH] ad functionality to get notified about object add/remove to GC --- libswfdec/swfdec_as_context.c | 9 +++++++-- libswfdec/swfdec_as_debugger.h | 8 ++++++++ libswfdec/swfdec_as_object.c | 5 +++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 0cb02262..a135585f 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -248,7 +248,7 @@ swfdec_as_context_remove_strings (gpointer key, gpointer value, gpointer data) } static gboolean -swfdec_as_context_remove_objects (gpointer key, gpointer value, gpointer data) +swfdec_as_context_remove_objects (gpointer key, gpointer value, gpointer debugger) { SwfdecAsObject *object; @@ -262,6 +262,11 @@ swfdec_as_context_remove_objects (gpointer key, gpointer value, gpointer data) } else { SWFDEC_LOG ("deleted: %s %p", G_OBJECT_TYPE_NAME (object), object); swfdec_as_object_collect (object); + if (debugger) { + SwfdecAsDebuggerClass *klass = SWFDEC_AS_DEBUGGER_GET_CLASS (debugger); + if (klass->remove) + klass->remove (debugger, object->context, object); + } return TRUE; } } @@ -274,7 +279,7 @@ swfdec_as_context_collect (SwfdecAsContext *context) g_hash_table_foreach_remove (context->strings, swfdec_as_context_remove_strings, context); g_hash_table_foreach_remove (context->objects, - swfdec_as_context_remove_objects, context); + swfdec_as_context_remove_objects, context->debugger); SWFDEC_INFO (">> done collecting garbage"); } diff --git a/libswfdec/swfdec_as_debugger.h b/libswfdec/swfdec_as_debugger.h index 4a0f952a..61aaae68 100644 --- a/libswfdec/swfdec_as_debugger.h +++ b/libswfdec/swfdec_as_debugger.h @@ -43,6 +43,14 @@ struct _SwfdecAsDebugger { struct _SwfdecAsDebuggerClass { GObjectClass object_class; + /* a new object was added to the GC */ + void (* add) (SwfdecAsDebugger * debugger, + SwfdecAsContext * context, + SwfdecAsObject * object); + /* an object was removed from the GC */ + void (* remove) (SwfdecAsDebugger * debugger, + SwfdecAsContext * context, + SwfdecAsObject * object); /* called before executing a bytecode */ void (* step) (SwfdecAsDebugger * debugger, SwfdecAsContext * context); diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index d0418030..bd2cf901 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -528,6 +528,11 @@ swfdec_as_object_add (SwfdecAsObject *object, SwfdecAsContext *context, gsize si klass = SWFDEC_AS_OBJECT_GET_CLASS (object); g_return_if_fail (klass->add); klass->add (object); + if (context->debugger) { + SwfdecAsDebuggerClass *dklass = SWFDEC_AS_DEBUGGER_GET_CLASS (context->debugger); + if (dklass->add) + dklass->add (context->debugger, context, object); + } } void -- 2.11.4.GIT