[Swfdec-commits] 8 commits - doc/swfdec-sections.txt swfdec/swfdec_amf.c swfdec/swfdec_as_array.c swfdec/swfdec_as_context.c swfdec/swfdec_as_context.h swfdec/swfdec_as_date.c swfdec/swfdec_as_frame.c swfdec/swfdec_as_function.c swfdec/swfdec_as_interpret.c swfdec/swfdec_as_native_function.c swfdec/swfdec_as_object.c swfdec/swfdec_as_script_function.c swfdec/swfdec_as_stack.c swfdec/swfdec_as_string.c swfdec/swfdec_as_super.c swfdec/swfdec_color_as.c swfdec/swfdec_color_transform_as.c swfdec/swfdec_constant_pool.c swfdec/swfdec_interval.c swfdec/swfdec_movie.c swfdec/swfdec_movie_clip_loader.c swfdec/swfdec_net_connection.c swfdec/swfdec_net_connection.h swfdec/swfdec_net_stream_as.c swfdec/swfdec_net_stream.c swfdec/swfdec_net_stream.h swfdec/swfdec_resource.c swfdec/swfdec_sandbox.c swfdec/swfdec_sound_object.c swfdec/swfdec_sprite_movie_as.c swfdec/swfdec_swf_decoder.c swfdec/swfdec_swf_decoder.h swfdec/swfdec_tag.c swfdec/swfdec_tag.h 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_video_movie_as.c swfdec/swfdec_xml.c swfdec/swfdec_xml_node.c swfdec/swfdec_xml_socket.c test/swfdec_test_buffer.c test/swfdec_test_image.c test/swfdec_test_socket.c test/swfdec_test_test.c test/trace vivified/code vivified/core

Benjamin Otte company at kemper.freedesktop.org
Tue Jul 22 01:32:06 PDT 2008


 doc/swfdec-sections.txt             |    2 
 swfdec/swfdec_amf.c                 |    6 -
 swfdec/swfdec_as_array.c            |   10 -
 swfdec/swfdec_as_context.c          |  193 +-----------------------------------
 swfdec/swfdec_as_context.h          |   10 -
 swfdec/swfdec_as_date.c             |    6 -
 swfdec/swfdec_as_frame.c            |    8 -
 swfdec/swfdec_as_function.c         |   15 --
 swfdec/swfdec_as_interpret.c        |   17 +--
 swfdec/swfdec_as_native_function.c  |    7 -
 swfdec/swfdec_as_object.c           |   30 +----
 swfdec/swfdec_as_script_function.c  |    7 -
 swfdec/swfdec_as_stack.c            |    3 
 swfdec/swfdec_as_string.c           |    4 
 swfdec/swfdec_as_super.c            |    3 
 swfdec/swfdec_color_as.c            |    2 
 swfdec/swfdec_color_transform_as.c  |    2 
 swfdec/swfdec_constant_pool.c       |   14 +-
 swfdec/swfdec_interval.c            |    3 
 swfdec/swfdec_movie.c               |    4 
 swfdec/swfdec_movie_clip_loader.c   |    4 
 swfdec/swfdec_net_connection.c      |   17 ---
 swfdec/swfdec_net_connection.h      |    2 
 swfdec/swfdec_net_stream.c          |   22 ----
 swfdec/swfdec_net_stream.h          |    2 
 swfdec/swfdec_net_stream_as.c       |    4 
 swfdec/swfdec_resource.c            |    8 -
 swfdec/swfdec_sandbox.c             |    3 
 swfdec/swfdec_sound_object.c        |    2 
 swfdec/swfdec_sprite_movie_as.c     |    6 -
 swfdec/swfdec_swf_decoder.c         |    4 
 swfdec/swfdec_swf_decoder.h         |    1 
 swfdec/swfdec_tag.c                 |   30 ++++-
 swfdec/swfdec_tag.h                 |    6 -
 swfdec/swfdec_text_field_movie.c    |    2 
 swfdec/swfdec_text_field_movie_as.c |    3 
 swfdec/swfdec_text_format.c         |    5 
 swfdec/swfdec_transform_as.c        |    3 
 swfdec/swfdec_video_movie_as.c      |    4 
 swfdec/swfdec_xml.c                 |    3 
 swfdec/swfdec_xml_node.c            |    8 -
 swfdec/swfdec_xml_socket.c          |    3 
 test/swfdec_test_buffer.c           |    7 -
 test/swfdec_test_image.c            |    3 
 test/swfdec_test_socket.c           |    3 
 test/swfdec_test_test.c             |    6 -
 test/trace/Makefile.am              |   11 ++
 test/trace/invalid-utf8-4.swf       |binary
 test/trace/invalid-utf8-4.swf.trace |    2 
 test/trace/invalid-utf8-5.swf       |binary
 test/trace/invalid-utf8-5.swf.trace |    2 
 test/trace/invalid-utf8-6.swf       |binary
 test/trace/invalid-utf8-6.swf.trace |    2 
 test/trace/invalid-utf8-7.swf       |binary
 test/trace/invalid-utf8-7.swf.trace |    2 
 test/trace/invalid-utf8-8.swf       |binary
 test/trace/invalid-utf8-8.swf.trace |    2 
 test/trace/invalid-utf8.as          |   17 +++
 vivified/code/compiler.c            |   16 ++
 vivified/code/vivi_code_compiler.c  |    3 
 vivified/core/vivi_wrap.c           |    3 
 61 files changed, 150 insertions(+), 417 deletions(-)

New commits:
commit 7cb70c829710c9e052d2c49cca42ed88bc18aa82
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Jul 21 15:02:53 2008 +0100

    change semantics of swfdec_as_context_use_mem()
    
    swfdec_as_context_use_mem() will now not do hard memory checking anymore,
    but do soft checking. This means that you can use memory as long as you
    want to and the only difference is that the context will abort with OOM. You
    are not expected to track if the context has aborted, unless you do
    potentially large allocations. In that case extra care has to be taken by the
    developer as the system will not enforce anything anymore.
    
    The positive effect about this is that all script object allocation functions
    (like swfdec_as_object_new()) now guarantee to always return an object, so no
    NULL-checks have to be performed. This reduces code size and ensures
    readability.
    Plus, everyone forgets these checks. In the code I fied I found at least 8
    potential NULL-pointer dereferences.

diff --git a/swfdec/swfdec_amf.c b/swfdec/swfdec_amf.c
index c3a091f..251a764 100644
--- a/swfdec/swfdec_amf.c
+++ b/swfdec/swfdec_amf.c
@@ -97,8 +97,6 @@ swfdec_amf_parse_object (SwfdecAsContext *context, SwfdecBits *bits, SwfdecAsVal
   SwfdecAsObject *object;
   
   object = swfdec_as_object_new (context);
-  if (object == NULL)
-    return FALSE;
   if (!swfdec_amf_parse_properties (context, bits, object))
     return FALSE;
   SWFDEC_AS_VALUE_SET_OBJECT (val, object);
@@ -113,8 +111,6 @@ swfdec_amf_parse_mixed_array (SwfdecAsContext *context, SwfdecBits *bits, Swfdec
   
   len = swfdec_bits_get_bu32 (bits);
   array = swfdec_as_array_new (context);
-  if (array == NULL)
-    return FALSE;
   if (!swfdec_amf_parse_properties (context, bits, array))
     return FALSE;
   SWFDEC_AS_VALUE_SET_OBJECT (val, array);
@@ -131,8 +127,6 @@ swfdec_amf_parse_array (SwfdecAsContext *context, SwfdecBits *bits, SwfdecAsValu
   
   len = swfdec_bits_get_bu32 (bits);
   array = swfdec_as_array_new (context);
-  if (array == NULL)
-    return FALSE;
   for (i = 0; i < len; i++) {
     SwfdecAsValue tmp;
     type = swfdec_bits_get_u8 (bits);
diff --git a/swfdec/swfdec_as_array.c b/swfdec/swfdec_as_array.c
index 070f0ab..059317e 100644
--- a/swfdec/swfdec_as_array.c
+++ b/swfdec/swfdec_as_array.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>
  *               2007 Pekka Lampila <pekka.lampila at iki.fi>
  *
  * This library is free software; you can redistribute it and/or
@@ -571,7 +571,7 @@ swfdec_as_array_init (SwfdecAsArray *array)
  *
  * Creates a new #SwfdecAsArray. 
  *
- * Returns: the new array or %NULL on OOM.
+ * Returns: the new array
  **/
 SwfdecAsObject *
 swfdec_as_array_new (SwfdecAsContext *context)
@@ -581,8 +581,7 @@ swfdec_as_array_new (SwfdecAsContext *context)
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
 
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsArray)))
-    return NULL;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecAsArray));
 
   ret = g_object_new (SWFDEC_TYPE_AS_ARRAY, NULL);
   swfdec_as_object_add (ret, context, sizeof (SwfdecAsArray));
@@ -1373,8 +1372,7 @@ swfdec_as_array_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   if (!cx->frame->construct) {
     SwfdecAsValue val;
-    if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecAsArray)))
-      return;
+    swfdec_as_context_use_mem (cx, sizeof (SwfdecAsArray));
     object = g_object_new (SWFDEC_TYPE_AS_ARRAY, NULL);
     swfdec_as_object_add (object, cx, sizeof (SwfdecAsArray));
     swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_Array, &val);
diff --git a/swfdec/swfdec_as_context.c b/swfdec/swfdec_as_context.c
index 20a7119..cdd7291 100644
--- a/swfdec/swfdec_as_context.c
+++ b/swfdec/swfdec_as_context.c
@@ -169,8 +169,8 @@ swfdec_as_context_abort (SwfdecAsContext *context, const char *reason)
 {
   g_return_if_fail (context);
 
-  SWFDEC_ERROR ("%s", reason);
   if (context->state != SWFDEC_AS_CONTEXT_ABORTED) {
+    SWFDEC_ERROR ("abort: %s", reason);
     context->state = SWFDEC_AS_CONTEXT_ABORTED;
     g_object_notify (G_OBJECT (context), "aborted");
   }
@@ -218,14 +218,16 @@ swfdec_as_context_try_use_mem (SwfdecAsContext *context, gsize bytes)
  *
  * Returns: %TRUE if the memory could be allocated. %FALSE on OOM.
  **/
-gboolean
+void
 swfdec_as_context_use_mem (SwfdecAsContext *context, gsize bytes)
 {
-  g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), FALSE);
-  g_return_val_if_fail (bytes > 0, FALSE);
+  g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context));
+  g_return_if_fail (bytes > 0);
 
   /* FIXME: Don't forget to abort on OOM */
-  return swfdec_as_context_try_use_mem (context, bytes);
+  if (!swfdec_as_context_try_use_mem (context, bytes)) {
+    swfdec_as_context_abort (context, "Out of memory");
+  }
 }
 
 /**
@@ -619,8 +621,10 @@ swfdec_as_context_create_string (SwfdecAsContext *context, const char *string, g
 {
   char *new;
   
-  if (!swfdec_as_context_use_mem (context, sizeof (char) * (2 + len)))
+  if (!swfdec_as_context_try_use_mem (context, sizeof (char) * (2 + len))) {
+    swfdec_as_context_abort (context, "Out of memory");
     return SWFDEC_AS_STR_EMPTY;
+  }
 
   new = g_slice_alloc (2 + len);
   memcpy (&new[1], string, len);
diff --git a/swfdec/swfdec_as_context.h b/swfdec/swfdec_as_context.h
index a8732e0..e517992 100644
--- a/swfdec/swfdec_as_context.h
+++ b/swfdec/swfdec_as_context.h
@@ -121,7 +121,7 @@ gboolean	swfdec_as_context_catch		(SwfdecAsContext *	context,
 
 gboolean	swfdec_as_context_try_use_mem	(SwfdecAsContext *	context,
 						 gsize			bytes);
-gboolean	swfdec_as_context_use_mem	(SwfdecAsContext *	context,
+void		swfdec_as_context_use_mem	(SwfdecAsContext *	context,
 						 gsize			bytes);
 void		swfdec_as_context_unuse_mem   	(SwfdecAsContext *	context,
 						 gsize			bytes);
diff --git a/swfdec/swfdec_as_date.c b/swfdec/swfdec_as_date.c
index e41ac66..eb37f66 100644
--- a/swfdec/swfdec_as_date.c
+++ b/swfdec/swfdec_as_date.c
@@ -1016,8 +1016,7 @@ swfdec_as_date_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   if (!cx->frame->construct) {
     SwfdecAsValue val;
-    if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecAsDate)))
-      return;
+    swfdec_as_context_use_mem (cx, sizeof (SwfdecAsDate));
     object = g_object_new (SWFDEC_TYPE_AS_DATE, NULL);
     swfdec_as_object_add (object, cx, sizeof (SwfdecAsDate));
     swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_Date, &val);
@@ -1171,8 +1170,7 @@ swfdec_as_date_new (SwfdecAsContext *context, double milliseconds,
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
 
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsDate)))
-    return NULL;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecAsDate));
 
   ret = g_object_new (SWFDEC_TYPE_AS_DATE, NULL);
   swfdec_as_object_add (ret, context, sizeof (SwfdecAsDate));
diff --git a/swfdec/swfdec_as_frame.c b/swfdec/swfdec_as_frame.c
index 7f07a46..0604f04 100644
--- a/swfdec/swfdec_as_frame.c
+++ b/swfdec/swfdec_as_frame.c
@@ -394,8 +394,7 @@ swfdec_as_frame_new (SwfdecAsContext *context, SwfdecScript *script)
   g_return_val_if_fail (script != NULL, NULL);
   
   size = sizeof (SwfdecAsFrame) + sizeof (SwfdecAsValue) * script->n_registers;
-  if (!swfdec_as_context_use_mem (context, size))
-    return NULL;
+  swfdec_as_context_use_mem (context, size);
   frame = g_object_new (SWFDEC_TYPE_AS_FRAME, NULL);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (frame), context, size);
   frame->script = swfdec_script_ref (script);
@@ -425,8 +424,7 @@ swfdec_as_frame_new_native (SwfdecAsContext *context)
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
   
   size = sizeof (SwfdecAsFrame);
-  if (!swfdec_as_context_use_mem (context, size))
-    return NULL;
+  swfdec_as_context_use_mem (context, size);
   frame = g_object_new (SWFDEC_TYPE_AS_FRAME, NULL);
   SWFDEC_DEBUG ("new native frame");
   swfdec_as_object_add (SWFDEC_AS_OBJECT (frame), context, size);
@@ -697,8 +695,6 @@ swfdec_as_frame_preload (SwfdecAsFrame *frame)
   if ((script->flags & (SWFDEC_SCRIPT_PRELOAD_ARGS | SWFDEC_SCRIPT_SUPPRESS_ARGS)) != SWFDEC_SCRIPT_SUPPRESS_ARGS) {
     SwfdecAsFrame *next;
     args = swfdec_as_array_new (context);
-    if (!args)
-      goto out;
     for (cur = swfdec_as_stack_iterator_init_arguments (&iter, frame); cur != NULL;
 	cur = swfdec_as_stack_iterator_next (&iter)) {
       swfdec_as_array_push (SWFDEC_AS_ARRAY (args), cur);
diff --git a/swfdec/swfdec_as_function.c b/swfdec/swfdec_as_function.c
index f99b28a..4e534c9 100644
--- a/swfdec/swfdec_as_function.c
+++ b/swfdec/swfdec_as_function.c
@@ -182,8 +182,6 @@ swfdec_as_function_do_call (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   if (thisp == NULL) {
     thisp = swfdec_as_object_new_empty (cx);
-    if (thisp == NULL)
-      return;
   }
   if (argc > 0) {
     argc--;
@@ -205,11 +203,8 @@ swfdec_as_function_apply (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_FUNCTION, &fun, "|O", &thisp);
 
-  if (thisp == NULL) {
+  if (thisp == NULL)
     thisp = swfdec_as_object_new_empty (cx);
-    if (thisp == NULL)
-      return;
-  }
 
   if (argc > 1 && SWFDEC_AS_VALUE_IS_OBJECT (&argv[1])) {
     int i;
@@ -223,8 +218,10 @@ swfdec_as_function_apply (SwfdecAsContext *cx, SwfdecAsObject *object,
 
     if (length > 0) {
       /* FIXME: find a smarter way to do this, like providing argv not as an array */
-      if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecAsValue) * length))
+      if (!swfdec_as_context_try_use_mem (cx, sizeof (SwfdecAsValue) * length)) {
+	swfdec_as_context_abort (cx, "too many arguments to Function.apply");
 	return;
+      }
       argv_pass = g_malloc (sizeof (SwfdecAsValue) * length);
 
       for (i = 0; i < length; i++) {
@@ -255,16 +252,12 @@ swfdec_as_function_init_context (SwfdecAsContext *context)
 
   function = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global,
       SWFDEC_AS_STR_Function, 0, NULL, 0));
-  if (!function)
-    return;
   swfdec_as_object_set_variable_flags (context->global, SWFDEC_AS_STR_Function, SWFDEC_AS_VARIABLE_VERSION_6_UP);
   context->Function = function;
   SWFDEC_AS_VALUE_SET_OBJECT (&val, function);
   swfdec_as_object_set_variable_and_flags (function, SWFDEC_AS_STR_constructor,
       &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
   proto = swfdec_as_object_new_empty (context);
-  if (!proto)
-    return;
   context->Function_prototype = proto;
   SWFDEC_AS_VALUE_SET_OBJECT (&val, proto);
   swfdec_as_object_set_variable_and_flags (function, SWFDEC_AS_STR_prototype,
diff --git a/swfdec/swfdec_as_interpret.c b/swfdec/swfdec_as_interpret.c
index e2c52e2..4f77e79 100644
--- a/swfdec/swfdec_as_interpret.c
+++ b/swfdec/swfdec_as_interpret.c
@@ -1792,8 +1792,6 @@ swfdec_action_init_object (SwfdecAsContext *cx, guint action, const guint8 *data
   }
 
   object = swfdec_as_object_new (cx);
-  if (object == NULL)
-    return;
   for (i = 0; i < n_args; i++) {
     const char *s = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx, 2));
     swfdec_as_object_set_variable (object, s, swfdec_as_stack_peek (cx, 1));
@@ -1813,8 +1811,6 @@ swfdec_action_init_array (SwfdecAsContext *cx, guint action, const guint8 *data,
   n = swfdec_as_value_to_integer (cx, swfdec_as_stack_peek (cx, 1));
   swfdec_as_stack_pop (cx);
   array = swfdec_as_array_new (cx);
-  if (array == NULL)
-    return;
   /* NB: we can't increase the stack here, as the number can easily be MAXINT */
   for (i = 0; i < n && swfdec_as_stack_get_size (cx) > 0; i++) {
     swfdec_as_stack_ensure_size (cx, 1);
@@ -2376,8 +2372,6 @@ swfdec_action_extends (SwfdecAsContext *cx, guint action, const guint8 *data, gu
   }
   super = SWFDEC_AS_VALUE_GET_OBJECT (superclass);
   prototype = swfdec_as_object_new_empty (cx);
-  if (prototype == NULL)
-    goto fail;
   swfdec_as_object_get_variable (super, SWFDEC_AS_STR_prototype, &proto);
   swfdec_as_object_set_variable_and_flags (prototype, SWFDEC_AS_STR___proto__, &proto,
       SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
diff --git a/swfdec/swfdec_as_native_function.c b/swfdec/swfdec_as_native_function.c
index 71d01af..b1f6be4 100644
--- a/swfdec/swfdec_as_native_function.c
+++ b/swfdec/swfdec_as_native_function.c
@@ -131,7 +131,7 @@ swfdec_as_native_function_init (SwfdecAsNativeFunction *function)
  * will just redurn undefined. You might want to use 
  * swfdec_as_object_add_function() instead of this function.
  *
- * Returns: a new #SwfdecAsFunction or %NULL on OOM
+ * Returns: a new #SwfdecAsFunction
  **/
 SwfdecAsFunction *
 swfdec_as_native_function_new (SwfdecAsContext *context, const char *name,
@@ -143,11 +143,8 @@ swfdec_as_native_function_new (SwfdecAsContext *context, const char *name,
   g_return_val_if_fail (native != NULL, NULL);
   g_return_val_if_fail (prototype == NULL || SWFDEC_IS_AS_OBJECT (prototype), NULL);
 
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsNativeFunction)))
-    return NULL;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecAsNativeFunction));
   fun = g_object_new (SWFDEC_TYPE_AS_NATIVE_FUNCTION, NULL);
-  if (fun == NULL)
-    return NULL;
   fun->native = native;
   fun->min_args = min_args;
   fun->name = g_strdup (name);
diff --git a/swfdec/swfdec_as_object.c b/swfdec/swfdec_as_object.c
index a590d5e..58e7889 100644
--- a/swfdec/swfdec_as_object.c
+++ b/swfdec/swfdec_as_object.c
@@ -208,8 +208,7 @@ swfdec_as_object_hash_create (SwfdecAsObject *object, const char *variable, guin
 
   if (!swfdec_as_variable_name_is_valid (variable))
     return NULL;
-  if (!swfdec_as_context_use_mem (object->context, sizeof (SwfdecAsVariable)))
-    return NULL;
+  swfdec_as_context_use_mem (object->context, sizeof (SwfdecAsVariable));
   var = g_slice_new0 (SwfdecAsVariable);
   var->flags = flags;
   g_hash_table_insert (object->properties, (gpointer) variable, var);
@@ -265,9 +264,8 @@ swfdec_as_watch_new (SwfdecAsFunction *function)
 {
   SwfdecAsWatch *watch;
 
-  if (!swfdec_as_context_use_mem (SWFDEC_AS_OBJECT (function)->context, 
-	sizeof (SwfdecAsWatch)))
-    return NULL;
+  swfdec_as_context_use_mem (SWFDEC_AS_OBJECT (function)->context, 
+      sizeof (SwfdecAsWatch));
 
   watch = g_slice_new (SwfdecAsWatch);
   watch->refcount = 1;
@@ -714,7 +712,7 @@ swfdec_as_object_init (SwfdecAsObject *object)
  * swfdec_as_object_set_constructor() on the returned object yourself.
  * You may want to use swfdec_as_object_new() instead.
  *
- * Returns: A new #SwfdecAsObject adde to @context or %NULL on OOM.
+ * Returns: A new #SwfdecAsObject added to @context
  **/
 SwfdecAsObject *
 swfdec_as_object_new_empty (SwfdecAsContext *context)
@@ -723,8 +721,7 @@ swfdec_as_object_new_empty (SwfdecAsContext *context)
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
   
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsObject)))
-    return NULL;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecAsObject));
   object = g_object_new (SWFDEC_TYPE_AS_OBJECT, NULL);
   swfdec_as_object_add (object, context, sizeof (SwfdecAsObject));
   return object;
@@ -737,7 +734,7 @@ swfdec_as_object_new_empty (SwfdecAsContext *context)
  * Allocates a new Object. This does the same as the Actionscript code 
  * "new Object()".
  *
- * Returns: the new object or NULL on out of memory.
+ * Returns: the new object
  **/
 SwfdecAsObject *
 swfdec_as_object_new (SwfdecAsContext *context)
@@ -750,8 +747,6 @@ swfdec_as_object_new (SwfdecAsContext *context)
   g_assert (context->Object_prototype);
   
   object = swfdec_as_object_new_empty (context);
-  if (object == NULL)
-    return NULL;
   SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Object);
   swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR_constructor,
       &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
@@ -1127,7 +1122,7 @@ swfdec_as_object_do_nothing (SwfdecAsContext *cx, SwfdecAsObject *object,
  * Adds @native as a variable named @name to @object. The newly added variable
  * will not be enumerated.
  *
- * Returns: the newly created #SwfdecAsFunction or %NULL on error.
+ * Returns: the newly created #SwfdecAsFunction
  **/
 SwfdecAsFunction *
 swfdec_as_object_add_function (SwfdecAsObject *object, const char *name, GType type,
@@ -1157,7 +1152,7 @@ swfdec_as_object_add_function (SwfdecAsObject *object, const char *name, GType t
  * Adds @native as a constructor named @name to @object. The newly added variable
  * will not be enumerated.
  *
- * Returns: the newly created #SwfdecAsFunction or %NULL on error.
+ * Returns: the newly created #SwfdecAsFunction
  **/
 SwfdecAsFunction *
 swfdec_as_object_add_constructor (SwfdecAsObject *object, const char *name, GType type,
@@ -1175,8 +1170,6 @@ swfdec_as_object_add_constructor (SwfdecAsObject *object, const char *name, GTyp
   if (!native)
     native = swfdec_as_object_do_nothing;
   function = swfdec_as_native_function_new (object->context, name, native, min_args, prototype);
-  if (function == NULL)
-    return NULL;
   if (type != 0)
     swfdec_as_native_function_set_object_type (SWFDEC_AS_NATIVE_FUNCTION (function), type);
   if (construct_type != 0)
@@ -1314,8 +1307,7 @@ swfdec_as_object_create (SwfdecAsFunction *fun, guint n_args,
     type = SWFDEC_TYPE_AS_OBJECT;
     size = sizeof (SwfdecAsObject);
   }
-  if (!swfdec_as_context_use_mem (context, size))
-    return;
+  swfdec_as_context_use_mem (context, size);
 
   new = g_object_new (type, NULL);
   swfdec_as_object_add (new, context, size);
@@ -1730,12 +1722,8 @@ swfdec_as_object_init_context (SwfdecAsContext *context)
   SwfdecAsObject *object, *proto;
 
   proto = swfdec_as_object_new_empty (context);
-  if (!proto)
-    return;
   object = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, 
       SWFDEC_AS_STR_Object, 0, swfdec_as_object_construct, 0));
-  if (!object)
-    return;
   context->Object = object;
   context->Object_prototype = proto;
   SWFDEC_AS_VALUE_SET_OBJECT (&val, proto);
diff --git a/swfdec/swfdec_as_script_function.c b/swfdec/swfdec_as_script_function.c
index c696305..5006c95 100644
--- a/swfdec/swfdec_as_script_function.c
+++ b/swfdec/swfdec_as_script_function.c
@@ -124,19 +124,14 @@ swfdec_as_script_function_new (SwfdecAsObject *target, const GSList *scope_chain
   g_return_val_if_fail (script != NULL, NULL);
 
   context = target->context;
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsScriptFunction)))
-    return NULL;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecAsScriptFunction));
   fun = g_object_new (SWFDEC_TYPE_AS_SCRIPT_FUNCTION, NULL);
-  if (fun == NULL)
-    return NULL;
   fun->scope_chain = g_slist_copy ((GSList *) scope_chain);
   fun->script = script;
   fun->target = target;
   swfdec_as_object_add (SWFDEC_AS_OBJECT (fun), context, sizeof (SwfdecAsScriptFunction));
   /* set prototype */
   proto = swfdec_as_object_new_empty (context);
-  if (proto == NULL)
-    return NULL;
   SWFDEC_AS_VALUE_SET_OBJECT (&val, proto);
   swfdec_as_object_set_variable_and_flags (SWFDEC_AS_OBJECT (fun),
       SWFDEC_AS_STR_prototype, &val,
diff --git a/swfdec/swfdec_as_stack.c b/swfdec/swfdec_as_stack.c
index f86e1e0..fa3d059 100644
--- a/swfdec/swfdec_as_stack.c
+++ b/swfdec/swfdec_as_stack.c
@@ -40,8 +40,7 @@ swfdec_as_stack_new (SwfdecAsContext *context, guint n_elements)
   SwfdecAsStack *stack;
 
   size = sizeof (SwfdecAsStack) + n_elements * sizeof (SwfdecAsValue);
-  if (!swfdec_as_context_use_mem (context, size))
-    return NULL;
+  swfdec_as_context_use_mem (context, size);
 
   stack = g_slice_alloc (size);
   stack->n_elements = n_elements;
diff --git a/swfdec/swfdec_as_string.c b/swfdec/swfdec_as_string.c
index 599cc1e..ff48559 100644
--- a/swfdec/swfdec_as_string.c
+++ b/swfdec/swfdec_as_string.c
@@ -361,8 +361,6 @@ swfdec_as_string_split_5 (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   str = swfdec_as_string_object_to_string (cx, object);
   arr = SWFDEC_AS_ARRAY (swfdec_as_array_new (cx));
-  if (arr == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (arr));
   /* hi, i'm the special case */
   if (argc < 1 || SWFDEC_AS_VALUE_IS_UNDEFINED (&argv[0])) {
@@ -414,8 +412,6 @@ swfdec_as_string_split_6 (SwfdecAsContext *cx, SwfdecAsObject *object,
 
   str = swfdec_as_string_object_to_string (cx, object);
   arr = SWFDEC_AS_ARRAY (swfdec_as_array_new (cx));
-  if (arr == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (arr));
   /* hi, i'm the special case */
   if (argc < 1 || SWFDEC_AS_VALUE_IS_UNDEFINED (&argv[0])) {
diff --git a/swfdec/swfdec_as_super.c b/swfdec/swfdec_as_super.c
index 9e67b40..22a74d2 100644
--- a/swfdec/swfdec_as_super.c
+++ b/swfdec/swfdec_as_super.c
@@ -159,8 +159,7 @@ swfdec_as_super_new (SwfdecAsFrame *frame, SwfdecAsObject *thisp, SwfdecAsObject
   if (context->version <= 5)
     return;
 
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsSuper)))
-    return;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecAsSuper));
   super = g_object_new (SWFDEC_TYPE_AS_SUPER, NULL);
   frame->super = SWFDEC_AS_OBJECT (super);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (super), context, sizeof (SwfdecAsSuper));
diff --git a/swfdec/swfdec_color_as.c b/swfdec/swfdec_color_as.c
index 8a0ed29..8155b1b 100644
--- a/swfdec/swfdec_color_as.c
+++ b/swfdec/swfdec_color_as.c
@@ -93,8 +93,6 @@ swfdec_movie_color_getTransform (SwfdecAsContext *cx, SwfdecAsObject *obj,
     return;
 
   ret = swfdec_as_object_new (cx);
-  if (ret == NULL)
-    return;
 
   add_variable (ret, SWFDEC_AS_STR_ra, movie->color_transform.ra * 100.0 / 256.0);
   add_variable (ret, SWFDEC_AS_STR_ga, movie->color_transform.ga * 100.0 / 256.0);
diff --git a/swfdec/swfdec_color_transform_as.c b/swfdec/swfdec_color_transform_as.c
index a3fe585..416e8ba 100644
--- a/swfdec/swfdec_color_transform_as.c
+++ b/swfdec/swfdec_color_transform_as.c
@@ -371,8 +371,6 @@ swfdec_color_transform_as_new_from_transform (SwfdecAsContext *context,
   g_return_val_if_fail (transform != NULL, NULL);
 
   size = sizeof (SwfdecColorTransformAs);
-  if (!swfdec_as_context_use_mem (context, size))
-    return NULL;
   transform_as = g_object_new (SWFDEC_TYPE_COLOR_TRANSFORM_AS, NULL);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (transform_as), context, size);
 
diff --git a/swfdec/swfdec_interval.c b/swfdec/swfdec_interval.c
index 88a2ca4..da80306 100644
--- a/swfdec/swfdec_interval.c
+++ b/swfdec/swfdec_interval.c
@@ -123,8 +123,7 @@ swfdec_interval_new (SwfdecPlayer *player, guint msecs, gboolean repeat,
 
   context = SWFDEC_AS_CONTEXT (player);
   size = sizeof (SwfdecInterval) + n_args * sizeof (SwfdecAsValue);
-  if (!swfdec_as_context_use_mem (context, size))
-    return 0;
+  swfdec_as_context_use_mem (context, size);
   interval = g_object_new (SWFDEC_TYPE_INTERVAL, NULL);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (interval), context, size);
 
diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index d12da72..8392cbd 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -1399,9 +1399,7 @@ swfdec_movie_new (SwfdecPlayer *player, int depth, SwfdecMovie *parent, SwfdecRe
   }
   /* register it to the VM */
   /* FIXME: It'd be nice if we'd not overuse memory here when calling this function from a script */
-  if (!swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), size)) {
-    size = 0;
-  }
+  swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), size);
   g_object_ref (movie);
   /* set essential properties */
   movie->parent = parent;
diff --git a/swfdec/swfdec_movie_clip_loader.c b/swfdec/swfdec_movie_clip_loader.c
index db9f595..c56aec1 100644
--- a/swfdec/swfdec_movie_clip_loader.c
+++ b/swfdec/swfdec_movie_clip_loader.c
@@ -55,8 +55,6 @@ swfdec_movie_clip_loader_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
     return;
 
   array = swfdec_as_array_new (cx);
-  if (array == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (&val, object);
   swfdec_as_array_push (SWFDEC_AS_ARRAY (array), &val);
   SWFDEC_AS_VALUE_SET_OBJECT (&val, array);
@@ -112,8 +110,6 @@ swfdec_movie_clip_loader_getProgress (SwfdecAsContext *cx, SwfdecAsObject *objec
   if (movie == NULL)
     return;
   ret = swfdec_as_object_new_empty (cx);
-  if (ret == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (rval, ret);
   resource = swfdec_movie_get_own_resource (movie);
   if (resource == NULL || resource->decoder == NULL) {
diff --git a/swfdec/swfdec_net_connection.c b/swfdec/swfdec_net_connection.c
index ad16614..6e288e3 100644
--- a/swfdec/swfdec_net_connection.c
+++ b/swfdec/swfdec_net_connection.c
@@ -67,8 +67,6 @@ swfdec_net_connection_onstatus (SwfdecNetConnection *conn, const char *code,
   SwfdecAsObject *info;
 
   info = swfdec_as_object_new (SWFDEC_AS_OBJECT (conn)->context);
-  if (info == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_STRING (&value, code);
   swfdec_as_object_set_variable (info, SWFDEC_AS_STR_code, &value);
   SWFDEC_AS_VALUE_SET_STRING (&value, level);
@@ -81,21 +79,6 @@ swfdec_net_connection_onstatus (SwfdecNetConnection *conn, const char *code,
   swfdec_as_object_call (SWFDEC_AS_OBJECT (conn), SWFDEC_AS_STR_onStatus, 1, &value, NULL);
 }
 
-SwfdecNetConnection *
-swfdec_net_connection_new (SwfdecAsContext *context)
-{
-  SwfdecNetConnection *conn;
-
-  g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
-
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecNetConnection)))
-    return NULL;
-  conn = g_object_new (SWFDEC_TYPE_NET_CONNECTION, NULL);
-  swfdec_as_object_add (SWFDEC_AS_OBJECT (conn), context, sizeof (SwfdecNetConnection));
-
-  return conn;
-}
-
 void
 swfdec_net_connection_connect (SwfdecNetConnection *conn, const char *url)
 {
diff --git a/swfdec/swfdec_net_connection.h b/swfdec/swfdec_net_connection.h
index c14daac..6ab26b8 100644
--- a/swfdec/swfdec_net_connection.h
+++ b/swfdec/swfdec_net_connection.h
@@ -47,8 +47,6 @@ struct _SwfdecNetConnectionClass {
 
 GType			swfdec_net_connection_get_type	(void);
 
-SwfdecNetConnection *	swfdec_net_connection_new	(SwfdecAsContext *	context);
-
 void			swfdec_net_connection_connect	(SwfdecNetConnection *	conn,
 							 const char *		url);
 
diff --git a/swfdec/swfdec_net_stream.c b/swfdec/swfdec_net_stream.c
index ba0399e..8b9741e 100644
--- a/swfdec/swfdec_net_stream.c
+++ b/swfdec/swfdec_net_stream.c
@@ -47,10 +47,6 @@ swfdec_net_stream_onstatus (SwfdecNetStream *stream, const char *code, const cha
 
   swfdec_sandbox_use (stream->sandbox);
   object = swfdec_as_object_new (SWFDEC_AS_OBJECT (stream)->context);
-  if (!object) {
-    swfdec_sandbox_unuse (stream->sandbox);
-    return;
-  }
   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);
@@ -569,24 +565,6 @@ swfdec_net_stream_init (SwfdecNetStream *stream)
   stream->buffer_time = 100; /* msecs */
 }
 
-SwfdecNetStream *
-swfdec_net_stream_new (SwfdecNetConnection *conn)
-{
-  SwfdecAsContext *context;
-  SwfdecNetStream *stream;
-  
-  g_return_val_if_fail (SWFDEC_IS_NET_CONNECTION (conn), NULL);
-
-  context = SWFDEC_AS_OBJECT (conn)->context;
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecNetStream)))
-    return NULL;
-  stream = g_object_new (SWFDEC_TYPE_NET_STREAM, NULL);
-  swfdec_as_object_add (SWFDEC_AS_OBJECT (stream), context, sizeof (SwfdecNetStream));
-  stream->conn = conn;
-
-  return stream;
-}
-
 static void
 swfdec_net_stream_load (SwfdecPlayer *player, gboolean allowed, gpointer streamp)
 {
diff --git a/swfdec/swfdec_net_stream.h b/swfdec/swfdec_net_stream.h
index 78356c6..d198b52 100644
--- a/swfdec/swfdec_net_stream.h
+++ b/swfdec/swfdec_net_stream.h
@@ -77,8 +77,6 @@ struct _SwfdecNetStreamClass
 
 GType			swfdec_net_stream_get_type	(void);
 
-SwfdecNetStream *	swfdec_net_stream_new		(SwfdecNetConnection *	conn);
-
 void			swfdec_net_stream_set_url	(SwfdecNetStream *	stream,
 							 const char *		url);
 void			swfdec_net_stream_set_loader	(SwfdecNetStream *	stream,
diff --git a/swfdec/swfdec_net_stream_as.c b/swfdec/swfdec_net_stream_as.c
index 4eebd18..a27af26 100644
--- a/swfdec/swfdec_net_stream_as.c
+++ b/swfdec/swfdec_net_stream_as.c
@@ -169,13 +169,9 @@ swfdec_net_stream_init_context (SwfdecPlayer *player)
 
   context = SWFDEC_AS_CONTEXT (player);
   proto = swfdec_as_object_new_empty (context);
-  if (proto == NULL)
-    return;
   stream = SWFDEC_AS_OBJECT (swfdec_as_object_add_constructor (context->global, 
       SWFDEC_AS_STR_NetStream, SWFDEC_TYPE_NET_STREAM, SWFDEC_TYPE_NET_STREAM,
       swfdec_net_stream_construct, 1, proto));
-  if (stream == NULL)
-    return;
   /* set the right properties on the NetStream.prototype object */
   swfdec_as_object_add_function (proto, SWFDEC_AS_STR_pause, SWFDEC_TYPE_NET_STREAM,
       swfdec_net_stream_pause, 0);
diff --git a/swfdec/swfdec_resource.c b/swfdec/swfdec_resource.c
index fdc28ed..0500216 100644
--- a/swfdec/swfdec_resource.c
+++ b/swfdec/swfdec_resource.c
@@ -447,8 +447,7 @@ swfdec_resource_new (SwfdecPlayer *player, SwfdecLoader *loader, const char *var
   g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL);
 
   size = sizeof (SwfdecResource);
-  if (!swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), size))
-    size = 0;
+  swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), size);
   resource = g_object_new (SWFDEC_TYPE_RESOURCE, NULL);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (resource), SWFDEC_AS_CONTEXT (player), size);
   resource->version = 8;
@@ -565,10 +564,7 @@ swfdec_resource_do_load (SwfdecPlayer *player, gboolean allowed, gpointer loadp)
   SwfdecResource *resource;
   SwfdecLoader *loader;
   
-  if (!swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), sizeof (SwfdecResource))) {
-    swfdec_player_unroot (player, load);
-    return;
-  }
+  swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), sizeof (SwfdecResource));
   resource = g_object_new (SWFDEC_TYPE_RESOURCE, NULL);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (resource), SWFDEC_AS_CONTEXT (player), sizeof (SwfdecResource));
   resource->version = 8;
diff --git a/swfdec/swfdec_sandbox.c b/swfdec/swfdec_sandbox.c
index 8842251..cdce611 100644
--- a/swfdec/swfdec_sandbox.c
+++ b/swfdec/swfdec_sandbox.c
@@ -208,8 +208,7 @@ swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url,
   } else {
     SwfdecAsContext *context = SWFDEC_AS_CONTEXT (player);
     guint size = sizeof (SwfdecSandbox);
-    if (!swfdec_as_context_use_mem (context, size))
-      size = 0;
+    swfdec_as_context_use_mem (context, size);
 
     sandbox = g_object_new (SWFDEC_TYPE_SANDBOX, NULL);
     swfdec_as_object_add (SWFDEC_AS_OBJECT (sandbox), context, size);
diff --git a/swfdec/swfdec_sound_object.c b/swfdec/swfdec_sound_object.c
index cb278f9..8e7993c 100644
--- a/swfdec/swfdec_sound_object.c
+++ b/swfdec/swfdec_sound_object.c
@@ -157,8 +157,6 @@ swfdec_sound_object_getTransform (SwfdecAsContext *cx, SwfdecAsObject *object,
     return;
 
   obj = swfdec_as_object_new (cx);
-  if (obj == NULL)
-    return;
 
   SWFDEC_AS_VALUE_SET_INT (&val, matrix->ll);
   swfdec_as_object_set_variable (obj, SWFDEC_AS_STR_ll, &val);
diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index 756051d..7935692 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -842,8 +842,6 @@ swfdec_sprite_movie_getBounds (SwfdecAsContext *cx, SwfdecAsObject *object,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE, &movie, "");
 
   obj= swfdec_as_object_new_empty (cx);
-  if (obj== NULL)
-    return;
 
   swfdec_movie_update (movie);
   if (swfdec_rect_is_empty (&movie->extents)) {
@@ -936,12 +934,8 @@ swfdec_sprite_movie_init_context (SwfdecPlayer *player)
 
   movie = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, 
       SWFDEC_AS_STR_MovieClip, 0, NULL, 0));
-  if (movie == NULL)
-    return;
   SWFDEC_SANDBOX (context->global)->MovieClip = movie;
   proto = swfdec_as_object_new (context);
-  if (!proto)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (&val, proto);
   swfdec_as_object_set_variable_and_flags (movie,
       SWFDEC_AS_STR_prototype, &val, SWFDEC_AS_VARIABLE_HIDDEN |
diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 6d501dd..28712df 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -405,8 +405,6 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie)
 
   /* create _listeners array */
   array = swfdec_as_array_new (cx);
-  if (array == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (movie));
   swfdec_as_array_push (SWFDEC_AS_ARRAY (array), &val);
   SWFDEC_AS_VALUE_SET_OBJECT (&val, array);
diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index a7dad16..5b18e66 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -1550,8 +1550,7 @@ swfdec_text_field_movie_construct (SwfdecAsContext *cx, SwfdecAsObject *object,
 {
   if (!cx->frame->construct) {
     SwfdecAsValue val;
-    if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecAsObject)))
-      return;
+    swfdec_as_context_use_mem (cx, sizeof (SwfdecAsObject));
     object = g_object_new (SWFDEC_TYPE_AS_OBJECT, NULL);
     swfdec_as_object_add (object, cx, sizeof (SwfdecAsObject));
     swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_TextField, &val);
diff --git a/swfdec/swfdec_text_format.c b/swfdec/swfdec_text_format.c
index 1971c72..9ec4d15 100644
--- a/swfdec/swfdec_text_format.c
+++ b/swfdec/swfdec_text_format.c
@@ -817,8 +817,6 @@ swfdec_text_format_getTextExtent (SwfdecAsContext *cx, SwfdecAsObject *object,
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FORMAT, &format, "s", &text);
 
   obj = swfdec_as_object_new_empty (cx);
-  if (obj == NULL)
-    return;
 
   buffer = swfdec_text_buffer_new ();
   swfdec_text_buffer_set_default_attributes (buffer,
@@ -1074,8 +1072,7 @@ swfdec_text_format_new_no_properties (SwfdecAsContext *context)
 
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
 
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecTextFormat)))
-    return NULL;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecTextFormat));
 
   ret = g_object_new (SWFDEC_TYPE_TEXT_FORMAT, NULL);
   swfdec_as_object_add (ret, context, sizeof (SwfdecTextFormat));
diff --git a/swfdec/swfdec_transform_as.c b/swfdec/swfdec_transform_as.c
index ae82bc5..9d1b990 100644
--- a/swfdec/swfdec_transform_as.c
+++ b/swfdec/swfdec_transform_as.c
@@ -208,8 +208,7 @@ swfdec_transform_as_new (SwfdecAsContext *context, SwfdecMovie *target)
   g_return_val_if_fail (SWFDEC_IS_MOVIE (target), NULL);
 
   size = sizeof (SwfdecTransformAs);
-  if (!swfdec_as_context_use_mem (context, size))
-    return NULL;
+  swfdec_as_context_use_mem (context, size);
   transform = g_object_new (SWFDEC_TYPE_TRANSFORM_AS, NULL);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (transform), context, size);
 
diff --git a/swfdec/swfdec_video_movie_as.c b/swfdec/swfdec_video_movie_as.c
index 4ac2b2f..3e5a5f7 100644
--- a/swfdec/swfdec_video_movie_as.c
+++ b/swfdec/swfdec_video_movie_as.c
@@ -73,12 +73,8 @@ swfdec_video_movie_init_context (SwfdecPlayer *player)
   context = SWFDEC_AS_CONTEXT (player);
   video = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, 
       SWFDEC_AS_STR_Video, 0, NULL, 0));
-  if (video == NULL)
-    return;
   SWFDEC_SANDBOX (context->global)->Video = video;
   proto = swfdec_as_object_new_empty (context);
-  if (proto == NULL)
-    return;
   /* set the right properties on the Video object */
   SWFDEC_AS_VALUE_SET_OBJECT (&val, proto);
   swfdec_as_object_set_variable_and_flags (video, SWFDEC_AS_STR_prototype, &val,
diff --git a/swfdec/swfdec_xml.c b/swfdec/swfdec_xml.c
index d71a461..57a1bff 100644
--- a/swfdec/swfdec_xml.c
+++ b/swfdec/swfdec_xml.c
@@ -947,8 +947,7 @@ swfdec_xml_new_no_properties (SwfdecAsContext *context, const char *str,
   g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL);
 
   size = sizeof (SwfdecXml);
-  if (!swfdec_as_context_use_mem (context, size))
-    return NULL;
+  swfdec_as_context_use_mem (context, size);
   xml = g_object_new (SWFDEC_TYPE_XML, NULL);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (xml), context, size);
   swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_XML, &val);
diff --git a/swfdec/swfdec_xml_node.c b/swfdec/swfdec_xml_node.c
index b0d35aa..32e7e63 100644
--- a/swfdec/swfdec_xml_node.c
+++ b/swfdec/swfdec_xml_node.c
@@ -990,11 +990,6 @@ swfdec_xml_node_init_values (SwfdecXmlNode *node, int type, const char* value)
   }
 
   node->child_nodes = SWFDEC_AS_ARRAY (swfdec_as_array_new (object->context));
-
-  if (node->children == NULL || node->attributes == NULL ||
-      node->child_nodes == NULL) {
-    node->valid = FALSE;
-  }
 }
 
 static void
@@ -1059,8 +1054,7 @@ swfdec_xml_node_new_no_properties (SwfdecAsContext *context,
   g_return_val_if_fail (value != NULL, NULL);
 
   size = sizeof (SwfdecXmlNode);
-  if (!swfdec_as_context_use_mem (context, size))
-    return NULL;
+  swfdec_as_context_use_mem (context, size);
   node = g_object_new (SWFDEC_TYPE_XML_NODE, NULL);
   swfdec_as_object_add (SWFDEC_AS_OBJECT (node), context, size);
   swfdec_as_object_get_variable (context->global, SWFDEC_AS_STR_XMLNode, &val);
diff --git a/swfdec/swfdec_xml_socket.c b/swfdec/swfdec_xml_socket.c
index a697346..d7ea1e8 100644
--- a/swfdec/swfdec_xml_socket.c
+++ b/swfdec/swfdec_xml_socket.c
@@ -221,8 +221,7 @@ swfdec_xml_socket_create (SwfdecAsObject *target, SwfdecSandbox *sandbox, const
   SwfdecXmlSocket *xml;
   SwfdecSocket *sock;
 
-  if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecXmlSocket)))
-    return NULL;
+  swfdec_as_context_use_mem (cx, sizeof (SwfdecXmlSocket));
 
   SWFDEC_FIXME ("implement security checks please");
   sock = swfdec_player_create_socket (SWFDEC_PLAYER (cx), hostname, port);
diff --git a/test/swfdec_test_buffer.c b/test/swfdec_test_buffer.c
index 648d35a..f81ea6a 100644
--- a/test/swfdec_test_buffer.c
+++ b/test/swfdec_test_buffer.c
@@ -34,8 +34,7 @@ swfdec_test_buffer_new (SwfdecAsContext *context, SwfdecBuffer *buffer)
   SwfdecAsValue val;
   SwfdecAsObject *ret;
 
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecTestBuffer)))
-    return NULL;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecTestBuffer));
 
   ret = g_object_new (SWFDEC_TYPE_TEST_BUFFER, NULL);
   swfdec_as_object_add (ret, context, sizeof (SwfdecTestBuffer));
@@ -208,8 +207,6 @@ swfdec_test_buffer_load (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
   }
 
   buffer = swfdec_test_buffer_new (cx, b);
-  if (buffer == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (retval, buffer);
 }
 
@@ -234,8 +231,6 @@ swfdec_test_buffer_sub (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc,
 
   b = swfdec_buffer_new_subbuffer (buffer->buffer, offset, length);
   o = swfdec_test_buffer_new (cx, b);
-  if (o == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (retval, o);
 }
 
diff --git a/test/swfdec_test_image.c b/test/swfdec_test_image.c
index 3d3a60e..b1bc223 100644
--- a/test/swfdec_test_image.c
+++ b/test/swfdec_test_image.c
@@ -34,8 +34,7 @@ swfdec_test_image_new (SwfdecAsContext *context, guint width, guint height)
   SwfdecAsValue val;
   SwfdecAsObject *ret;
 
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecTestImage)))
-    return NULL;
+  swfdec_as_context_use_mem (context, sizeof (SwfdecTestImage));
 
   ret = g_object_new (SWFDEC_TYPE_TEST_IMAGE, NULL);
   swfdec_as_object_add (ret, context, sizeof (SwfdecTestImage));
diff --git a/test/swfdec_test_socket.c b/test/swfdec_test_socket.c
index 030d1a9..a017f99 100644
--- a/test/swfdec_test_socket.c
+++ b/test/swfdec_test_socket.c
@@ -207,8 +207,7 @@ swfdec_test_socket_new (SwfdecTestTest *test, SwfdecTestPluginSocket *plugin)
 
   cx = SWFDEC_AS_OBJECT (test)->context;
 
-  if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecTestSocket)))
-    return NULL;
+  swfdec_as_context_use_mem (cx, sizeof (SwfdecTestSocket));
   new = g_object_new (SWFDEC_TYPE_TEST_SOCKET, NULL);
   swfdec_as_object_add (new, cx, sizeof (SwfdecTestSocket));
   swfdec_as_object_get_variable (cx->global, 
diff --git a/test/swfdec_test_test.c b/test/swfdec_test_test.c
index 71b4994..2da666f 100644
--- a/test/swfdec_test_test.c
+++ b/test/swfdec_test_test.c
@@ -326,8 +326,6 @@ swfdec_test_test_render (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc
     h = test->plugin.height;
   }
   image = swfdec_test_image_new (cx, w, h);
-  if (image == NULL)
-    return;
 
   if (test->plugin.screenshot) {
     test->plugin.screenshot (&test->plugin, 
@@ -367,8 +365,6 @@ 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);
-  if (o == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (retval, o);
 }
 
@@ -413,8 +409,6 @@ 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);
-  if (o == NULL)
-    return;
   SWFDEC_AS_VALUE_SET_OBJECT (retval, o);
 }
 
diff --git a/vivified/core/vivi_wrap.c b/vivified/core/vivi_wrap.c
index da86446..b018dcd 100644
--- a/vivified/core/vivi_wrap.c
+++ b/vivified/core/vivi_wrap.c
@@ -65,8 +65,7 @@ vivi_wrap_object (ViviApplication *app, SwfdecAsObject *object)
     return wrap;
 
   cx = SWFDEC_AS_CONTEXT (app);
-  if (!swfdec_as_context_use_mem (cx, sizeof (ViviWrap)))
-    return NULL;
+  swfdec_as_context_use_mem (cx, sizeof (ViviWrap));
   wrap = g_object_new (VIVI_TYPE_WRAP, NULL);
   swfdec_as_object_add (wrap, cx, sizeof (ViviWrap));
   /* frames are special */
commit ae43643eb5a5d6e82f48c3eba6b49f6ef2fa9f6f
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Jul 21 10:24:15 2008 +0100

    add a test that contains invalid strings

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 5196770..8c31dea 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -1685,6 +1685,17 @@ EXTRA_DIST = \
 	implements-7.swf.trace \
 	implements-8.swf \
 	implements-8.swf.trace \
+	invalid-utf8-4.swf \
+	invalid-utf8-4.swf.trace \
+	invalid-utf8-5.swf \
+	invalid-utf8-5.swf.trace \
+	invalid-utf8-6.swf \
+	invalid-utf8-6.swf.trace \
+	invalid-utf8-7.swf \
+	invalid-utf8-7.swf.trace \
+	invalid-utf8-8.swf \
+	invalid-utf8-8.swf.trace \
+	invalid-utf8.as \
 	invalid-variable-name.as \
 	invalid-variable-name-5.swf \
 	invalid-variable-name-5.swf.trace \
diff --git a/test/trace/invalid-utf8-4.swf b/test/trace/invalid-utf8-4.swf
new file mode 100644
index 0000000..55d1806
Binary files /dev/null and b/test/trace/invalid-utf8-4.swf differ
diff --git a/test/trace/invalid-utf8-4.swf.trace b/test/trace/invalid-utf8-4.swf.trace
new file mode 100644
index 0000000..4f3e24e
--- /dev/null
+++ b/test/trace/invalid-utf8-4.swf.trace
@@ -0,0 +1,2 @@
+ÿÿ
+ÿÿ
diff --git a/test/trace/invalid-utf8-5.swf b/test/trace/invalid-utf8-5.swf
new file mode 100644
index 0000000..005778d
Binary files /dev/null and b/test/trace/invalid-utf8-5.swf differ
diff --git a/test/trace/invalid-utf8-5.swf.trace b/test/trace/invalid-utf8-5.swf.trace
new file mode 100644
index 0000000..4f3e24e
--- /dev/null
+++ b/test/trace/invalid-utf8-5.swf.trace
@@ -0,0 +1,2 @@
+ÿÿ
+ÿÿ
diff --git a/test/trace/invalid-utf8-6.swf b/test/trace/invalid-utf8-6.swf
new file mode 100644
index 0000000..636a24e
Binary files /dev/null and b/test/trace/invalid-utf8-6.swf differ
diff --git a/test/trace/invalid-utf8-6.swf.trace b/test/trace/invalid-utf8-6.swf.trace
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/test/trace/invalid-utf8-6.swf.trace
@@ -0,0 +1,2 @@
+
+
diff --git a/test/trace/invalid-utf8-7.swf b/test/trace/invalid-utf8-7.swf
new file mode 100644
index 0000000..a1a55ff
Binary files /dev/null and b/test/trace/invalid-utf8-7.swf differ
diff --git a/test/trace/invalid-utf8-7.swf.trace b/test/trace/invalid-utf8-7.swf.trace
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/test/trace/invalid-utf8-7.swf.trace
@@ -0,0 +1,2 @@
+
+
diff --git a/test/trace/invalid-utf8-8.swf b/test/trace/invalid-utf8-8.swf
new file mode 100644
index 0000000..3656a8a
Binary files /dev/null and b/test/trace/invalid-utf8-8.swf differ
diff --git a/test/trace/invalid-utf8-8.swf.trace b/test/trace/invalid-utf8-8.swf.trace
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/test/trace/invalid-utf8-8.swf.trace
@@ -0,0 +1,2 @@
+
+
diff --git a/test/trace/invalid-utf8.as b/test/trace/invalid-utf8.as
new file mode 100644
index 0000000..fa90414
--- /dev/null
+++ b/test/trace/invalid-utf8.as
@@ -0,0 +1,17 @@
+// vivi-compile -O 0 -o invalid-utf8.swf invalid-utf8.as
+
+// NB: There is no compiler that compiles invalid utf-8 properly. Therefore,
+// I hexedited the resultig FLash file and replaced the occurences of "xx" with
+// 0xFF 0xFF bytes
+
+asm {
+  pool "", "xx"
+  push pool 0, pool 1
+  add2
+  trace
+  push "xx"
+  trace
+};
+
+getURL ("fscommand:quit", "");
+
commit 47e4dcfb90816b43a2f0a7005497edfc705660ca
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Jul 21 10:23:09 2008 +0100

    make vivi-compile have a -o option so automatic pooling can be disabled

diff --git a/vivified/code/compiler.c b/vivified/code/compiler.c
index f622458..91e81a4 100644
--- a/vivified/code/compiler.c
+++ b/vivified/code/compiler.c
@@ -84,6 +84,7 @@ main (int argc, char *argv[])
   ViviCodeAssembler *assembler;
   int version = 8;
   int rate = 15;
+  int optimize = 2;
   char *size_string = NULL;
   SwfdecRect size_rect = { 0, 0, 2000, 3000 };
   const char *output_filename = NULL;
@@ -91,10 +92,11 @@ main (int argc, char *argv[])
   GError *error = NULL;
 
   GOptionEntry options[] = {
-    { "version", 'v', 0, G_OPTION_ARG_INT, &version, "target version", NULL },
-    { "rate", 'r', 0, G_OPTION_ARG_INT, &rate, "the frame rate of the resulting Flash file", NULL },
-    { "size", 's', 0, G_OPTION_ARG_STRING, &size_string, "the size give as WxH of the resulting Flash file", NULL },
-    { "output", 'o', 0, G_OPTION_ARG_FILENAME, &output_filename, "output filename", NULL },
+    { "version", 'v', 0, G_OPTION_ARG_INT, &version, "target version", "N" },
+    { "rate", 'r', 0, G_OPTION_ARG_INT, &rate, "the frame rate of the resulting Flash file", "N" },
+    { "size", 's', 0, G_OPTION_ARG_STRING, &size_string, "the size give as WxH of the resulting Flash file", "WxH" },
+    { "output", 'o', 0, G_OPTION_ARG_FILENAME, &output_filename, "output filename", "FILE" },
+    { "optimize", 'O', 0, G_OPTION_ARG_INT, &optimize, "optimization level", "LEVEL" },
     { "asm", 'a', 0, G_OPTION_ARG_NONE, &use_asm, "output assembler instead of a Flash file", NULL },
     { NULL }
   };
@@ -188,6 +190,12 @@ main (int argc, char *argv[])
   assembler = g_object_ref (vivi_code_compiler_get_assembler (compiler));
   g_object_unref (compiler);
 
+  if (optimize > 0) {
+    vivi_code_assembler_pool (assembler);
+    if (optimize > 1)
+      vivi_code_assembler_merge_push (assembler, G_MAXUINT);
+  }
+
   if (use_asm) {
     ViviCodePrinter *printer = vivi_code_text_printer_new ();
     vivi_code_printer_print_token (printer, VIVI_CODE_TOKEN (assembler));
diff --git a/vivified/code/vivi_code_compiler.c b/vivified/code/vivi_code_compiler.c
index 7a5c91e..8a5536f 100644
--- a/vivified/code/vivi_code_compiler.c
+++ b/vivified/code/vivi_code_compiler.c
@@ -85,9 +85,6 @@ vivi_code_compiler_compile_script (ViviCodeCompiler *compiler,
 
   vivi_code_compiler_compile_statement (compiler, statement);
   vivi_code_compiler_take_code (compiler, vivi_code_asm_end_new ());
-
-  vivi_code_assembler_pool (compiler->assembler);
-  vivi_code_assembler_merge_push (compiler->assembler, G_MAXUINT);
 }
 
 void
commit 899da3596bcd6286d8d2f3b87649a41b75975182
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Jul 21 10:22:21 2008 +0100

    handle invalid strings and use the empty string instead

diff --git a/swfdec/swfdec_as_interpret.c b/swfdec/swfdec_as_interpret.c
index 37b6141..e2c52e2 100644
--- a/swfdec/swfdec_as_interpret.c
+++ b/swfdec/swfdec_as_interpret.c
@@ -318,10 +318,13 @@ swfdec_action_push (SwfdecAsContext *cx, guint action, const guint8 *data, guint
       case 0: /* string */
 	{
 	  char *s = swfdec_bits_get_string (&bits, cx->version);
-	  if (s == NULL)
-	    return;
-	  SWFDEC_AS_VALUE_SET_STRING (swfdec_as_stack_push (cx), 
-	      swfdec_as_context_give_string (cx, s));
+	  if (s == NULL) {
+	    SWFDEC_AS_VALUE_SET_STRING (swfdec_as_stack_push (cx), 
+		SWFDEC_AS_STR_EMPTY);
+	  } else {
+	    SWFDEC_AS_VALUE_SET_STRING (swfdec_as_stack_push (cx), 
+		swfdec_as_context_give_string (cx, s));
+	  }
 	  break;
 	}
       case 1: /* float */
diff --git a/swfdec/swfdec_constant_pool.c b/swfdec/swfdec_constant_pool.c
index 7cf70b3..9a14312 100644
--- a/swfdec/swfdec_constant_pool.c
+++ b/swfdec/swfdec_constant_pool.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
@@ -22,6 +22,7 @@
 #endif
 
 #include "swfdec_constant_pool.h"
+#include "swfdec_as_strings.h"
 #include "swfdec_bits.h"
 #include "swfdec_debug.h"
 
@@ -73,15 +74,14 @@ swfdec_constant_pool_new (SwfdecAsContext *context, SwfdecBuffer *buffer, guint
   size = sizeof (SwfdecConstantPool) + (MAX (1, n) - 1) * sizeof (char *);
   pool = g_slice_alloc0 (size);
   pool->n_strings = n;
-  for (i = 0; i < n; i++) {
+  for (i = 0; i < n && swfdec_bits_left (&bits); i++) {
     pool->strings[i] = swfdec_bits_get_string (&bits, version);
     if (pool->strings[i] == NULL) {
-      SWFDEC_ERROR ("not enough strings available");
-      g_slice_free1 (size, pool);
-      return NULL;
-    }
-    if (context)
+      SWFDEC_ERROR ("constant pool index %u invalid, using empty string instead.", i);
+      pool->strings[i] = context ? (char *) SWFDEC_AS_STR_EMPTY : g_strdup ("");
+    } else if (context) {
       pool->strings[i] = (char *) swfdec_as_context_give_string (context, pool->strings[i]);
+    }
   }
   if (swfdec_bits_left (&bits)) {
     SWFDEC_WARNING ("constant pool didn't consume whole buffer (%u bytes leftover)", swfdec_bits_left (&bits) / 8);
commit c54f2a4e8b02a2cc8beeaed6623967c57bd1481a
Author: Benjamin Otte <otte at gnome.org>
Date:   Sun Jul 20 10:54:30 2008 +0100

    get rid of unused eval API that should have been died a year ago

diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt
index 73d812c..5ab3a9a 100644
--- a/doc/swfdec-sections.txt
+++ b/doc/swfdec-sections.txt
@@ -429,8 +429,6 @@ swfdec_as_context_maybe_gc
 swfdec_as_context_run
 swfdec_as_context_throw
 swfdec_as_context_catch
-swfdec_as_context_eval
-swfdec_as_context_eval_set
 swfdec_as_context_get_time
 swfdec_as_context_get_frame
 swfdec_as_context_is_constructing
diff --git a/swfdec/swfdec_as_context.c b/swfdec/swfdec_as_context.c
index 6bb28e9..20a7119 100644
--- a/swfdec/swfdec_as_context.c
+++ b/swfdec/swfdec_as_context.c
@@ -1029,183 +1029,6 @@ out:
   return;
 }
 
-/*** EVAL ***/
-
-static char *
-swfdec_as_slash_to_dot (const char *slash_str)
-{
-  const char *cur = slash_str;
-  GString *str = g_string_new ("");
-
-  if (*cur == '/') {
-    g_string_append (str, "_root");
-  } else {
-    goto start;
-  }
-  while (cur && *cur == '/') {
-    cur++;
-start:
-    if (str->len > 0)
-      g_string_append_c (str, '.');
-    if (cur[0] == '.' && cur[1] == '.') {
-      g_string_append (str, "_parent");
-      cur += 2;
-    } else {
-      char *slash = strchr (cur, '/');
-      if (slash) {
-	g_string_append_len (str, cur, slash - cur);
-	cur = slash;
-      } else {
-	g_string_append (str, cur);
-	cur = NULL;
-      }
-    }
-    /* cur should now point to the slash */
-  }
-  if (cur) {
-    if (*cur != '\0')
-      goto fail;
-  }
-  SWFDEC_DEBUG ("parsed slash-notated string \"%s\" into dot notation \"%s\"",
-      slash_str, str->str);
-  return g_string_free (str, FALSE);
-
-fail:
-  SWFDEC_WARNING ("failed to parse slash-notated string \"%s\" into dot notation", slash_str);
-  g_string_free (str, TRUE);
-  return NULL;
-}
-
-static void
-swfdec_as_context_eval_get_property (SwfdecAsContext *cx, 
-    SwfdecAsObject *obj, const char *name, SwfdecAsValue *ret)
-{
-  if (obj) {
-    swfdec_as_object_get_variable (obj, name, ret);
-  } else {
-    if (cx->frame) {
-      swfdec_as_frame_get_variable (cx->frame, name, ret);
-    } else {
-      SWFDEC_WARNING ("eval called without a frame");
-      swfdec_as_object_get_variable (cx->global, name, ret);
-    }
-  }
-}
-
-static void
-swfdec_as_context_eval_set_property (SwfdecAsContext *cx, 
-    SwfdecAsObject *obj, const char *name, const SwfdecAsValue *ret)
-{
-  if (obj == NULL) {
-    if (cx->frame == NULL) {
-      SWFDEC_ERROR ("no frame in eval_set?");
-      return;
-    }
-    swfdec_as_frame_set_variable (cx->frame, name, ret, TRUE, FALSE);
-  } else {
-    swfdec_as_object_set_variable (obj, name, ret);
-  }
-}
-
-static void
-swfdec_as_context_eval_internal (SwfdecAsContext *cx, SwfdecAsObject *obj, const char *str,
-        SwfdecAsValue *val, gboolean set)
-{
-  SwfdecAsValue cur;
-  char **varlist;
-  guint i;
-
-  SWFDEC_LOG ("eval called with \"%s\" on %p", str, obj);
-  if (strchr (str, '/')) {
-    char *work = swfdec_as_slash_to_dot (str);
-    if (!work) {
-      SWFDEC_AS_VALUE_SET_UNDEFINED (val);
-      return;
-    }
-    varlist = g_strsplit (work, ".", -1);
-    g_free (work);
-  } else {
-    varlist = g_strsplit (str, ".", -1);
-  }
-  for (i = 0; varlist[i] != NULL; i++) {
-    const char *dot = swfdec_as_context_get_string (cx, varlist[i]);
-    if (varlist[i+1] != NULL) {
-      swfdec_as_context_eval_get_property (cx, obj, dot, &cur);
-      if (!SWFDEC_AS_VALUE_IS_OBJECT (&cur)) {
-	SWFDEC_AS_VALUE_SET_UNDEFINED (&cur);
-	break;
-      }
-      obj = SWFDEC_AS_VALUE_GET_OBJECT (&cur);
-    } else {
-      if (set) {
-	swfdec_as_context_eval_set_property (cx, obj, dot, val);
-      } else {
-	swfdec_as_context_eval_get_property (cx, obj, dot, &cur);
-      }
-      goto finish;
-    }
-  }
-  if (obj == NULL) {
-    if (cx->frame)
-      obj = cx->frame->target;
-    else
-      obj = cx->global;
-  }
-  g_assert (obj != NULL);
-  SWFDEC_AS_VALUE_SET_OBJECT (&cur, obj);
-
-finish:
-  g_strfreev (varlist);
-  *val = cur;
-}
-
-/**
- * swfdec_as_context_eval:
- * @context: a #SwfdecAsContext
- * @obj: #SwfdecAsObject to use as source for evaluating or NULL for the 
- *       current frame's scope
- * @str: The string to evaluate
- * @val: location for the return value
- *
- * This function works like the Actionscript eval function used on @obj.
- * It handles both slash-style and dot-style notation. If an error occured
- * during evaluation, the return value will be the undefined value.
- **/
-void
-swfdec_as_context_eval (SwfdecAsContext *context, SwfdecAsObject *obj, const char *str, 
-    SwfdecAsValue *val)
-{
-  g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context));
-  g_return_if_fail (obj == NULL || SWFDEC_IS_AS_OBJECT (obj));
-  g_return_if_fail (str != NULL);
-  g_return_if_fail (val != NULL);
-
-  swfdec_as_context_eval_internal (context, obj, str, val, FALSE);
-}
-
-/**
- * swfdec_as_context_eval_set:
- * @context: a #SwfdecAsContext
- * @obj: #SwfdecAsObject to use as source for evaluating or NULL for the 
- *       default object.
- * @str: The string to evaluate
- * @val: the value to set the variable to
- *
- * Sets the variable referenced by @str to @val. If @str does not reference 
- * a valid property, nothing happens.
- **/
-void
-swfdec_as_context_eval_set (SwfdecAsContext *context, SwfdecAsObject *obj, const char *str,
-    const SwfdecAsValue *val)
-{
-  g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context));
-  g_return_if_fail (obj == NULL || SWFDEC_IS_AS_OBJECT (obj));
-  g_return_if_fail (str != NULL);
-  g_return_if_fail (val != NULL);
-
-  swfdec_as_context_eval_internal (context, obj, str, (SwfdecAsValue *) val, TRUE);
-}
-
 /*** AS CODE ***/
 
 static void
diff --git a/swfdec/swfdec_as_context.h b/swfdec/swfdec_as_context.h
index 8cb877b..a8732e0 100644
--- a/swfdec/swfdec_as_context.h
+++ b/swfdec/swfdec_as_context.h
@@ -133,14 +133,6 @@ void		swfdec_as_context_maybe_gc	(SwfdecAsContext *	context);
 
 void		swfdec_as_context_run		(SwfdecAsContext *	context);
 
-void		swfdec_as_context_eval		(SwfdecAsContext *	context,
-						 SwfdecAsObject *	obj,
-						 const char *		str,
-						 SwfdecAsValue *	val);
-void		swfdec_as_context_eval_set	(SwfdecAsContext *	context,
-						 SwfdecAsObject *	obj,
-						 const char *		str,
-						 const SwfdecAsValue *	val);
 
 G_END_DECLS
 #endif
commit 70fa6afd03f45a0696e4ea5d02f6e97bcebc2e52
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Jul 18 10:53:09 2008 +0200

    rename Abc tags to the names used in the specification

diff --git a/swfdec/swfdec_tag.c b/swfdec/swfdec_tag.c
index deedf1f..240da9f 100644
--- a/swfdec/swfdec_tag.c
+++ b/swfdec/swfdec_tag.c
@@ -469,10 +469,10 @@ static struct tag_func_struct tag_funcs[] = {
   [SWFDEC_TAG_DEFINEFONTALIGNZONES] = {"DefineFontAlignZones", NULL, 0},
   [SWFDEC_TAG_CSMTEXTSETTINGS] = {"CSMTextSettings", NULL, 0},
   [SWFDEC_TAG_DEFINEFONT3] = {"DefineFont3", tag_func_define_font_2, 0},
-  [SWFDEC_TAG_AVM2DECL] = {"AVM2Decl", NULL, SWFDEC_TAG_DEFINE_SPRITE },
+  [SWFDEC_TAG_SYMBOLCLASS] = {"SymbolClass", NULL, SWFDEC_TAG_DEFINE_SPRITE },
   [SWFDEC_TAG_METADATA] = {"Metadata", tag_func_metadata, 0},
   [SWFDEC_TAG_DEFINESCALINGGRID] = {"DefineScalingGrid", NULL, 0},
-  [SWFDEC_TAG_AVM2ACTION] = {"AVM2Action", NULL, SWFDEC_TAG_DEFINE_SPRITE },
+  [SWFDEC_TAG_DOABC] = {"DoAbc", NULL, SWFDEC_TAG_DEFINE_SPRITE },
   [SWFDEC_TAG_DEFINESHAPE4] = {"DefineShape4", tag_define_shape_4, 0},
   [SWFDEC_TAG_DEFINEMORPHSHAPE2] = {"DefineMorphShape2", NULL, 0},
   [SWFDEC_TAG_PRIVATE_IMAGE] = { "PrivateImage", NULL, 0},
diff --git a/swfdec/swfdec_tag.h b/swfdec/swfdec_tag.h
index 11e1d2b..eded328 100644
--- a/swfdec/swfdec_tag.h
+++ b/swfdec/swfdec_tag.h
@@ -97,7 +97,7 @@ typedef enum {
   SWFDEC_TAG_DEFINEFONTALIGNZONES = 73,
   SWFDEC_TAG_CSMTEXTSETTINGS	  = 74,
   SWFDEC_TAG_DEFINEFONT3	  = 75,
-  SWFDEC_TAG_AVM2DECL		  = 76,
+  SWFDEC_TAG_SYMBOLCLASS	  = 76,
   SWFDEC_TAG_METADATA		  = 77,
   SWFDEC_TAG_DEFINESCALINGGRID	  = 78,
 #if 0
@@ -105,7 +105,7 @@ typedef enum {
   SWFDEC_TAG_			  = 80,
   SWFDEC_TAG_			  = 81,
 #endif
-  SWFDEC_TAG_AVM2ACTION		  = 82,
+  SWFDEC_TAG_DOABC		  = 82,
   SWFDEC_TAG_DEFINESHAPE4	  = 83,
   SWFDEC_TAG_DEFINEMORPHSHAPE2    = 84,
   SWFDEC_TAG_PRIVATE_IMAGE    	  = 85,
commit ba6614df7d41752ff84e46507594447d6c7d5db7
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Jul 18 10:48:27 2008 +0200

    implement Metadata tag

diff --git a/swfdec/swfdec_swf_decoder.c b/swfdec/swfdec_swf_decoder.c
index 2dabaac..318af69 100644
--- a/swfdec/swfdec_swf_decoder.c
+++ b/swfdec/swfdec_swf_decoder.c
@@ -68,9 +68,13 @@ swfdec_swf_decoder_dispose (GObject *object)
 
   if (s->jpegtables) {
     swfdec_buffer_unref (s->jpegtables);
+    s->jpegtables = NULL;
   }
 
   g_free (s->password);
+  s->password = NULL;
+  g_free (s->metadata);
+  s->metadata = NULL;
 
   G_OBJECT_CLASS (swfdec_swf_decoder_parent_class)->dispose (object);
 }
diff --git a/swfdec/swfdec_swf_decoder.h b/swfdec/swfdec_swf_decoder.h
index 0566c99..0bc7771 100644
--- a/swfdec/swfdec_swf_decoder.h
+++ b/swfdec/swfdec_swf_decoder.h
@@ -68,6 +68,7 @@ struct _SwfdecSwfDecoder
   gboolean		has_metadata;	/* TRUE if this file contains metadata */
   gboolean		protection;   	/* TRUE is this file is protected and may not be edited */
   char *		password;     	/* MD5'd password to open for editing or NULL if may not be opened */
+  char *		metadata;	/* NULL if unset or contents of Metadata tag (supposed to be RDF) */
 
   SwfdecBuffer *	jpegtables;	/* jpeg tables for DefineJPEG compressed jpeg files */
 };
diff --git a/swfdec/swfdec_tag.c b/swfdec/swfdec_tag.c
index d741769..deedf1f 100644
--- a/swfdec/swfdec_tag.c
+++ b/swfdec/swfdec_tag.c
@@ -374,6 +374,28 @@ tag_func_sound_stream_head (SwfdecSwfDecoder *s, guint tag)
   return tag_func_enqueue (s, tag);
 }
 
+static int
+tag_func_metadata (SwfdecSwfDecoder *s, guint tag)
+{
+  char *meta;
+
+  meta = swfdec_bits_get_string (&s->b, s->version);
+  if (meta == NULL) {
+    SWFDEC_ERROR ("invalid metadata contents");
+    return SWFDEC_STATUS_OK;
+  }
+  SWFDEC_LOG ("metadata: %s", meta);
+
+  if (s->metadata) {
+    SWFDEC_ERROR ("Duplicated metadata tag, ignoring");
+    /* FIXME: or use this one? */
+    g_free (meta);
+  } else {
+    s->metadata = meta;
+  }
+  return SWFDEC_STATUS_OK;
+}
+
 struct tag_func_struct
 {
   const char *name;
@@ -448,7 +470,7 @@ static struct tag_func_struct tag_funcs[] = {
   [SWFDEC_TAG_CSMTEXTSETTINGS] = {"CSMTextSettings", NULL, 0},
   [SWFDEC_TAG_DEFINEFONT3] = {"DefineFont3", tag_func_define_font_2, 0},
   [SWFDEC_TAG_AVM2DECL] = {"AVM2Decl", NULL, SWFDEC_TAG_DEFINE_SPRITE },
-  [SWFDEC_TAG_METADATA] = {"Metadata", NULL, 0},
+  [SWFDEC_TAG_METADATA] = {"Metadata", tag_func_metadata, 0},
   [SWFDEC_TAG_DEFINESCALINGGRID] = {"DefineScalingGrid", NULL, 0},
   [SWFDEC_TAG_AVM2ACTION] = {"AVM2Action", NULL, SWFDEC_TAG_DEFINE_SPRITE },
   [SWFDEC_TAG_DEFINESHAPE4] = {"DefineShape4", tag_define_shape_4, 0},
commit 055ad970ad27e3f656565f80afa11b24b45a65be
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Jul 18 10:42:16 2008 +0200

    rename SerialNumber tag to ProductInfo

diff --git a/swfdec/swfdec_tag.c b/swfdec/swfdec_tag.c
index 9e4fd4a..d741769 100644
--- a/swfdec/swfdec_tag.c
+++ b/swfdec/swfdec_tag.c
@@ -420,7 +420,7 @@ static struct tag_func_struct tag_funcs[] = {
   [SWFDEC_TAG_DEFINEMOVIE] = {"DefineMovie", NULL, 0},
   [SWFDEC_TAG_DEFINESPRITE] = {"DefineSprite", tag_func_define_sprite, 0},
   [SWFDEC_TAG_NAMECHARACTER] = {"NameCharacter", NULL, 0},
-  [SWFDEC_TAG_SERIALNUMBER] = {"SerialNumber", NULL, 0},
+  [SWFDEC_TAG_PRODUCTINFO] = {"ProductInfo", NULL, 0},
   [SWFDEC_TAG_GENERATORTEXT] = {"GeneratorText", NULL, 0},
   [SWFDEC_TAG_FRAMELABEL] = {"FrameLabel", tag_func_frame_label, SWFDEC_TAG_DEFINE_SPRITE },
   [SWFDEC_TAG_SOUNDSTREAMHEAD2] = {"SoundStreamHead2", tag_func_sound_stream_head, SWFDEC_TAG_DEFINE_SPRITE },
diff --git a/swfdec/swfdec_tag.h b/swfdec/swfdec_tag.h
index a269fa3..11e1d2b 100644
--- a/swfdec/swfdec_tag.h
+++ b/swfdec/swfdec_tag.h
@@ -62,7 +62,7 @@ typedef enum {
   SWFDEC_TAG_DEFINEMOVIE          = 38,
   SWFDEC_TAG_DEFINESPRITE         = 39,      /* Define a sequence of tags that describe the behavior of a sprite. */
   SWFDEC_TAG_NAMECHARACTER        = 40,      /* Name a character definition, character id and a string, (used for buttons, bitmaps, sprites and sounds). */
-  SWFDEC_TAG_SERIALNUMBER         = 41,
+  SWFDEC_TAG_PRODUCTINFO	  = 41,
   SWFDEC_TAG_GENERATORTEXT        = 42,      /* contains an id */
   SWFDEC_TAG_FRAMELABEL           = 43,      /* A string label for the current frame. */
   SWFDEC_TAG_SOUNDSTREAMHEAD2     = 45,      /* For lossless streaming sound, should not have needed this... */


More information about the Swfdec-commits mailing list