[Swfdec-commits] 16 commits - swfdec/Makefile.am swfdec/swfdec_as_context.c swfdec/swfdec_as_internal.h swfdec/swfdec_as_native_function.c swfdec/swfdec_as_native_function.h swfdec/swfdec_as_object.c swfdec/swfdec_as_object.h swfdec/swfdec_as_relay.c swfdec/swfdec_audio_load.c swfdec/swfdec.h swfdec/swfdec_net_stream_as.c swfdec/swfdec_net_stream.c swfdec/swfdec_net_stream.h swfdec/swfdec_video_movie_as.c test/swfdec_test_buffer.c test/swfdec_test_buffer.h test/swfdec_test_function.c test/swfdec_test_function.h test/swfdec_test_global.c test/swfdec_test_http_request.c test/swfdec_test_http_server.c test/swfdec_test_image.c test/swfdec_test_image.h test/swfdec_test_plugin.c test/swfdec_test_socket.c test/swfdec_test_test.c test/swfdec_test_test.h vivified/core

Benjamin Otte company at kemper.freedesktop.org
Sat Oct 25 08:28:55 PDT 2008


 swfdec/Makefile.am                 |    2 
 swfdec/swfdec.h                    |    3 
 swfdec/swfdec_as_context.c         |    3 
 swfdec/swfdec_as_internal.h        |    8 -
 swfdec/swfdec_as_native_function.c |   27 ------
 swfdec/swfdec_as_native_function.h |    7 -
 swfdec/swfdec_as_object.c          |   80 ++-----------------
 swfdec/swfdec_as_object.h          |    8 +
 swfdec/swfdec_as_relay.c           |    2 
 swfdec/swfdec_audio_load.c         |   18 ----
 swfdec/swfdec_net_stream.c         |   81 +-------------------
 swfdec/swfdec_net_stream.h         |    8 -
 swfdec/swfdec_net_stream_as.c      |  149 +++++++++++++++++++++++++++++++++++--
 swfdec/swfdec_video_movie_as.c     |    4 
 test/swfdec_test_buffer.c          |   58 +++++++-------
 test/swfdec_test_buffer.h          |   16 +--
 test/swfdec_test_function.c        |   12 +-
 test/swfdec_test_function.h        |    2 
 test/swfdec_test_global.c          |    2 
 test/swfdec_test_http_request.c    |   22 ++---
 test/swfdec_test_http_server.c     |    4 
 test/swfdec_test_image.c           |   45 ++++++-----
 test/swfdec_test_image.h           |   12 +-
 test/swfdec_test_plugin.c          |    2 
 test/swfdec_test_socket.c          |   13 +--
 test/swfdec_test_test.c            |   55 +++++++------
 test/swfdec_test_test.h            |    4 
 vivified/core/vivi_breakpoint.c    |    4 
 vivified/core/vivi_breakpoint.h    |    6 -
 vivified/core/vivi_function.c      |   11 --
 30 files changed, 321 insertions(+), 347 deletions(-)

New commits:
commit 2f4a66c50c89beeb11634806274a0e757e661dea
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 17:27:17 2008 +0200

    reenable GCing every frame
    
    This costs roughly 20% performance, but catches bugs. (like the last 3
    commits). Ergo: enable

diff --git a/test/swfdec_test_plugin.c b/test/swfdec_test_plugin.c
index bb5a013..679aac6 100644
--- a/test/swfdec_test_plugin.c
+++ b/test/swfdec_test_plugin.c
@@ -145,7 +145,7 @@ swfdec_test_plugin_swfdec_new (SwfdecTestPlugin *plugin)
   plugin->data = player = g_object_new (SWFDEC_TYPE_PLAYER, "random-seed", 0,
       "loader-type", SWFDEC_TYPE_FILE_LOADER, "socket-type", SWFDEC_TYPE_TEST_SWFDEC_SOCKET,
       "max-runtime", 0, "start-time", &the_beginning, "allow-fullscreen", TRUE,
-      NULL);
+      "memory-until-gc", 0, NULL);
 
   g_object_set_data (G_OBJECT (player), "plugin", plugin);
   g_signal_connect (player, "fscommand", G_CALLBACK (swfdec_test_plugin_swfdec_fscommand), plugin);
commit 03688ad0378d6ce0841c09153a38376da92da7e5
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 17:19:59 2008 +0200

    avoid cyclic references
    
    SwfdecAudioLoad and SwfdecLoadSound were referencing each other

diff --git a/swfdec/swfdec_audio_load.c b/swfdec/swfdec_audio_load.c
index d63da2d..f8365be 100644
--- a/swfdec/swfdec_audio_load.c
+++ b/swfdec/swfdec_audio_load.c
@@ -30,19 +30,6 @@
 
 G_DEFINE_TYPE (SwfdecAudioLoad, swfdec_audio_load, SWFDEC_TYPE_AUDIO_STREAM)
 
-static void
-swfdec_audio_load_dispose (GObject *object)
-{
-  SwfdecAudioLoad *stream = SWFDEC_AUDIO_LOAD (object);
-
-  if (stream->load != NULL) {
-    g_object_unref (stream->load);
-    stream->load = NULL;
-  }
-
-  G_OBJECT_CLASS (swfdec_audio_load_parent_class)->dispose (object);
-}
-
 static SwfdecBuffer *
 swfdec_audio_load_pull (SwfdecAudioStream *audio)
 {
@@ -60,11 +47,8 @@ swfdec_audio_load_pull (SwfdecAudioStream *audio)
 static void
 swfdec_audio_load_class_init (SwfdecAudioLoadClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   SwfdecAudioStreamClass *stream_class = SWFDEC_AUDIO_STREAM_CLASS (klass);
 
-  object_class->dispose = swfdec_audio_load_dispose;
-
   stream_class->pull = swfdec_audio_load_pull;
 }
 
@@ -82,7 +66,7 @@ swfdec_audio_load_new (SwfdecPlayer *player, SwfdecLoadSound *load)
   g_return_val_if_fail (SWFDEC_IS_LOAD_SOUND (load), NULL);
 
   stream = g_object_new (SWFDEC_TYPE_AUDIO_LOAD, NULL);
-  stream->load = g_object_ref (load);
+  stream->load = load;
   swfdec_audio_stream_use_decoder (SWFDEC_AUDIO_STREAM (stream), 
       SWFDEC_AUDIO_CODEC_MP3, swfdec_audio_format_new (44100, TRUE, 2));
   
commit 34adacae3f98c02f34faa292d5af3cfc48ca8854
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 17:09:11 2008 +0200

    call parent mark function

diff --git a/swfdec/swfdec_as_relay.c b/swfdec/swfdec_as_relay.c
index b0ee439..85c5527 100644
--- a/swfdec/swfdec_as_relay.c
+++ b/swfdec/swfdec_as_relay.c
@@ -36,6 +36,8 @@ swfdec_as_relay_mark (SwfdecGcObject *object)
 
   if (relay->relay)
     swfdec_gc_object_mark (relay->relay);
+
+  SWFDEC_GC_OBJECT_CLASS (swfdec_as_relay_parent_class)->mark (object);
 }
 
 static void
commit 87f126e329bcfd04daaa2f06140bbc445b2e9272
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 16:43:15 2008 +0200

    remove collected strings from our interned strings hash
    
    This was a cause for lots of random invalid read/write issues

diff --git a/swfdec/swfdec_as_context.c b/swfdec/swfdec_as_context.c
index adda5b8..6726536 100644
--- a/swfdec/swfdec_as_context.c
+++ b/swfdec/swfdec_as_context.c
@@ -274,6 +274,9 @@ swfdec_as_context_collect_string (SwfdecAsContext *context, gpointer gc)
   SwfdecAsStringValue *string;
 
   string = gc;
+  if (!g_hash_table_remove (context->interned_strings, string->string)) {
+    g_assert_not_reached ();
+  }
   swfdec_as_gcable_free (context, gc, sizeof (SwfdecAsStringValue) + string->length + 1);
 }
 
commit 9534c9aba28615d2b08fab67d9a3b14b7ce16e01
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 15:52:43 2008 +0200

    properly mark the relay during GC

diff --git a/swfdec/swfdec_as_object.c b/swfdec/swfdec_as_object.c
index 84f7a8a..92f7dc8 100644
--- a/swfdec/swfdec_as_object.c
+++ b/swfdec/swfdec_as_object.c
@@ -245,6 +245,8 @@ swfdec_as_object_mark (SwfdecGcObject *gc)
   g_hash_table_foreach (object->properties, swfdec_gc_object_mark_property, NULL);
   if (object->watches)
     g_hash_table_foreach (object->watches, swfdec_gc_object_mark_watch, NULL);
+  if (object->relay)
+    swfdec_gc_object_mark (object->relay);
   g_slist_foreach (object->interfaces, (GFunc) swfdec_gc_object_mark, NULL); 
 }
 
commit fc90f9aeb4f89083443ed951ffd16bd65ef37277
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 15:27:38 2008 +0200

    make Vivified compile again
    
    I'd be surprised if it still worked

diff --git a/vivified/core/vivi_breakpoint.c b/vivified/core/vivi_breakpoint.c
index df47627..d83ab6e 100644
--- a/vivified/core/vivi_breakpoint.c
+++ b/vivified/core/vivi_breakpoint.c
@@ -1,5 +1,5 @@
 /* Vivified
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -26,7 +26,7 @@
 #include "vivi_function.h"
 #include "vivi_wrap.h"
 
-G_DEFINE_TYPE (ViviBreakpoint, vivi_breakpoint, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (ViviBreakpoint, vivi_breakpoint, SWFDEC_TYPE_AS_RELAY)
 
 static gboolean
 vivi_breakpoint_step (ViviDebugger *debugger, ViviBreakpoint *breakpoint)
diff --git a/vivified/core/vivi_breakpoint.h b/vivified/core/vivi_breakpoint.h
index ed9af66..3b25274 100644
--- a/vivified/core/vivi_breakpoint.h
+++ b/vivified/core/vivi_breakpoint.h
@@ -1,5 +1,5 @@
 /* Vivified
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -38,7 +38,7 @@ typedef struct _ViviBreakpointClass ViviBreakpointClass;
 
 struct _ViviBreakpoint
 {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 
   gboolean		active;		/* only active breakpoints receive events */
   gulong		handlers[5];	/* handlers for every signal of the debugger or 0 */
@@ -46,7 +46,7 @@ struct _ViviBreakpoint
 
 struct _ViviBreakpointClass
 {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType			vivi_breakpoint_get_type   	(void);
diff --git a/vivified/core/vivi_function.c b/vivified/core/vivi_function.c
index f61ce9a..0c7c73d 100644
--- a/vivified/core/vivi_function.c
+++ b/vivified/core/vivi_function.c
@@ -53,7 +53,6 @@ void
 vivi_function_init_context (ViviApplication *app)
 { 
   SwfdecAsContext *cx = SWFDEC_AS_CONTEXT (app);
-  SwfdecAsFunction *fun;
   SwfdecAsObject *obj;
   SwfdecAsValue val;
   guint i;
@@ -68,16 +67,6 @@ vivi_function_init_context (ViviApplication *app)
       swfdec_as_context_get_string (cx, functions[i].name),
       functions[i].fun);
   }
-  /* FIXME: find a better solution than this */
-  fun = swfdec_as_object_add_function (obj,
-    swfdec_as_context_get_string (cx, "Breakpoint"),
-    functions[i].fun);
-  swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (fun),
-      VIVI_TYPE_BREAKPOINT);
-  obj = swfdec_as_object_new (cx, NULL);
-  SWFDEC_AS_VALUE_SET_OBJECT (&val, obj);
-  swfdec_as_object_set_variable (SWFDEC_AS_OBJECT (fun), 
-      swfdec_as_context_get_string (cx, "prototype"), &val);
 
   g_signal_connect (app, "message", G_CALLBACK (vivi_function_not_reached), NULL);
   vivi_application_execute (app, vivi_initialize);
commit 1f026438ec921dd86f7c436985694255d2ca365d
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 15:18:58 2008 +0200

    get rid of support for construction types

diff --git a/swfdec/swfdec_as_native_function.c b/swfdec/swfdec_as_native_function.c
index 0bac0e3..4daea74 100644
--- a/swfdec/swfdec_as_native_function.c
+++ b/swfdec/swfdec_as_native_function.c
@@ -63,12 +63,6 @@ swfdec_as_native_function_call (SwfdecAsFunction *function, SwfdecAsObject *this
   SwfdecAsValue rval = { 0, };
   SwfdecAsValue *argv;
 
-  if (construct && native->construct_type != 0 &&
-      !g_type_is_a (G_OBJECT_TYPE (thisp), native->construct_type)) {
-    SWFDEC_FIXME ("Swfdec can't handle call to native constructor with invalid type");
-    return;
-  }
-
   g_assert (native->name);
 
   swfdec_as_frame_init_native (&frame, cx);
@@ -198,27 +192,6 @@ swfdec_as_native_function_new (SwfdecAsContext *context, const char *name,
 }
 
 /**
- * swfdec_as_native_function_set_construct_type:
- * @function: a #SwfdecAsNativeFunction
- * @type: #GType used when constructing an object with @function
- *
- * Sets the @type to be used when using @function as a constructor. If this is
- * not set, using @function as a constructor will create a #SwfdecAsObject.
- **/
-void
-swfdec_as_native_function_set_construct_type (SwfdecAsNativeFunction *function, GType type)
-{
-  GTypeQuery query;
-
-  g_return_if_fail (SWFDEC_IS_AS_NATIVE_FUNCTION (function));
-  g_return_if_fail (g_type_is_a (type, SWFDEC_TYPE_AS_OBJECT));
-
-  g_type_query (type, &query);
-  function->construct_type = type;
-  function->construct_size = query.instance_size;
-}
-
-/**
  * SWFDEC_AS_CHECK:
  * @type: required type of this object or 0 for ignoring
  * @result: converted this object
diff --git a/swfdec/swfdec_as_native_function.h b/swfdec/swfdec_as_native_function.h
index 283d3cc..a8f7d35 100644
--- a/swfdec/swfdec_as_native_function.h
+++ b/swfdec/swfdec_as_native_function.h
@@ -42,9 +42,6 @@ struct _SwfdecAsNativeFunction {
 
   SwfdecAsNative	native;		/* native call or NULL when script */
   char *		name;		/* function name */
-  /* constructor info */
-  GType			construct_type;	/* type used when used as a constructor or 0 */
-  guint			construct_size;	/* instance size of type */
 };
 
 struct _SwfdecAsNativeFunctionClass {
@@ -58,10 +55,6 @@ SwfdecAsFunction *swfdec_as_native_function_new	(SwfdecAsContext *	context,
 						 SwfdecAsNative		native,
 						 SwfdecAsObject *	prototype);
 
-void		swfdec_as_native_function_set_construct_type
-						(SwfdecAsNativeFunction *function,
-						 GType			type);
-
 gboolean	swfdec_as_native_function_check	(SwfdecAsContext *	cx,
 						 SwfdecAsObject *	object,
 						 GType			type,
diff --git a/swfdec/swfdec_as_object.c b/swfdec/swfdec_as_object.c
index 20cf7c2..84f7a8a 100644
--- a/swfdec/swfdec_as_object.c
+++ b/swfdec/swfdec_as_object.c
@@ -1192,50 +1192,24 @@ swfdec_as_object_do_nothing (SwfdecAsContext *cx, SwfdecAsObject *object,
 SwfdecAsFunction *
 swfdec_as_object_add_function (SwfdecAsObject *object, const char *name, SwfdecAsNative native)
 {
-  g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL);
-  g_return_val_if_fail (name != NULL, NULL);
-
-  return swfdec_as_object_add_constructor (object, name, 0, native, NULL);
-}
-
-/**
- * swfdec_as_object_add_constructor:
- * @object: a #SwfdecAsObject
- * @name: name of the function. The string does not have to be 
- *        garbage-collected.
- * @construct_type: type used when using this function as a constructor. May 
- *                  be 0 to use the default type.
- * @native: a native function or %NULL to just not do anything
- * @prototype: An optional object to be set as the "prototype" property of the
- *             new function. The prototype will be hidden and constant.
- *
- * Adds @native as a constructor named @name to @object. The newly added variable
- * will not be enumerated.
- *
- * Returns: the newly created #SwfdecAsFunction
- **/
-SwfdecAsFunction *
-swfdec_as_object_add_constructor (SwfdecAsObject *object, const char *name,
-    GType construct_type, SwfdecAsNative native, SwfdecAsObject *prototype)
-{
   SwfdecAsFunction *function;
+  SwfdecAsContext *cx;
   SwfdecAsValue val;
 
   g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL);
   g_return_val_if_fail (name != NULL, NULL);
-  g_return_val_if_fail (construct_type == 0 || g_type_is_a (construct_type, SWFDEC_TYPE_AS_OBJECT), NULL);
-  g_return_val_if_fail (prototype == NULL || SWFDEC_IS_AS_OBJECT (prototype), NULL);
 
+  cx = swfdec_gc_object_get_context (object);
   if (!native)
     native = swfdec_as_object_do_nothing;
-  function = swfdec_as_native_function_new (swfdec_gc_object_get_context (object), name, native, prototype);
-  if (construct_type != 0)
-    swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (function), construct_type);
-  name = swfdec_as_context_get_string (swfdec_gc_object_get_context (object), name);
+  function = swfdec_as_native_function_new (cx, name, native, NULL);
+
+  name = swfdec_as_context_get_string (cx, name);
   SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (function));
   /* FIXME: I'd like to make sure no such property exists yet */
   swfdec_as_object_set_variable_and_flags (object, name, &val,
       SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
+
   return function;
 }
 
@@ -1324,48 +1298,12 @@ swfdec_as_object_create (SwfdecAsFunction *fun, guint n_args,
   SwfdecAsValue val;
   SwfdecAsObject *new;
   SwfdecAsContext *context;
-  SwfdecAsFunction *cur;
-  guint i, size = 0;
-  GType type = 0;
 
   g_return_if_fail (SWFDEC_IS_AS_FUNCTION (fun));
 
-  // FIXME: The way we decide object's type is wrong
-  // It seems to be actually possible to change the type inside a constructor
-  // (many times) by changing this.__proto__.__constructor__ and calling super
-
   context = swfdec_gc_object_get_context (fun);
-  cur = fun;
-  i = 0;
-  do {
-    if (SWFDEC_IS_AS_NATIVE_FUNCTION (cur)) {
-      SwfdecAsNativeFunction *native = SWFDEC_AS_NATIVE_FUNCTION (cur);
-      if (native->construct_size) {
-	type = native->construct_type;
-	size = native->construct_size;
-	break;
-      }
-    }
-    i++;
-    swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (cur), SWFDEC_AS_STR_prototype, &val);
-    if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-      SwfdecAsObject *proto = SWFDEC_AS_VALUE_GET_OBJECT (&val);
-      swfdec_as_object_get_variable (proto, SWFDEC_AS_STR___constructor__, &val);
-      if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-	cur = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val);
-	if (SWFDEC_IS_AS_FUNCTION (cur)) {
-	  continue;
-	}
-      }
-    }
-    cur = NULL;
-  } while (type == 0 && cur != NULL && i < SWFDEC_AS_OBJECT_PROTOTYPE_RECURSION_LIMIT);
-  if (type == 0) {
-    type = SWFDEC_TYPE_AS_OBJECT;
-    size = sizeof (SwfdecAsObject);
-  }
 
-  new = g_object_new (type, "context", context, NULL);
+  new = g_object_new (SWFDEC_TYPE_AS_OBJECT, "context", context, NULL);
   /* set initial variables */
   if (swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (fun), SWFDEC_AS_STR_prototype, &val)) {
       swfdec_as_object_set_variable_and_flags (new, SWFDEC_AS_STR___proto__,
commit ec271e23796c19fa530986b5e1cab6e5afedf2b4
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 15:03:40 2008 +0200

    get rid of constuct function types in the test runner

diff --git a/test/swfdec_test_buffer.c b/test/swfdec_test_buffer.c
index e26fc97..07928c9 100644
--- a/test/swfdec_test_buffer.c
+++ b/test/swfdec_test_buffer.c
@@ -136,7 +136,7 @@ swfdec_test_diff_buffers (SwfdecBuffer *buf1, SwfdecBuffer *buf2, GError **error
   return diff;
 }
 
-SWFDEC_TEST_FUNCTION ("Buffer_diff", swfdec_test_buffer_diff, 0)
+SWFDEC_TEST_FUNCTION ("Buffer_diff", swfdec_test_buffer_diff)
 void
 swfdec_test_buffer_diff (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -169,7 +169,7 @@ swfdec_test_buffer_diff (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Buffer_find", swfdec_test_buffer_find, 0)
+SWFDEC_TEST_FUNCTION ("Buffer_find", swfdec_test_buffer_find)
 void
 swfdec_test_buffer_find (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -187,7 +187,7 @@ swfdec_test_buffer_find (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
     swfdec_as_value_set_integer (cx, retval, found - buffer->buffer->data);
 }
 
-SWFDEC_TEST_FUNCTION ("Buffer_load", swfdec_test_buffer_load, 0)
+SWFDEC_TEST_FUNCTION ("Buffer_load", swfdec_test_buffer_load)
 void
 swfdec_test_buffer_load (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -210,7 +210,7 @@ swfdec_test_buffer_load (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
   SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (buffer)));
 }
 
-SWFDEC_TEST_FUNCTION ("Buffer_sub", swfdec_test_buffer_sub, 0)
+SWFDEC_TEST_FUNCTION ("Buffer_sub", swfdec_test_buffer_sub)
 void
 swfdec_test_buffer_sub (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -233,7 +233,7 @@ swfdec_test_buffer_sub (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
   SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (sub)));
 }
 
-SWFDEC_TEST_FUNCTION ("Buffer_toString", swfdec_test_buffer_toString, 0)
+SWFDEC_TEST_FUNCTION ("Buffer_toString", swfdec_test_buffer_toString)
 void
 swfdec_test_buffer_toString (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -292,7 +292,7 @@ swfdec_test_buffer_from_args (SwfdecAsContext *cx, guint argc, SwfdecAsValue *ar
   return buffer;
 }
 
-SWFDEC_TEST_FUNCTION ("Buffer", swfdec_test_buffer_create, NULL)
+SWFDEC_TEST_FUNCTION ("Buffer", swfdec_test_buffer_create)
 void
 swfdec_test_buffer_create (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
diff --git a/test/swfdec_test_function.c b/test/swfdec_test_function.c
index aa997e5..6d686b1 100644
--- a/test/swfdec_test_function.c
+++ b/test/swfdec_test_function.c
@@ -38,15 +38,14 @@
 /* include swfdec_test_function_list with special macro definition, so we get a nice
  * way to initialize it */
 #undef SWFDEC_TEST_FUNCTION
-#define SWFDEC_TEST_FUNCTION(name, fun, type) \
-  { name, fun, type },
+#define SWFDEC_TEST_FUNCTION(name, fun) \
+  { name, fun },
 static const struct {
   const char *		name;
   SwfdecAsNative	fun;
-  GType			(* type) (void);
 } functions[] = {
 #include "swfdec_test_function_list.h"
-  { NULL, NULL, NULL }
+  { NULL, NULL }
 };
 #undef SWFDEC_TEST_FUNCTION
 
@@ -65,10 +64,9 @@ swfdec_test_function_init_context (SwfdecAsContext *cx)
       swfdec_as_context_get_string (cx, "Native"), &val);
 
   for (i = 0; functions[i].name; i++) {
-    GType type = functions[i].type ? functions[i].type () : 0;
-    swfdec_as_object_add_constructor (obj,
+    swfdec_as_object_add_function (obj,
       swfdec_as_context_get_string (cx, functions[i].name),
-      type, functions[i].fun, NULL);
+	  functions[i].fun);
   }
 }
 
diff --git a/test/swfdec_test_function.h b/test/swfdec_test_function.h
index a523fcd..7868b3a 100644
--- a/test/swfdec_test_function.h
+++ b/test/swfdec_test_function.h
@@ -25,7 +25,7 @@
 G_BEGIN_DECLS
 
 
-#define SWFDEC_TEST_FUNCTION(name, fun, type) \
+#define SWFDEC_TEST_FUNCTION(name, fun) \
   void fun (SwfdecAsContext *cx, SwfdecAsObject *this, guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval);
 
 void		swfdec_test_function_init_context	(SwfdecAsContext *cx);
diff --git a/test/swfdec_test_global.c b/test/swfdec_test_global.c
index 7edd8d2..1f64faa 100644
--- a/test/swfdec_test_global.c
+++ b/test/swfdec_test_global.c
@@ -26,7 +26,7 @@
 #include "swfdec_test_function.h"
 #include "swfdec_test_initialize.h"
 
-SWFDEC_TEST_FUNCTION ("print", swfdec_test_print, 0)
+SWFDEC_TEST_FUNCTION ("print", swfdec_test_print)
 void
 swfdec_test_print (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
diff --git a/test/swfdec_test_http_request.c b/test/swfdec_test_http_request.c
index 9f00671..9beddf3 100644
--- a/test/swfdec_test_http_request.c
+++ b/test/swfdec_test_http_request.c
@@ -106,7 +106,7 @@ swfdec_test_http_request_init (SwfdecTestHTTPRequest *this)
 
 /*** AS CODE ***/
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_toString", swfdec_test_http_request_toString, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_toString", swfdec_test_http_request_toString)
 void
 swfdec_test_http_request_toString (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -127,7 +127,7 @@ swfdec_test_http_request_toString (SwfdecAsContext *cx, SwfdecAsObject *object,
       swfdec_as_context_give_string (cx, g_string_free (string, FALSE)));
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_get_server", swfdec_test_http_request_get_server, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_get_server", swfdec_test_http_request_get_server)
 void
 swfdec_test_http_request_get_server (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
@@ -140,7 +140,7 @@ swfdec_test_http_request_get_server (SwfdecAsContext *cx,
   SWFDEC_AS_VALUE_SET_OBJECT (retval, SWFDEC_AS_OBJECT (request->server));
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_get_url", swfdec_test_http_request_get_url, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_get_url", swfdec_test_http_request_get_url)
 void
 swfdec_test_http_request_get_url (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -156,7 +156,7 @@ swfdec_test_http_request_get_url (SwfdecAsContext *cx, SwfdecAsObject *object,
       swfdec_as_context_give_string (cx, soup_uri_to_string (uri, FALSE)));
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_get_path", swfdec_test_http_request_get_path, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_get_path", swfdec_test_http_request_get_path)
 void
 swfdec_test_http_request_get_path (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -189,7 +189,7 @@ swfdec_test_http_request_foreach_set_headers (const char *name,
       swfdec_as_context_get_string (cx, name), &val);
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_get_headers", swfdec_test_http_request_get_headers, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_get_headers", swfdec_test_http_request_get_headers)
 void
 swfdec_test_http_request_get_headers (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
@@ -208,7 +208,7 @@ swfdec_test_http_request_get_headers (SwfdecAsContext *cx,
   SWFDEC_AS_VALUE_SET_OBJECT (retval, request->headers);
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_get_contentType", swfdec_test_http_request_get_contentType, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_get_contentType", swfdec_test_http_request_get_contentType)
 void
 swfdec_test_http_request_get_contentType (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
@@ -230,7 +230,7 @@ swfdec_test_http_request_get_contentType (SwfdecAsContext *cx,
   }
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_set_contentType", swfdec_test_http_request_set_contentType, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_set_contentType", swfdec_test_http_request_set_contentType)
 void
 swfdec_test_http_request_set_contentType (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
@@ -255,7 +255,7 @@ swfdec_test_http_request_set_contentType (SwfdecAsContext *cx,
   }
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_get_statusCode", swfdec_test_http_request_get_statusCode, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_get_statusCode", swfdec_test_http_request_get_statusCode)
 void
 swfdec_test_http_request_get_statusCode (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
@@ -268,7 +268,7 @@ swfdec_test_http_request_get_statusCode (SwfdecAsContext *cx,
   swfdec_as_value_set_integer (cx, retval, request->message->status_code);
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_set_statusCode", swfdec_test_http_request_set_statusCode, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_set_statusCode", swfdec_test_http_request_set_statusCode)
 void
 swfdec_test_http_request_set_statusCode (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
@@ -290,7 +290,7 @@ swfdec_test_http_request_set_statusCode (SwfdecAsContext *cx,
   soup_message_set_status (request->message, status_code);
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_send", swfdec_test_http_request_send, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_send", swfdec_test_http_request_send)
 void
 swfdec_test_http_request_send (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -324,7 +324,7 @@ swfdec_test_http_request_send (SwfdecAsContext *cx, SwfdecAsObject *object,
   request->state = SWFDEC_TEST_HTTP_REQUEST_STATE_SENDING;
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPRequest_close", swfdec_test_http_request_close, 0)
+SWFDEC_TEST_FUNCTION ("HTTPRequest_close", swfdec_test_http_request_close)
 void
 swfdec_test_http_request_close (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
diff --git a/test/swfdec_test_http_server.c b/test/swfdec_test_http_server.c
index 94593b0..4148e94 100644
--- a/test/swfdec_test_http_server.c
+++ b/test/swfdec_test_http_server.c
@@ -153,7 +153,7 @@ swfdec_test_http_server_init (SwfdecTestHTTPServer *server)
 
 /*** AS CODE ***/
 
-SWFDEC_TEST_FUNCTION ("HTTPServer_get_port", swfdec_test_http_server_get_port, 0)
+SWFDEC_TEST_FUNCTION ("HTTPServer_get_port", swfdec_test_http_server_get_port)
 void
 swfdec_test_http_server_get_port (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -165,7 +165,7 @@ swfdec_test_http_server_get_port (SwfdecAsContext *cx, SwfdecAsObject *object,
   swfdec_as_value_set_integer (cx, retval, server->port);
 }
 
-SWFDEC_TEST_FUNCTION ("HTTPServer_getRequest", swfdec_test_http_server_get_request, 0)
+SWFDEC_TEST_FUNCTION ("HTTPServer_getRequest", swfdec_test_http_server_get_request)
 void
 swfdec_test_http_server_get_request (SwfdecAsContext *cx,
     SwfdecAsObject *object, guint argc, SwfdecAsValue *argv,
diff --git a/test/swfdec_test_image.c b/test/swfdec_test_image.c
index be88a4b..a988194 100644
--- a/test/swfdec_test_image.c
+++ b/test/swfdec_test_image.c
@@ -136,7 +136,7 @@ buffer_diff_core (unsigned char *buf_a,
     return result;
 }
 
-SWFDEC_TEST_FUNCTION ("Image_compare", swfdec_test_image_compare, 0)
+SWFDEC_TEST_FUNCTION ("Image_compare", swfdec_test_image_compare)
 void
 swfdec_test_image_compare (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -180,7 +180,7 @@ swfdec_test_image_compare (SwfdecAsContext *cx, SwfdecAsObject *object, guint ar
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Image_save", swfdec_test_image_save, 0)
+SWFDEC_TEST_FUNCTION ("Image_save", swfdec_test_image_save)
 void
 swfdec_test_image_save (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -203,7 +203,7 @@ swfdec_test_image_save (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
   SWFDEC_AS_VALUE_SET_BOOLEAN (retval, TRUE);
 }
 
-SWFDEC_TEST_FUNCTION ("Image", swfdec_test_image_create, NULL)
+SWFDEC_TEST_FUNCTION ("Image", swfdec_test_image_create)
 void
 swfdec_test_image_create (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
diff --git a/test/swfdec_test_socket.c b/test/swfdec_test_socket.c
index ad5413b..bd2f5a5 100644
--- a/test/swfdec_test_socket.c
+++ b/test/swfdec_test_socket.c
@@ -93,7 +93,7 @@ swfdec_test_socket_init (SwfdecTestSocket *sock)
 
 /*** AS CODE ***/
 
-SWFDEC_TEST_FUNCTION ("Socket_send", swfdec_test_socket_send, 0)
+SWFDEC_TEST_FUNCTION ("Socket_send", swfdec_test_socket_send)
 void
 swfdec_test_socket_send (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -112,7 +112,7 @@ swfdec_test_socket_send (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
   swfdec_buffer_unref (buffer);
 }
 
-SWFDEC_TEST_FUNCTION ("Socket_receive", swfdec_test_socket_receive, 0)
+SWFDEC_TEST_FUNCTION ("Socket_receive", swfdec_test_socket_receive)
 void
 swfdec_test_socket_receive (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -143,7 +143,7 @@ swfdec_test_socket_receive (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
 	SWFDEC_AS_RELAY (swfdec_test_buffer_new (cx, buffer))));
 }
 
-SWFDEC_TEST_FUNCTION ("Socket_error", swfdec_test_socket_error, 0)
+SWFDEC_TEST_FUNCTION ("Socket_error", swfdec_test_socket_error)
 void
 swfdec_test_socket_error (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -155,7 +155,7 @@ swfdec_test_socket_error (SwfdecAsContext *cx, SwfdecAsObject *object, guint arg
   swfdec_test_socket_do_close (sock, FALSE);
 }
 
-SWFDEC_TEST_FUNCTION ("Socket_close", swfdec_test_socket_close_as, 0)
+SWFDEC_TEST_FUNCTION ("Socket_close", swfdec_test_socket_close_as)
 void
 swfdec_test_socket_close_as (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -167,7 +167,7 @@ swfdec_test_socket_close_as (SwfdecAsContext *cx, SwfdecAsObject *object, guint
   swfdec_test_socket_do_close (sock, TRUE);
 }
 
-SWFDEC_TEST_FUNCTION ("Socket_get_closed", swfdec_test_socket_get_closed, 0)
+SWFDEC_TEST_FUNCTION ("Socket_get_closed", swfdec_test_socket_get_closed)
 void
 swfdec_test_socket_get_closed (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
diff --git a/test/swfdec_test_test.c b/test/swfdec_test_test.c
index d7c3b91..5e49d36 100644
--- a/test/swfdec_test_test.c
+++ b/test/swfdec_test_test.c
@@ -210,7 +210,7 @@ swfdec_test_do_reset (SwfdecTestTest *test, const char *filename)
   swfdec_test_test_load_plugin (test, filename);
 }
 
-SWFDEC_TEST_FUNCTION ("Test_advance", swfdec_test_test_advance, 0)
+SWFDEC_TEST_FUNCTION ("Test_advance", swfdec_test_test_advance)
 void
 swfdec_test_test_advance (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -230,7 +230,7 @@ swfdec_test_test_advance (SwfdecAsContext *cx, SwfdecAsObject *object, guint arg
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Test_reset", swfdec_test_test_reset, 0)
+SWFDEC_TEST_FUNCTION ("Test_reset", swfdec_test_test_reset)
 void
 swfdec_test_test_reset (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -243,7 +243,7 @@ swfdec_test_test_reset (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
   swfdec_test_do_reset (test, filename);
 }
 
-SWFDEC_TEST_FUNCTION ("Test_mouse_move", swfdec_test_test_mouse_move, 0)
+SWFDEC_TEST_FUNCTION ("Test_mouse_move", swfdec_test_test_mouse_move)
 void
 swfdec_test_test_mouse_move (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -263,7 +263,7 @@ swfdec_test_test_mouse_move (SwfdecAsContext *cx, SwfdecAsObject *object, guint
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Test_mouse_press", swfdec_test_test_mouse_press, 0)
+SWFDEC_TEST_FUNCTION ("Test_mouse_press", swfdec_test_test_mouse_press)
 void
 swfdec_test_test_mouse_press (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -285,7 +285,7 @@ swfdec_test_test_mouse_press (SwfdecAsContext *cx, SwfdecAsObject *object, guint
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Test_mouse_release", swfdec_test_test_mouse_release, 0)
+SWFDEC_TEST_FUNCTION ("Test_mouse_release", swfdec_test_test_mouse_release)
 void
 swfdec_test_test_mouse_release (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -307,7 +307,7 @@ swfdec_test_test_mouse_release (SwfdecAsContext *cx, SwfdecAsObject *object, gui
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Test_render", swfdec_test_test_render, 0)
+SWFDEC_TEST_FUNCTION ("Test_render", swfdec_test_test_render)
 void
 swfdec_test_test_render (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -337,7 +337,7 @@ swfdec_test_test_render (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Test", swfdec_test_test_new, 0)
+SWFDEC_TEST_FUNCTION ("Test", swfdec_test_test_new)
 void
 swfdec_test_test_new (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -357,7 +357,7 @@ swfdec_test_test_new (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
   SWFDEC_AS_VALUE_SET_OBJECT (retval, object);
 }
 
-SWFDEC_TEST_FUNCTION ("Test_get_launched", swfdec_test_test_get_launched, 0)
+SWFDEC_TEST_FUNCTION ("Test_get_launched", swfdec_test_test_get_launched)
 void
 swfdec_test_test_get_launched (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -375,7 +375,7 @@ swfdec_test_test_get_launched (SwfdecAsContext *cx, SwfdecAsObject *object,
   SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (buf)));
 }
 
-SWFDEC_TEST_FUNCTION ("Socket_getSocket", swfdec_test_test_getSocket, 0)
+SWFDEC_TEST_FUNCTION ("Socket_getSocket", swfdec_test_test_getSocket)
 void
 swfdec_test_test_getSocket (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -401,7 +401,7 @@ swfdec_test_test_getSocket (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Test_get_trace", swfdec_test_test_get_trace, 0)
+SWFDEC_TEST_FUNCTION ("Test_get_trace", swfdec_test_test_get_trace)
 void
 swfdec_test_test_get_trace (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -419,7 +419,7 @@ swfdec_test_test_get_trace (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
   SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (buf)));
 }
 
-SWFDEC_TEST_FUNCTION ("Test_get_quit", swfdec_test_test_get_quit, 0)
+SWFDEC_TEST_FUNCTION ("Test_get_quit", swfdec_test_test_get_quit)
 void
 swfdec_test_test_get_quit (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -432,7 +432,7 @@ swfdec_test_test_get_quit (SwfdecAsContext *cx, SwfdecAsObject *object, guint ar
   SWFDEC_AS_VALUE_SET_BOOLEAN (retval, !test->plugin_loaded || test->plugin_error || test->plugin_quit);
 }
 
-SWFDEC_TEST_FUNCTION ("Test_get_rate", swfdec_test_test_get_rate, 0)
+SWFDEC_TEST_FUNCTION ("Test_get_rate", swfdec_test_test_get_rate)
 void
 swfdec_test_test_get_rate (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
commit ebf03d1ddc44d44ac8111461705058ddf5225f9c
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 14:55:32 2008 +0200

    make SwfdecTestTest a relay

diff --git a/test/swfdec_test_test.c b/test/swfdec_test_test.c
index 53e9043..d7c3b91 100644
--- a/test/swfdec_test_test.c
+++ b/test/swfdec_test_test.c
@@ -158,7 +158,7 @@ swfdec_test_test_unload_plugin (SwfdecTestTest *test)
 
 /*** SWFDEC_TEST_TEST ***/
 
-G_DEFINE_TYPE (SwfdecTestTest, swfdec_test_test, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecTestTest, swfdec_test_test, SWFDEC_TYPE_AS_RELAY)
 
 static void
 swfdec_test_test_dispose (GObject *object)
@@ -303,7 +303,7 @@ swfdec_test_test_mouse_release (SwfdecAsContext *cx, SwfdecAsObject *object, gui
   if (test->plugin.advance) {
     test->plugin.mouse_release (&test->plugin, x, y, button);
   } else {
-    swfdec_test_throw (cx, "plugin doesn't implement mouse_press");
+    swfdec_test_throw (cx, "plugin doesn't implement mouse_release");
   }
 }
 
@@ -333,11 +333,11 @@ swfdec_test_test_render (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
 	x, y, w, h);
     SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (image)));
   } else {
-    swfdec_test_throw (cx, "plugin doesn't implement mouse_press");
+    swfdec_test_throw (cx, "plugin doesn't implement render");
   }
 }
 
-SWFDEC_TEST_FUNCTION ("Test", swfdec_test_test_new, swfdec_test_test_get_type)
+SWFDEC_TEST_FUNCTION ("Test", swfdec_test_test_new, 0)
 void
 swfdec_test_test_new (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -345,9 +345,16 @@ swfdec_test_test_new (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
   SwfdecTestTest *test;
   const char *filename = NULL;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "|s", &filename);
+  if (!swfdec_as_context_is_constructing (cx))
+    return;
+
+  SWFDEC_AS_CHECK (0, NULL, "|s", &filename);
 
+  test = g_object_new (SWFDEC_TYPE_TEST_TEST, "context", cx, NULL);
   swfdec_test_do_reset (test, filename);
+
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (test));
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, object);
 }
 
 SWFDEC_TEST_FUNCTION ("Test_get_launched", swfdec_test_test_get_launched, 0)
diff --git a/test/swfdec_test_test.h b/test/swfdec_test_test.h
index 19d50f3..bc82863 100644
--- a/test/swfdec_test_test.h
+++ b/test/swfdec_test_test.h
@@ -39,7 +39,7 @@ typedef struct _SwfdecTestTestClass SwfdecTestTestClass;
 
 struct _SwfdecTestTest
 {
-  SwfdecAsObject	as_object;
+  SwfdecAsRelay		relay;
 
   SwfdecTestPlugin	plugin;		/* the plugin we use */
   GModule *		module;		/* module we loaded the plugin from or NULL */
@@ -57,7 +57,7 @@ struct _SwfdecTestTest
 
 struct _SwfdecTestTestClass
 {
-  SwfdecAsObjectClass	as_object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 extern char *swfdec_test_plugin_name;
commit 2c6d63314c9816374765d3e5d15303c0ee610490
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Oct 25 14:46:41 2008 +0200

    make SwfdecTestImage a relay

diff --git a/test/swfdec_test_image.c b/test/swfdec_test_image.c
index b54f713..be88a4b 100644
--- a/test/swfdec_test_image.c
+++ b/test/swfdec_test_image.c
@@ -28,26 +28,26 @@
 #define SWFDEC_TEST_IMAGE_IS_VALID(image) ((image)->surface && \
     cairo_surface_status ((image)->surface) == CAIRO_STATUS_SUCCESS)
 
-SwfdecAsObject *
+SwfdecTestImage *
 swfdec_test_image_new (SwfdecAsContext *context, guint width, guint height)
 {
-  SwfdecAsValue val;
-  SwfdecAsObject *ret;
+  SwfdecTestImage *ret;
+  SwfdecAsObject *object;
 
   ret = g_object_new (SWFDEC_TYPE_TEST_IMAGE, "context", context, NULL);
-  swfdec_as_object_get_variable (context->global, 
-      swfdec_as_context_get_string (context, "Image"), &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val))
-    swfdec_as_object_set_constructor (ret, SWFDEC_AS_VALUE_GET_OBJECT (&val));
+  ret->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+
+  object = swfdec_as_object_new (context, NULL);
+  swfdec_as_object_set_constructor_by_name (object,
+      swfdec_as_context_get_string (context, "Image"), NULL);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (ret));
 
-  SWFDEC_TEST_IMAGE (ret)->surface = 
-    cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
   return ret;
 }
 
 /*** SWFDEC_TEST_IMAGE ***/
 
-G_DEFINE_TYPE (SwfdecTestImage, swfdec_test_image, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecTestImage, swfdec_test_image, SWFDEC_TYPE_AS_RELAY)
 
 static void
 swfdec_test_image_dispose (GObject *object)
@@ -142,14 +142,16 @@ swfdec_test_image_compare (SwfdecAsContext *cx, SwfdecAsObject *object, guint ar
     SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
   SwfdecTestImage *image, *compare, *diff;
+  SwfdecAsObject *o;
   int w, h;
   
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_IMAGE, &image, "O", &compare);
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_IMAGE, &image, "o", &o);
 
-  if (!SWFDEC_IS_TEST_IMAGE (compare))
+  if (!SWFDEC_IS_TEST_IMAGE (o->relay))
     return;
+  compare = SWFDEC_TEST_IMAGE (o->relay);
 
-  SWFDEC_AS_VALUE_SET_OBJECT (retval, SWFDEC_AS_OBJECT (image));
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (image)));
   if (!SWFDEC_TEST_IMAGE_IS_VALID (image) ||
       !SWFDEC_TEST_IMAGE_IS_VALID (compare))
     return;
@@ -164,8 +166,6 @@ swfdec_test_image_compare (SwfdecAsContext *cx, SwfdecAsObject *object, guint ar
   if (h != cairo_image_surface_get_height (compare->surface))
     return;
   diff = SWFDEC_TEST_IMAGE (swfdec_test_image_new (cx, w, h));
-  if (!diff)
-    return;
 
   if (!buffer_diff_core (cairo_image_surface_get_data (image->surface), 
 	cairo_image_surface_get_data (compare->surface), 
@@ -203,7 +203,7 @@ swfdec_test_image_save (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
   SWFDEC_AS_VALUE_SET_BOOLEAN (retval, TRUE);
 }
 
-SWFDEC_TEST_FUNCTION ("Image", swfdec_test_image_create, swfdec_test_image_get_type)
+SWFDEC_TEST_FUNCTION ("Image", swfdec_test_image_create, NULL)
 void
 swfdec_test_image_create (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
@@ -211,8 +211,15 @@ swfdec_test_image_create (SwfdecAsContext *cx, SwfdecAsObject *object, guint arg
   SwfdecTestImage *image;
   const char *filename;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_IMAGE, &image, "s", &filename);
+  if (!swfdec_as_context_is_constructing (cx))
+    return;
+
+  SWFDEC_AS_CHECK (0, NULL, "s", &filename);
 
+  image = g_object_new (SWFDEC_TYPE_TEST_IMAGE, "context", cx, NULL);
   image->surface = cairo_image_surface_create_from_png (filename);
+
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (image));
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, object);
 }
 
diff --git a/test/swfdec_test_image.h b/test/swfdec_test_image.h
index 6de6ccc..5791953 100644
--- a/test/swfdec_test_image.h
+++ b/test/swfdec_test_image.h
@@ -37,21 +37,21 @@ typedef struct _SwfdecTestImageClass SwfdecTestImageClass;
 
 struct _SwfdecTestImage
 {
-  SwfdecAsObject	as_object;
+  SwfdecAsRelay		relay;
 
   cairo_surface_t *	surface;	/* surface or NULL when broken image */
 };
 
 struct _SwfdecTestImageClass
 {
-  SwfdecAsObjectClass	as_object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
-GType		swfdec_test_image_get_type	(void);
+GType			swfdec_test_image_get_type	(void);
 
-SwfdecAsObject *swfdec_test_image_new		(SwfdecAsContext *	context,
-						 guint			width,
-						 guint			height);
+SwfdecTestImage *	swfdec_test_image_new		(SwfdecAsContext *	context,
+							 guint			width,
+							 guint			height);
 
 G_END_DECLS
 #endif
diff --git a/test/swfdec_test_test.c b/test/swfdec_test_test.c
index 9cee933..53e9043 100644
--- a/test/swfdec_test_test.c
+++ b/test/swfdec_test_test.c
@@ -313,7 +313,7 @@ swfdec_test_test_render (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
     SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
   SwfdecTestTest *test;
-  SwfdecAsObject *image;
+  SwfdecTestImage *image;
   int x = 0, y = 0, w = 0, h = 0;
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_TEST, &test, "|iiii", &x, &y, &w, &h);
@@ -331,7 +331,7 @@ swfdec_test_test_render (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
     test->plugin.screenshot (&test->plugin, 
 	cairo_image_surface_get_data (SWFDEC_TEST_IMAGE (image)->surface),
 	x, y, w, h);
-    SWFDEC_AS_VALUE_SET_OBJECT (retval, image);
+    SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (image)));
   } else {
     swfdec_test_throw (cx, "plugin doesn't implement mouse_press");
   }
commit e2843e15ded8376ea4d60b4c0d3784f1ecd0c678
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Oct 24 15:31:24 2008 +0200

    make SwfdecTestBufer a relay

diff --git a/test/swfdec_test_buffer.c b/test/swfdec_test_buffer.c
index b9ddda4..e26fc97 100644
--- a/test/swfdec_test_buffer.c
+++ b/test/swfdec_test_buffer.c
@@ -28,25 +28,26 @@
 #include "swfdec_test_function.h"
 #include "swfdec_test_utils.h"
 
-SwfdecAsObject *
+SwfdecTestBuffer *
 swfdec_test_buffer_new (SwfdecAsContext *context, SwfdecBuffer *buffer)
 {
-  SwfdecAsValue val;
-  SwfdecAsObject *ret;
+  SwfdecTestBuffer *ret;
+  SwfdecAsObject *object;
 
   ret = g_object_new (SWFDEC_TYPE_TEST_BUFFER, "context", context, NULL);
-  swfdec_as_object_get_variable (context->global, 
-      swfdec_as_context_get_string (context, "Buffer"), &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val))
-    swfdec_as_object_set_constructor (ret, SWFDEC_AS_VALUE_GET_OBJECT (&val));
+  ret->buffer = buffer;
+
+  object = swfdec_as_object_new (context, NULL);
+  swfdec_as_object_set_constructor_by_name (object,
+    swfdec_as_context_get_string (context, "Buffer"), NULL);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (ret));
 
-  SWFDEC_TEST_BUFFER (ret)->buffer = buffer;
   return ret;
 }
 
 /*** SWFDEC_TEST_BUFFER ***/
 
-G_DEFINE_TYPE (SwfdecTestBuffer, swfdec_test_buffer, SWFDEC_TYPE_AS_OBJECT)
+G_DEFINE_TYPE (SwfdecTestBuffer, swfdec_test_buffer, SWFDEC_TYPE_AS_RELAY)
 
 static void
 swfdec_test_buffer_dispose (GObject *object)
@@ -141,15 +142,17 @@ swfdec_test_buffer_diff (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
     SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
   SwfdecTestBuffer *buffer, *compare = NULL;
+  SwfdecAsObject *compare_object;
   GError *error = NULL;
   char *ret;
   
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_BUFFER, &buffer, "|o", &compare);
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_BUFFER, &buffer, "|o", &compare_object);
 
-  if (!SWFDEC_IS_TEST_BUFFER (compare)) {
+  if (compare_object == NULL || !SWFDEC_IS_TEST_BUFFER (compare_object->relay)) {
     swfdec_test_throw (cx, "must pass a buffer to Buffer.diff");
     return;
   }
+  compare = SWFDEC_TEST_BUFFER (compare_object->relay);
 
   ret = swfdec_test_diff_buffers (compare->buffer, buffer->buffer, &error);
   if (ret) {
@@ -190,7 +193,7 @@ swfdec_test_buffer_load (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
     SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
   SwfdecBuffer *b;
-  SwfdecAsObject *buffer;
+  SwfdecTestBuffer *buffer;
   const char *filename;
   GError *error = NULL;
   
@@ -204,7 +207,7 @@ swfdec_test_buffer_load (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
   }
 
   buffer = swfdec_test_buffer_new (cx, b);
-  SWFDEC_AS_VALUE_SET_OBJECT (retval, buffer);
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (buffer)));
 }
 
 SWFDEC_TEST_FUNCTION ("Buffer_sub", swfdec_test_buffer_sub, 0)
@@ -213,8 +216,7 @@ swfdec_test_buffer_sub (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
   SwfdecBuffer *b;
-  SwfdecTestBuffer *buffer;
-  SwfdecAsObject *o;
+  SwfdecTestBuffer *buffer, *sub;
   guint offset, length = 0;
   
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_BUFFER, &buffer, "i|i", &offset, &length);
@@ -227,8 +229,8 @@ swfdec_test_buffer_sub (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     length = buffer->buffer->length - offset;
 
   b = swfdec_buffer_new_subbuffer (buffer->buffer, offset, length);
-  o = swfdec_test_buffer_new (cx, b);
-  SWFDEC_AS_VALUE_SET_OBJECT (retval, o);
+  sub = swfdec_test_buffer_new (cx, b);
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (sub)));
 }
 
 SWFDEC_TEST_FUNCTION ("Buffer_toString", swfdec_test_buffer_toString, 0)
@@ -268,8 +270,8 @@ swfdec_test_buffer_from_args (SwfdecAsContext *cx, guint argc, SwfdecAsValue *ar
     SwfdecBuffer *b = NULL;
     if (SWFDEC_AS_VALUE_IS_OBJECT (&argv[i])) {
       SwfdecAsObject *o = SWFDEC_AS_VALUE_GET_OBJECT (&argv[i]);
-      if (SWFDEC_IS_TEST_BUFFER (o))
-	b = swfdec_buffer_ref (SWFDEC_TEST_BUFFER (o)->buffer);
+      if (SWFDEC_IS_TEST_BUFFER (o->relay))
+	b = swfdec_buffer_ref (SWFDEC_TEST_BUFFER (o->relay)->buffer);
     } else if (SWFDEC_AS_VALUE_IS_NUMBER (&argv[i])) {
       b = swfdec_buffer_new (1);
       b->data[0] = swfdec_as_value_to_integer (cx, &argv[i]);
@@ -290,19 +292,21 @@ swfdec_test_buffer_from_args (SwfdecAsContext *cx, guint argc, SwfdecAsValue *ar
   return buffer;
 }
 
-SWFDEC_TEST_FUNCTION ("Buffer", swfdec_test_buffer_create, swfdec_test_buffer_get_type)
+SWFDEC_TEST_FUNCTION ("Buffer", swfdec_test_buffer_create, NULL)
 void
 swfdec_test_buffer_create (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
     SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
   SwfdecTestBuffer *buffer;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_TEST_BUFFER, &buffer, "");
-
   if (!swfdec_as_context_is_constructing (cx))
     return;
 
+  buffer = g_object_new (SWFDEC_TYPE_TEST_BUFFER, "context", cx, NULL);
   buffer->buffer = swfdec_test_buffer_from_args (cx, argc, argv);
+  swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (buffer));
+
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, object);
 }
 
 
diff --git a/test/swfdec_test_buffer.h b/test/swfdec_test_buffer.h
index 7e70f87..3d29bc2 100644
--- a/test/swfdec_test_buffer.h
+++ b/test/swfdec_test_buffer.h
@@ -37,24 +37,24 @@ typedef struct _SwfdecTestBufferClass SwfdecTestBufferClass;
 
 struct _SwfdecTestBuffer
 {
-  SwfdecAsObject	as_object;
+  SwfdecAsRelay		relay;
 
   SwfdecBuffer *	buffer;
 };
 
 struct _SwfdecTestBufferClass
 {
-  SwfdecAsObjectClass	as_object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
-GType		swfdec_test_buffer_get_type	(void);
+GType	  		swfdec_test_buffer_get_type	(void);
 
-SwfdecAsObject *swfdec_test_buffer_new		(SwfdecAsContext *	context,
-						 SwfdecBuffer *		buffer);
+SwfdecTestBuffer *	swfdec_test_buffer_new		(SwfdecAsContext *	context,
+							 SwfdecBuffer *		buffer);
 
-SwfdecBuffer *	swfdec_test_buffer_from_args	(SwfdecAsContext *	cx,
-						 guint			argc,
-						 SwfdecAsValue *	argv);
+SwfdecBuffer *		swfdec_test_buffer_from_args	(SwfdecAsContext *	cx,
+				  			 guint			argc,
+							 SwfdecAsValue *	argv);
 
 G_END_DECLS
 #endif
diff --git a/test/swfdec_test_socket.c b/test/swfdec_test_socket.c
index d6dcba7..ad5413b 100644
--- a/test/swfdec_test_socket.c
+++ b/test/swfdec_test_socket.c
@@ -139,7 +139,8 @@ swfdec_test_socket_receive (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
       buffer = swfdec_buffer_queue_pull (sock->receive_queue, depth);
     }
   }
-  SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_test_buffer_new (cx, buffer));
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (
+	SWFDEC_AS_RELAY (swfdec_test_buffer_new (cx, buffer))));
 }
 
 SWFDEC_TEST_FUNCTION ("Socket_error", swfdec_test_socket_error, 0)
diff --git a/test/swfdec_test_test.c b/test/swfdec_test_test.c
index ee16a2a..9cee933 100644
--- a/test/swfdec_test_test.c
+++ b/test/swfdec_test_test.c
@@ -356,7 +356,7 @@ swfdec_test_test_get_launched (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
   SwfdecTestTest *test;
-  SwfdecAsObject *o;
+  SwfdecTestBuffer *buf;
   SwfdecBuffer *buffer;
   gsize len;
 
@@ -364,8 +364,8 @@ swfdec_test_test_get_launched (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   len = swfdec_buffer_queue_get_depth (test->launched);
   buffer = swfdec_buffer_queue_peek (test->launched, len);
-  o = swfdec_test_buffer_new (cx, buffer);
-  SWFDEC_AS_VALUE_SET_OBJECT (retval, o);
+  buf = swfdec_test_buffer_new (cx, buffer);
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (buf)));
 }
 
 SWFDEC_TEST_FUNCTION ("Socket_getSocket", swfdec_test_test_getSocket, 0)
@@ -400,7 +400,7 @@ swfdec_test_test_get_trace (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
     SwfdecAsValue *argv, SwfdecAsValue *retval)
 {
   SwfdecTestTest *test;
-  SwfdecAsObject *o;
+  SwfdecTestBuffer *buf;
   SwfdecBuffer *buffer;
   gsize len;
 
@@ -408,8 +408,8 @@ swfdec_test_test_get_trace (SwfdecAsContext *cx, SwfdecAsObject *object, guint a
 
   len = swfdec_buffer_queue_get_depth (test->trace);
   buffer = swfdec_buffer_queue_peek (test->trace, len);
-  o = swfdec_test_buffer_new (cx, buffer);
-  SWFDEC_AS_VALUE_SET_OBJECT (retval, o);
+  buf = swfdec_test_buffer_new (cx, buffer);
+  SWFDEC_AS_VALUE_SET_OBJECT (retval, swfdec_as_relay_get_as_object (SWFDEC_AS_RELAY (buf)));
 }
 
 SWFDEC_TEST_FUNCTION ("Test_get_quit", swfdec_test_test_get_quit, 0)
commit 6cc572b85705feee1e31eb48511d7ee9d71f3b27
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Oct 24 15:31:08 2008 +0200

    export swfdec_as_object_set_constructor_by_name()

diff --git a/swfdec/swfdec_as_internal.h b/swfdec/swfdec_as_internal.h
index 4b53c46..dc7ce23 100644
--- a/swfdec/swfdec_as_internal.h
+++ b/swfdec/swfdec_as_internal.h
@@ -70,14 +70,6 @@ void		swfdec_as_object_add_native_variable (SwfdecAsObject *	object,
 						 const char *		variable,
 						 SwfdecAsNative		get,
 						 SwfdecAsNative		set);
-SwfdecAsObject * swfdec_as_object_set_constructor_by_name 
-						(SwfdecAsObject *	object,
-						 const char *		name,
-						 ...) G_GNUC_NULL_TERMINATED;
-SwfdecAsObject * swfdec_as_object_set_constructor_by_namev 
-						(SwfdecAsObject *	object,
-						 const char *		name,
-						 va_list		args);
 
 /* swfdec_as_array.h */
 void		swfdec_as_array_remove_range	(SwfdecAsObject *	object,
diff --git a/swfdec/swfdec_as_object.h b/swfdec/swfdec_as_object.h
index 214d951..123faae 100644
--- a/swfdec/swfdec_as_object.h
+++ b/swfdec/swfdec_as_object.h
@@ -106,6 +106,14 @@ GType		swfdec_as_object_get_type	(void);
 SwfdecAsObject *swfdec_as_object_new		(SwfdecAsContext *    	context,
 						 ...) G_GNUC_NULL_TERMINATED;
 SwfdecAsObject *swfdec_as_object_new_empty    	(SwfdecAsContext *    	context);
+SwfdecAsObject * swfdec_as_object_set_constructor_by_name 
+						(SwfdecAsObject *	object,
+						 const char *		name,
+						 ...) G_GNUC_NULL_TERMINATED;
+SwfdecAsObject * swfdec_as_object_set_constructor_by_namev 
+						(SwfdecAsObject *	object,
+						 const char *		name,
+						 va_list		args);
 void		swfdec_as_object_create		(SwfdecAsFunction *	fun,
 						 guint			n_args,
 						 const SwfdecAsValue *	args,
commit 103676c395f1439d40d75be64d4d225d82c8f8f7
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Oct 24 15:30:51 2008 +0200

    export swfdec_as_relay.h

diff --git a/swfdec/Makefile.am b/swfdec/Makefile.am
index dfdce00..a73cea0 100644
--- a/swfdec/Makefile.am
+++ b/swfdec/Makefile.am
@@ -209,6 +209,7 @@ public_headers = \
 	swfdec_as_function.h \
 	swfdec_as_native_function.h \
 	swfdec_as_object.h \
+	swfdec_as_relay.h \
 	swfdec_as_string_value.h \
 	swfdec_as_types.h \
 	swfdec_audio.h \
@@ -245,7 +246,6 @@ noinst_HEADERS = \
 	swfdec_as_gcable.h \
 	swfdec_as_interpret.h \
 	swfdec_as_number.h \
-	swfdec_as_relay.h \
 	swfdec_as_script_function.h \
 	swfdec_as_stack.h \
 	swfdec_as_string.h \
diff --git a/swfdec/swfdec.h b/swfdec/swfdec.h
index 32b55d8..eff395f 100644
--- a/swfdec/swfdec.h
+++ b/swfdec/swfdec.h
@@ -1,7 +1,7 @@
 /* Swfdec
  * Copyright (C) 2003-2006 David Schleef <ds at schleef.org>
  *		 2005-2006 Eric Anholt <eric at anholt.net>
- *		 2006-2007 Benjamin Otte <otte at gnome.org>
+ *		 2006-2008 Benjamin Otte <otte at gnome.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -29,6 +29,7 @@
 #include <swfdec/swfdec_as_function.h>
 #include <swfdec/swfdec_as_native_function.h>
 #include <swfdec/swfdec_as_object.h>
+#include <swfdec/swfdec_as_relay.h>
 #include <swfdec/swfdec_as_types.h>
 #include <swfdec/swfdec_script.h>
 
commit 086e7fb9cc770882c64efe30275f9f2dddafbef4
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Oct 24 13:52:53 2008 +0200

    make NetStream a relay

diff --git a/swfdec/swfdec_net_stream.c b/swfdec/swfdec_net_stream.c
index b5aefe5..dee670e 100644
--- a/swfdec/swfdec_net_stream.c
+++ b/swfdec/swfdec_net_stream.c
@@ -1,5 +1,5 @@
 /* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -44,9 +44,11 @@ swfdec_net_stream_onstatus (SwfdecNetStream *stream, const char *code, const cha
 {
   SwfdecAsValue val;
   SwfdecAsObject *object;
+  SwfdecAsContext *cx;
 
+  cx = swfdec_gc_object_get_context (stream);
   swfdec_sandbox_use (stream->sandbox);
-  object = swfdec_as_object_new (swfdec_gc_object_get_context (stream), SWFDEC_AS_STR_Object, NULL);
+  object = swfdec_as_object_new (cx, SWFDEC_AS_STR_Object, NULL);
   SWFDEC_INFO ("emitting onStatus for %s %s", level, code);
   SWFDEC_AS_VALUE_SET_STRING (&val, code);
   swfdec_as_object_set_variable (object, SWFDEC_AS_STR_code, &val);
@@ -54,14 +56,14 @@ swfdec_net_stream_onstatus (SwfdecNetStream *stream, const char *code, const cha
   swfdec_as_object_set_variable (object, SWFDEC_AS_STR_level, &val);
 
   SWFDEC_AS_VALUE_SET_OBJECT (&val, object);
-  if (!swfdec_as_object_call (SWFDEC_AS_OBJECT (stream),
+  if (!swfdec_as_relay_call (SWFDEC_AS_RELAY (stream),
         SWFDEC_AS_STR_onStatus, 1, &val, NULL)) {
     // if it's an error message and the stream object didn't have onStatus
     // handler, call System.onStatus
     if (level == SWFDEC_AS_STR_error) {
       SwfdecAsValue system;
 
-      swfdec_as_object_get_variable (swfdec_gc_object_get_context (stream)->global,
+      swfdec_as_object_get_variable (cx->global,
           SWFDEC_AS_STR_System, &system);
       if (SWFDEC_AS_VALUE_IS_OBJECT (&system)) {
         swfdec_as_object_call (SWFDEC_AS_VALUE_GET_OBJECT (&system),
@@ -275,7 +277,7 @@ swfdec_net_stream_video_goto (SwfdecNetStream *stream, guint timestamp)
 	    SWFDEC_AMF_STRING, &name, SWFDEC_AMF_MIXED_ARRAY, &value) != 2) {
 	SWFDEC_ERROR ("could not parse data tag");
       } else {
-	swfdec_as_object_call (SWFDEC_AS_OBJECT (stream), 
+	swfdec_as_relay_call (SWFDEC_AS_RELAY (stream), 
 	    SWFDEC_AS_VALUE_GET_STRING (&name), 1, &value, NULL);
       }
       swfdec_sandbox_unuse (stream->sandbox);
@@ -502,7 +504,7 @@ swfdec_net_stream_video_provider_init (SwfdecVideoProviderInterface *iface)
 
 /*** SWFDEC_NET_STREAM ***/
 
-G_DEFINE_TYPE_WITH_CODE (SwfdecNetStream, swfdec_net_stream, SWFDEC_TYPE_AS_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (SwfdecNetStream, swfdec_net_stream, SWFDEC_TYPE_AS_RELAY,
     G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_net_stream_stream_target_init)
     G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_VIDEO_PROVIDER, swfdec_net_stream_video_provider_init))
 
diff --git a/swfdec/swfdec_net_stream.h b/swfdec/swfdec_net_stream.h
index d198b52..078b9e9 100644
--- a/swfdec/swfdec_net_stream.h
+++ b/swfdec/swfdec_net_stream.h
@@ -1,5 +1,5 @@
 /* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -21,7 +21,7 @@
 #define _SWFDEC_NET_STREAM_H_
 
 #include <swfdec/swfdec.h>
-#include <swfdec/swfdec_as_object.h>
+#include <swfdec/swfdec_as_relay.h>
 #include <swfdec/swfdec_net_connection.h>
 #include <swfdec/swfdec_flv_decoder.h>
 #include <swfdec/swfdec_player_internal.h>
@@ -43,7 +43,7 @@ typedef struct _SwfdecNetStreamClass SwfdecNetStreamClass;
 
 struct _SwfdecNetStream
 {
-  SwfdecAsObject	object;
+  SwfdecAsRelay		relay;
 
   SwfdecNetConnection *	conn;		/* connection used for opening streams */
   char *		requested_url;	/* URL we have requested that isn't loaded yet */
@@ -72,7 +72,7 @@ struct _SwfdecNetStream
 
 struct _SwfdecNetStreamClass
 {
-  SwfdecAsObjectClass	object_class;
+  SwfdecAsRelayClass	relay_class;
 };
 
 GType			swfdec_net_stream_get_type	(void);
diff --git a/swfdec/swfdec_net_stream_as.c b/swfdec/swfdec_net_stream_as.c
index 028abfe..44910be 100644
--- a/swfdec/swfdec_net_stream_as.c
+++ b/swfdec/swfdec_net_stream_as.c
@@ -1,5 +1,5 @@
 /* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -290,7 +290,9 @@ swfdec_net_stream_construct (SwfdecAsContext *cx, SwfdecAsObject *obj, guint arg
     SWFDEC_FIXME ("What do we do if not constructing?");
     return;
   }
-  stream = SWFDEC_NET_STREAM (obj);
+  stream = g_object_new (SWFDEC_TYPE_NET_STREAM, "context", cx, NULL);
+  swfdec_as_object_set_relay (obj, SWFDEC_AS_RELAY (stream));
+
   swfdec_net_stream_setup (cx, obj, 0, NULL, rval);
   if (argc == 0 ||
       !SWFDEC_AS_VALUE_IS_OBJECT (&argv[0]) || 
@@ -313,9 +315,8 @@ swfdec_net_stream_init_context (SwfdecPlayer *player)
 
   context = SWFDEC_AS_CONTEXT (player);
   proto = swfdec_as_object_new_empty (context);
-  stream = SWFDEC_AS_OBJECT (swfdec_as_object_add_constructor (context->global, 
-      SWFDEC_AS_STR_NetStream, SWFDEC_TYPE_NET_STREAM, 
-      swfdec_net_stream_construct, proto));
+  stream = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, 
+      SWFDEC_AS_STR_NetStream, swfdec_net_stream_construct));
   /* set the right properties on the NetStream.prototype object */
   swfdec_as_object_add_function (proto, SWFDEC_AS_STR_pause, swfdec_net_stream_pause);
   swfdec_as_object_add_function (proto, SWFDEC_AS_STR_play, swfdec_net_stream_play);
@@ -326,5 +327,8 @@ swfdec_net_stream_init_context (SwfdecPlayer *player)
   SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Object_prototype);
   swfdec_as_object_set_variable_and_flags (proto, SWFDEC_AS_STR___proto__, &val,
       SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
+  SWFDEC_AS_VALUE_SET_OBJECT (&val, proto);
+  swfdec_as_object_set_variable_and_flags (stream, SWFDEC_AS_STR_prototype, &val,
+      SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
 }
 
diff --git a/swfdec/swfdec_video_movie_as.c b/swfdec/swfdec_video_movie_as.c
index 62492ff..4b44361 100644
--- a/swfdec/swfdec_video_movie_as.c
+++ b/swfdec/swfdec_video_movie_as.c
@@ -40,13 +40,13 @@ swfdec_video_attach_video (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_VIDEO_MOVIE, &video, "O", &o);
 
-  if (!SWFDEC_IS_VIDEO_PROVIDER (o)) {
+  if (o == NULL || !SWFDEC_IS_VIDEO_PROVIDER (o->relay)) {
     SWFDEC_WARNING ("calling attachVideo without a NetStream object");
     swfdec_video_movie_set_provider (video, NULL);
     return;
   }
 
-  swfdec_video_movie_set_provider (video, SWFDEC_VIDEO_PROVIDER (o));
+  swfdec_video_movie_set_provider (video, SWFDEC_VIDEO_PROVIDER (o->relay));
 }
 
 SWFDEC_AS_NATIVE (667, 2, swfdec_video_clear)
commit 6413f62b70131ccaaf454580cc9df7993ec42c2a
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Oct 24 11:00:53 2008 +0200

    move NetStream get function into add_variable calls

diff --git a/swfdec/swfdec_net_stream.c b/swfdec/swfdec_net_stream.c
index 0884975..b5aefe5 100644
--- a/swfdec/swfdec_net_stream.c
+++ b/swfdec/swfdec_net_stream.c
@@ -528,70 +528,6 @@ swfdec_net_stream_dispose (GObject *object)
   G_OBJECT_CLASS (swfdec_net_stream_parent_class)->dispose (object);
 }
 
-static gboolean
-swfdec_net_stream_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig,
-    const char *variable, SwfdecAsValue *val, guint *flags)
-{
-  SwfdecNetStream *stream;
-  SwfdecAsContext *cx;
-
-  if (SWFDEC_AS_OBJECT_CLASS (swfdec_net_stream_parent_class)->get (object, orig, variable, val, flags))
-    return TRUE;
-
-  cx = swfdec_gc_object_get_context (object);
-  stream = SWFDEC_NET_STREAM (object);
-  /* FIXME: need case insensitive comparisons? */
-  if (variable == SWFDEC_AS_STR_time) {
-    guint msecs;
-    if (stream->flvdecoder == NULL ||
-	!swfdec_flv_decoder_get_video_info (stream->flvdecoder, &msecs, NULL)) {
-      swfdec_as_value_set_integer (cx, val, 0);
-    } else {
-      if (msecs >= stream->current_time)
-	msecs = 0;
-      else 
-	msecs = stream->current_time - msecs;
-      swfdec_as_value_set_number (cx, val, msecs / 1000.);
-    }
-    *flags = 0;
-    return TRUE;
-  } else if (variable == SWFDEC_AS_STR_bytesLoaded) {
-    if (stream->loader == NULL)
-      swfdec_as_value_set_integer (cx, val, 0);
-    else
-      swfdec_as_value_set_number (cx, val, swfdec_loader_get_loaded (stream->loader));
-    *flags = 0;
-    return TRUE;
-  } else if (variable == SWFDEC_AS_STR_bytesTotal) {
-    glong bytes;
-    if (stream->loader == NULL) {
-      bytes = 0;
-    } else { 
-      bytes = swfdec_loader_get_size (stream->loader);
-      if (bytes < 0)
-	bytes = swfdec_loader_get_loaded (stream->loader);
-    }
-    swfdec_as_value_set_number (cx, val, bytes);
-    *flags = 0;
-    return TRUE;
-  } else if (variable == SWFDEC_AS_STR_bufferLength) {
-    SWFDEC_STUB ("Netstream.bufferLength (get)");
-  } else if (variable == SWFDEC_AS_STR_bufferTime) {
-    SWFDEC_STUB ("Netstream.bufferTime (get)");
-  } else if (variable == SWFDEC_AS_STR_audiocodec) {
-    SWFDEC_STUB ("Netstream.audiocodec (get)");
-  } else if (variable == SWFDEC_AS_STR_currentFps) {
-    SWFDEC_STUB ("Netstream.currentFps (get)");
-  } else if (variable == SWFDEC_AS_STR_decodedFrames) {
-    SWFDEC_STUB ("Netstream.decodedFrames (get)");
-  } else if (variable == SWFDEC_AS_STR_liveDelay) {
-    SWFDEC_STUB ("Netstream.liveDelay (get)");
-  } else if (variable == SWFDEC_AS_STR_videoCodec) {
-    SWFDEC_STUB ("Netstream.videoCodec (get)");
-  }
-  return FALSE;
-}
-
 static void
 swfdec_net_stream_mark (SwfdecGcObject *object)
 {
@@ -610,13 +546,10 @@ swfdec_net_stream_class_init (SwfdecNetStreamClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   SwfdecGcObjectClass *gc_class = SWFDEC_GC_OBJECT_CLASS (klass);
-  SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass);
 
   object_class->dispose = swfdec_net_stream_dispose;
 
   gc_class->mark = swfdec_net_stream_mark;
-
-  asobject_class->get = swfdec_net_stream_get_variable;
 }
 
 static void
diff --git a/swfdec/swfdec_net_stream_as.c b/swfdec/swfdec_net_stream_as.c
index 72a7f01..028abfe 100644
--- a/swfdec/swfdec_net_stream_as.c
+++ b/swfdec/swfdec_net_stream_as.c
@@ -148,6 +148,139 @@ swfdec_net_stream_do_seek (SwfdecAsContext *cx, SwfdecAsObject *object,
 }
 
 static void
+swfdec_net_stream_get_time (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SwfdecNetStream *stream;
+  guint msecs;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_NET_STREAM, &stream, "");
+
+  if (stream->flvdecoder == NULL ||
+      !swfdec_flv_decoder_get_video_info (stream->flvdecoder, &msecs, NULL)) {
+    swfdec_as_value_set_integer (cx, ret, 0);
+  } else {
+    if (msecs >= stream->current_time)
+      msecs = 0;
+    else 
+      msecs = stream->current_time - msecs;
+    swfdec_as_value_set_number (cx, ret, msecs / 1000.);
+  }
+}
+
+static void
+swfdec_net_stream_get_bytesLoaded (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SwfdecNetStream *stream;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_NET_STREAM, &stream, "");
+
+  if (stream->loader == NULL)
+    swfdec_as_value_set_integer (cx, ret, 0);
+  else
+    swfdec_as_value_set_number (cx, ret, swfdec_loader_get_loaded (stream->loader));
+}
+
+static void
+swfdec_net_stream_get_bytesTotal (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SwfdecNetStream *stream;
+  glong bytes;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_NET_STREAM, &stream, "");
+
+  if (stream->loader == NULL) {
+    bytes = 0;
+  } else { 
+    bytes = swfdec_loader_get_size (stream->loader);
+    if (bytes < 0)
+      bytes = swfdec_loader_get_loaded (stream->loader);
+  }
+  swfdec_as_value_set_number (cx, ret, bytes);
+}
+
+static void
+swfdec_net_stream_get_bufferLength (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SWFDEC_STUB ("Netstream.bufferLength (get)");
+}
+
+static void
+swfdec_net_stream_get_bufferTime (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SWFDEC_STUB ("Netstream.bufferTime (get)");
+}
+
+static void
+swfdec_net_stream_get_audiocodec (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SWFDEC_STUB ("Netstream.audiocodec (get)");
+}
+
+static void
+swfdec_net_stream_get_currentFps (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SWFDEC_STUB ("Netstream.currentFps (get)");
+}
+
+static void
+swfdec_net_stream_get_decodedFrames (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SWFDEC_STUB ("Netstream.decodedFrames (get)");
+}
+
+static void
+swfdec_net_stream_get_liveDelay (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SWFDEC_STUB ("Netstream.liveDelay (get)");
+}
+
+static void
+swfdec_net_stream_get_videoCodec (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  SWFDEC_STUB ("Netstream.videoCodec (get)");
+}
+
+SWFDEC_AS_NATIVE (2101, 200, swfdec_net_stream_setup)
+void
+swfdec_net_stream_setup (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, 
+    SwfdecAsValue *argv, SwfdecAsValue *ret)
+{
+  if (object == NULL)
+    return;
+
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_time,
+      swfdec_net_stream_get_time, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_bytesLoaded,
+      swfdec_net_stream_get_bytesLoaded, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_bytesTotal,
+      swfdec_net_stream_get_bytesTotal, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_bufferLength,
+      swfdec_net_stream_get_bufferLength, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_bufferTime,
+      swfdec_net_stream_get_bufferTime, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_audiocodec,
+      swfdec_net_stream_get_audiocodec, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_currentFps,
+      swfdec_net_stream_get_currentFps, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_decodedFrames,
+      swfdec_net_stream_get_decodedFrames, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_liveDelay,
+      swfdec_net_stream_get_liveDelay, NULL);
+  swfdec_as_object_add_native_variable (object, SWFDEC_AS_STR_videoCodec,
+      swfdec_net_stream_get_videoCodec, NULL);
+}
+
+static void
 swfdec_net_stream_construct (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
 {
   SwfdecNetStream *stream;
@@ -158,6 +291,7 @@ swfdec_net_stream_construct (SwfdecAsContext *cx, SwfdecAsObject *obj, guint arg
     return;
   }
   stream = SWFDEC_NET_STREAM (obj);
+  swfdec_net_stream_setup (cx, obj, 0, NULL, rval);
   if (argc == 0 ||
       !SWFDEC_AS_VALUE_IS_OBJECT (&argv[0]) || 
       !SWFDEC_IS_NET_CONNECTION ((conn = (SwfdecNetConnection *) SWFDEC_AS_VALUE_GET_OBJECT (&argv[0])))) {
@@ -165,6 +299,7 @@ swfdec_net_stream_construct (SwfdecAsContext *cx, SwfdecAsObject *obj, guint arg
     return;
   }
   stream->conn = conn;
+  SWFDEC_AS_VALUE_SET_OBJECT (rval, obj);
 }
 
 void
commit 40ffef0504f457ccd7a965fe37b000962c20821c
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Oct 24 10:53:23 2008 +0200

    remove another unnecessary check

diff --git a/swfdec/swfdec_as_object.c b/swfdec/swfdec_as_object.c
index e25b716..20cf7c2 100644
--- a/swfdec/swfdec_as_object.c
+++ b/swfdec/swfdec_as_object.c
@@ -1504,8 +1504,6 @@ swfdec_as_object_add_native_variable (SwfdecAsObject *object,
 
   get_func =
     swfdec_as_native_function_new (swfdec_gc_object_get_context (object), variable, get, NULL);
-  if (get_func == NULL)
-    return;
 
   if (set != NULL) {
     set_func =


More information about the Swfdec-commits mailing list