[Swfdec] Branch 'as' - 8 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_number.c libswfdec/swfdec_as_scope.h libswfdec/swfdec_as_script_function.c libswfdec/swfdec_as_with.c libswfdec/swfdec_as_with.h libswfdec/swfdec_button_movie.c libswfdec/swfdec_mouse_as.c libswfdec/swfdec_movie.c libswfdec/swfdec_player.c libswfdec/swfdec_root_movie.c libswfdec/swfdec_root_movie.h libswfdec/swfdec_sprite_movie_as.c libswfdec/swfdec_sprite_movie.c player/swfdec_debug_movies.c test/trace

Benjamin Otte company at kemper.freedesktop.org
Tue Jun 5 13:20:54 PDT 2007


 libswfdec/Makefile.am                              |    2 
 libswfdec/swfdec_as_context.c                      |    6 
 libswfdec/swfdec_as_frame.c                        |   32 ++++-
 libswfdec/swfdec_as_frame.h                        |    5 
 libswfdec/swfdec_as_interpret.c                    |   33 ++++-
 libswfdec/swfdec_as_number.c                       |    7 -
 libswfdec/swfdec_as_scope.h                        |    2 
 libswfdec/swfdec_as_script_function.c              |    1 
 libswfdec/swfdec_as_with.c                         |  133 +++++++++++++++++++++
 libswfdec/swfdec_as_with.h                         |   56 ++++++++
 libswfdec/swfdec_button_movie.c                    |    2 
 libswfdec/swfdec_mouse_as.c                        |    4 
 libswfdec/swfdec_movie.c                           |   30 ++--
 libswfdec/swfdec_player.c                          |    1 
 libswfdec/swfdec_root_movie.c                      |   13 +-
 libswfdec/swfdec_root_movie.h                      |    2 
 libswfdec/swfdec_sprite_movie.c                    |    8 -
 libswfdec/swfdec_sprite_movie_as.c                 |    9 -
 player/swfdec_debug_movies.c                       |    4 
 test/trace/Makefile.am                             |   23 +++
 test/trace/jump-into-with.as                       |   20 +++
 test/trace/jump-into-with.swf                      |binary
 test/trace/jump-into-with.swf.trace                |   21 +++
 test/trace/jump-out-and-back-into-with-2.as        |   22 +++
 test/trace/jump-out-and-back-into-with-2.swf       |binary
 test/trace/jump-out-and-back-into-with-2.swf.trace |   22 +++
 test/trace/jump-out-and-back-into-with-3.as        |   26 ++++
 test/trace/jump-out-and-back-into-with-3.swf       |binary
 test/trace/jump-out-and-back-into-with-3.swf.trace |   13 ++
 test/trace/jump-out-and-back-into-with-4.as        |   23 +++
 test/trace/jump-out-and-back-into-with-4.swf       |binary
 test/trace/jump-out-and-back-into-with-4.swf.trace |   13 ++
 test/trace/jump-out-and-back-into-with-5.as        |   26 ++++
 test/trace/jump-out-and-back-into-with-5.swf       |binary
 test/trace/jump-out-and-back-into-with-5.swf.trace |   22 +++
 test/trace/jump-out-and-back-into-with.as          |   23 +++
 test/trace/jump-out-and-back-into-with.swf         |binary
 test/trace/jump-out-and-back-into-with.swf.trace   |    4 
 test/trace/jump-out-of-with.as                     |   20 +++
 test/trace/jump-out-of-with.swf                    |binary
 test/trace/jump-out-of-with.swf.trace              |   41 ++++++
 41 files changed, 617 insertions(+), 52 deletions(-)

New commits:
diff-tree 777b3d0c598129177ec806335ba681b41fd1d239 (from 945e8d45a71407e1c8579f8bc4906bc9b78f34ab)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jun 5 22:21:47 2007 +0200

    Add various tests for With action
    
    note that these tests' swf files are binary modified to get the right jumps

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 800eda2..dd0ea9b 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -193,6 +193,7 @@ EXTRA_DIST = \
 	isnan-6.swf \
 	isnan-6.swf.trace \
 	isnan-7.swf \
+	isnan-7.swf.trace \
 	if.as \
 	if-5.swf \
 	if-5.swf.trace \
@@ -200,7 +201,27 @@ EXTRA_DIST = \
 	if-6.swf.trace \
 	if-7.swf \
 	if-7.swf.trace \
-	isnan-7.swf.trace \
+	jump-into-with.as \
+	jump-into-with.swf \
+	jump-into-with.swf.trace \
+	jump-out-and-back-into-with.as \
+	jump-out-and-back-into-with.swf \
+	jump-out-and-back-into-with.swf.trace \
+	jump-out-and-back-into-with-2.as \
+	jump-out-and-back-into-with-2.swf \
+	jump-out-and-back-into-with-2.swf.trace \
+	jump-out-and-back-into-with-3.as \
+	jump-out-and-back-into-with-3.swf \
+	jump-out-and-back-into-with-3.swf.trace \
+	jump-out-and-back-into-with-4.as \
+	jump-out-and-back-into-with-4.swf \
+	jump-out-and-back-into-with-4.swf.trace \
+	jump-out-and-back-into-with-5.as \
+	jump-out-and-back-into-with-5.swf \
+	jump-out-and-back-into-with-5.swf.trace \
+	jump-out-of-with.as \
+	jump-out-of-with.swf \
+	jump-out-of-with.swf.trace \
 	lifetime1.swf \
 	lifetime1.swf.trace \
 	load-4.swf \
diff --git a/test/trace/jump-into-with.as b/test/trace/jump-into-with.as
new file mode 100644
index 0000000..7f83c51
--- /dev/null
+++ b/test/trace/jump-into-with.as
@@ -0,0 +1,20 @@
+// makeswf -v 7 -s 200x150 -r 1 -o movie68.swf movie68.as
+
+// note that the real checks are binary-modified to produce the desired tests.
+// The branch offsets have been adjusted.
+trace ("Check various things when jumping into with commands");
+x = 0;
+o = new Object ();
+o.x = -1;
+with (o) {
+  trace (x);
+}
+trace (x);
+x++;
+if (x < 10) {
+  asm {
+    branchalways "hi"
+  };
+}
+
+loadMovie ("FSCommand:quit", "");
diff --git a/test/trace/jump-into-with.swf b/test/trace/jump-into-with.swf
new file mode 100644
index 0000000..2baaeb5
Binary files /dev/null and b/test/trace/jump-into-with.swf differ
diff --git a/test/trace/jump-into-with.swf.trace b/test/trace/jump-into-with.swf.trace
new file mode 100644
index 0000000..260afc1
--- /dev/null
+++ b/test/trace/jump-into-with.swf.trace
@@ -0,0 +1,21 @@
+Check various things when jumping into with commands
+-1
+0
+1
+1
+2
+2
+3
+3
+4
+4
+5
+5
+6
+6
+7
+7
+8
+8
+9
+9
diff --git a/test/trace/jump-out-and-back-into-with-2.as b/test/trace/jump-out-and-back-into-with-2.as
new file mode 100644
index 0000000..4f45223
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with-2.as
@@ -0,0 +1,22 @@
+// makeswf -v 7 -s 200x150 -r 1 -o movie68.swf movie68.as
+
+// note that the real checks are binary-modified to produce the desired tests.
+// The branch offsets have been adjusted.
+trace ("Check how jumping out of a With and back in works");
+x = 0;
+o = new Object ();
+o.x = -10;
+with (o) {
+  trace (x);
+  x++;
+  if (x > 10) {
+    asm {
+      branchalways "hi"
+    };
+  }
+}
+asm {
+  branchalways "hi"
+};
+
+loadMovie ("FSCommand:quit", "");
diff --git a/test/trace/jump-out-and-back-into-with-2.swf b/test/trace/jump-out-and-back-into-with-2.swf
new file mode 100644
index 0000000..309a4cd
Binary files /dev/null and b/test/trace/jump-out-and-back-into-with-2.swf differ
diff --git a/test/trace/jump-out-and-back-into-with-2.swf.trace b/test/trace/jump-out-and-back-into-with-2.swf.trace
new file mode 100644
index 0000000..9e08aab
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with-2.swf.trace
@@ -0,0 +1,22 @@
+Check how jumping out of a With and back in works
+-10
+-9
+-8
+-7
+-6
+-5
+-4
+-3
+-2
+-1
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/test/trace/jump-out-and-back-into-with-3.as b/test/trace/jump-out-and-back-into-with-3.as
new file mode 100644
index 0000000..ca620ac
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with-3.as
@@ -0,0 +1,26 @@
+// makeswf -v 7 -s 200x150 -r 1 -o movie68.swf movie68.as
+
+// note that the real checks are binary-modified to produce the desired tests.
+// The branch offsets have been adjusted.
+trace ("Check how jumping out of a With and back in works");
+x = 0;
+o = new Object ();
+o.x = -10;
+with (o) {
+  trace (x);
+  x++;
+  if (x > 10) {
+    asm {
+      branchalways "hi"
+    };
+  }
+  asm {
+    push "hi"
+  };
+}
+asm {
+  trace
+  branchalways "hi"
+};
+
+loadMovie ("FSCommand:quit", "");
diff --git a/test/trace/jump-out-and-back-into-with-3.swf b/test/trace/jump-out-and-back-into-with-3.swf
new file mode 100644
index 0000000..890e735
Binary files /dev/null and b/test/trace/jump-out-and-back-into-with-3.swf differ
diff --git a/test/trace/jump-out-and-back-into-with-3.swf.trace b/test/trace/jump-out-and-back-into-with-3.swf.trace
new file mode 100644
index 0000000..8fb9392
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with-3.swf.trace
@@ -0,0 +1,13 @@
+Check how jumping out of a With and back in works
+-10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/test/trace/jump-out-and-back-into-with-4.as b/test/trace/jump-out-and-back-into-with-4.as
new file mode 100644
index 0000000..83fdacb
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with-4.as
@@ -0,0 +1,23 @@
+// makeswf -v 7 -s 200x150 -r 1 -o movie68.swf movie68.as
+
+// note that the real checks are binary-modified to produce the desired tests.
+// The branch offsets have been adjusted.
+trace ("Check how jumping out of a With and back in works");
+x = 0;
+o = new Object ();
+o.x = -10;
+with (o) {
+  trace (x);
+  x++;
+  if (x > 10) {
+    asm {
+      branchalways "hi"
+    };
+  };
+};
+asm {
+  stop
+  branchalways "hi"
+};
+
+loadMovie ("FSCommand:quit", "");
diff --git a/test/trace/jump-out-and-back-into-with-4.swf b/test/trace/jump-out-and-back-into-with-4.swf
new file mode 100644
index 0000000..dc68c2e
Binary files /dev/null and b/test/trace/jump-out-and-back-into-with-4.swf differ
diff --git a/test/trace/jump-out-and-back-into-with-4.swf.trace b/test/trace/jump-out-and-back-into-with-4.swf.trace
new file mode 100644
index 0000000..8fb9392
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with-4.swf.trace
@@ -0,0 +1,13 @@
+Check how jumping out of a With and back in works
+-10
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/test/trace/jump-out-and-back-into-with-5.as b/test/trace/jump-out-and-back-into-with-5.as
new file mode 100644
index 0000000..2d27dbc
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with-5.as
@@ -0,0 +1,26 @@
+// makeswf -v 7 -s 200x150 -r 1 -o movie68.swf movie68.as
+
+// note that the real checks are binary-modified to produce the desired tests.
+// The branch offsets have been adjusted.
+trace ("Check how jumping out of a With and back in works");
+x = 0;
+o = new Object ();
+o.x = -10;
+with (o) {
+  trace (x);
+  x++;
+  if (x > 10) {
+    asm {
+      push 0
+    };
+  } else {
+    asm {
+      push 1
+    };
+  }
+};
+asm {
+  branchiftrue "hi"
+};
+
+loadMovie ("FSCommand:quit", "");
diff --git a/test/trace/jump-out-and-back-into-with-5.swf b/test/trace/jump-out-and-back-into-with-5.swf
new file mode 100644
index 0000000..94956e4
Binary files /dev/null and b/test/trace/jump-out-and-back-into-with-5.swf differ
diff --git a/test/trace/jump-out-and-back-into-with-5.swf.trace b/test/trace/jump-out-and-back-into-with-5.swf.trace
new file mode 100644
index 0000000..9e08aab
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with-5.swf.trace
@@ -0,0 +1,22 @@
+Check how jumping out of a With and back in works
+-10
+-9
+-8
+-7
+-6
+-5
+-4
+-3
+-2
+-1
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/test/trace/jump-out-and-back-into-with.as b/test/trace/jump-out-and-back-into-with.as
new file mode 100644
index 0000000..5ded997
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with.as
@@ -0,0 +1,23 @@
+// makeswf -v 7 -s 200x150 -r 1 -o movie68.swf movie68.as
+
+// note that the real checks are binary-modified to produce the desired tests.
+// The branch offsets have been adjusted.
+trace ("Check how jumping out of a With and back in works");
+x = 0;
+o = new Object ();
+o.x = -1;
+with (o) {
+  trace (x);
+  asm {
+    branchalways "hi"
+  };
+  trace (x);
+}
+if (0) {
+  trace ("hi");
+  asm {
+    branchalways "hi"
+  };
+}
+
+loadMovie ("FSCommand:quit", "");
diff --git a/test/trace/jump-out-and-back-into-with.swf b/test/trace/jump-out-and-back-into-with.swf
new file mode 100644
index 0000000..b0871d7
Binary files /dev/null and b/test/trace/jump-out-and-back-into-with.swf differ
diff --git a/test/trace/jump-out-and-back-into-with.swf.trace b/test/trace/jump-out-and-back-into-with.swf.trace
new file mode 100644
index 0000000..a25ecad
--- /dev/null
+++ b/test/trace/jump-out-and-back-into-with.swf.trace
@@ -0,0 +1,4 @@
+Check how jumping out of a With and back in works
+-1
+hi
+0
diff --git a/test/trace/jump-out-of-with.as b/test/trace/jump-out-of-with.as
new file mode 100644
index 0000000..83170b9
--- /dev/null
+++ b/test/trace/jump-out-of-with.as
@@ -0,0 +1,20 @@
+// makeswf -v 7 -s 200x150 -r 1 -o movie68.swf movie68.as
+
+// note that the real checks are binary-modified to produce the desired tests.
+// The branch offsets have been adjusted.
+trace ("Check how jumping out of a With works");
+x = 0;
+o = new Object ();
+o.x = -10;
+trace (x);
+with (o) {
+  trace (x);
+  x++;
+  if (x < 10) {
+    asm {
+      branchalways "hi"
+    };
+  }
+};
+
+loadMovie ("FSCommand:quit", "");
diff --git a/test/trace/jump-out-of-with.swf b/test/trace/jump-out-of-with.swf
new file mode 100644
index 0000000..987e10a
Binary files /dev/null and b/test/trace/jump-out-of-with.swf differ
diff --git a/test/trace/jump-out-of-with.swf.trace b/test/trace/jump-out-of-with.swf.trace
new file mode 100644
index 0000000..9f97a38
--- /dev/null
+++ b/test/trace/jump-out-of-with.swf.trace
@@ -0,0 +1,41 @@
+Check how jumping out of a With works
+0
+-10
+0
+-9
+0
+-8
+0
+-7
+0
+-6
+0
+-5
+0
+-4
+0
+-3
+0
+-2
+0
+-1
+0
+0
+0
+1
+0
+2
+0
+3
+0
+4
+0
+5
+0
+6
+0
+7
+0
+8
+0
+9
diff-tree 945e8d45a71407e1c8579f8bc4906bc9b78f34ab (from 2351e7d7d1dd6269ead9447fe49de3163e174de2)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jun 5 22:18:22 2007 +0200

    Add With action
    
    This includes a With object, lots of code to jump out of scope at the right
    time and various other modifications to make With a reality

diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am
index d701d51..68350fc 100644
--- a/libswfdec/Makefile.am
+++ b/libswfdec/Makefile.am
@@ -47,6 +47,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES
 	swfdec_as_strings.c \
 	swfdec_as_super.c \
 	swfdec_as_types.c \
+	swfdec_as_with.c \
 	swfdec_amf.c \
 	swfdec_audio.c \
 	swfdec_audio_event.c \
@@ -151,6 +152,7 @@ noinst_HEADERS = \
 	swfdec_as_strings.h \
 	swfdec_as_super.h \
 	swfdec_as_types.h \
+	swfdec_as_with.h \
 	swfdec_amf.h \
 	swfdec_audio_internal.h \
 	swfdec_audio_event.h \
diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c
index d899d1e..c10a5ea 100644
--- a/libswfdec/swfdec_as_context.c
+++ b/libswfdec/swfdec_as_context.c
@@ -402,6 +402,7 @@ swfdec_as_context_run (SwfdecAsContext *
   int version;
   SwfdecAsContextClass *klass;
   void (* step) (SwfdecAsContext *context);
+  gboolean check_scope; /* some opcodes avoid a scope check */
 
   g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context));
   if (context->frame == NULL)
@@ -437,6 +438,7 @@ start:
   startpc = script->buffer->data;
   endpc = startpc + script->buffer->length;
   pc = frame->pc;
+  check_scope = TRUE;
 
   while (TRUE) {
     if (pc == endpc) {
@@ -447,6 +449,8 @@ start:
       SWFDEC_ERROR ("pc %p not in valid range [%p, %p) anymore", pc, startpc, endpc);
       goto error;
     }
+    if (check_scope)
+      swfdec_as_frame_check_scope (frame);
 
     /* decode next action */
     action = *pc;
@@ -508,8 +512,10 @@ start:
     /* FIXME: do this via flag? */
     if (frame->pc == pc) {
       frame->pc = pc = nextpc;
+      check_scope = TRUE;
     } else {
       pc = frame->pc;
+      check_scope = FALSE;
     }
     if (frame == context->frame) {
 #ifndef G_DISABLE_ASSERT
diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c
index b36e1e4..de18973 100644
--- a/libswfdec/swfdec_as_frame.c
+++ b/libswfdec/swfdec_as_frame.c
@@ -122,7 +122,7 @@ swfdec_as_frame_new (SwfdecAsContext *co
   SWFDEC_DEBUG ("new frame for function %s", frame->function_name);
   frame->pc = script->buffer->data;
   frame->stack = stack;
-  frame->scope = NULL;
+  frame->scope = SWFDEC_AS_SCOPE (frame);
   if (frame->next)
     frame->var_object = frame->next->var_object;
   frame->n_registers = script->n_registers;
@@ -202,7 +202,7 @@ swfdec_as_frame_find_variable (SwfdecAsF
   g_return_val_if_fail (SWFDEC_IS_AS_FRAME (frame), NULL);
   g_return_val_if_fail (variable != NULL, NULL);
 
-  cur = SWFDEC_AS_SCOPE (frame);
+  cur = frame->scope;
   for (i = 0; i < 256; i++) {
     ret = swfdec_as_object_find_variable (SWFDEC_AS_OBJECT (cur), variable);
     if (ret)
@@ -348,3 +348,31 @@ swfdec_as_frame_preload (SwfdecAsFrame *
     }
   }
 }
+
+/**
+ * swfdec_as_frame_check_scope:
+ * @frame: a #SwfdecAsFrame
+ *
+ * Checks that the current scope of the given @frame is still correct.
+ * If it is not, the current scope is popped and the next one is used.
+ * If the
+ **/
+void
+swfdec_as_frame_check_scope (SwfdecAsFrame *frame)
+{
+  SwfdecAsScope *frame_scope;
+
+  g_return_if_fail (SWFDEC_IS_AS_FRAME (frame));
+
+  frame_scope = SWFDEC_AS_SCOPE (frame);
+  while (frame->scope != frame_scope) {
+    SwfdecAsScope *cur = frame->scope;
+
+    if (frame->pc >= cur->startpc && 
+	frame->pc < cur->endpc)
+      break;
+    
+    frame->scope = cur->next;
+  }
+}
+
diff --git a/libswfdec/swfdec_as_frame.h b/libswfdec/swfdec_as_frame.h
index c0c2d71..c2423e3 100644
--- a/libswfdec/swfdec_as_frame.h
+++ b/libswfdec/swfdec_as_frame.h
@@ -42,11 +42,11 @@ struct _SwfdecAsFrame {
   SwfdecAsFunction *	function;	/* function we're executing or NULL if toplevel */
   SwfdecAsObject *	thisp;		/* this object in current frame or NULL if none */
   gboolean		construct;	/* TRUE if this is the constructor for thisp */
-  /* debugging */
-  char *		function_name;	/* name of function */
   SwfdecAsValue *	return_value;	/* pointer to where to store the return value */
   guint			argc;		/* number of arguments */
   const SwfdecAsValue *	argv;		/* arguments */
+  /* debugging */
+  char *		function_name;	/* name of function */
   /* normal execution */
   SwfdecScript *	script;		/* script being executed */
   SwfdecAsScope *	scope;		/* first object in scope chain (can be NULL) */
@@ -79,6 +79,7 @@ SwfdecAsObject *swfdec_as_frame_find_var
 
 void		swfdec_as_frame_set_target	(SwfdecAsFrame *	frame,
 						 SwfdecAsObject *	target);
+void		swfdec_as_frame_check_scope	(SwfdecAsFrame *	frame);
 
 
 G_END_DECLS
diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c
index 8cf7966..f1898a1 100644
--- a/libswfdec/swfdec_as_interpret.c
+++ b/libswfdec/swfdec_as_interpret.c
@@ -27,6 +27,7 @@
 #include "swfdec_as_function.h"
 #include "swfdec_as_script_function.h"
 #include "swfdec_as_stack.h"
+#include "swfdec_as_with.h"
 #include "swfdec_debug.h"
 
 #include <errno.h>
@@ -55,8 +56,7 @@ swfdec_action_get_target (SwfdecAsContex
   SwfdecAsObject *target = context->frame->target;
 
   if (target == NULL) {
-    SwfdecAsScope *scope = context->frame->scope ? 
-	context->frame->scope : SWFDEC_AS_SCOPE (context->frame);
+    SwfdecAsScope *scope = context->frame->scope;
     while (scope->next)
       scope = scope->next;
     g_assert (SWFDEC_IS_AS_FRAME (scope));
@@ -1945,9 +1945,36 @@ swfdec_action_mb_ascii_to_char_5 (Swfdec
   }
 }
 
+static void
+swfdec_action_with (SwfdecAsContext *cx, guint action, const guint8 *data, guint len)
+{
+  SwfdecAsObject *object;
+
+  if (len != 2) {
+    SWFDEC_ERROR ("With action requires a length of 2, but got %u", len);
+    return;
+  }
+  object = swfdec_as_value_to_object (cx, swfdec_as_stack_pop (cx->frame->stack));
+  if (object == NULL) {
+    SWFDEC_ERROR ("With called without an object");
+    return;
+  }
+  swfdec_as_with_new (object, data + len, GUINT16_FROM_LE (*(guint16 *) data));
+}
+
 /*** PRINT FUNCTIONS ***/
 
 static char *
+swfdec_action_print_with (guint action, const guint8 *data, guint len)
+{
+  if (len != 2) {
+    SWFDEC_ERROR ("With action requires a length of 2, but got %u", len);
+    return NULL;
+  }
+  return g_strdup_printf ("With %u", GUINT16_FROM_LE (*(guint16 *) data));
+}
+
+static char *
 swfdec_action_print_store_register (guint action, const guint8 *data, guint len)
 {
   if (len != 1) {
@@ -2344,7 +2371,7 @@ const SwfdecActionSpec swfdec_as_actions
   [SWFDEC_AS_ACTION_DEFINE_FUNCTION2] = { "DefineFunction2", swfdec_action_print_define_function, 0, -1, { NULL, NULL, NULL, swfdec_action_define_function, swfdec_action_define_function } },
   [SWFDEC_AS_ACTION_TRY] = { "Try", NULL },
   /* version 5 */
-  [SWFDEC_AS_ACTION_WITH] = { "With", NULL },
+  [SWFDEC_AS_ACTION_WITH] = { "With", swfdec_action_print_with, 1, 0, { NULL, NULL, swfdec_action_with, swfdec_action_with, swfdec_action_with } },
   /* version 4 */
   [SWFDEC_AS_ACTION_PUSH] = { "Push", swfdec_action_print_push, 0, -1, { NULL, swfdec_action_push, swfdec_action_push, swfdec_action_push, swfdec_action_push } },
   [SWFDEC_AS_ACTION_JUMP] = { "Jump", swfdec_action_print_jump, 0, 0, { NULL, swfdec_action_jump, swfdec_action_jump, swfdec_action_jump, swfdec_action_jump } },
diff --git a/libswfdec/swfdec_as_scope.h b/libswfdec/swfdec_as_scope.h
index d0a4c89..7c32e02 100644
--- a/libswfdec/swfdec_as_scope.h
+++ b/libswfdec/swfdec_as_scope.h
@@ -40,6 +40,8 @@ struct _SwfdecAsScope {
 
   /*< private >*/
   SwfdecAsScope *	next;		/* next scope or NULL if last */
+  const guint8 *      	startpc;	/* start of this scope */
+  const guint8 *      	endpc;		/* end of this scope */
 };
 
 struct _SwfdecAsScopeClass {
diff --git a/libswfdec/swfdec_as_script_function.c b/libswfdec/swfdec_as_script_function.c
index 14873d1..2144816 100644
--- a/libswfdec/swfdec_as_script_function.c
+++ b/libswfdec/swfdec_as_script_function.c
@@ -37,7 +37,6 @@ swfdec_as_script_function_call (SwfdecAs
 
   frame = swfdec_as_frame_new (SWFDEC_AS_OBJECT (function)->context, script->script);
   SWFDEC_AS_SCOPE (frame)->next = script->scope;
-  frame->scope = SWFDEC_AS_SCOPE (frame);
   frame->function = function;
   return frame;
 }
diff --git a/libswfdec/swfdec_as_with.c b/libswfdec/swfdec_as_with.c
new file mode 100644
index 0000000..b5c6ce1
--- /dev/null
+++ b/libswfdec/swfdec_as_with.c
@@ -0,0 +1,133 @@
+/* Swfdec
+ * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "swfdec_as_with.h"
+#include "swfdec_as_context.h"
+#include "swfdec_as_frame.h"
+#include "swfdec_debug.h"
+
+G_DEFINE_TYPE (SwfdecAsWith, swfdec_as_with, SWFDEC_TYPE_AS_SCOPE)
+
+static void
+swfdec_as_with_mark (SwfdecAsObject *object)
+{
+  SwfdecAsWith *with = SWFDEC_AS_WITH (object);
+
+  swfdec_as_object_mark (with->object);
+
+  SWFDEC_AS_OBJECT_CLASS (swfdec_as_with_parent_class)->mark (object);
+}
+
+static gboolean
+swfdec_as_with_get (SwfdecAsObject *object, const char *variable,
+  SwfdecAsValue *val, guint *flags)
+{
+  SwfdecAsWith *with = SWFDEC_AS_WITH (object);
+  SwfdecAsObjectClass *klass = SWFDEC_AS_OBJECT_GET_CLASS (with->object);
+
+  return klass->get (with->object, variable, val, flags);
+}
+
+static void
+swfdec_as_with_set (SwfdecAsObject *object, const char *variable,
+    const SwfdecAsValue *val)
+{
+  SwfdecAsWith *with = SWFDEC_AS_WITH (object);
+  SwfdecAsObjectClass *klass = SWFDEC_AS_OBJECT_GET_CLASS (with->object);
+
+  klass->set (with->object, variable, val);
+}
+
+static void
+swfdec_as_with_set_flags (SwfdecAsObject *object, const char *variable,
+    guint flags, guint mask)
+{
+  SwfdecAsWith *with = SWFDEC_AS_WITH (object);
+  SwfdecAsObjectClass *klass = SWFDEC_AS_OBJECT_GET_CLASS (with->object);
+
+  klass->set_flags (with->object, variable, flags, mask);
+}
+
+static void
+swfdec_as_with_delete (SwfdecAsObject *object, const char *variable)
+{
+  SwfdecAsWith *with = SWFDEC_AS_WITH (object);
+  SwfdecAsObjectClass *klass = SWFDEC_AS_OBJECT_GET_CLASS (with->object);
+
+  klass->delete (with->object, variable);
+}
+
+static gboolean
+swfdec_as_with_foreach (SwfdecAsObject *object, SwfdecAsVariableForeach func,
+    gpointer data)
+{
+  SwfdecAsWith *with = SWFDEC_AS_WITH (object);
+  SwfdecAsObjectClass *klass = SWFDEC_AS_OBJECT_GET_CLASS (with->object);
+
+  return klass->foreach (with->object, func, data);
+}
+
+static void
+swfdec_as_with_class_init (SwfdecAsWithClass *klass)
+{
+  SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass);
+
+  asobject_class->mark = swfdec_as_with_mark;
+  asobject_class->get = swfdec_as_with_get;
+  asobject_class->set = swfdec_as_with_set;
+  asobject_class->set_flags = swfdec_as_with_set_flags;
+  asobject_class->delete = swfdec_as_with_delete;
+  asobject_class->foreach = swfdec_as_with_foreach;
+}
+
+static void
+swfdec_as_with_init (SwfdecAsWith *with)
+{
+}
+
+SwfdecAsScope *
+swfdec_as_with_new (SwfdecAsObject *object, const guint8 *startpc, guint n_bytes)
+{
+  SwfdecAsContext *context;
+  SwfdecAsFrame *frame;
+  SwfdecAsScope *scope;
+  SwfdecAsWith *with;
+
+  g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL);
+
+  context = object->context;
+  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsWith)))
+    return NULL;
+  with = g_object_new (SWFDEC_TYPE_AS_WITH, NULL);
+  swfdec_as_object_add (SWFDEC_AS_OBJECT (with), context, sizeof (SwfdecAsWith));
+  scope = SWFDEC_AS_SCOPE (with);
+  frame = context->frame;
+  with->object = object;
+  scope->startpc = startpc;
+  scope->endpc = startpc + n_bytes;
+  scope->next = frame->scope;
+  frame->scope = scope;
+
+  return scope;
+}
+
diff --git a/libswfdec/swfdec_as_with.h b/libswfdec/swfdec_as_with.h
new file mode 100644
index 0000000..1d24d07
--- /dev/null
+++ b/libswfdec/swfdec_as_with.h
@@ -0,0 +1,56 @@
+/* Swfdec
+ * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+#ifndef _SWFDEC_AS_WITH_H_
+#define _SWFDEC_AS_WITH_H_
+
+#include <libswfdec/swfdec_as_scope.h>
+#include <libswfdec/swfdec_as_types.h>
+
+G_BEGIN_DECLS
+
+typedef struct _SwfdecAsWith SwfdecAsWith;
+typedef struct _SwfdecAsWithClass SwfdecAsWithClass;
+
+#define SWFDEC_TYPE_AS_WITH                    (swfdec_as_with_get_type())
+#define SWFDEC_IS_AS_WITH(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_AS_WITH))
+#define SWFDEC_IS_AS_WITH_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_AS_WITH))
+#define SWFDEC_AS_WITH(obj)                    (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_AS_WITH, SwfdecAsWith))
+#define SWFDEC_AS_WITH_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_AS_WITH, SwfdecAsWithClass))
+#define SWFDEC_AS_WITH_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_AS_WITH, SwfdecAsWithClass))
+
+struct _SwfdecAsWith {
+  SwfdecAsScope		scope;
+
+  /*< private >*/
+  SwfdecAsObject *	object;		/* the object of this With context */
+};
+
+struct _SwfdecAsWithClass {
+  SwfdecAsScopeClass	scope_class;
+};
+
+GType		swfdec_as_with_get_type	(void);
+
+SwfdecAsScope *	swfdec_as_with_new	(SwfdecAsObject *	object,
+					 const guint8 *		startpc,
+					 guint			n_bytes);
+
+G_END_DECLS
+#endif
diff-tree 2351e7d7d1dd6269ead9447fe49de3163e174de2 (from 5edf0a4e83374e21222b949a4aed0b0d3b8f0e2a)
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jun 5 13:53:49 2007 +0200

    fix debugger bits for removal of SwfdecRootMovie.player

diff --git a/player/swfdec_debug_movies.c b/player/swfdec_debug_movies.c
index 14e4281..30d758a 100644
--- a/player/swfdec_debug_movies.c
+++ b/player/swfdec_debug_movies.c
@@ -126,7 +126,7 @@ swfdec_debug_movies_movie_to_path (Swfde
     path = swfdec_debug_movies_movie_to_path (movie->parent);
     gtk_tree_path_append_index (path, i);
   } else {
-    i = my_g_list_is_nth (SWFDEC_ROOT_MOVIE (movie)->player->roots, movie);
+    i = my_g_list_is_nth (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context)->roots, movie);
     g_assert (i >= 0);
     path = gtk_tree_path_new ();
     gtk_tree_path_append_index (path, i);
@@ -182,7 +182,7 @@ swfdec_debug_movies_iter_next (GtkTreeMo
   if (movie->parent) {
     list = movie->parent->list;
   } else {
-    list = SWFDEC_ROOT_MOVIE (movie)->player->roots;
+    list = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context)->roots;
   }
   list = g_list_find (list, movie);
   g_assert (list);
diff-tree 5edf0a4e83374e21222b949a4aed0b0d3b8f0e2a (from parents)
Merge: 73d835f1e18e1043402e5edf60f35bfc0fb94066 e59e5f97c9e7b48205a7c557b9107b8a5d04a8a4
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Jun 5 13:42:22 2007 +0200

    Merge branch 'as' of ssh://company@git.freedesktop.org/git/swfdec into as

diff-tree 73d835f1e18e1043402e5edf60f35bfc0fb94066 (from ed331b00d990804d0ed7e8e008370eea4b76cccf)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Jun 4 21:37:27 2007 +0200

    remove SwfdecRootMovie.player - it has been replaced by SwfdecAsObject.context

diff --git a/libswfdec/swfdec_button_movie.c b/libswfdec/swfdec_button_movie.c
index a16a4f9..97824a0 100644
--- a/libswfdec/swfdec_button_movie.c
+++ b/libswfdec/swfdec_button_movie.c
@@ -182,7 +182,7 @@ swfdec_button_movie_change_mouse (Swfdec
     SwfdecAudio *audio;
     SWFDEC_LOG ("playing button sound %d", sound);
     audio = swfdec_audio_event_new (
-	SWFDEC_ROOT_MOVIE (SWFDEC_MOVIE (movie)->root)->player,
+	SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context),
 	movie->button->sounds[sound]);
     if (audio)
       g_object_unref (audio);
diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c
index a173c3c..6051b01 100644
--- a/libswfdec/swfdec_movie.c
+++ b/libswfdec/swfdec_movie.c
@@ -78,7 +78,7 @@ swfdec_movie_invalidate (SwfdecMovie *mo
       return;
     swfdec_rect_transform (&rect, &rect, &movie->matrix);
   }
-  swfdec_player_invalidate (SWFDEC_ROOT_MOVIE (movie)->player, &rect);
+  swfdec_player_invalidate (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context), &rect);
 }
 
 /**
@@ -271,8 +271,11 @@ swfdec_movie_find (SwfdecMovie *movie, i
 static gboolean
 swfdec_movie_do_remove (SwfdecMovie *movie)
 {
+  SwfdecPlayer *player;
+
   SWFDEC_LOG ("removing %s %s", G_OBJECT_TYPE_NAME (movie), movie->name);
 
+  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
   movie->will_be_removed = TRUE;
   while (movie->list) {
     GList *walk = movie->list;
@@ -283,10 +286,10 @@ swfdec_movie_do_remove (SwfdecMovie *mov
     swfdec_movie_remove (walk->data);
   }
   /* FIXME: all of this here or in destroy callback? */
-  if (SWFDEC_ROOT_MOVIE (movie->root)->player->mouse_grab == movie)
-    SWFDEC_ROOT_MOVIE (movie->root)->player->mouse_grab = NULL;
-  if (SWFDEC_ROOT_MOVIE (movie->root)->player->mouse_drag == movie)
-    SWFDEC_ROOT_MOVIE (movie->root)->player->mouse_drag = NULL;
+  if (player->mouse_grab == movie)
+    player->mouse_grab = NULL;
+  if (player->mouse_drag == movie)
+    player->mouse_drag = NULL;
   swfdec_movie_invalidate (movie);
   movie->depth = -16385 - movie->depth; /* don't ask me why... */
   if (movie->parent)
@@ -330,7 +333,7 @@ void
 swfdec_movie_destroy (SwfdecMovie *movie)
 {
   SwfdecMovieClass *klass = SWFDEC_MOVIE_GET_CLASS (movie);
-  SwfdecPlayer *player = SWFDEC_ROOT_MOVIE (movie->root)->player;
+  SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
 
   g_assert (movie->state < SWFDEC_MOVIE_STATE_DESTROYED);
   if (movie->state < SWFDEC_MOVIE_STATE_REMOVED) {
@@ -341,14 +344,12 @@ swfdec_movie_destroy (SwfdecMovie *movie
     swfdec_movie_destroy (movie->list->data);
   }
   if (movie->parent) {
-    SwfdecPlayer *player = SWFDEC_ROOT_MOVIE (movie->root)->player;
     if (SWFDEC_IS_DEBUGGER (player) &&
 	g_list_find (movie->parent->list, movie)) {
       g_signal_emit_by_name (player, "movie-removed", movie);
     }
     movie->parent->list = g_list_remove (movie->parent->list, movie);
   } else {
-    SwfdecPlayer *player = SWFDEC_ROOT_MOVIE (movie)->player;
     if (SWFDEC_IS_DEBUGGER (player) &&
 	g_list_find (player->roots, movie)) {
       g_signal_emit_by_name (player, "movie-removed", movie);
@@ -380,7 +381,7 @@ swfdec_movie_run_init (SwfdecMovie *movi
 
   g_return_if_fail (SWFDEC_IS_MOVIE (movie));
 
-  player = SWFDEC_ROOT_MOVIE (movie->root)->player;
+  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
   g_queue_remove (player->init_queue, movie);
   swfdec_movie_execute_script (movie, SWFDEC_EVENT_INITIALIZE);
 }
@@ -400,7 +401,7 @@ swfdec_movie_run_construct (SwfdecMovie 
 
   g_return_if_fail (SWFDEC_IS_MOVIE (movie));
 
-  player = SWFDEC_ROOT_MOVIE (movie->root)->player;
+  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
   g_queue_remove (player->construct_queue, movie);
   swfdec_movie_execute_script (movie, SWFDEC_EVENT_CONSTRUCT);
   swfdec_as_object_call (SWFDEC_AS_OBJECT (movie), SWFDEC_AS_STR_constructor, 0, NULL, NULL);
@@ -457,7 +458,7 @@ swfdec_movie_queue_script (SwfdecMovie *
       return FALSE;
   }
 
-  player = SWFDEC_ROOT_MOVIE (movie->root)->player;
+  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
   swfdec_player_add_action (player, movie, swfdec_movie_do_execute_script, 
       GUINT_TO_POINTER (condition));
   return TRUE;
@@ -557,7 +558,7 @@ swfdec_movie_get_mouse (SwfdecMovie *mov
   g_return_if_fail (x != NULL);
   g_return_if_fail (y != NULL);
 
-  player = SWFDEC_ROOT_MOVIE (movie->root)->player;
+  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
   *x = player->mouse_x;
   *y = player->mouse_y;
   swfdec_movie_global_to_local (movie, x, y);
@@ -577,7 +578,7 @@ swfdec_movie_send_mouse_change (SwfdecMo
     button = 0;
   } else {
     mouse_in = swfdec_movie_mouse_in (movie, x, y);
-    button = SWFDEC_ROOT_MOVIE (movie->root)->player->mouse_button;
+    button = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context)->mouse_button;
   }
   klass = SWFDEC_MOVIE_GET_CLASS (movie);
   g_assert (klass->mouse_change != NULL);
@@ -840,7 +841,7 @@ static void
 swfdec_movie_set_parent (SwfdecMovie *movie)
 {
   SwfdecMovie *parent = movie->parent;
-  SwfdecPlayer *player = SWFDEC_ROOT_MOVIE (movie->root)->player;
+  SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
   SwfdecMovieClass *klass;
 
   g_return_if_fail (SWFDEC_IS_MOVIE (movie));
@@ -936,7 +937,6 @@ swfdec_movie_new_for_player (SwfdecPlaye
   content->name = g_strdup_printf ("_level%u", depth);
   ret = g_object_new (SWFDEC_TYPE_ROOT_MOVIE, NULL);
   g_object_weak_ref (G_OBJECT (ret), (GWeakNotify) swfdec_content_free, content);
-  SWFDEC_ROOT_MOVIE (ret)->player = player;
   ret->root = ret;
   if (swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), sizeof (SwfdecRootMovie))) {
     g_object_ref (ret);
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index 54a2707..288e9ef 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -968,7 +968,6 @@ swfdec_player_add_level_from_loader (Swf
   swfdec_player_remove_level (player, depth);
   movie = swfdec_movie_new_for_player (player, depth);
   root = SWFDEC_ROOT_MOVIE (movie);
-  root->player = player;
   root->loader = loader;
   if (variables)
     swfdec_movie_set_variables (movie, variables);
diff --git a/libswfdec/swfdec_root_movie.c b/libswfdec/swfdec_root_movie.c
index 8b22055..1fcba46 100644
--- a/libswfdec/swfdec_root_movie.c
+++ b/libswfdec/swfdec_root_movie.c
@@ -47,7 +47,7 @@ G_DEFINE_TYPE_WITH_CODE (SwfdecRootMovie
 static SwfdecPlayer *
 swfdec_root_movie_loader_target_get_player (SwfdecLoaderTarget *target)
 {
-  return SWFDEC_ROOT_MOVIE (target)->player;
+  return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (target)->context);
 }
 
 static SwfdecDecoder *
@@ -148,7 +148,7 @@ swfdec_root_movie_iterate_end (SwfdecMov
   if (!SWFDEC_MOVIE_CLASS (swfdec_root_movie_parent_class)->iterate_end (movie))
     return FALSE;
 
-  return g_list_find (SWFDEC_ROOT_MOVIE (movie)->player->roots, movie) != NULL;
+  return g_list_find (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context)->roots, movie) != NULL;
 }
 
 static void
@@ -173,10 +173,13 @@ swfdec_root_movie_init (SwfdecRootMovie 
 void
 swfdec_root_movie_load (SwfdecRootMovie *root, const char *url, const char *target)
 {
+  SwfdecPlayer *player;
+
   g_return_if_fail (SWFDEC_IS_ROOT_MOVIE (root));
   g_return_if_fail (url != NULL);
   g_return_if_fail (target != NULL);
 
+  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (root)->context);
   /* yay for the multiple uses of GetURL - one of the crappier Flash things */
   if (g_str_has_prefix (target, "_level")) {
     const char *nr = target + strlen ("_level");
@@ -187,11 +190,11 @@ swfdec_root_movie_load (SwfdecRootMovie 
     depth = strtoul (nr, &end, 10);
     if (errno == 0 && *end == '\0') {
       if (url[0] == '\0') {
-	swfdec_player_remove_level (root->player, depth);
+	swfdec_player_remove_level (player, depth);
       } else {
 	SwfdecLoader *loader = swfdec_loader_load (root->loader, url);
 	if (loader) {
-	  swfdec_player_add_level_from_loader (root->player, depth, loader, NULL);
+	  swfdec_player_add_level_from_loader (player, depth, loader, NULL);
 	  swfdec_loader_queue_parse (loader);
 	} else {
 	  SWFDEC_WARNING ("didn't get a loader for url \"%s\" at depth %u", url, depth);
@@ -207,7 +210,7 @@ swfdec_root_movie_load (SwfdecRootMovie 
     SWFDEC_WARNING ("unhandled fscommand: %s %s", command, target);
     return;
   }
-  swfdec_player_launch (root->player, url, target);
+  swfdec_player_launch (player, url, target);
 }
 
 void
diff --git a/libswfdec/swfdec_root_movie.h b/libswfdec/swfdec_root_movie.h
index 408a40b..378cfec 100644
--- a/libswfdec/swfdec_root_movie.h
+++ b/libswfdec/swfdec_root_movie.h
@@ -38,7 +38,6 @@ struct _SwfdecRootMovie
 {
   SwfdecSpriteMovie	sprite_movie;
 
-  SwfdecPlayer *	player;		/* player we're played in */
   SwfdecLoader *	loader;		/* the loader providing data for the decoder */
   SwfdecDecoder *	decoder;	/* decoder that decoded all the stuff used by us */
   guint			unnamed_count;	/* variable used for naming unnamed movies */
diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c
index 3e25eb9..c0d0647 100644
--- a/libswfdec/swfdec_sprite_movie.c
+++ b/libswfdec/swfdec_sprite_movie.c
@@ -74,7 +74,7 @@ swfdec_sprite_movie_perform_one_action (
     gboolean skip_scripts, GList **movie_list)
 {
   SwfdecMovie *mov = SWFDEC_MOVIE (movie);
-  SwfdecPlayer *player = SWFDEC_ROOT_MOVIE (mov->root)->player;
+  SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (mov)->context);
   SwfdecMovie *child;
   SwfdecContent *content;
 
@@ -176,7 +176,7 @@ swfdec_sprite_movie_goto (SwfdecMovie *m
   if (goto_frame == movie->current_frame)
     return;
 
-  player = SWFDEC_ROOT_MOVIE (mov->root)->player;
+  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (mov)->context);
   SWFDEC_LOG ("doing goto %u for %p %d", goto_frame, mov, 
       SWFDEC_CHARACTER (SWFDEC_SPRITE_MOVIE (mov)->sprite)->id);
   mov->frame = goto_frame;
@@ -248,7 +248,7 @@ swfdec_sprite_movie_iterate_end (SwfdecM
   SwfdecSpriteFrame *last;
   SwfdecSpriteFrame *current;
   GSList *walk;
-  SwfdecPlayer *player = SWFDEC_ROOT_MOVIE (SWFDEC_MOVIE (movie)->root)->player;
+  SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (mov)->context);
 
   current = &movie->sprite->frames[movie->current_frame];
   if (!SWFDEC_MOVIE_CLASS (swfdec_sprite_movie_parent_class)->iterate_end (mov)) {
@@ -323,7 +323,7 @@ static void
 swfdec_sprite_movie_finish_movie (SwfdecMovie *mov)
 {
   SwfdecSpriteMovie *movie = SWFDEC_SPRITE_MOVIE (mov);
-  SwfdecPlayer *player = SWFDEC_ROOT_MOVIE (mov->root)->player;
+  SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (mov)->context);
 
   swfdec_player_remove_all_actions (player, mov);
   if (movie->sound_stream) {
diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c
index 0049ec6..fa48596 100644
--- a/libswfdec/swfdec_sprite_movie_as.c
+++ b/libswfdec/swfdec_sprite_movie_as.c
@@ -201,6 +201,7 @@ static void
 swfdec_sprite_movie_startDrag (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval)
 {
   SwfdecMovie *movie = SWFDEC_MOVIE (obj);
+  SwfdecPlayer *player = SWFDEC_PLAYER (obj->context);
   gboolean center = FALSE;
 
   if (argc > 0) {
@@ -213,11 +214,9 @@ swfdec_sprite_movie_startDrag (SwfdecAsO
     rect.x1 = swfdec_as_value_to_number (obj->context, &argv[3]);
     rect.y1 = swfdec_as_value_to_number (obj->context, &argv[4]);
     swfdec_rect_scale (&rect, &rect, SWFDEC_TWIPS_SCALE_FACTOR);
-    swfdec_player_set_drag_movie (SWFDEC_ROOT_MOVIE (movie->root)->player, movie,
-	center, &rect);
+    swfdec_player_set_drag_movie (player, movie, center, &rect);
   } else {
-    swfdec_player_set_drag_movie (SWFDEC_ROOT_MOVIE (movie->root)->player, movie,
-	center, NULL);
+    swfdec_player_set_drag_movie (player, movie, center, NULL);
   }
 }
 
@@ -268,7 +267,7 @@ swfdec_sprite_movie_init_from_object (Sw
 {
   SwfdecPlayer *player;
 
-  player = SWFDEC_ROOT_MOVIE (movie->root)->player;
+  player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context);
   g_queue_remove (player->init_queue, movie);
 }
 
diff-tree ed331b00d990804d0ed7e8e008370eea4b76cccf (from 2abb607a68429fb202f76674e82a0b4b9f758a72)
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Jun 4 21:17:16 2007 +0200

    that variable is unused

diff --git a/libswfdec/swfdec_root_movie.h b/libswfdec/swfdec_root_movie.h
index 67c785e..408a40b 100644
--- a/libswfdec/swfdec_root_movie.h
+++ b/libswfdec/swfdec_root_movie.h
@@ -38,7 +38,6 @@ struct _SwfdecRootMovie
 {
   SwfdecSpriteMovie	sprite_movie;
 
-  gboolean		error;		/* we're in error */
   SwfdecPlayer *	player;		/* player we're played in */
   SwfdecLoader *	loader;		/* the loader providing data for the decoder */
   SwfdecDecoder *	decoder;	/* decoder that decoded all the stuff used by us */
diff-tree 2abb607a68429fb202f76674e82a0b4b9f758a72 (from 1a442e379efc06ab078924f0d824b94aae01b34a)
Author: Nguyen Thai Ngoc Duy <pclouds at gmail.com>
Date:   Mon Jun 4 10:11:34 2007 +0200

    Fix wrong check

diff --git a/libswfdec/swfdec_mouse_as.c b/libswfdec/swfdec_mouse_as.c
index d4d53d9..ef36dc7 100644
--- a/libswfdec/swfdec_mouse_as.c
+++ b/libswfdec/swfdec_mouse_as.c
@@ -31,7 +31,7 @@ swfdec_mouse_addListener (SwfdecAsObject
 {
   SwfdecPlayer *player = SWFDEC_PLAYER (object->context);
 
-  if (!SWFDEC_IS_AS_OBJECT (&argv[0]))
+  if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[0]))
     return;
   swfdec_listener_add (player->mouse_listener, SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]));
 }
@@ -41,7 +41,7 @@ swfdec_mouse_removeListener (SwfdecAsObj
 {
   SwfdecPlayer *player = SWFDEC_PLAYER (object->context);
 
-  if (!SWFDEC_IS_AS_OBJECT (&argv[0]))
+  if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[0]))
     return;
   swfdec_listener_remove (player->mouse_listener, SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]));
 }
diff-tree 1a442e379efc06ab078924f0d824b94aae01b34a (from 89c4d90d1c31e4bba4b15f8419f7ebd13cd6cbb8)
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jun 2 19:10:50 2007 +0200

    Number.prototype is an object, not a number

diff --git a/libswfdec/swfdec_as_number.c b/libswfdec/swfdec_as_number.c
index 8d5e3b3..edeb3c3 100644
--- a/libswfdec/swfdec_as_number.c
+++ b/libswfdec/swfdec_as_number.c
@@ -119,15 +119,10 @@ swfdec_as_number_init_context (SwfdecAsC
   context->Number = number;
   swfdec_as_native_function_set_object_type (SWFDEC_AS_NATIVE_FUNCTION (number), 
       SWFDEC_TYPE_AS_NUMBER);
-  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecAsNumber)))
-    return;
-  proto = g_object_new (SWFDEC_TYPE_AS_NUMBER, NULL);
-  swfdec_as_object_add (proto, context, sizeof (SwfdecAsNumber));
+  proto = swfdec_as_object_new (context);
   /* set the right properties on the Number object */
-  swfdec_as_object_root (proto);
   SWFDEC_AS_VALUE_SET_OBJECT (&val, proto);
   swfdec_as_object_set_variable (number, SWFDEC_AS_STR_prototype, &val);
-  swfdec_as_object_unroot (proto);
   SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Function);
   swfdec_as_object_set_variable (number, SWFDEC_AS_STR_constructor, &val);
   SWFDEC_AS_VALUE_SET_NUMBER (&val, NAN);


More information about the Swfdec mailing list