[Swfdec-commits] swfdec/swfdec_as_array.c swfdec/swfdec_as_date.c swfdec/swfdec_as_internal.h swfdec/swfdec_as_object.c swfdec/swfdec_bitmap_data.c swfdec/swfdec_color_transform_as.c swfdec/swfdec_text_field_movie_as.c swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_format.c swfdec/swfdec_transform_as.c swfdec/swfdec_xml.c swfdec/swfdec_xml_node.c

Benjamin Otte company at kemper.freedesktop.org
Wed Sep 3 08:23:39 PDT 2008


 swfdec/swfdec_as_array.c            |   14 ++------------
 swfdec/swfdec_as_date.c             |   14 ++------------
 swfdec/swfdec_as_internal.h         |    4 ++++
 swfdec/swfdec_as_object.c           |   27 +++++++++++++++++++++++++++
 swfdec/swfdec_bitmap_data.c         |   16 ++--------------
 swfdec/swfdec_color_transform_as.c  |   16 ++--------------
 swfdec/swfdec_text_field_movie.c    |   10 ++++------
 swfdec/swfdec_text_field_movie_as.c |    9 +--------
 swfdec/swfdec_text_format.c         |    7 +------
 swfdec/swfdec_transform_as.c        |   19 ++++---------------
 swfdec/swfdec_xml.c                 |    7 +------
 swfdec/swfdec_xml_node.c            |    9 ++-------
 12 files changed, 52 insertions(+), 100 deletions(-)

New commits:
commit eda0c7c71ebd78c464012f084b1d61ae420156bc
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Sep 3 17:21:39 2008 +0200

    invent swfdec_as_object_set_constructor_by_name() and use it

diff --git a/swfdec/swfdec_as_array.c b/swfdec/swfdec_as_array.c
index 3b1e9b1..6926ebf 100644
--- a/swfdec/swfdec_as_array.c
+++ b/swfdec/swfdec_as_array.c
@@ -574,14 +574,11 @@ SwfdecAsObject *
 swfdec_as_array_new (SwfdecAsContext *context)
 {
   SwfdecAsObject *ret;
-  SwfdecAsValue val;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
 
   ret = g_object_new (SWFDEC_TYPE_AS_ARRAY, "context", context, NULL);
-  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_Array, &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val))
-    swfdec_as_object_set_constructor (ret, SWFDEC_AS_VALUE_GET_OBJECT (&val));
+  swfdec_as_object_set_constructor_by_name (ret, SWFDEC_AS_STR_Array, NULL);
 
   swfdec_as_array_set_length_object (ret, 0);
 
@@ -1370,15 +1367,8 @@ swfdec_as_array_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
   SwfdecAsArray *array;
 
   if (!cx->frame->construct) {
-    SwfdecAsValue val;
     object = g_object_new (SWFDEC_TYPE_AS_ARRAY, "context", cx, NULL);
-    swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_Array, &val);
-    if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-      swfdec_as_object_set_constructor (object,
-	  SWFDEC_AS_VALUE_GET_OBJECT (&val));
-    } else {
-      SWFDEC_INFO ("\"Array\" is not an object");
-    }
+    swfdec_as_object_set_constructor_by_name (object, SWFDEC_AS_STR_Array, NULL);
   }
 
   array = SWFDEC_AS_ARRAY (object);
diff --git a/swfdec/swfdec_as_date.c b/swfdec/swfdec_as_date.c
index 42311f9..b8b73d7 100644
--- a/swfdec/swfdec_as_date.c
+++ b/swfdec/swfdec_as_date.c
@@ -1057,15 +1057,8 @@ swfdec_as_date_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
   SwfdecAsDate *date;
 
   if (!cx->frame->construct) {
-    SwfdecAsValue val;
     object = g_object_new (SWFDEC_TYPE_AS_DATE, "context", cx, NULL);
-    swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_Date, &val);
-    if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-      swfdec_as_object_set_constructor (object,
-	  SWFDEC_AS_VALUE_GET_OBJECT (&val));
-    } else {
-      SWFDEC_INFO ("\"Date\" is not an object");
-    }
+    swfdec_as_object_set_constructor_by_name (object, SWFDEC_AS_STR_Date, NULL);
   }
 
   date = SWFDEC_AS_DATE (object);
@@ -1206,14 +1199,11 @@ swfdec_as_date_new (SwfdecAsContext *context, double milliseconds,
     int utc_offset)
 {
   SwfdecAsObject *ret;
-  SwfdecAsValue val;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
 
   ret = g_object_new (SWFDEC_TYPE_AS_DATE, "context", context, NULL);
-  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_Date, &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val))
-    swfdec_as_object_set_constructor (ret, SWFDEC_AS_VALUE_GET_OBJECT (&val));
+  swfdec_as_object_set_constructor_by_name (ret, SWFDEC_AS_STR_Date, NULL);
 
   SWFDEC_AS_DATE (ret)->milliseconds = milliseconds;
   SWFDEC_AS_DATE (ret)->utc_offset = utc_offset;
diff --git a/swfdec/swfdec_as_internal.h b/swfdec/swfdec_as_internal.h
index eaa9b33..db0af8f 100644
--- a/swfdec/swfdec_as_internal.h
+++ b/swfdec/swfdec_as_internal.h
@@ -69,6 +69,10 @@ void		swfdec_as_object_add_native_variable (SwfdecAsObject *	object,
 						 const char *		variable,
 						 SwfdecAsNative		get,
 						 SwfdecAsNative		set);
+void		swfdec_as_object_set_constructor_by_name 
+						(SwfdecAsObject *	object,
+						 const char *		name,
+						 ...) G_GNUC_NULL_TERMINATED;
 
 
 G_END_DECLS
diff --git a/swfdec/swfdec_as_object.c b/swfdec/swfdec_as_object.c
index 82c936e..2e92e08 100644
--- a/swfdec/swfdec_as_object.c
+++ b/swfdec/swfdec_as_object.c
@@ -1320,6 +1320,33 @@ swfdec_as_object_create (SwfdecAsFunction *fun, guint n_args,
   swfdec_as_function_call_full (fun, new, TRUE, new->prototype, n_args, args, return_value);
 }
 
+void
+swfdec_as_object_set_constructor_by_name (SwfdecAsObject *object, const char *name, ...)
+{
+  SwfdecAsContext *context;
+  SwfdecAsObject *cur;
+  SwfdecAsValue val;
+  va_list args;
+
+  g_return_if_fail (SWFDEC_IS_AS_OBJECT (object));
+  g_return_if_fail (name != NULL);
+
+  context = swfdec_gc_object_get_context (object);
+  va_start (args, name);
+  cur = context->global;
+  do {
+    if (!swfdec_as_object_get_variable (cur, name, &val) || 
+	!SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
+      SWFDEC_WARNING ("could not find constructor %s", name);
+      return;
+    }
+    cur = SWFDEC_AS_VALUE_GET_OBJECT (&val);
+    name = va_arg (args, const char *);
+  } while (name != NULL);
+  va_end (args);
+  swfdec_as_object_set_constructor (object, cur);
+}
+
 /**
  * swfdec_as_object_set_constructor:
  * @object: a #SwfdecAsObject
diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index fe80dcd..91d0234 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -107,7 +107,6 @@ SwfdecBitmapData *
 swfdec_bitmap_data_new (SwfdecAsContext *context, gboolean transparent, guint width, guint height)
 {
   SwfdecBitmapData *bitmap;
-  SwfdecAsValue val;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
   g_return_val_if_fail (width > 0, NULL);
@@ -120,19 +119,8 @@ swfdec_bitmap_data_new (SwfdecAsContext *context, gboolean transparent, guint wi
   bitmap->surface = cairo_image_surface_create (
       transparent ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, width, height);
 
-  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_flash, &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-    swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&val), 
-	SWFDEC_AS_STR_display, &val);
-    if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-      swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&val), 
-	  SWFDEC_AS_STR_BitmapData, &val);
-      if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-	swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (bitmap),
-	    SWFDEC_AS_VALUE_GET_OBJECT (&val));
-      }
-    }
-  }
+  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (bitmap),
+      SWFDEC_AS_STR_flash, SWFDEC_AS_STR_display, SWFDEC_AS_STR_BitmapData, NULL);
 
   return bitmap;
 }
diff --git a/swfdec/swfdec_color_transform_as.c b/swfdec/swfdec_color_transform_as.c
index a50794d..95c949d 100644
--- a/swfdec/swfdec_color_transform_as.c
+++ b/swfdec/swfdec_color_transform_as.c
@@ -363,7 +363,6 @@ SwfdecColorTransformAs *
 swfdec_color_transform_as_new_from_transform (SwfdecAsContext *context,
     const SwfdecColorTransform *transform)
 {
-  SwfdecAsValue val;
   SwfdecColorTransformAs *transform_as;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
@@ -371,19 +370,8 @@ swfdec_color_transform_as_new_from_transform (SwfdecAsContext *context,
 
   transform_as = g_object_new (SWFDEC_TYPE_COLOR_TRANSFORM_AS, "context", context, NULL);
 
-  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_flash, &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-    swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&val),
-	SWFDEC_AS_STR_geom, &val);
-    if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-      swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&val),
-	  SWFDEC_AS_STR_ColorTransform, &val);
-      if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-	swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (transform_as),
-	    SWFDEC_AS_VALUE_GET_OBJECT (&val));
-      }
-    }
-  }
+  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (transform_as),
+      SWFDEC_AS_STR_flash, SWFDEC_AS_STR_geom, SWFDEC_AS_STR_ColorTransform, NULL);
 
   transform_as->ra = transform->ra / 256.0;
   transform_as->ga = transform->ga / 256.0;
diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 3140a51..9864b34 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -28,8 +28,9 @@
 
 #include "swfdec_text_field_movie.h"
 #include "swfdec_as_context.h"
-#include "swfdec_as_strings.h"
+#include "swfdec_as_internal.h"
 #include "swfdec_as_interpret.h"
+#include "swfdec_as_strings.h"
 #include "swfdec_debug.h"
 #include "swfdec_internal.h"
 #include "swfdec_player_internal.h"
@@ -397,11 +398,8 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie)
 
   swfdec_text_field_movie_init_properties (cx);
 
-  swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_TextField, &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-    swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie),
-	SWFDEC_AS_VALUE_GET_OBJECT (&val));
-  }
+  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (movie),
+      SWFDEC_AS_STR_TextField, NULL);
 
   /* create _listeners array */
   array = swfdec_as_array_new (cx);
diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 82fe13a..8118023 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -1550,15 +1550,8 @@ swfdec_text_field_movie_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
   if (!cx->frame->construct) {
-    SwfdecAsValue val;
     object = swfdec_as_object_new_empty (cx);
-    swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_TextField, &val);
-    if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-      swfdec_as_object_set_constructor (object,
-	  SWFDEC_AS_VALUE_GET_OBJECT (&val));
-    } else {
-      SWFDEC_INFO ("\"TextField\" is not an object");
-    }
+    swfdec_as_object_set_constructor_by_name (object, SWFDEC_AS_STR_TextField, NULL);
   }
 
   swfdec_text_field_movie_init_properties (cx);
diff --git a/swfdec/swfdec_text_format.c b/swfdec/swfdec_text_format.c
index 153c2d7..7442a0d 100644
--- a/swfdec/swfdec_text_format.c
+++ b/swfdec/swfdec_text_format.c
@@ -1079,12 +1079,7 @@ swfdec_text_format_new_no_properties (SwfdecAsContext *context)
   ret = g_object_new (SWFDEC_TYPE_TEXT_FORMAT, "context", context, NULL);
 
   swfdec_text_format_clear (SWFDEC_TEXT_FORMAT (ret));
-
-  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_TextFormat,
-      &val);
-  if (!SWFDEC_AS_VALUE_IS_OBJECT (&val))
-    return ret;
-  swfdec_as_object_set_constructor (ret, SWFDEC_AS_VALUE_GET_OBJECT (&val));
+  swfdec_as_object_set_constructor_by_name (ret, SWFDEC_AS_STR_TextFormat, NULL);
 
   // FIXME: Need better way to create function without prototype/constructor
   tmp = context->Function;
diff --git a/swfdec/swfdec_transform_as.c b/swfdec/swfdec_transform_as.c
index 3bd4f2b..97ffa49 100644
--- a/swfdec/swfdec_transform_as.c
+++ b/swfdec/swfdec_transform_as.c
@@ -22,11 +22,13 @@
 #endif
 
 #include "swfdec_transform_as.h"
+
 #include "swfdec_color_transform_as.h"
 #include "swfdec_as_strings.h"
 #include "swfdec_as_internal.h"
 #include "swfdec_as_frame_internal.h"
 #include "swfdec_debug.h"
+#include "swfdec_utils.h"
 
 G_DEFINE_TYPE (SwfdecTransformAs, swfdec_transform_as, SWFDEC_TYPE_AS_OBJECT)
 
@@ -191,7 +193,6 @@ swfdec_transform_as_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
 SwfdecTransformAs *
 swfdec_transform_as_new (SwfdecAsContext *context, SwfdecMovie *target)
 {
-  SwfdecAsValue val;
   SwfdecTransformAs *transform;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
@@ -199,20 +200,8 @@ swfdec_transform_as_new (SwfdecAsContext *context, SwfdecMovie *target)
 
   transform = g_object_new (SWFDEC_TYPE_TRANSFORM_AS, "context", context, NULL);
 
-  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_flash, &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-    swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&val),
-	SWFDEC_AS_STR_geom, &val);
-    if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-      swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&val),
-	  SWFDEC_AS_STR_Transform, &val);
-      if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-	swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (transform),
-	    SWFDEC_AS_VALUE_GET_OBJECT (&val));
-      }
-    }
-  }
-
+  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (transform),
+      SWFDEC_AS_STR_flash, SWFDEC_AS_STR_geom, SWFDEC_AS_STR_Transform, NULL);
   transform->target = target;
 
   return transform;
diff --git a/swfdec/swfdec_xml.c b/swfdec/swfdec_xml.c
index efff92a..988d7be 100644
--- a/swfdec/swfdec_xml.c
+++ b/swfdec/swfdec_xml.c
@@ -940,18 +940,13 @@ SwfdecXml *
 swfdec_xml_new_no_properties (SwfdecAsContext *context, const char *str,
     gboolean ignore_white)
 {
-  SwfdecAsValue val;
   SwfdecXml *xml;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
 
   xml = g_object_new (SWFDEC_TYPE_XML, "context", context, NULL);
-  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_XML, &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-    swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (xml),
-	SWFDEC_AS_VALUE_GET_OBJECT (&val));
-  }
 
+  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (xml), SWFDEC_AS_STR_XML, NULL);
   xml->ignore_white = ignore_white;
 
   swfdec_xml_node_init_values (SWFDEC_XML_NODE (xml),
diff --git a/swfdec/swfdec_xml_node.c b/swfdec/swfdec_xml_node.c
index 6d43192..27bd006 100644
--- a/swfdec/swfdec_xml_node.c
+++ b/swfdec/swfdec_xml_node.c
@@ -1046,19 +1046,14 @@ SwfdecXmlNode *
 swfdec_xml_node_new_no_properties (SwfdecAsContext *context,
     SwfdecXmlNodeType type, const char* value)
 {
-  SwfdecAsValue val;
   SwfdecXmlNode *node;
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
   g_return_val_if_fail (value != NULL, NULL);
 
   node = g_object_new (SWFDEC_TYPE_XML_NODE, "context", context, NULL);
-  swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_XMLNode, &val);
-  if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) {
-    swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (node),
-	SWFDEC_AS_VALUE_GET_OBJECT (&val));
-  }
-
+  swfdec_as_object_set_constructor_by_name (SWFDEC_AS_OBJECT (node),
+      SWFDEC_AS_STR_XMLNode, NULL);
   swfdec_xml_node_init_values (node, type, value);
 
   return node;


More information about the Swfdec-commits mailing list