[Swfdec] 11 commits - libswfdec/js libswfdec/swfdec_loader.c libswfdec/swfdec_root_sprite.c libswfdec/swfdec_script.c player/swfdebug.c player/swfdec_player_manager.c test/trace

Benjamin Otte company at kemper.freedesktop.org
Mon Mar 12 16:03:07 PDT 2007


 libswfdec/js/jsapi.c                    |    3 
 libswfdec/js/jsapi.h                    |    2 
 libswfdec/js/jsinterp.c                 |    2 
 libswfdec/js/jsobj.c                    |    4 
 libswfdec/swfdec_loader.c               |    5 
 libswfdec/swfdec_root_sprite.c          |    5 
 libswfdec/swfdec_script.c               |  154 +++++-
 player/swfdebug.c                       |    8 
 player/swfdec_player_manager.c          |    2 
 test/trace/Makefile.am                  |    8 
 test/trace/and-or-5.swf                 |binary
 test/trace/and-or-5.swf.trace           |  801 ++++++++++++++++++++++++++++++++
 test/trace/and-or-6.swf                 |binary
 test/trace/and-or-6.swf.trace           |  649 +++++++++++++++++++++++++
 test/trace/and-or-7.swf                 |binary
 test/trace/and-or-7.swf.trace           |  801 ++++++++++++++++++++++++++++++++
 test/trace/undefined-tostring.swf       |binary
 test/trace/undefined-tostring.swf.trace |    3 
 18 files changed, 2428 insertions(+), 19 deletions(-)

New commits:
diff-tree d569f40ce1d270b721fd0b1fb12ed77a512d6e74 (from ff920ea3ce2cdfa2e16d1a7ee993bd221b94316d)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Mar 13 00:03:07 2007 +0100

    put the sprite id of the init action into the script name

diff --git a/libswfdec/swfdec_root_sprite.c b/libswfdec/swfdec_root_sprite.c
index e8e868b..1b41237 100644
--- a/libswfdec/swfdec_root_sprite.c
+++ b/libswfdec/swfdec_root_sprite.c
@@ -147,6 +147,7 @@ tag_func_do_init_action (SwfdecSwfDecode
   SwfdecBits *bits = &s->b;
   guint id;
   SwfdecSprite *sprite;
+  char *name;
 
   id = swfdec_bits_get_u16 (bits);
   SWFDEC_LOG ("  id = %u", id);
@@ -159,8 +160,10 @@ tag_func_do_init_action (SwfdecSwfDecode
     SWFDEC_ERROR ("sprite %u already has an init action", id);
     return SWFDEC_STATUS_OK;
   }
+  name = g_strdup_printf ("InitAction %u", id);
   sprite->init_action = swfdec_script_new_for_player (SWFDEC_DECODER (s)->player,
-      bits, "InitAction", s->version);
+      bits, name, s->version);
+  g_free (name);
   if (sprite->init_action) {
     swfdec_script_ref (sprite->init_action);
     swfdec_root_sprite_add_root_action (SWFDEC_ROOT_SPRITE (s->main_sprite),
diff-tree ff920ea3ce2cdfa2e16d1a7ee993bd221b94316d (from 472626b9c0ecf18ec535c3fb105fb1508be6e817)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Mar 13 00:02:07 2007 +0100

    Try to reverse engineer the function name for anonymous functions

diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c
index bb56c19..ac47a97 100644
--- a/libswfdec/swfdec_script.c
+++ b/libswfdec/swfdec_script.c
@@ -1715,12 +1715,26 @@ swfdec_action_define_function (JSContext
     return FALSE;
   } else {
     /* create the script */
+    const char *name = NULL;
     SwfdecBuffer *buffer = swfdec_buffer_new_subbuffer (script->buffer, 
 	cx->fp->pc + 3 + len - script->buffer->data, size);
     swfdec_bits_init (&bits, buffer);
+    if (*function_name) {
+      name = function_name;
+    } else if (cx->fp->sp > cx->fp->spbase) {
+      /* This is kind of a hack that uses a feature of the Adobe compiler:
+       * foo = function () {} is compiled as these actions:
+       * Push "foo", DefineFunction, SetVariable/SetMember
+       * With this knowledge we can inspect the topmost stack member, since
+       * it will contain the name this function will soon be assigned to.
+       */
+      if (JSVAL_IS_STRING (cx->fp->sp[-1]))
+	name = JS_GetStringBytes (JSVAL_TO_STRING (cx->fp->sp[-1]));
+    }
+    if (name == NULL)
+      name = "unnamed_function";
     script = swfdec_script_new_for_player (JS_GetContextPrivate (cx),
-	&bits, *function_name ? function_name : "<lambda>", 
-	((SwfdecScript *) cx->fp->swf)->version);
+	&bits, name, ((SwfdecScript *) cx->fp->swf)->version);
     swfdec_buffer_unref (buffer);
     if (cx->fp->constant_pool) {
       script->constant_pool = swfdec_constant_pool_get_area (cx->fp->swf,
diff-tree 472626b9c0ecf18ec535c3fb105fb1508be6e817 (from 373087a199e661915222e8e4fd6a9bcfe292c373)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 22:30:30 2007 +0100

    print ConstantPool id next to the string

diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c
index 3d6a836..bb56c19 100644
--- a/libswfdec/swfdec_script.c
+++ b/libswfdec/swfdec_script.c
@@ -2344,6 +2344,7 @@ swfdec_action_print_constant_pool (guint
   for (i = 0; i < swfdec_constant_pool_size (pool); i++) {
     g_string_append (string, i ? ", " : " ");
     g_string_append (string, swfdec_constant_pool_get (pool, i));
+    g_string_append_printf (string, " (%u)", i);
   }
   return g_string_free (string, FALSE);
 }
diff-tree 373087a199e661915222e8e4fd6a9bcfe292c373 (from abee6c3ca4c2bc3e6337896746a47f8a6b7cb406)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 22:29:29 2007 +0100

    some small fixes
    
    - make all areas have full scrollbars, so there's no bigger-than-fullscreen window
    - don't set an automatic breakpoint on empty functions

diff --git a/player/swfdebug.c b/player/swfdebug.c
index f5aa12b..acb7490 100644
--- a/player/swfdebug.c
+++ b/player/swfdebug.c
@@ -270,14 +270,14 @@ view_swf (SwfdecPlayer *player, double s
 
   scroll = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
-      GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
   gtk_box_pack_start (GTK_BOX (hbox), scroll, TRUE, TRUE, 0);
   widget = swfdec_debug_stack_new (manager);
   gtk_container_add (GTK_CONTAINER (scroll), widget);
 
   scroll = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), 
-      GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
   gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
   widget = gtk_text_view_new ();
   gtk_text_view_set_editable (GTK_TEXT_VIEW (widget), FALSE);
@@ -303,7 +303,9 @@ view_swf (SwfdecPlayer *player, double s
 static void
 do_break_cb (SwfdecDebugger *debugger, SwfdecDebuggerScript *script, gpointer unused)
 {
-  swfdec_debugger_set_breakpoint (debugger, script, 0);
+  /* no need tobreak on scripts that don't do anything, so no special case needed */
+  if (script->n_commands > 0)
+    swfdec_debugger_set_breakpoint (debugger, script, 0);
 }
 
 static gboolean
diff-tree abee6c3ca4c2bc3e6337896746a47f8a6b7cb406 (from e69a7f78da02f87b10450ac20995412909d916fc)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 22:28:31 2007 +0100

    for absolute URIs, print a warning and then load them relative
    
    This is strictly a Youtube fix :)

diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c
index 8c85d81..22f418b 100644
--- a/libswfdec/swfdec_loader.c
+++ b/libswfdec/swfdec_loader.c
@@ -183,8 +183,9 @@ swfdec_file_loader_load (SwfdecLoader *l
   GError *error = NULL;
 
   if (g_path_is_absolute (url)) {
-    SWFDEC_ERROR ("absolute paths are not allowed");
-    return NULL;
+    SWFDEC_ERROR ("\"%s\" is an absolute path - using relative instead", url);
+    while (*url == G_DIR_SEPARATOR)
+      url++;
   }
 
   /* FIXME: need to rework seperators on windows? */
diff-tree e69a7f78da02f87b10450ac20995412909d916fc (from 05fe373cc29797c23c99d67ae5d61e7b50c7c4f3)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 22:06:50 2007 +0100

    JSIDArrays have an unsigned length now

diff --git a/player/swfdec_player_manager.c b/player/swfdec_player_manager.c
index 1f6831c..1307c32 100644
--- a/player/swfdec_player_manager.c
+++ b/player/swfdec_player_manager.c
@@ -591,7 +591,7 @@ command_enumerate (SwfdecPlayerManager *
   JSObject *obj;
   JSIdArray *array;
   const char *s, *t;
-  int i;
+  guint i;
 
   if (!swfdec_js_run (manager->player, arg, &rval)) {
     swfdec_player_manager_error (manager, "Invalid command");
diff-tree 05fe373cc29797c23c99d67ae5d61e7b50c7c4f3 (from 40df9ed037067d3fce3c5da2a918881b97497523)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 22:06:28 2007 +0100

    use swfdec_js_is_movieclip to get around undefined symbols

diff --git a/libswfdec/js/jsobj.c b/libswfdec/js/jsobj.c
index 81ac409..0f825ff 100644
--- a/libswfdec/js/jsobj.c
+++ b/libswfdec/js/jsobj.c
@@ -905,7 +905,7 @@ js_obj_toSource(JSContext *cx, JSObject 
 }
 #endif /* JS_HAS_INITIALIZERS || JS_HAS_TOSOURCE */
 
-extern const JSClass movieclip_class;
+extern int swfdec_js_is_movieclip (JSContext *cx, JSObject *obj);
 extern char *swfdec_movie_get_path (void *movieclip);
 extern void g_free (void *p);
 JSBool
@@ -921,7 +921,7 @@ js_obj_toString(JSContext *cx, JSObject 
 	*rval = STRING_TO_JSVAL(cx->runtime->emptyString);
 	return JS_TRUE;
     }
-    if (clasp == &movieclip_class) {
+    if (swfdec_js_is_movieclip (cx, obj)) {
 	void *p = JS_GetPrivate (cx, obj);
 	if (p) {
 	    char *path = swfdec_movie_get_path (p);
diff-tree 40df9ed037067d3fce3c5da2a918881b97497523 (from a40742304fe1d37a295f11b806da4b5550a18f04)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 21:39:06 2007 +0100

    check undefined to string conversions

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 131989d..ed2582f 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -150,6 +150,8 @@ EXTRA_DIST = \
 	transform2.swf \
 	transform2.swf.trace \
 	transform2.swf.trace.org \
+	undefined-tostring.swf \
+	undefined-tostring.swf.trace \
 	undefined1.swf \
 	undefined1.swf.trace \
 	undefined2-6.swf \
diff --git a/test/trace/undefined-tostring.swf b/test/trace/undefined-tostring.swf
new file mode 100755
index 0000000..a971a58
Binary files /dev/null and b/test/trace/undefined-tostring.swf differ
diff --git a/test/trace/undefined-tostring.swf.trace b/test/trace/undefined-tostring.swf.trace
new file mode 100755
index 0000000..6c96480
--- /dev/null
+++ b/test/trace/undefined-tostring.swf.trace
@@ -0,0 +1,3 @@
+Check undefined gets converted to the empty string
+undefined
+
diff-tree a40742304fe1d37a295f11b806da4b5550a18f04 (from 77266adc81a3093449703572a6123d71d33277d4)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 21:38:16 2007 +0100

    test And and Or actions

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 1994892..131989d 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -9,6 +9,12 @@ trace_LDFLAGS = $(SWF_LIBS) $(CAIRO_LIBS
 
 EXTRA_DIST = \
 	README \
+	and-or-5.swf \
+	and-or-5.swf.trace \
+	and-or-6.swf \
+	and-or-6.swf.trace \
+	and-or-7.swf \
+	and-or-7.swf.trace \
 	array.swf \
 	array.swf.trace \
 	callfunction-stack.as \
diff --git a/test/trace/and-or-5.swf b/test/trace/and-or-5.swf
new file mode 100755
index 0000000..bbbb692
Binary files /dev/null and b/test/trace/and-or-5.swf differ
diff --git a/test/trace/and-or-5.swf.trace b/test/trace/and-or-5.swf.trace
new file mode 100755
index 0000000..f174da0
--- /dev/null
+++ b/test/trace/and-or-5.swf.trace
@@ -0,0 +1,801 @@
+Check AND and OR logical operators with various values
+true (boolean) AND true (boolean) = true
+true (boolean) OR true (boolean) = true
+true (boolean) AND false (boolean) = false
+true (boolean) OR false (boolean) = true
+true (boolean) AND 1 (number) = true
+true (boolean) OR 1 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND 42 (number) = true
+true (boolean) OR 42 (number) = true
+true (boolean) AND -100000 (number) = true
+true (boolean) OR -100000 (number) = true
+true (boolean) AND  (undefined) = false
+true (boolean) OR  (undefined) = true
+true (boolean) AND null (null) = false
+true (boolean) OR null (null) = true
+true (boolean) AND _level0 (movieclip) = true
+true (boolean) OR _level0 (movieclip) = true
+true (boolean) AND [object Object] (object) = true
+true (boolean) OR [object Object] (object) = true
+true (boolean) AND hi (string) = false
+true (boolean) OR hi (string) = true
+true (boolean) AND 1 (string) = true
+true (boolean) OR 1 (string) = true
+true (boolean) AND 0 (string) = false
+true (boolean) OR 0 (string) = true
+true (boolean) AND  (string) = false
+true (boolean) OR  (string) = true
+true (boolean) AND 1 (number) = true
+true (boolean) OR 1 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND -0.2 (number) = true
+true (boolean) OR -0.2 (number) = true
+true (boolean) AND NaN (number) = false
+true (boolean) OR NaN (number) = true
+true (boolean) AND Infinity (number) = true
+true (boolean) OR Infinity (number) = true
+false (boolean) AND true (boolean) = false
+false (boolean) OR true (boolean) = true
+false (boolean) AND false (boolean) = false
+false (boolean) OR false (boolean) = false
+false (boolean) AND 1 (number) = false
+false (boolean) OR 1 (number) = true
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND 42 (number) = false
+false (boolean) OR 42 (number) = true
+false (boolean) AND -100000 (number) = false
+false (boolean) OR -100000 (number) = true
+false (boolean) AND  (undefined) = false
+false (boolean) OR  (undefined) = false
+false (boolean) AND null (null) = false
+false (boolean) OR null (null) = false
+false (boolean) AND _level0 (movieclip) = false
+false (boolean) OR _level0 (movieclip) = true
+false (boolean) AND [object Object] (object) = false
+false (boolean) OR [object Object] (object) = true
+false (boolean) AND hi (string) = false
+false (boolean) OR hi (string) = false
+false (boolean) AND 1 (string) = false
+false (boolean) OR 1 (string) = true
+false (boolean) AND 0 (string) = false
+false (boolean) OR 0 (string) = false
+false (boolean) AND  (string) = false
+false (boolean) OR  (string) = false
+false (boolean) AND 1 (number) = false
+false (boolean) OR 1 (number) = true
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND -0.2 (number) = false
+false (boolean) OR -0.2 (number) = true
+false (boolean) AND NaN (number) = false
+false (boolean) OR NaN (number) = false
+false (boolean) AND Infinity (number) = false
+false (boolean) OR Infinity (number) = true
+1 (number) AND true (boolean) = true
+1 (number) OR true (boolean) = true
+1 (number) AND false (boolean) = false
+1 (number) OR false (boolean) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 42 (number) = true
+1 (number) OR 42 (number) = true
+1 (number) AND -100000 (number) = true
+1 (number) OR -100000 (number) = true
+1 (number) AND  (undefined) = false
+1 (number) OR  (undefined) = true
+1 (number) AND null (null) = false
+1 (number) OR null (null) = true
+1 (number) AND _level0 (movieclip) = true
+1 (number) OR _level0 (movieclip) = true
+1 (number) AND [object Object] (object) = true
+1 (number) OR [object Object] (object) = true
+1 (number) AND hi (string) = false
+1 (number) OR hi (string) = true
+1 (number) AND 1 (string) = true
+1 (number) OR 1 (string) = true
+1 (number) AND 0 (string) = false
+1 (number) OR 0 (string) = true
+1 (number) AND  (string) = false
+1 (number) OR  (string) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND -0.2 (number) = true
+1 (number) OR -0.2 (number) = true
+1 (number) AND NaN (number) = false
+1 (number) OR NaN (number) = true
+1 (number) AND Infinity (number) = true
+1 (number) OR Infinity (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND  (undefined) = false
+0 (number) OR  (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = false
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = false
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+0 (number) AND NaN (number) = false
+0 (number) OR NaN (number) = false
+0 (number) AND Infinity (number) = false
+0 (number) OR Infinity (number) = true
+42 (number) AND true (boolean) = true
+42 (number) OR true (boolean) = true
+42 (number) AND false (boolean) = false
+42 (number) OR false (boolean) = true
+42 (number) AND 1 (number) = true
+42 (number) OR 1 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND 42 (number) = true
+42 (number) OR 42 (number) = true
+42 (number) AND -100000 (number) = true
+42 (number) OR -100000 (number) = true
+42 (number) AND  (undefined) = false
+42 (number) OR  (undefined) = true
+42 (number) AND null (null) = false
+42 (number) OR null (null) = true
+42 (number) AND _level0 (movieclip) = true
+42 (number) OR _level0 (movieclip) = true
+42 (number) AND [object Object] (object) = true
+42 (number) OR [object Object] (object) = true
+42 (number) AND hi (string) = false
+42 (number) OR hi (string) = true
+42 (number) AND 1 (string) = true
+42 (number) OR 1 (string) = true
+42 (number) AND 0 (string) = false
+42 (number) OR 0 (string) = true
+42 (number) AND  (string) = false
+42 (number) OR  (string) = true
+42 (number) AND 1 (number) = true
+42 (number) OR 1 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND -0.2 (number) = true
+42 (number) OR -0.2 (number) = true
+42 (number) AND NaN (number) = false
+42 (number) OR NaN (number) = true
+42 (number) AND Infinity (number) = true
+42 (number) OR Infinity (number) = true
+-100000 (number) AND true (boolean) = true
+-100000 (number) OR true (boolean) = true
+-100000 (number) AND false (boolean) = false
+-100000 (number) OR false (boolean) = true
+-100000 (number) AND 1 (number) = true
+-100000 (number) OR 1 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND 42 (number) = true
+-100000 (number) OR 42 (number) = true
+-100000 (number) AND -100000 (number) = true
+-100000 (number) OR -100000 (number) = true
+-100000 (number) AND  (undefined) = false
+-100000 (number) OR  (undefined) = true
+-100000 (number) AND null (null) = false
+-100000 (number) OR null (null) = true
+-100000 (number) AND _level0 (movieclip) = true
+-100000 (number) OR _level0 (movieclip) = true
+-100000 (number) AND [object Object] (object) = true
+-100000 (number) OR [object Object] (object) = true
+-100000 (number) AND hi (string) = false
+-100000 (number) OR hi (string) = true
+-100000 (number) AND 1 (string) = true
+-100000 (number) OR 1 (string) = true
+-100000 (number) AND 0 (string) = false
+-100000 (number) OR 0 (string) = true
+-100000 (number) AND  (string) = false
+-100000 (number) OR  (string) = true
+-100000 (number) AND 1 (number) = true
+-100000 (number) OR 1 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND -0.2 (number) = true
+-100000 (number) OR -0.2 (number) = true
+-100000 (number) AND NaN (number) = false
+-100000 (number) OR NaN (number) = true
+-100000 (number) AND Infinity (number) = true
+-100000 (number) OR Infinity (number) = true
+ (undefined) AND true (boolean) = false
+ (undefined) OR true (boolean) = true
+ (undefined) AND false (boolean) = false
+ (undefined) OR false (boolean) = false
+ (undefined) AND 1 (number) = false
+ (undefined) OR 1 (number) = true
+ (undefined) AND 0 (number) = false
+ (undefined) OR 0 (number) = false
+ (undefined) AND 42 (number) = false
+ (undefined) OR 42 (number) = true
+ (undefined) AND -100000 (number) = false
+ (undefined) OR -100000 (number) = true
+ (undefined) AND  (undefined) = false
+ (undefined) OR  (undefined) = false
+ (undefined) AND null (null) = false
+ (undefined) OR null (null) = false
+ (undefined) AND _level0 (movieclip) = false
+ (undefined) OR _level0 (movieclip) = true
+ (undefined) AND [object Object] (object) = false
+ (undefined) OR [object Object] (object) = true
+ (undefined) AND hi (string) = false
+ (undefined) OR hi (string) = false
+ (undefined) AND 1 (string) = false
+ (undefined) OR 1 (string) = true
+ (undefined) AND 0 (string) = false
+ (undefined) OR 0 (string) = false
+ (undefined) AND  (string) = false
+ (undefined) OR  (string) = false
+ (undefined) AND 1 (number) = false
+ (undefined) OR 1 (number) = true
+ (undefined) AND 0 (number) = false
+ (undefined) OR 0 (number) = false
+ (undefined) AND 0 (number) = false
+ (undefined) OR 0 (number) = false
+ (undefined) AND -0.2 (number) = false
+ (undefined) OR -0.2 (number) = true
+ (undefined) AND NaN (number) = false
+ (undefined) OR NaN (number) = false
+ (undefined) AND Infinity (number) = false
+ (undefined) OR Infinity (number) = true
+null (null) AND true (boolean) = false
+null (null) OR true (boolean) = true
+null (null) AND false (boolean) = false
+null (null) OR false (boolean) = false
+null (null) AND 1 (number) = false
+null (null) OR 1 (number) = true
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND 42 (number) = false
+null (null) OR 42 (number) = true
+null (null) AND -100000 (number) = false
+null (null) OR -100000 (number) = true
+null (null) AND  (undefined) = false
+null (null) OR  (undefined) = false
+null (null) AND null (null) = false
+null (null) OR null (null) = false
+null (null) AND _level0 (movieclip) = false
+null (null) OR _level0 (movieclip) = true
+null (null) AND [object Object] (object) = false
+null (null) OR [object Object] (object) = true
+null (null) AND hi (string) = false
+null (null) OR hi (string) = false
+null (null) AND 1 (string) = false
+null (null) OR 1 (string) = true
+null (null) AND 0 (string) = false
+null (null) OR 0 (string) = false
+null (null) AND  (string) = false
+null (null) OR  (string) = false
+null (null) AND 1 (number) = false
+null (null) OR 1 (number) = true
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND -0.2 (number) = false
+null (null) OR -0.2 (number) = true
+null (null) AND NaN (number) = false
+null (null) OR NaN (number) = false
+null (null) AND Infinity (number) = false
+null (null) OR Infinity (number) = true
+_level0 (movieclip) AND true (boolean) = true
+_level0 (movieclip) OR true (boolean) = true
+_level0 (movieclip) AND false (boolean) = false
+_level0 (movieclip) OR false (boolean) = true
+_level0 (movieclip) AND 1 (number) = true
+_level0 (movieclip) OR 1 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND 42 (number) = true
+_level0 (movieclip) OR 42 (number) = true
+_level0 (movieclip) AND -100000 (number) = true
+_level0 (movieclip) OR -100000 (number) = true
+_level0 (movieclip) AND  (undefined) = false
+_level0 (movieclip) OR  (undefined) = true
+_level0 (movieclip) AND null (null) = false
+_level0 (movieclip) OR null (null) = true
+_level0 (movieclip) AND _level0 (movieclip) = true
+_level0 (movieclip) OR _level0 (movieclip) = true
+_level0 (movieclip) AND [object Object] (object) = true
+_level0 (movieclip) OR [object Object] (object) = true
+_level0 (movieclip) AND hi (string) = false
+_level0 (movieclip) OR hi (string) = true
+_level0 (movieclip) AND 1 (string) = true
+_level0 (movieclip) OR 1 (string) = true
+_level0 (movieclip) AND 0 (string) = false
+_level0 (movieclip) OR 0 (string) = true
+_level0 (movieclip) AND  (string) = false
+_level0 (movieclip) OR  (string) = true
+_level0 (movieclip) AND 1 (number) = true
+_level0 (movieclip) OR 1 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND -0.2 (number) = true
+_level0 (movieclip) OR -0.2 (number) = true
+_level0 (movieclip) AND NaN (number) = false
+_level0 (movieclip) OR NaN (number) = true
+_level0 (movieclip) AND Infinity (number) = true
+_level0 (movieclip) OR Infinity (number) = true
+[object Object] (object) AND true (boolean) = true
+[object Object] (object) OR true (boolean) = true
+[object Object] (object) AND false (boolean) = false
+[object Object] (object) OR false (boolean) = true
+[object Object] (object) AND 1 (number) = true
+[object Object] (object) OR 1 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND 42 (number) = true
+[object Object] (object) OR 42 (number) = true
+[object Object] (object) AND -100000 (number) = true
+[object Object] (object) OR -100000 (number) = true
+[object Object] (object) AND  (undefined) = false
+[object Object] (object) OR  (undefined) = true
+[object Object] (object) AND null (null) = false
+[object Object] (object) OR null (null) = true
+[object Object] (object) AND _level0 (movieclip) = true
+[object Object] (object) OR _level0 (movieclip) = true
+[object Object] (object) AND [object Object] (object) = true
+[object Object] (object) OR [object Object] (object) = true
+[object Object] (object) AND hi (string) = false
+[object Object] (object) OR hi (string) = true
+[object Object] (object) AND 1 (string) = true
+[object Object] (object) OR 1 (string) = true
+[object Object] (object) AND 0 (string) = false
+[object Object] (object) OR 0 (string) = true
+[object Object] (object) AND  (string) = false
+[object Object] (object) OR  (string) = true
+[object Object] (object) AND 1 (number) = true
+[object Object] (object) OR 1 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND -0.2 (number) = true
+[object Object] (object) OR -0.2 (number) = true
+[object Object] (object) AND NaN (number) = false
+[object Object] (object) OR NaN (number) = true
+[object Object] (object) AND Infinity (number) = true
+[object Object] (object) OR Infinity (number) = true
+hi (string) AND true (boolean) = false
+hi (string) OR true (boolean) = true
+hi (string) AND false (boolean) = false
+hi (string) OR false (boolean) = false
+hi (string) AND 1 (number) = false
+hi (string) OR 1 (number) = true
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = false
+hi (string) AND 42 (number) = false
+hi (string) OR 42 (number) = true
+hi (string) AND -100000 (number) = false
+hi (string) OR -100000 (number) = true
+hi (string) AND  (undefined) = false
+hi (string) OR  (undefined) = false
+hi (string) AND null (null) = false
+hi (string) OR null (null) = false
+hi (string) AND _level0 (movieclip) = false
+hi (string) OR _level0 (movieclip) = true
+hi (string) AND [object Object] (object) = false
+hi (string) OR [object Object] (object) = true
+hi (string) AND hi (string) = false
+hi (string) OR hi (string) = false
+hi (string) AND 1 (string) = false
+hi (string) OR 1 (string) = true
+hi (string) AND 0 (string) = false
+hi (string) OR 0 (string) = false
+hi (string) AND  (string) = false
+hi (string) OR  (string) = false
+hi (string) AND 1 (number) = false
+hi (string) OR 1 (number) = true
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = false
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = false
+hi (string) AND -0.2 (number) = false
+hi (string) OR -0.2 (number) = true
+hi (string) AND NaN (number) = false
+hi (string) OR NaN (number) = false
+hi (string) AND Infinity (number) = false
+hi (string) OR Infinity (number) = true
+1 (string) AND true (boolean) = true
+1 (string) OR true (boolean) = true
+1 (string) AND false (boolean) = false
+1 (string) OR false (boolean) = true
+1 (string) AND 1 (number) = true
+1 (string) OR 1 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND 42 (number) = true
+1 (string) OR 42 (number) = true
+1 (string) AND -100000 (number) = true
+1 (string) OR -100000 (number) = true
+1 (string) AND  (undefined) = false
+1 (string) OR  (undefined) = true
+1 (string) AND null (null) = false
+1 (string) OR null (null) = true
+1 (string) AND _level0 (movieclip) = true
+1 (string) OR _level0 (movieclip) = true
+1 (string) AND [object Object] (object) = true
+1 (string) OR [object Object] (object) = true
+1 (string) AND hi (string) = false
+1 (string) OR hi (string) = true
+1 (string) AND 1 (string) = true
+1 (string) OR 1 (string) = true
+1 (string) AND 0 (string) = false
+1 (string) OR 0 (string) = true
+1 (string) AND  (string) = false
+1 (string) OR  (string) = true
+1 (string) AND 1 (number) = true
+1 (string) OR 1 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND -0.2 (number) = true
+1 (string) OR -0.2 (number) = true
+1 (string) AND NaN (number) = false
+1 (string) OR NaN (number) = true
+1 (string) AND Infinity (number) = true
+1 (string) OR Infinity (number) = true
+0 (string) AND true (boolean) = false
+0 (string) OR true (boolean) = true
+0 (string) AND false (boolean) = false
+0 (string) OR false (boolean) = false
+0 (string) AND 1 (number) = false
+0 (string) OR 1 (number) = true
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = false
+0 (string) AND 42 (number) = false
+0 (string) OR 42 (number) = true
+0 (string) AND -100000 (number) = false
+0 (string) OR -100000 (number) = true
+0 (string) AND  (undefined) = false
+0 (string) OR  (undefined) = false
+0 (string) AND null (null) = false
+0 (string) OR null (null) = false
+0 (string) AND _level0 (movieclip) = false
+0 (string) OR _level0 (movieclip) = true
+0 (string) AND [object Object] (object) = false
+0 (string) OR [object Object] (object) = true
+0 (string) AND hi (string) = false
+0 (string) OR hi (string) = false
+0 (string) AND 1 (string) = false
+0 (string) OR 1 (string) = true
+0 (string) AND 0 (string) = false
+0 (string) OR 0 (string) = false
+0 (string) AND  (string) = false
+0 (string) OR  (string) = false
+0 (string) AND 1 (number) = false
+0 (string) OR 1 (number) = true
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = false
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = false
+0 (string) AND -0.2 (number) = false
+0 (string) OR -0.2 (number) = true
+0 (string) AND NaN (number) = false
+0 (string) OR NaN (number) = false
+0 (string) AND Infinity (number) = false
+0 (string) OR Infinity (number) = true
+ (string) AND true (boolean) = false
+ (string) OR true (boolean) = true
+ (string) AND false (boolean) = false
+ (string) OR false (boolean) = false
+ (string) AND 1 (number) = false
+ (string) OR 1 (number) = true
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND 42 (number) = false
+ (string) OR 42 (number) = true
+ (string) AND -100000 (number) = false
+ (string) OR -100000 (number) = true
+ (string) AND  (undefined) = false
+ (string) OR  (undefined) = false
+ (string) AND null (null) = false
+ (string) OR null (null) = false
+ (string) AND _level0 (movieclip) = false
+ (string) OR _level0 (movieclip) = true
+ (string) AND [object Object] (object) = false
+ (string) OR [object Object] (object) = true
+ (string) AND hi (string) = false
+ (string) OR hi (string) = false
+ (string) AND 1 (string) = false
+ (string) OR 1 (string) = true
+ (string) AND 0 (string) = false
+ (string) OR 0 (string) = false
+ (string) AND  (string) = false
+ (string) OR  (string) = false
+ (string) AND 1 (number) = false
+ (string) OR 1 (number) = true
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND -0.2 (number) = false
+ (string) OR -0.2 (number) = true
+ (string) AND NaN (number) = false
+ (string) OR NaN (number) = false
+ (string) AND Infinity (number) = false
+ (string) OR Infinity (number) = true
+1 (number) AND true (boolean) = true
+1 (number) OR true (boolean) = true
+1 (number) AND false (boolean) = false
+1 (number) OR false (boolean) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 42 (number) = true
+1 (number) OR 42 (number) = true
+1 (number) AND -100000 (number) = true
+1 (number) OR -100000 (number) = true
+1 (number) AND  (undefined) = false
+1 (number) OR  (undefined) = true
+1 (number) AND null (null) = false
+1 (number) OR null (null) = true
+1 (number) AND _level0 (movieclip) = true
+1 (number) OR _level0 (movieclip) = true
+1 (number) AND [object Object] (object) = true
+1 (number) OR [object Object] (object) = true
+1 (number) AND hi (string) = false
+1 (number) OR hi (string) = true
+1 (number) AND 1 (string) = true
+1 (number) OR 1 (string) = true
+1 (number) AND 0 (string) = false
+1 (number) OR 0 (string) = true
+1 (number) AND  (string) = false
+1 (number) OR  (string) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND -0.2 (number) = true
+1 (number) OR -0.2 (number) = true
+1 (number) AND NaN (number) = false
+1 (number) OR NaN (number) = true
+1 (number) AND Infinity (number) = true
+1 (number) OR Infinity (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND  (undefined) = false
+0 (number) OR  (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = false
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = false
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+0 (number) AND NaN (number) = false
+0 (number) OR NaN (number) = false
+0 (number) AND Infinity (number) = false
+0 (number) OR Infinity (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND  (undefined) = false
+0 (number) OR  (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = false
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = false
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+0 (number) AND NaN (number) = false
+0 (number) OR NaN (number) = false
+0 (number) AND Infinity (number) = false
+0 (number) OR Infinity (number) = true
+-0.2 (number) AND true (boolean) = true
+-0.2 (number) OR true (boolean) = true
+-0.2 (number) AND false (boolean) = false
+-0.2 (number) OR false (boolean) = true
+-0.2 (number) AND 1 (number) = true
+-0.2 (number) OR 1 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND 42 (number) = true
+-0.2 (number) OR 42 (number) = true
+-0.2 (number) AND -100000 (number) = true
+-0.2 (number) OR -100000 (number) = true
+-0.2 (number) AND  (undefined) = false
+-0.2 (number) OR  (undefined) = true
+-0.2 (number) AND null (null) = false
+-0.2 (number) OR null (null) = true
+-0.2 (number) AND _level0 (movieclip) = true
+-0.2 (number) OR _level0 (movieclip) = true
+-0.2 (number) AND [object Object] (object) = true
+-0.2 (number) OR [object Object] (object) = true
+-0.2 (number) AND hi (string) = false
+-0.2 (number) OR hi (string) = true
+-0.2 (number) AND 1 (string) = true
+-0.2 (number) OR 1 (string) = true
+-0.2 (number) AND 0 (string) = false
+-0.2 (number) OR 0 (string) = true
+-0.2 (number) AND  (string) = false
+-0.2 (number) OR  (string) = true
+-0.2 (number) AND 1 (number) = true
+-0.2 (number) OR 1 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND -0.2 (number) = true
+-0.2 (number) OR -0.2 (number) = true
+-0.2 (number) AND NaN (number) = false
+-0.2 (number) OR NaN (number) = true
+-0.2 (number) AND Infinity (number) = true
+-0.2 (number) OR Infinity (number) = true
+NaN (number) AND true (boolean) = false
+NaN (number) OR true (boolean) = true
+NaN (number) AND false (boolean) = false
+NaN (number) OR false (boolean) = false
+NaN (number) AND 1 (number) = false
+NaN (number) OR 1 (number) = true
+NaN (number) AND 0 (number) = false
+NaN (number) OR 0 (number) = false
+NaN (number) AND 42 (number) = false
+NaN (number) OR 42 (number) = true
+NaN (number) AND -100000 (number) = false
+NaN (number) OR -100000 (number) = true
+NaN (number) AND  (undefined) = false
+NaN (number) OR  (undefined) = false
+NaN (number) AND null (null) = false
+NaN (number) OR null (null) = false
+NaN (number) AND _level0 (movieclip) = false
+NaN (number) OR _level0 (movieclip) = true
+NaN (number) AND [object Object] (object) = false
+NaN (number) OR [object Object] (object) = true
+NaN (number) AND hi (string) = false
+NaN (number) OR hi (string) = false
+NaN (number) AND 1 (string) = false
+NaN (number) OR 1 (string) = true
+NaN (number) AND 0 (string) = false
+NaN (number) OR 0 (string) = false
+NaN (number) AND  (string) = false
+NaN (number) OR  (string) = false
+NaN (number) AND 1 (number) = false
+NaN (number) OR 1 (number) = true
+NaN (number) AND 0 (number) = false
+NaN (number) OR 0 (number) = false
+NaN (number) AND 0 (number) = false
+NaN (number) OR 0 (number) = false
+NaN (number) AND -0.2 (number) = false
+NaN (number) OR -0.2 (number) = true
+NaN (number) AND NaN (number) = false
+NaN (number) OR NaN (number) = false
+NaN (number) AND Infinity (number) = false
+NaN (number) OR Infinity (number) = true
+Infinity (number) AND true (boolean) = true
+Infinity (number) OR true (boolean) = true
+Infinity (number) AND false (boolean) = false
+Infinity (number) OR false (boolean) = true
+Infinity (number) AND 1 (number) = true
+Infinity (number) OR 1 (number) = true
+Infinity (number) AND 0 (number) = false
+Infinity (number) OR 0 (number) = true
+Infinity (number) AND 42 (number) = true
+Infinity (number) OR 42 (number) = true
+Infinity (number) AND -100000 (number) = true
+Infinity (number) OR -100000 (number) = true
+Infinity (number) AND  (undefined) = false
+Infinity (number) OR  (undefined) = true
+Infinity (number) AND null (null) = false
+Infinity (number) OR null (null) = true
+Infinity (number) AND _level0 (movieclip) = true
+Infinity (number) OR _level0 (movieclip) = true
+Infinity (number) AND [object Object] (object) = true
+Infinity (number) OR [object Object] (object) = true
+Infinity (number) AND hi (string) = false
+Infinity (number) OR hi (string) = true
+Infinity (number) AND 1 (string) = true
+Infinity (number) OR 1 (string) = true
+Infinity (number) AND 0 (string) = false
+Infinity (number) OR 0 (string) = true
+Infinity (number) AND  (string) = false
+Infinity (number) OR  (string) = true
+Infinity (number) AND 1 (number) = true
+Infinity (number) OR 1 (number) = true
+Infinity (number) AND 0 (number) = false
+Infinity (number) OR 0 (number) = true
+Infinity (number) AND 0 (number) = false
+Infinity (number) OR 0 (number) = true
+Infinity (number) AND -0.2 (number) = true
+Infinity (number) OR -0.2 (number) = true
+Infinity (number) AND NaN (number) = false
+Infinity (number) OR NaN (number) = true
+Infinity (number) AND Infinity (number) = true
+Infinity (number) OR Infinity (number) = true
diff --git a/test/trace/and-or-6.swf b/test/trace/and-or-6.swf
new file mode 100755
index 0000000..6bf0429
Binary files /dev/null and b/test/trace/and-or-6.swf differ
diff --git a/test/trace/and-or-6.swf.trace b/test/trace/and-or-6.swf.trace
new file mode 100755
index 0000000..0e31c9a
--- /dev/null
+++ b/test/trace/and-or-6.swf.trace
@@ -0,0 +1,649 @@
+Check AND and OR logical operators with various values
+true (boolean) AND true (boolean) = true
+true (boolean) OR true (boolean) = true
+true (boolean) AND false (boolean) = false
+true (boolean) OR false (boolean) = true
+true (boolean) AND 1 (number) = true
+true (boolean) OR 1 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND 42 (number) = true
+true (boolean) OR 42 (number) = true
+true (boolean) AND -100000 (number) = true
+true (boolean) OR -100000 (number) = true
+true (boolean) AND  (undefined) = false
+true (boolean) OR  (undefined) = true
+true (boolean) AND null (null) = false
+true (boolean) OR null (null) = true
+true (boolean) AND _level0 (movieclip) = true
+true (boolean) OR _level0 (movieclip) = true
+true (boolean) AND [object Object] (object) = true
+true (boolean) OR [object Object] (object) = true
+true (boolean) AND hi (string) = false
+true (boolean) OR hi (string) = true
+true (boolean) AND 1 (string) = true
+true (boolean) OR 1 (string) = true
+true (boolean) AND 0 (string) = false
+true (boolean) OR 0 (string) = true
+true (boolean) AND  (string) = false
+true (boolean) OR  (string) = true
+true (boolean) AND 1 (number) = true
+true (boolean) OR 1 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND -0.2 (number) = true
+true (boolean) OR -0.2 (number) = true
+false (boolean) AND true (boolean) = false
+false (boolean) OR true (boolean) = true
+false (boolean) AND false (boolean) = false
+false (boolean) OR false (boolean) = false
+false (boolean) AND 1 (number) = false
+false (boolean) OR 1 (number) = true
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND 42 (number) = false
+false (boolean) OR 42 (number) = true
+false (boolean) AND -100000 (number) = false
+false (boolean) OR -100000 (number) = true
+false (boolean) AND  (undefined) = false
+false (boolean) OR  (undefined) = false
+false (boolean) AND null (null) = false
+false (boolean) OR null (null) = false
+false (boolean) AND _level0 (movieclip) = false
+false (boolean) OR _level0 (movieclip) = true
+false (boolean) AND [object Object] (object) = false
+false (boolean) OR [object Object] (object) = true
+false (boolean) AND hi (string) = false
+false (boolean) OR hi (string) = false
+false (boolean) AND 1 (string) = false
+false (boolean) OR 1 (string) = true
+false (boolean) AND 0 (string) = false
+false (boolean) OR 0 (string) = false
+false (boolean) AND  (string) = false
+false (boolean) OR  (string) = false
+false (boolean) AND 1 (number) = false
+false (boolean) OR 1 (number) = true
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND -0.2 (number) = false
+false (boolean) OR -0.2 (number) = true
+1 (number) AND true (boolean) = true
+1 (number) OR true (boolean) = true
+1 (number) AND false (boolean) = false
+1 (number) OR false (boolean) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 42 (number) = true
+1 (number) OR 42 (number) = true
+1 (number) AND -100000 (number) = true
+1 (number) OR -100000 (number) = true
+1 (number) AND  (undefined) = false
+1 (number) OR  (undefined) = true
+1 (number) AND null (null) = false
+1 (number) OR null (null) = true
+1 (number) AND _level0 (movieclip) = true
+1 (number) OR _level0 (movieclip) = true
+1 (number) AND [object Object] (object) = true
+1 (number) OR [object Object] (object) = true
+1 (number) AND hi (string) = false
+1 (number) OR hi (string) = true
+1 (number) AND 1 (string) = true
+1 (number) OR 1 (string) = true
+1 (number) AND 0 (string) = false
+1 (number) OR 0 (string) = true
+1 (number) AND  (string) = false
+1 (number) OR  (string) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND -0.2 (number) = true
+1 (number) OR -0.2 (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND  (undefined) = false
+0 (number) OR  (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = false
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = false
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+42 (number) AND true (boolean) = true
+42 (number) OR true (boolean) = true
+42 (number) AND false (boolean) = false
+42 (number) OR false (boolean) = true
+42 (number) AND 1 (number) = true
+42 (number) OR 1 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND 42 (number) = true
+42 (number) OR 42 (number) = true
+42 (number) AND -100000 (number) = true
+42 (number) OR -100000 (number) = true
+42 (number) AND  (undefined) = false
+42 (number) OR  (undefined) = true
+42 (number) AND null (null) = false
+42 (number) OR null (null) = true
+42 (number) AND _level0 (movieclip) = true
+42 (number) OR _level0 (movieclip) = true
+42 (number) AND [object Object] (object) = true
+42 (number) OR [object Object] (object) = true
+42 (number) AND hi (string) = false
+42 (number) OR hi (string) = true
+42 (number) AND 1 (string) = true
+42 (number) OR 1 (string) = true
+42 (number) AND 0 (string) = false
+42 (number) OR 0 (string) = true
+42 (number) AND  (string) = false
+42 (number) OR  (string) = true
+42 (number) AND 1 (number) = true
+42 (number) OR 1 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND -0.2 (number) = true
+42 (number) OR -0.2 (number) = true
+-100000 (number) AND true (boolean) = true
+-100000 (number) OR true (boolean) = true
+-100000 (number) AND false (boolean) = false
+-100000 (number) OR false (boolean) = true
+-100000 (number) AND 1 (number) = true
+-100000 (number) OR 1 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND 42 (number) = true
+-100000 (number) OR 42 (number) = true
+-100000 (number) AND -100000 (number) = true
+-100000 (number) OR -100000 (number) = true
+-100000 (number) AND  (undefined) = false
+-100000 (number) OR  (undefined) = true
+-100000 (number) AND null (null) = false
+-100000 (number) OR null (null) = true
+-100000 (number) AND _level0 (movieclip) = true
+-100000 (number) OR _level0 (movieclip) = true
+-100000 (number) AND [object Object] (object) = true
+-100000 (number) OR [object Object] (object) = true
+-100000 (number) AND hi (string) = false
+-100000 (number) OR hi (string) = true
+-100000 (number) AND 1 (string) = true
+-100000 (number) OR 1 (string) = true
+-100000 (number) AND 0 (string) = false
+-100000 (number) OR 0 (string) = true
+-100000 (number) AND  (string) = false
+-100000 (number) OR  (string) = true
+-100000 (number) AND 1 (number) = true
+-100000 (number) OR 1 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND -0.2 (number) = true
+-100000 (number) OR -0.2 (number) = true
+ (undefined) AND true (boolean) = false
+ (undefined) OR true (boolean) = true
+ (undefined) AND false (boolean) = false
+ (undefined) OR false (boolean) = false
+ (undefined) AND 1 (number) = false
+ (undefined) OR 1 (number) = true
+ (undefined) AND 0 (number) = false
+ (undefined) OR 0 (number) = false
+ (undefined) AND 42 (number) = false
+ (undefined) OR 42 (number) = true
+ (undefined) AND -100000 (number) = false
+ (undefined) OR -100000 (number) = true
+ (undefined) AND  (undefined) = false
+ (undefined) OR  (undefined) = false
+ (undefined) AND null (null) = false
+ (undefined) OR null (null) = false
+ (undefined) AND _level0 (movieclip) = false
+ (undefined) OR _level0 (movieclip) = true
+ (undefined) AND [object Object] (object) = false
+ (undefined) OR [object Object] (object) = true
+ (undefined) AND hi (string) = false
+ (undefined) OR hi (string) = false
+ (undefined) AND 1 (string) = false
+ (undefined) OR 1 (string) = true
+ (undefined) AND 0 (string) = false
+ (undefined) OR 0 (string) = false
+ (undefined) AND  (string) = false
+ (undefined) OR  (string) = false
+ (undefined) AND 1 (number) = false
+ (undefined) OR 1 (number) = true
+ (undefined) AND 0 (number) = false
+ (undefined) OR 0 (number) = false
+ (undefined) AND 0 (number) = false
+ (undefined) OR 0 (number) = false
+ (undefined) AND -0.2 (number) = false
+ (undefined) OR -0.2 (number) = true
+null (null) AND true (boolean) = false
+null (null) OR true (boolean) = true
+null (null) AND false (boolean) = false
+null (null) OR false (boolean) = false
+null (null) AND 1 (number) = false
+null (null) OR 1 (number) = true
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND 42 (number) = false
+null (null) OR 42 (number) = true
+null (null) AND -100000 (number) = false
+null (null) OR -100000 (number) = true
+null (null) AND  (undefined) = false
+null (null) OR  (undefined) = false
+null (null) AND null (null) = false
+null (null) OR null (null) = false
+null (null) AND _level0 (movieclip) = false
+null (null) OR _level0 (movieclip) = true
+null (null) AND [object Object] (object) = false
+null (null) OR [object Object] (object) = true
+null (null) AND hi (string) = false
+null (null) OR hi (string) = false
+null (null) AND 1 (string) = false
+null (null) OR 1 (string) = true
+null (null) AND 0 (string) = false
+null (null) OR 0 (string) = false
+null (null) AND  (string) = false
+null (null) OR  (string) = false
+null (null) AND 1 (number) = false
+null (null) OR 1 (number) = true
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND -0.2 (number) = false
+null (null) OR -0.2 (number) = true
+_level0 (movieclip) AND true (boolean) = true
+_level0 (movieclip) OR true (boolean) = true
+_level0 (movieclip) AND false (boolean) = false
+_level0 (movieclip) OR false (boolean) = true
+_level0 (movieclip) AND 1 (number) = true
+_level0 (movieclip) OR 1 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND 42 (number) = true
+_level0 (movieclip) OR 42 (number) = true
+_level0 (movieclip) AND -100000 (number) = true
+_level0 (movieclip) OR -100000 (number) = true
+_level0 (movieclip) AND  (undefined) = false
+_level0 (movieclip) OR  (undefined) = true
+_level0 (movieclip) AND null (null) = false
+_level0 (movieclip) OR null (null) = true
+_level0 (movieclip) AND _level0 (movieclip) = true
+_level0 (movieclip) OR _level0 (movieclip) = true
+_level0 (movieclip) AND [object Object] (object) = true
+_level0 (movieclip) OR [object Object] (object) = true
+_level0 (movieclip) AND hi (string) = false
+_level0 (movieclip) OR hi (string) = true
+_level0 (movieclip) AND 1 (string) = true
+_level0 (movieclip) OR 1 (string) = true
+_level0 (movieclip) AND 0 (string) = false
+_level0 (movieclip) OR 0 (string) = true
+_level0 (movieclip) AND  (string) = false
+_level0 (movieclip) OR  (string) = true
+_level0 (movieclip) AND 1 (number) = true
+_level0 (movieclip) OR 1 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND -0.2 (number) = true
+_level0 (movieclip) OR -0.2 (number) = true
+[object Object] (object) AND true (boolean) = true
+[object Object] (object) OR true (boolean) = true
+[object Object] (object) AND false (boolean) = false
+[object Object] (object) OR false (boolean) = true
+[object Object] (object) AND 1 (number) = true
+[object Object] (object) OR 1 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND 42 (number) = true
+[object Object] (object) OR 42 (number) = true
+[object Object] (object) AND -100000 (number) = true
+[object Object] (object) OR -100000 (number) = true
+[object Object] (object) AND  (undefined) = false
+[object Object] (object) OR  (undefined) = true
+[object Object] (object) AND null (null) = false
+[object Object] (object) OR null (null) = true
+[object Object] (object) AND _level0 (movieclip) = true
+[object Object] (object) OR _level0 (movieclip) = true
+[object Object] (object) AND [object Object] (object) = true
+[object Object] (object) OR [object Object] (object) = true
+[object Object] (object) AND hi (string) = false
+[object Object] (object) OR hi (string) = true
+[object Object] (object) AND 1 (string) = true
+[object Object] (object) OR 1 (string) = true
+[object Object] (object) AND 0 (string) = false
+[object Object] (object) OR 0 (string) = true
+[object Object] (object) AND  (string) = false
+[object Object] (object) OR  (string) = true
+[object Object] (object) AND 1 (number) = true
+[object Object] (object) OR 1 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND -0.2 (number) = true
+[object Object] (object) OR -0.2 (number) = true
+hi (string) AND true (boolean) = false
+hi (string) OR true (boolean) = true
+hi (string) AND false (boolean) = false
+hi (string) OR false (boolean) = false
+hi (string) AND 1 (number) = false
+hi (string) OR 1 (number) = true
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = false
+hi (string) AND 42 (number) = false
+hi (string) OR 42 (number) = true
+hi (string) AND -100000 (number) = false
+hi (string) OR -100000 (number) = true
+hi (string) AND  (undefined) = false
+hi (string) OR  (undefined) = false
+hi (string) AND null (null) = false
+hi (string) OR null (null) = false
+hi (string) AND _level0 (movieclip) = false
+hi (string) OR _level0 (movieclip) = true
+hi (string) AND [object Object] (object) = false
+hi (string) OR [object Object] (object) = true
+hi (string) AND hi (string) = false
+hi (string) OR hi (string) = false
+hi (string) AND 1 (string) = false
+hi (string) OR 1 (string) = true
+hi (string) AND 0 (string) = false
+hi (string) OR 0 (string) = false
+hi (string) AND  (string) = false
+hi (string) OR  (string) = false
+hi (string) AND 1 (number) = false
+hi (string) OR 1 (number) = true
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = false
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = false
+hi (string) AND -0.2 (number) = false
+hi (string) OR -0.2 (number) = true
+1 (string) AND true (boolean) = true
+1 (string) OR true (boolean) = true
+1 (string) AND false (boolean) = false
+1 (string) OR false (boolean) = true
+1 (string) AND 1 (number) = true
+1 (string) OR 1 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND 42 (number) = true
+1 (string) OR 42 (number) = true
+1 (string) AND -100000 (number) = true
+1 (string) OR -100000 (number) = true
+1 (string) AND  (undefined) = false
+1 (string) OR  (undefined) = true
+1 (string) AND null (null) = false
+1 (string) OR null (null) = true
+1 (string) AND _level0 (movieclip) = true
+1 (string) OR _level0 (movieclip) = true
+1 (string) AND [object Object] (object) = true
+1 (string) OR [object Object] (object) = true
+1 (string) AND hi (string) = false
+1 (string) OR hi (string) = true
+1 (string) AND 1 (string) = true
+1 (string) OR 1 (string) = true
+1 (string) AND 0 (string) = false
+1 (string) OR 0 (string) = true
+1 (string) AND  (string) = false
+1 (string) OR  (string) = true
+1 (string) AND 1 (number) = true
+1 (string) OR 1 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND -0.2 (number) = true
+1 (string) OR -0.2 (number) = true
+0 (string) AND true (boolean) = false
+0 (string) OR true (boolean) = true
+0 (string) AND false (boolean) = false
+0 (string) OR false (boolean) = false
+0 (string) AND 1 (number) = false
+0 (string) OR 1 (number) = true
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = false
+0 (string) AND 42 (number) = false
+0 (string) OR 42 (number) = true
+0 (string) AND -100000 (number) = false
+0 (string) OR -100000 (number) = true
+0 (string) AND  (undefined) = false
+0 (string) OR  (undefined) = false
+0 (string) AND null (null) = false
+0 (string) OR null (null) = false
+0 (string) AND _level0 (movieclip) = false
+0 (string) OR _level0 (movieclip) = true
+0 (string) AND [object Object] (object) = false
+0 (string) OR [object Object] (object) = true
+0 (string) AND hi (string) = false
+0 (string) OR hi (string) = false
+0 (string) AND 1 (string) = false
+0 (string) OR 1 (string) = true
+0 (string) AND 0 (string) = false
+0 (string) OR 0 (string) = false
+0 (string) AND  (string) = false
+0 (string) OR  (string) = false
+0 (string) AND 1 (number) = false
+0 (string) OR 1 (number) = true
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = false
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = false
+0 (string) AND -0.2 (number) = false
+0 (string) OR -0.2 (number) = true
+ (string) AND true (boolean) = false
+ (string) OR true (boolean) = true
+ (string) AND false (boolean) = false
+ (string) OR false (boolean) = false
+ (string) AND 1 (number) = false
+ (string) OR 1 (number) = true
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND 42 (number) = false
+ (string) OR 42 (number) = true
+ (string) AND -100000 (number) = false
+ (string) OR -100000 (number) = true
+ (string) AND  (undefined) = false
+ (string) OR  (undefined) = false
+ (string) AND null (null) = false
+ (string) OR null (null) = false
+ (string) AND _level0 (movieclip) = false
+ (string) OR _level0 (movieclip) = true
+ (string) AND [object Object] (object) = false
+ (string) OR [object Object] (object) = true
+ (string) AND hi (string) = false
+ (string) OR hi (string) = false
+ (string) AND 1 (string) = false
+ (string) OR 1 (string) = true
+ (string) AND 0 (string) = false
+ (string) OR 0 (string) = false
+ (string) AND  (string) = false
+ (string) OR  (string) = false
+ (string) AND 1 (number) = false
+ (string) OR 1 (number) = true
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND -0.2 (number) = false
+ (string) OR -0.2 (number) = true
+1 (number) AND true (boolean) = true
+1 (number) OR true (boolean) = true
+1 (number) AND false (boolean) = false
+1 (number) OR false (boolean) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 42 (number) = true
+1 (number) OR 42 (number) = true
+1 (number) AND -100000 (number) = true
+1 (number) OR -100000 (number) = true
+1 (number) AND  (undefined) = false
+1 (number) OR  (undefined) = true
+1 (number) AND null (null) = false
+1 (number) OR null (null) = true
+1 (number) AND _level0 (movieclip) = true
+1 (number) OR _level0 (movieclip) = true
+1 (number) AND [object Object] (object) = true
+1 (number) OR [object Object] (object) = true
+1 (number) AND hi (string) = false
+1 (number) OR hi (string) = true
+1 (number) AND 1 (string) = true
+1 (number) OR 1 (string) = true
+1 (number) AND 0 (string) = false
+1 (number) OR 0 (string) = true
+1 (number) AND  (string) = false
+1 (number) OR  (string) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND -0.2 (number) = true
+1 (number) OR -0.2 (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND  (undefined) = false
+0 (number) OR  (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = false
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = false
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND  (undefined) = false
+0 (number) OR  (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = false
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = false
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+-0.2 (number) AND true (boolean) = true
+-0.2 (number) OR true (boolean) = true
+-0.2 (number) AND false (boolean) = false
+-0.2 (number) OR false (boolean) = true
+-0.2 (number) AND 1 (number) = true
+-0.2 (number) OR 1 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND 42 (number) = true
+-0.2 (number) OR 42 (number) = true
+-0.2 (number) AND -100000 (number) = true
+-0.2 (number) OR -100000 (number) = true
+-0.2 (number) AND  (undefined) = false
+-0.2 (number) OR  (undefined) = true
+-0.2 (number) AND null (null) = false
+-0.2 (number) OR null (null) = true
+-0.2 (number) AND _level0 (movieclip) = true
+-0.2 (number) OR _level0 (movieclip) = true
+-0.2 (number) AND [object Object] (object) = true
+-0.2 (number) OR [object Object] (object) = true
+-0.2 (number) AND hi (string) = false
+-0.2 (number) OR hi (string) = true
+-0.2 (number) AND 1 (string) = true
+-0.2 (number) OR 1 (string) = true
+-0.2 (number) AND 0 (string) = false
+-0.2 (number) OR 0 (string) = true
+-0.2 (number) AND  (string) = false
+-0.2 (number) OR  (string) = true
+-0.2 (number) AND 1 (number) = true
+-0.2 (number) OR 1 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND -0.2 (number) = true
+-0.2 (number) OR -0.2 (number) = true
diff --git a/test/trace/and-or-7.swf b/test/trace/and-or-7.swf
new file mode 100755
index 0000000..7640f7e
Binary files /dev/null and b/test/trace/and-or-7.swf differ
diff --git a/test/trace/and-or-7.swf.trace b/test/trace/and-or-7.swf.trace
new file mode 100755
index 0000000..57f0b5f
--- /dev/null
+++ b/test/trace/and-or-7.swf.trace
@@ -0,0 +1,801 @@
+Check AND and OR logical operators with various values
+true (boolean) AND true (boolean) = true
+true (boolean) OR true (boolean) = true
+true (boolean) AND false (boolean) = false
+true (boolean) OR false (boolean) = true
+true (boolean) AND 1 (number) = true
+true (boolean) OR 1 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND 42 (number) = true
+true (boolean) OR 42 (number) = true
+true (boolean) AND -100000 (number) = true
+true (boolean) OR -100000 (number) = true
+true (boolean) AND undefined (undefined) = false
+true (boolean) OR undefined (undefined) = true
+true (boolean) AND null (null) = false
+true (boolean) OR null (null) = true
+true (boolean) AND _level0 (movieclip) = true
+true (boolean) OR _level0 (movieclip) = true
+true (boolean) AND [object Object] (object) = true
+true (boolean) OR [object Object] (object) = true
+true (boolean) AND hi (string) = true
+true (boolean) OR hi (string) = true
+true (boolean) AND 1 (string) = true
+true (boolean) OR 1 (string) = true
+true (boolean) AND 0 (string) = true
+true (boolean) OR 0 (string) = true
+true (boolean) AND  (string) = false
+true (boolean) OR  (string) = true
+true (boolean) AND 1 (number) = true
+true (boolean) OR 1 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND 0 (number) = false
+true (boolean) OR 0 (number) = true
+true (boolean) AND -0.2 (number) = true
+true (boolean) OR -0.2 (number) = true
+true (boolean) AND NaN (number) = false
+true (boolean) OR NaN (number) = true
+true (boolean) AND Infinity (number) = true
+true (boolean) OR Infinity (number) = true
+false (boolean) AND true (boolean) = false
+false (boolean) OR true (boolean) = true
+false (boolean) AND false (boolean) = false
+false (boolean) OR false (boolean) = false
+false (boolean) AND 1 (number) = false
+false (boolean) OR 1 (number) = true
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND 42 (number) = false
+false (boolean) OR 42 (number) = true
+false (boolean) AND -100000 (number) = false
+false (boolean) OR -100000 (number) = true
+false (boolean) AND undefined (undefined) = false
+false (boolean) OR undefined (undefined) = false
+false (boolean) AND null (null) = false
+false (boolean) OR null (null) = false
+false (boolean) AND _level0 (movieclip) = false
+false (boolean) OR _level0 (movieclip) = true
+false (boolean) AND [object Object] (object) = false
+false (boolean) OR [object Object] (object) = true
+false (boolean) AND hi (string) = false
+false (boolean) OR hi (string) = true
+false (boolean) AND 1 (string) = false
+false (boolean) OR 1 (string) = true
+false (boolean) AND 0 (string) = false
+false (boolean) OR 0 (string) = true
+false (boolean) AND  (string) = false
+false (boolean) OR  (string) = false
+false (boolean) AND 1 (number) = false
+false (boolean) OR 1 (number) = true
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND 0 (number) = false
+false (boolean) OR 0 (number) = false
+false (boolean) AND -0.2 (number) = false
+false (boolean) OR -0.2 (number) = true
+false (boolean) AND NaN (number) = false
+false (boolean) OR NaN (number) = false
+false (boolean) AND Infinity (number) = false
+false (boolean) OR Infinity (number) = true
+1 (number) AND true (boolean) = true
+1 (number) OR true (boolean) = true
+1 (number) AND false (boolean) = false
+1 (number) OR false (boolean) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 42 (number) = true
+1 (number) OR 42 (number) = true
+1 (number) AND -100000 (number) = true
+1 (number) OR -100000 (number) = true
+1 (number) AND undefined (undefined) = false
+1 (number) OR undefined (undefined) = true
+1 (number) AND null (null) = false
+1 (number) OR null (null) = true
+1 (number) AND _level0 (movieclip) = true
+1 (number) OR _level0 (movieclip) = true
+1 (number) AND [object Object] (object) = true
+1 (number) OR [object Object] (object) = true
+1 (number) AND hi (string) = true
+1 (number) OR hi (string) = true
+1 (number) AND 1 (string) = true
+1 (number) OR 1 (string) = true
+1 (number) AND 0 (string) = true
+1 (number) OR 0 (string) = true
+1 (number) AND  (string) = false
+1 (number) OR  (string) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND -0.2 (number) = true
+1 (number) OR -0.2 (number) = true
+1 (number) AND NaN (number) = false
+1 (number) OR NaN (number) = true
+1 (number) AND Infinity (number) = true
+1 (number) OR Infinity (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND undefined (undefined) = false
+0 (number) OR undefined (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = true
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = true
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+0 (number) AND NaN (number) = false
+0 (number) OR NaN (number) = false
+0 (number) AND Infinity (number) = false
+0 (number) OR Infinity (number) = true
+42 (number) AND true (boolean) = true
+42 (number) OR true (boolean) = true
+42 (number) AND false (boolean) = false
+42 (number) OR false (boolean) = true
+42 (number) AND 1 (number) = true
+42 (number) OR 1 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND 42 (number) = true
+42 (number) OR 42 (number) = true
+42 (number) AND -100000 (number) = true
+42 (number) OR -100000 (number) = true
+42 (number) AND undefined (undefined) = false
+42 (number) OR undefined (undefined) = true
+42 (number) AND null (null) = false
+42 (number) OR null (null) = true
+42 (number) AND _level0 (movieclip) = true
+42 (number) OR _level0 (movieclip) = true
+42 (number) AND [object Object] (object) = true
+42 (number) OR [object Object] (object) = true
+42 (number) AND hi (string) = true
+42 (number) OR hi (string) = true
+42 (number) AND 1 (string) = true
+42 (number) OR 1 (string) = true
+42 (number) AND 0 (string) = true
+42 (number) OR 0 (string) = true
+42 (number) AND  (string) = false
+42 (number) OR  (string) = true
+42 (number) AND 1 (number) = true
+42 (number) OR 1 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND 0 (number) = false
+42 (number) OR 0 (number) = true
+42 (number) AND -0.2 (number) = true
+42 (number) OR -0.2 (number) = true
+42 (number) AND NaN (number) = false
+42 (number) OR NaN (number) = true
+42 (number) AND Infinity (number) = true
+42 (number) OR Infinity (number) = true
+-100000 (number) AND true (boolean) = true
+-100000 (number) OR true (boolean) = true
+-100000 (number) AND false (boolean) = false
+-100000 (number) OR false (boolean) = true
+-100000 (number) AND 1 (number) = true
+-100000 (number) OR 1 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND 42 (number) = true
+-100000 (number) OR 42 (number) = true
+-100000 (number) AND -100000 (number) = true
+-100000 (number) OR -100000 (number) = true
+-100000 (number) AND undefined (undefined) = false
+-100000 (number) OR undefined (undefined) = true
+-100000 (number) AND null (null) = false
+-100000 (number) OR null (null) = true
+-100000 (number) AND _level0 (movieclip) = true
+-100000 (number) OR _level0 (movieclip) = true
+-100000 (number) AND [object Object] (object) = true
+-100000 (number) OR [object Object] (object) = true
+-100000 (number) AND hi (string) = true
+-100000 (number) OR hi (string) = true
+-100000 (number) AND 1 (string) = true
+-100000 (number) OR 1 (string) = true
+-100000 (number) AND 0 (string) = true
+-100000 (number) OR 0 (string) = true
+-100000 (number) AND  (string) = false
+-100000 (number) OR  (string) = true
+-100000 (number) AND 1 (number) = true
+-100000 (number) OR 1 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND 0 (number) = false
+-100000 (number) OR 0 (number) = true
+-100000 (number) AND -0.2 (number) = true
+-100000 (number) OR -0.2 (number) = true
+-100000 (number) AND NaN (number) = false
+-100000 (number) OR NaN (number) = true
+-100000 (number) AND Infinity (number) = true
+-100000 (number) OR Infinity (number) = true
+undefined (undefined) AND true (boolean) = false
+undefined (undefined) OR true (boolean) = true
+undefined (undefined) AND false (boolean) = false
+undefined (undefined) OR false (boolean) = false
+undefined (undefined) AND 1 (number) = false
+undefined (undefined) OR 1 (number) = true
+undefined (undefined) AND 0 (number) = false
+undefined (undefined) OR 0 (number) = false
+undefined (undefined) AND 42 (number) = false
+undefined (undefined) OR 42 (number) = true
+undefined (undefined) AND -100000 (number) = false
+undefined (undefined) OR -100000 (number) = true
+undefined (undefined) AND undefined (undefined) = false
+undefined (undefined) OR undefined (undefined) = false
+undefined (undefined) AND null (null) = false
+undefined (undefined) OR null (null) = false
+undefined (undefined) AND _level0 (movieclip) = false
+undefined (undefined) OR _level0 (movieclip) = true
+undefined (undefined) AND [object Object] (object) = false
+undefined (undefined) OR [object Object] (object) = true
+undefined (undefined) AND hi (string) = false
+undefined (undefined) OR hi (string) = true
+undefined (undefined) AND 1 (string) = false
+undefined (undefined) OR 1 (string) = true
+undefined (undefined) AND 0 (string) = false
+undefined (undefined) OR 0 (string) = true
+undefined (undefined) AND  (string) = false
+undefined (undefined) OR  (string) = false
+undefined (undefined) AND 1 (number) = false
+undefined (undefined) OR 1 (number) = true
+undefined (undefined) AND 0 (number) = false
+undefined (undefined) OR 0 (number) = false
+undefined (undefined) AND 0 (number) = false
+undefined (undefined) OR 0 (number) = false
+undefined (undefined) AND -0.2 (number) = false
+undefined (undefined) OR -0.2 (number) = true
+undefined (undefined) AND NaN (number) = false
+undefined (undefined) OR NaN (number) = false
+undefined (undefined) AND Infinity (number) = false
+undefined (undefined) OR Infinity (number) = true
+null (null) AND true (boolean) = false
+null (null) OR true (boolean) = true
+null (null) AND false (boolean) = false
+null (null) OR false (boolean) = false
+null (null) AND 1 (number) = false
+null (null) OR 1 (number) = true
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND 42 (number) = false
+null (null) OR 42 (number) = true
+null (null) AND -100000 (number) = false
+null (null) OR -100000 (number) = true
+null (null) AND undefined (undefined) = false
+null (null) OR undefined (undefined) = false
+null (null) AND null (null) = false
+null (null) OR null (null) = false
+null (null) AND _level0 (movieclip) = false
+null (null) OR _level0 (movieclip) = true
+null (null) AND [object Object] (object) = false
+null (null) OR [object Object] (object) = true
+null (null) AND hi (string) = false
+null (null) OR hi (string) = true
+null (null) AND 1 (string) = false
+null (null) OR 1 (string) = true
+null (null) AND 0 (string) = false
+null (null) OR 0 (string) = true
+null (null) AND  (string) = false
+null (null) OR  (string) = false
+null (null) AND 1 (number) = false
+null (null) OR 1 (number) = true
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND 0 (number) = false
+null (null) OR 0 (number) = false
+null (null) AND -0.2 (number) = false
+null (null) OR -0.2 (number) = true
+null (null) AND NaN (number) = false
+null (null) OR NaN (number) = false
+null (null) AND Infinity (number) = false
+null (null) OR Infinity (number) = true
+_level0 (movieclip) AND true (boolean) = true
+_level0 (movieclip) OR true (boolean) = true
+_level0 (movieclip) AND false (boolean) = false
+_level0 (movieclip) OR false (boolean) = true
+_level0 (movieclip) AND 1 (number) = true
+_level0 (movieclip) OR 1 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND 42 (number) = true
+_level0 (movieclip) OR 42 (number) = true
+_level0 (movieclip) AND -100000 (number) = true
+_level0 (movieclip) OR -100000 (number) = true
+_level0 (movieclip) AND undefined (undefined) = false
+_level0 (movieclip) OR undefined (undefined) = true
+_level0 (movieclip) AND null (null) = false
+_level0 (movieclip) OR null (null) = true
+_level0 (movieclip) AND _level0 (movieclip) = true
+_level0 (movieclip) OR _level0 (movieclip) = true
+_level0 (movieclip) AND [object Object] (object) = true
+_level0 (movieclip) OR [object Object] (object) = true
+_level0 (movieclip) AND hi (string) = true
+_level0 (movieclip) OR hi (string) = true
+_level0 (movieclip) AND 1 (string) = true
+_level0 (movieclip) OR 1 (string) = true
+_level0 (movieclip) AND 0 (string) = true
+_level0 (movieclip) OR 0 (string) = true
+_level0 (movieclip) AND  (string) = false
+_level0 (movieclip) OR  (string) = true
+_level0 (movieclip) AND 1 (number) = true
+_level0 (movieclip) OR 1 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND 0 (number) = false
+_level0 (movieclip) OR 0 (number) = true
+_level0 (movieclip) AND -0.2 (number) = true
+_level0 (movieclip) OR -0.2 (number) = true
+_level0 (movieclip) AND NaN (number) = false
+_level0 (movieclip) OR NaN (number) = true
+_level0 (movieclip) AND Infinity (number) = true
+_level0 (movieclip) OR Infinity (number) = true
+[object Object] (object) AND true (boolean) = true
+[object Object] (object) OR true (boolean) = true
+[object Object] (object) AND false (boolean) = false
+[object Object] (object) OR false (boolean) = true
+[object Object] (object) AND 1 (number) = true
+[object Object] (object) OR 1 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND 42 (number) = true
+[object Object] (object) OR 42 (number) = true
+[object Object] (object) AND -100000 (number) = true
+[object Object] (object) OR -100000 (number) = true
+[object Object] (object) AND undefined (undefined) = false
+[object Object] (object) OR undefined (undefined) = true
+[object Object] (object) AND null (null) = false
+[object Object] (object) OR null (null) = true
+[object Object] (object) AND _level0 (movieclip) = true
+[object Object] (object) OR _level0 (movieclip) = true
+[object Object] (object) AND [object Object] (object) = true
+[object Object] (object) OR [object Object] (object) = true
+[object Object] (object) AND hi (string) = true
+[object Object] (object) OR hi (string) = true
+[object Object] (object) AND 1 (string) = true
+[object Object] (object) OR 1 (string) = true
+[object Object] (object) AND 0 (string) = true
+[object Object] (object) OR 0 (string) = true
+[object Object] (object) AND  (string) = false
+[object Object] (object) OR  (string) = true
+[object Object] (object) AND 1 (number) = true
+[object Object] (object) OR 1 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND 0 (number) = false
+[object Object] (object) OR 0 (number) = true
+[object Object] (object) AND -0.2 (number) = true
+[object Object] (object) OR -0.2 (number) = true
+[object Object] (object) AND NaN (number) = false
+[object Object] (object) OR NaN (number) = true
+[object Object] (object) AND Infinity (number) = true
+[object Object] (object) OR Infinity (number) = true
+hi (string) AND true (boolean) = true
+hi (string) OR true (boolean) = true
+hi (string) AND false (boolean) = false
+hi (string) OR false (boolean) = true
+hi (string) AND 1 (number) = true
+hi (string) OR 1 (number) = true
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = true
+hi (string) AND 42 (number) = true
+hi (string) OR 42 (number) = true
+hi (string) AND -100000 (number) = true
+hi (string) OR -100000 (number) = true
+hi (string) AND undefined (undefined) = false
+hi (string) OR undefined (undefined) = true
+hi (string) AND null (null) = false
+hi (string) OR null (null) = true
+hi (string) AND _level0 (movieclip) = true
+hi (string) OR _level0 (movieclip) = true
+hi (string) AND [object Object] (object) = true
+hi (string) OR [object Object] (object) = true
+hi (string) AND hi (string) = true
+hi (string) OR hi (string) = true
+hi (string) AND 1 (string) = true
+hi (string) OR 1 (string) = true
+hi (string) AND 0 (string) = true
+hi (string) OR 0 (string) = true
+hi (string) AND  (string) = false
+hi (string) OR  (string) = true
+hi (string) AND 1 (number) = true
+hi (string) OR 1 (number) = true
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = true
+hi (string) AND 0 (number) = false
+hi (string) OR 0 (number) = true
+hi (string) AND -0.2 (number) = true
+hi (string) OR -0.2 (number) = true
+hi (string) AND NaN (number) = false
+hi (string) OR NaN (number) = true
+hi (string) AND Infinity (number) = true
+hi (string) OR Infinity (number) = true
+1 (string) AND true (boolean) = true
+1 (string) OR true (boolean) = true
+1 (string) AND false (boolean) = false
+1 (string) OR false (boolean) = true
+1 (string) AND 1 (number) = true
+1 (string) OR 1 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND 42 (number) = true
+1 (string) OR 42 (number) = true
+1 (string) AND -100000 (number) = true
+1 (string) OR -100000 (number) = true
+1 (string) AND undefined (undefined) = false
+1 (string) OR undefined (undefined) = true
+1 (string) AND null (null) = false
+1 (string) OR null (null) = true
+1 (string) AND _level0 (movieclip) = true
+1 (string) OR _level0 (movieclip) = true
+1 (string) AND [object Object] (object) = true
+1 (string) OR [object Object] (object) = true
+1 (string) AND hi (string) = true
+1 (string) OR hi (string) = true
+1 (string) AND 1 (string) = true
+1 (string) OR 1 (string) = true
+1 (string) AND 0 (string) = true
+1 (string) OR 0 (string) = true
+1 (string) AND  (string) = false
+1 (string) OR  (string) = true
+1 (string) AND 1 (number) = true
+1 (string) OR 1 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND 0 (number) = false
+1 (string) OR 0 (number) = true
+1 (string) AND -0.2 (number) = true
+1 (string) OR -0.2 (number) = true
+1 (string) AND NaN (number) = false
+1 (string) OR NaN (number) = true
+1 (string) AND Infinity (number) = true
+1 (string) OR Infinity (number) = true
+0 (string) AND true (boolean) = true
+0 (string) OR true (boolean) = true
+0 (string) AND false (boolean) = false
+0 (string) OR false (boolean) = true
+0 (string) AND 1 (number) = true
+0 (string) OR 1 (number) = true
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = true
+0 (string) AND 42 (number) = true
+0 (string) OR 42 (number) = true
+0 (string) AND -100000 (number) = true
+0 (string) OR -100000 (number) = true
+0 (string) AND undefined (undefined) = false
+0 (string) OR undefined (undefined) = true
+0 (string) AND null (null) = false
+0 (string) OR null (null) = true
+0 (string) AND _level0 (movieclip) = true
+0 (string) OR _level0 (movieclip) = true
+0 (string) AND [object Object] (object) = true
+0 (string) OR [object Object] (object) = true
+0 (string) AND hi (string) = true
+0 (string) OR hi (string) = true
+0 (string) AND 1 (string) = true
+0 (string) OR 1 (string) = true
+0 (string) AND 0 (string) = true
+0 (string) OR 0 (string) = true
+0 (string) AND  (string) = false
+0 (string) OR  (string) = true
+0 (string) AND 1 (number) = true
+0 (string) OR 1 (number) = true
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = true
+0 (string) AND 0 (number) = false
+0 (string) OR 0 (number) = true
+0 (string) AND -0.2 (number) = true
+0 (string) OR -0.2 (number) = true
+0 (string) AND NaN (number) = false
+0 (string) OR NaN (number) = true
+0 (string) AND Infinity (number) = true
+0 (string) OR Infinity (number) = true
+ (string) AND true (boolean) = false
+ (string) OR true (boolean) = true
+ (string) AND false (boolean) = false
+ (string) OR false (boolean) = false
+ (string) AND 1 (number) = false
+ (string) OR 1 (number) = true
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND 42 (number) = false
+ (string) OR 42 (number) = true
+ (string) AND -100000 (number) = false
+ (string) OR -100000 (number) = true
+ (string) AND undefined (undefined) = false
+ (string) OR undefined (undefined) = false
+ (string) AND null (null) = false
+ (string) OR null (null) = false
+ (string) AND _level0 (movieclip) = false
+ (string) OR _level0 (movieclip) = true
+ (string) AND [object Object] (object) = false
+ (string) OR [object Object] (object) = true
+ (string) AND hi (string) = false
+ (string) OR hi (string) = true
+ (string) AND 1 (string) = false
+ (string) OR 1 (string) = true
+ (string) AND 0 (string) = false
+ (string) OR 0 (string) = true
+ (string) AND  (string) = false
+ (string) OR  (string) = false
+ (string) AND 1 (number) = false
+ (string) OR 1 (number) = true
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND 0 (number) = false
+ (string) OR 0 (number) = false
+ (string) AND -0.2 (number) = false
+ (string) OR -0.2 (number) = true
+ (string) AND NaN (number) = false
+ (string) OR NaN (number) = false
+ (string) AND Infinity (number) = false
+ (string) OR Infinity (number) = true
+1 (number) AND true (boolean) = true
+1 (number) OR true (boolean) = true
+1 (number) AND false (boolean) = false
+1 (number) OR false (boolean) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 42 (number) = true
+1 (number) OR 42 (number) = true
+1 (number) AND -100000 (number) = true
+1 (number) OR -100000 (number) = true
+1 (number) AND undefined (undefined) = false
+1 (number) OR undefined (undefined) = true
+1 (number) AND null (null) = false
+1 (number) OR null (null) = true
+1 (number) AND _level0 (movieclip) = true
+1 (number) OR _level0 (movieclip) = true
+1 (number) AND [object Object] (object) = true
+1 (number) OR [object Object] (object) = true
+1 (number) AND hi (string) = true
+1 (number) OR hi (string) = true
+1 (number) AND 1 (string) = true
+1 (number) OR 1 (string) = true
+1 (number) AND 0 (string) = true
+1 (number) OR 0 (string) = true
+1 (number) AND  (string) = false
+1 (number) OR  (string) = true
+1 (number) AND 1 (number) = true
+1 (number) OR 1 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND 0 (number) = false
+1 (number) OR 0 (number) = true
+1 (number) AND -0.2 (number) = true
+1 (number) OR -0.2 (number) = true
+1 (number) AND NaN (number) = false
+1 (number) OR NaN (number) = true
+1 (number) AND Infinity (number) = true
+1 (number) OR Infinity (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND undefined (undefined) = false
+0 (number) OR undefined (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = true
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = true
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+0 (number) AND NaN (number) = false
+0 (number) OR NaN (number) = false
+0 (number) AND Infinity (number) = false
+0 (number) OR Infinity (number) = true
+0 (number) AND true (boolean) = false
+0 (number) OR true (boolean) = true
+0 (number) AND false (boolean) = false
+0 (number) OR false (boolean) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 42 (number) = false
+0 (number) OR 42 (number) = true
+0 (number) AND -100000 (number) = false
+0 (number) OR -100000 (number) = true
+0 (number) AND undefined (undefined) = false
+0 (number) OR undefined (undefined) = false
+0 (number) AND null (null) = false
+0 (number) OR null (null) = false
+0 (number) AND _level0 (movieclip) = false
+0 (number) OR _level0 (movieclip) = true
+0 (number) AND [object Object] (object) = false
+0 (number) OR [object Object] (object) = true
+0 (number) AND hi (string) = false
+0 (number) OR hi (string) = true
+0 (number) AND 1 (string) = false
+0 (number) OR 1 (string) = true
+0 (number) AND 0 (string) = false
+0 (number) OR 0 (string) = true
+0 (number) AND  (string) = false
+0 (number) OR  (string) = false
+0 (number) AND 1 (number) = false
+0 (number) OR 1 (number) = true
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND 0 (number) = false
+0 (number) OR 0 (number) = false
+0 (number) AND -0.2 (number) = false
+0 (number) OR -0.2 (number) = true
+0 (number) AND NaN (number) = false
+0 (number) OR NaN (number) = false
+0 (number) AND Infinity (number) = false
+0 (number) OR Infinity (number) = true
+-0.2 (number) AND true (boolean) = true
+-0.2 (number) OR true (boolean) = true
+-0.2 (number) AND false (boolean) = false
+-0.2 (number) OR false (boolean) = true
+-0.2 (number) AND 1 (number) = true
+-0.2 (number) OR 1 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND 42 (number) = true
+-0.2 (number) OR 42 (number) = true
+-0.2 (number) AND -100000 (number) = true
+-0.2 (number) OR -100000 (number) = true
+-0.2 (number) AND undefined (undefined) = false
+-0.2 (number) OR undefined (undefined) = true
+-0.2 (number) AND null (null) = false
+-0.2 (number) OR null (null) = true
+-0.2 (number) AND _level0 (movieclip) = true
+-0.2 (number) OR _level0 (movieclip) = true
+-0.2 (number) AND [object Object] (object) = true
+-0.2 (number) OR [object Object] (object) = true
+-0.2 (number) AND hi (string) = true
+-0.2 (number) OR hi (string) = true
+-0.2 (number) AND 1 (string) = true
+-0.2 (number) OR 1 (string) = true
+-0.2 (number) AND 0 (string) = true
+-0.2 (number) OR 0 (string) = true
+-0.2 (number) AND  (string) = false
+-0.2 (number) OR  (string) = true
+-0.2 (number) AND 1 (number) = true
+-0.2 (number) OR 1 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND 0 (number) = false
+-0.2 (number) OR 0 (number) = true
+-0.2 (number) AND -0.2 (number) = true
+-0.2 (number) OR -0.2 (number) = true
+-0.2 (number) AND NaN (number) = false
+-0.2 (number) OR NaN (number) = true
+-0.2 (number) AND Infinity (number) = true
+-0.2 (number) OR Infinity (number) = true
+NaN (number) AND true (boolean) = false
+NaN (number) OR true (boolean) = true
+NaN (number) AND false (boolean) = false
+NaN (number) OR false (boolean) = false
+NaN (number) AND 1 (number) = false
+NaN (number) OR 1 (number) = true
+NaN (number) AND 0 (number) = false
+NaN (number) OR 0 (number) = false
+NaN (number) AND 42 (number) = false
+NaN (number) OR 42 (number) = true
+NaN (number) AND -100000 (number) = false
+NaN (number) OR -100000 (number) = true
+NaN (number) AND undefined (undefined) = false
+NaN (number) OR undefined (undefined) = false
+NaN (number) AND null (null) = false
+NaN (number) OR null (null) = false
+NaN (number) AND _level0 (movieclip) = false
+NaN (number) OR _level0 (movieclip) = true
+NaN (number) AND [object Object] (object) = false
+NaN (number) OR [object Object] (object) = true
+NaN (number) AND hi (string) = false
+NaN (number) OR hi (string) = true
+NaN (number) AND 1 (string) = false
+NaN (number) OR 1 (string) = true
+NaN (number) AND 0 (string) = false
+NaN (number) OR 0 (string) = true
+NaN (number) AND  (string) = false
+NaN (number) OR  (string) = false
+NaN (number) AND 1 (number) = false
+NaN (number) OR 1 (number) = true
+NaN (number) AND 0 (number) = false
+NaN (number) OR 0 (number) = false
+NaN (number) AND 0 (number) = false
+NaN (number) OR 0 (number) = false
+NaN (number) AND -0.2 (number) = false
+NaN (number) OR -0.2 (number) = true
+NaN (number) AND NaN (number) = false
+NaN (number) OR NaN (number) = false
+NaN (number) AND Infinity (number) = false
+NaN (number) OR Infinity (number) = true
+Infinity (number) AND true (boolean) = true
+Infinity (number) OR true (boolean) = true
+Infinity (number) AND false (boolean) = false
+Infinity (number) OR false (boolean) = true
+Infinity (number) AND 1 (number) = true
+Infinity (number) OR 1 (number) = true
+Infinity (number) AND 0 (number) = false
+Infinity (number) OR 0 (number) = true
+Infinity (number) AND 42 (number) = true
+Infinity (number) OR 42 (number) = true
+Infinity (number) AND -100000 (number) = true
+Infinity (number) OR -100000 (number) = true
+Infinity (number) AND undefined (undefined) = false
+Infinity (number) OR undefined (undefined) = true
+Infinity (number) AND null (null) = false
+Infinity (number) OR null (null) = true
+Infinity (number) AND _level0 (movieclip) = true
+Infinity (number) OR _level0 (movieclip) = true
+Infinity (number) AND [object Object] (object) = true
+Infinity (number) OR [object Object] (object) = true
+Infinity (number) AND hi (string) = true
+Infinity (number) OR hi (string) = true
+Infinity (number) AND 1 (string) = true
+Infinity (number) OR 1 (string) = true
+Infinity (number) AND 0 (string) = true
+Infinity (number) OR 0 (string) = true
+Infinity (number) AND  (string) = false
+Infinity (number) OR  (string) = true
+Infinity (number) AND 1 (number) = true
+Infinity (number) OR 1 (number) = true
+Infinity (number) AND 0 (number) = false
+Infinity (number) OR 0 (number) = true
+Infinity (number) AND 0 (number) = false
+Infinity (number) OR 0 (number) = true
+Infinity (number) AND -0.2 (number) = true
+Infinity (number) OR -0.2 (number) = true
+Infinity (number) AND NaN (number) = false
+Infinity (number) OR NaN (number) = true
+Infinity (number) AND Infinity (number) = true
+Infinity (number) OR Infinity (number) = true
diff-tree 77266adc81a3093449703572a6123d71d33277d4 (from da61842ce18333f525b5f18f790cebf68141d11a)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 21:37:21 2007 +0100

    implement ToString, Add and Or actions
    
    NB: And and Or are not implemented for Flash4 because I was to lazy to write tests.

diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c
index ac4921c..3d6a836 100644
--- a/libswfdec/swfdec_script.c
+++ b/libswfdec/swfdec_script.c
@@ -191,6 +191,55 @@ swfdec_action_push_string (JSContext *cx
   return JS_TRUE;
 }
 
+static JSBool
+swfdec_value_to_boolean_5 (JSContext *cx, jsval val)
+{
+  if (JSVAL_IS_BOOLEAN (val)) {
+    return JSVAL_TO_BOOLEAN (val);
+  } else if (JSVAL_IS_INT (val)) {
+    return JSVAL_TO_INT (val) != 0;
+  } else if (JSVAL_IS_DOUBLE (val)) {
+    double d = *JSVAL_TO_DOUBLE (val);
+    return d != 0.0 && !isnan (d);
+  } else if (JSVAL_IS_STRING (val)) {
+    double d;
+    if (!JS_ValueToNumber (cx, val, &d))
+      return 0;
+    return d != 0.0 && !isnan (d);
+  } else if (JSVAL_IS_NULL (val)) {
+    return JS_FALSE;
+  } else if (JSVAL_IS_VOID (val)) {
+    return JS_FALSE;
+  } else if (JSVAL_IS_OBJECT (val)) {
+    return JS_TRUE;
+  }
+  g_assert_not_reached ();
+  return JS_FALSE;
+}
+
+static JSBool
+swfdec_value_to_boolean_7 (JSContext *cx, jsval val)
+{
+  if (JSVAL_IS_BOOLEAN (val)) {
+    return JSVAL_TO_BOOLEAN (val);
+  } else if (JSVAL_IS_INT (val)) {
+    return JSVAL_TO_INT (val) != 0;
+  } else if (JSVAL_IS_DOUBLE (val)) {
+    double d = *JSVAL_TO_DOUBLE (val);
+    return d != 0.0 && !isnan (d);
+  } else if (JSVAL_IS_STRING (val)) {
+    return JS_GetStringLength (JSVAL_TO_STRING (val)) > 0;
+  } else if (JSVAL_IS_NULL (val)) {
+    return JS_FALSE;
+  } else if (JSVAL_IS_VOID (val)) {
+    return JS_FALSE;
+  } else if (JSVAL_IS_OBJECT (val)) {
+    return JS_TRUE;
+  }
+  g_assert_not_reached ();
+  return JS_FALSE;
+}
+
 static double
 swfdec_value_to_number (JSContext *cx, jsval val)
 {
@@ -930,7 +979,7 @@ swfdec_action_binary (JSContext *cx, gui
 static JSString *
 swfdec_action_to_string_5 (JSContext *cx, jsval val)
 {
-  if (JSVAL_IS_VOID (val) || JSVAL_IS_NULL (val))
+  if (JSVAL_IS_VOID (val))
     return cx->runtime->emptyString;
   return js_ValueToString (cx, val);
 }
@@ -1936,6 +1985,17 @@ swfdec_action_to_number (JSContext *cx, 
 }
 
 static JSBool
+swfdec_action_to_string (JSContext *cx, guint action, const guint8 *data, guint len)
+{
+  JSString *s;
+  s = JS_ValueToString(cx, cx->fp->sp[-1]);
+  if (!s)
+    return JS_FALSE;
+  cx->fp->sp[-1] = STRING_TO_JSVAL (s);
+  return JS_TRUE;
+}
+
+static JSBool
 swfdec_action_type_of (JSContext *cx, guint action, const guint8 *data, guint len)
 {
   jsval val;
@@ -2010,6 +2070,71 @@ swfdec_action_extends (JSContext *cx, gu
   return JS_TRUE;
 }
 
+static JSBool
+swfdec_action_enumerate2 (JSContext *cx, guint action, const guint8 *data, guint len)
+{
+  JSObject *obj;
+  JSIdArray *array;
+  guint i;
+
+  if (!JSVAL_IS_OBJECT (cx->fp->sp[-1]) || cx->fp->sp[-1] == JSVAL_NULL) {
+    SWFDEC_ERROR ("Enumerate2 called without an object");
+    cx->fp->sp[-1] = JSVAL_NULL;
+    return JS_TRUE;
+  }
+  obj = JSVAL_TO_OBJECT (cx->fp->sp[-1]);
+  cx->fp->sp[-1] = JSVAL_NULL;
+  array = JS_Enumerate (cx, obj);
+  if (!array)
+    return JS_FALSE;
+  if ((guint) (cx->fp->spend - cx->fp->sp) < array->length) {
+    SWFDEC_ERROR ("FIXME: not enough stack space, need %u, got %d",
+	array->length, cx->fp->spend - cx->fp->sp);
+    JS_DestroyIdArray (cx, array);
+    return JS_FALSE;
+  }
+  for (i = 0; i < array->length; i++) {
+    if (!JS_IdToValue (cx, array->vector[i], cx->fp->sp++)) {
+      JS_DestroyIdArray (cx, array);
+      return JS_FALSE;
+    }
+  }
+  JS_DestroyIdArray (cx, array);
+  return JS_TRUE;
+}
+
+static JSBool
+swfdec_action_logical_5 (JSContext *cx, guint action, const guint8 *data, guint len)
+{
+  JSBool l, r;
+
+  l = swfdec_value_to_boolean_5 (cx, cx->fp->sp[-1]);
+  r = swfdec_value_to_boolean_5 (cx, cx->fp->sp[-2]);
+
+  cx->fp->sp--;
+  if (action == 0x10)
+    cx->fp->sp[-1] = l && r ? JSVAL_TRUE : JSVAL_FALSE;
+  else
+    cx->fp->sp[-1] = l || r ? JSVAL_TRUE : JSVAL_FALSE;
+  return JS_TRUE;
+}
+
+static JSBool
+swfdec_action_logical_7 (JSContext *cx, guint action, const guint8 *data, guint len)
+{
+  JSBool l, r;
+
+  l = swfdec_value_to_boolean_7 (cx, cx->fp->sp[-1]);
+  r = swfdec_value_to_boolean_7 (cx, cx->fp->sp[-2]);
+
+  cx->fp->sp--;
+  if (action == 0x10)
+    cx->fp->sp[-1] = l && r ? JSVAL_TRUE : JSVAL_FALSE;
+  else
+    cx->fp->sp[-1] = l || r ? JSVAL_TRUE : JSVAL_FALSE;
+  return JS_TRUE;
+}
+
 /*** PRINT FUNCTIONS ***/
 
 static char *
@@ -2321,8 +2446,8 @@ static const SwfdecActionSpec actions[25
   [0x0d] = { "Divide", NULL, 2, 1, { NULL, swfdec_action_binary, swfdec_action_binary, swfdec_action_binary, swfdec_action_binary } },
   [0x0e] = { "Equals", NULL, 2, 1, { NULL, swfdec_action_old_compare, swfdec_action_old_compare, swfdec_action_old_compare, swfdec_action_old_compare } },
   [0x0f] = { "Less", NULL, 2, 1, { NULL, swfdec_action_old_compare, swfdec_action_old_compare, swfdec_action_old_compare, swfdec_action_old_compare } },
-  [0x10] = { "And", NULL },
-  [0x11] = { "Or", NULL },
+  [0x10] = { "And", NULL, 2, 1, { NULL, /* FIXME */NULL, swfdec_action_logical_5, swfdec_action_logical_5, swfdec_action_logical_7 } },
+  [0x11] = { "Or", NULL, 2, 1, { NULL, /* FIXME */NULL, swfdec_action_logical_5, swfdec_action_logical_5, swfdec_action_logical_7 } },
   [0x12] = { "Not", NULL, 1, 1, { NULL, swfdec_action_not_4, swfdec_action_not_5, swfdec_action_not_5, swfdec_action_not_5 } },
   [0x13] = { "StringEquals", NULL },
   [0x14] = { "StringLength", NULL },
@@ -2372,7 +2497,7 @@ static const SwfdecActionSpec actions[25
   [0x48] = { "Less2", NULL, 2, 1, { NULL, NULL, swfdec_action_new_comparison_6, swfdec_action_new_comparison_6, swfdec_action_new_comparison_7 } },
   [0x49] = { "Equals2", NULL, 2, 1, { NULL, NULL, swfdec_action_equals2, swfdec_action_equals2, swfdec_action_equals2 } },
   [0x4a] = { "ToNumber", NULL, 1, 1, { NULL, NULL, swfdec_action_to_number, swfdec_action_to_number, swfdec_action_to_number } },
-  [0x4b] = { "ToString", NULL },
+  [0x4b] = { "ToString", NULL, 1, 1, { NULL, NULL, swfdec_action_to_string, swfdec_action_to_string, swfdec_action_to_string } },
   [0x4c] = { "PushDuplicate", NULL, 1, 2, { NULL, NULL, swfdec_action_push_duplicate, swfdec_action_push_duplicate, swfdec_action_push_duplicate } },
   [0x4d] = { "Swap", NULL, 2, 2, { NULL, NULL, swfdec_action_swap, swfdec_action_swap, swfdec_action_swap } },
   [0x4e] = { "GetMember", NULL, 2, 1, { NULL, swfdec_action_get_member, swfdec_action_get_member, swfdec_action_get_member, swfdec_action_get_member } },
@@ -2383,7 +2508,7 @@ static const SwfdecActionSpec actions[25
   [0x53] = { "NewMethod", NULL, -1, 1, { NULL, NULL, swfdec_action_new_method, swfdec_action_new_method, swfdec_action_new_method } },
   /* version 6 */
   [0x54] = { "InstanceOf", NULL },
-  [0x55] = { "Enumerate2", NULL },
+  [0x55] = { "Enumerate2", NULL, 1, -1, { NULL, NULL, NULL, swfdec_action_enumerate2, swfdec_action_enumerate2 } },
   /* version 5 */
   [0x60] = { "BitAnd", NULL, 2, 1, { NULL, NULL, swfdec_action_bitwise, swfdec_action_bitwise, swfdec_action_bitwise } },
   [0x61] = { "BitOr", NULL, 2, 1, { NULL, NULL, swfdec_action_bitwise, swfdec_action_bitwise, swfdec_action_bitwise } },
diff-tree da61842ce18333f525b5f18f790cebf68141d11a (from a4707072b71463188e6fa49a397f893fc9ad5b89)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Mar 12 21:36:37 2007 +0100

    JSIdArray length should be unsigned

diff --git a/libswfdec/js/jsapi.c b/libswfdec/js/jsapi.c
index e33b846..7485350 100644
--- a/libswfdec/js/jsapi.c
+++ b/libswfdec/js/jsapi.c
@@ -2845,7 +2845,8 @@ JS_ClearScope(JSContext *cx, JSObject *o
 JS_PUBLIC_API(JSIdArray *)
 JS_Enumerate(JSContext *cx, JSObject *obj)
 {
-    jsint i, n;
+    jsuint i;
+    jsint n;
     jsval iter_state, num_properties;
     jsid id;
     JSIdArray *ida;
diff --git a/libswfdec/js/jsapi.h b/libswfdec/js/jsapi.h
index 9cc1dd0..28dcbfa 100644
--- a/libswfdec/js/jsapi.h
+++ b/libswfdec/js/jsapi.h
@@ -813,7 +813,7 @@ struct JSProperty {
 };
 
 struct JSIdArray {
-    jsint length;
+    jsuint length;
     jsid  vector[1];    /* actually, length jsid words */
 };
 
diff --git a/libswfdec/js/jsinterp.c b/libswfdec/js/jsinterp.c
index 121962f..fbf54b8 100644
--- a/libswfdec/js/jsinterp.c
+++ b/libswfdec/js/jsinterp.c
@@ -1205,7 +1205,7 @@ ImportProperty(JSContext *cx, JSObject *
     JSObject *obj2, *target, *funobj, *closure;
     JSString *str;
     uintN attrs;
-    jsint i;
+    jsuint i;
     jsval value;
 
     if (JSVAL_IS_VOID(id)) {


More information about the Swfdec mailing list