Benjamin Otte
2007-Jul-12 09:09 UTC
[Swfdec] Branch 'as' - 7 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_with.c libswfdec/swfdec_sprite_movie.c test/trace
libswfdec/swfdec_as_array.c | 8 ++++++-- libswfdec/swfdec_as_frame.c | 5 ++++- libswfdec/swfdec_as_interpret.c | 13 +++++++++---- libswfdec/swfdec_as_object.c | 24 ++++++++++++++++++++++++ libswfdec/swfdec_as_object.h | 4 ++++ libswfdec/swfdec_as_with.c | 9 +++++++++ libswfdec/swfdec_sprite_movie.c | 9 +++++++-- test/trace/Makefile.am | 18 ++++++++++++++++++ test/trace/this-localfunction-5.swf |binary test/trace/this-localfunction-5.swf.trace | 5 +++++ test/trace/this-localfunction-6.swf |binary test/trace/this-localfunction-6.swf.trace | 5 +++++ test/trace/this-localfunction-7.swf |binary test/trace/this-localfunction-7.swf.trace | 5 +++++ test/trace/this-localfunction-8.swf |binary test/trace/this-localfunction-8.swf.trace | 5 +++++ test/trace/this-localfunction.as | 20 ++++++++++++++++++++ test/trace/with-outobject-5.swf |binary test/trace/with-outobject-5.swf.trace | 4 ++++ test/trace/with-outobject-6.swf |binary test/trace/with-outobject-6.swf.trace | 4 ++++ test/trace/with-outobject-7.swf |binary test/trace/with-outobject-7.swf.trace | 4 ++++ test/trace/with-outobject-8.swf |binary test/trace/with-outobject-8.swf.trace | 4 ++++ test/trace/with-outobject.as | 17 +++++++++++++++++ 26 files changed, 154 insertions(+), 9 deletions(-) New commits: diff-tree d5f8ba68c26452741aba41ffc48e697e0aafe4b4 (from 853b7f4ee7c52323772f2c5482d36ceadf031c6c) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 11:09:36 2007 +0200 add a test for With without an object diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index 9511070..f15f8e7 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -889,6 +889,15 @@ EXTRA_DIST = \ with-function-delete-6.swf.trace \ with-function-delete-7.swf \ with-function-delete-7.swf.trace \ + with-outobject.as \ + with-outobject-5.swf \ + with-outobject-5.swf.trace \ + with-outobject-6.swf \ + with-outobject-6.swf.trace \ + with-outobject-7.swf \ + with-outobject-7.swf.trace \ + with-outobject-8.swf \ + with-outobject-8.swf.trace \ with-prototypes.as \ with-prototypes-5.swf \ with-prototypes-5.swf.trace \ diff --git a/test/trace/with-outobject-5.swf b/test/trace/with-outobject-5.swf new file mode 100644 index 0000000..0d8e4e0 Binary files /dev/null and b/test/trace/with-outobject-5.swf differ diff --git a/test/trace/with-outobject-5.swf.trace b/test/trace/with-outobject-5.swf.trace new file mode 100644 index 0000000..f37a654 --- /dev/null +++ b/test/trace/with-outobject-5.swf.trace @@ -0,0 +1,4 @@ +Check how with behaves when called on non-object values +1 +... +done diff --git a/test/trace/with-outobject-6.swf b/test/trace/with-outobject-6.swf new file mode 100644 index 0000000..8c31f85 Binary files /dev/null and b/test/trace/with-outobject-6.swf differ diff --git a/test/trace/with-outobject-6.swf.trace b/test/trace/with-outobject-6.swf.trace new file mode 100644 index 0000000..f37a654 --- /dev/null +++ b/test/trace/with-outobject-6.swf.trace @@ -0,0 +1,4 @@ +Check how with behaves when called on non-object values +1 +... +done diff --git a/test/trace/with-outobject-7.swf b/test/trace/with-outobject-7.swf new file mode 100644 index 0000000..a47abb9 Binary files /dev/null and b/test/trace/with-outobject-7.swf differ diff --git a/test/trace/with-outobject-7.swf.trace b/test/trace/with-outobject-7.swf.trace new file mode 100644 index 0000000..f37a654 --- /dev/null +++ b/test/trace/with-outobject-7.swf.trace @@ -0,0 +1,4 @@ +Check how with behaves when called on non-object values +1 +... +done diff --git a/test/trace/with-outobject-8.swf b/test/trace/with-outobject-8.swf new file mode 100644 index 0000000..6ec7bc4 Binary files /dev/null and b/test/trace/with-outobject-8.swf differ diff --git a/test/trace/with-outobject-8.swf.trace b/test/trace/with-outobject-8.swf.trace new file mode 100644 index 0000000..f37a654 --- /dev/null +++ b/test/trace/with-outobject-8.swf.trace @@ -0,0 +1,4 @@ +Check how with behaves when called on non-object values +1 +... +done diff --git a/test/trace/with-outobject.as b/test/trace/with-outobject.as new file mode 100644 index 0000000..2657ac5 --- /dev/null +++ b/test/trace/with-outobject.as @@ -0,0 +1,17 @@ +// makeswf -v 7 -s 200x150 -r 1 -o movie2.swf movie2.as + +trace ("Check how with behaves when called on non-object values"); + +with ("hi") { + trace (indexOf ("i")); +}; +with (undefined) { + trace ("undefined"); +}; +trace ("..."); +with (null) { + trace ("null"); +}; +trace ("done"); + +loadMovie ("FSCommand:quit", ""); diff-tree 853b7f4ee7c52323772f2c5482d36ceadf031c6c (from fda2b0f04240de18304ad775d5ccea02a9f6437e) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 11:07:24 2007 +0200 With sections are skipped if the With doesn't reference an object diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 0c65e72..ae14f4f 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -2039,19 +2039,21 @@ static void swfdec_action_with (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { SwfdecAsObject *object; + guint offset; if (len != 2) { SWFDEC_ERROR ("With action requires a length of 2, but got %u", len); swfdec_as_stack_pop (cx); return; } + offset = data[0] | (data[1] << 8); object = swfdec_as_value_to_object (cx, swfdec_as_stack_peek (cx, 1)); if (object == NULL) { - SWFDEC_ERROR ("With called without an object"); - swfdec_as_stack_pop (cx); - return; + SWFDEC_INFO ("With called without an object, skipping"); + cx->frame->pc = (guint8 *) data + len + offset; + } else { + swfdec_as_with_new (object, data + len, offset); } - swfdec_as_with_new (object, data + len, GUINT16_FROM_LE (*(guint16 *) data)); swfdec_as_stack_pop (cx); } diff-tree fda2b0f04240de18304ad775d5ccea02a9f6437e (from f8b5b8a5f845885ed761592f5599ed331fbc9af0) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 11:03:15 2007 +0200 Check that local functions get passed the Frame as this object diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index c2fc231..9511070 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -820,6 +820,15 @@ EXTRA_DIST = \ targetpath-6.swf.trace \ targetpath-7.swf \ targetpath-7.swf.trace \ + this-localfunction.as \ + this-localfunction-5.swf \ + this-localfunction-5.swf.trace \ + this-localfunction-6.swf \ + this-localfunction-6.swf.trace \ + this-localfunction-7.swf \ + this-localfunction-7.swf.trace \ + this-localfunction-8.swf \ + this-localfunction-8.swf.trace \ tointeger-numbers.as \ tointeger-numbers-5.swf \ tointeger-numbers-5.swf.trace \ diff --git a/test/trace/this-localfunction-5.swf b/test/trace/this-localfunction-5.swf new file mode 100644 index 0000000..886a34f Binary files /dev/null and b/test/trace/this-localfunction-5.swf differ diff --git a/test/trace/this-localfunction-5.swf.trace b/test/trace/this-localfunction-5.swf.trace new file mode 100644 index 0000000..955adad --- /dev/null +++ b/test/trace/this-localfunction-5.swf.trace @@ -0,0 +1,5 @@ +Check the this object of local functions +[type Object] +3 +[type Object] +3 diff --git a/test/trace/this-localfunction-6.swf b/test/trace/this-localfunction-6.swf new file mode 100644 index 0000000..68e9872 Binary files /dev/null and b/test/trace/this-localfunction-6.swf differ diff --git a/test/trace/this-localfunction-6.swf.trace b/test/trace/this-localfunction-6.swf.trace new file mode 100644 index 0000000..955adad --- /dev/null +++ b/test/trace/this-localfunction-6.swf.trace @@ -0,0 +1,5 @@ +Check the this object of local functions +[type Object] +3 +[type Object] +3 diff --git a/test/trace/this-localfunction-7.swf b/test/trace/this-localfunction-7.swf new file mode 100644 index 0000000..f4e99eb Binary files /dev/null and b/test/trace/this-localfunction-7.swf differ diff --git a/test/trace/this-localfunction-7.swf.trace b/test/trace/this-localfunction-7.swf.trace new file mode 100644 index 0000000..955adad --- /dev/null +++ b/test/trace/this-localfunction-7.swf.trace @@ -0,0 +1,5 @@ +Check the this object of local functions +[type Object] +3 +[type Object] +3 diff --git a/test/trace/this-localfunction-8.swf b/test/trace/this-localfunction-8.swf new file mode 100644 index 0000000..c55475b Binary files /dev/null and b/test/trace/this-localfunction-8.swf differ diff --git a/test/trace/this-localfunction-8.swf.trace b/test/trace/this-localfunction-8.swf.trace new file mode 100644 index 0000000..955adad --- /dev/null +++ b/test/trace/this-localfunction-8.swf.trace @@ -0,0 +1,5 @@ +Check the this object of local functions +[type Object] +3 +[type Object] +3 diff --git a/test/trace/this-localfunction.as b/test/trace/this-localfunction.as new file mode 100644 index 0000000..d09652f --- /dev/null +++ b/test/trace/this-localfunction.as @@ -0,0 +1,20 @@ +// makeswf -v 7 -s 200x150 -r 1 -o this-localfunction.swf this-localfunction.as + +trace ("Check the this object of local functions"); + +function test () { + o = { x: 2 }; + var x = 3; + var bla = function () { + trace (this); + trace (this.x); + }; + bla (); + with (o) { + bla (); + } +}; +x = 1; +test (); + +loadMovie ("FSCommand:quit", ""); diff-tree f8b5b8a5f845885ed761592f5599ed331fbc9af0 (from 786973ef96469eef042e077378889e1303453930) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 11:02:05 2007 +0200 add swfdec_as_object_resolve() This is only used with the With object for now. I get the suspicion that With is handled differently in Flash. A lot of code could be removed by handling it different. I'd just find a nice way of getting the with stack into functions defined inside it. diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 6115cb5..5990d69 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -264,8 +264,11 @@ swfdec_as_frame_set_this (SwfdecAsFrame * Finds the given variable in the current scope chain. Returns the first * object in the scope chain that contains this variable in its prototype * chain. If you want to know the explicit object that contains the variable, - * you have to call swfdec_as_object_find_variable() on the result. + * you have to call swfdec_as_object_get_variable_and_flags() on the result. * If no such variable exist in the scope chain, %NULL is returned. + * <note>The returned object might be an internal object. You probably do not + * want to expose it to scripts. Call swfdec_as_object_resolve () on the + * returned value to be sure of not having an internal object.</note> * * Returns: the object that contains @variable or %NULL if none. **/ diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 3f88deb..0c65e72 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -611,8 +611,9 @@ swfdec_action_call_function (SwfdecAsCon fun = swfdec_as_stack_peek (cx, 1); obj = swfdec_as_frame_find_variable (frame, name); if (obj) { - SWFDEC_AS_VALUE_SET_OBJECT (thisp, obj); swfdec_as_object_get_variable (obj, name, fun); + obj = swfdec_as_object_resolve (obj); + SWFDEC_AS_VALUE_SET_OBJECT (thisp, obj); } else { SWFDEC_AS_VALUE_SET_NULL (thisp); SWFDEC_AS_VALUE_SET_UNDEFINED (fun); diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index a18a4bc..3f81101 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -806,3 +806,27 @@ swfdec_as_object_get_debug (SwfdecAsObje return klass->debug (object); } +/** + * swfdec_as_object_resolve: + * @object: a #SwfdecAsObject + * + * Resolves the object to its real object. Some internal objects should not be + * exposed to scripts, for example #SwfdecAsFrame objects. If an object you want + * to expose might be internal, call this function to resolve it to an object + * that is safe to expose. + * + * Returns: a non-internal object + **/ +SwfdecAsObject * +swfdec_as_object_resolve (SwfdecAsObject *object) +{ + SwfdecAsObjectClass *klass; + + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL); + + klass = SWFDEC_AS_OBJECT_GET_CLASS (object); + if (klass->resolve == NULL) + return object; + + return klass->resolve (object); +} diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h index 2c5c1c3..ef818fb 100644 --- a/libswfdec/swfdec_as_object.h +++ b/libswfdec/swfdec_as_object.h @@ -90,6 +90,9 @@ struct _SwfdecAsObjectClass { gboolean (* foreach) (SwfdecAsObject * object, SwfdecAsVariableForeach func, gpointer data); + /* get the real object referenced by this object (useful for internal objects) */ + SwfdecAsObject * (* resolve) (SwfdecAsObject * object); + /* get a debug string representation for this object */ char * (* debug) (SwfdecAsObject * object); }; @@ -104,6 +107,7 @@ void swfdec_as_object_create (SwfdecAs void swfdec_as_object_set_constructor(SwfdecAsObject * object, SwfdecAsObject * construct, gboolean scripted); +SwfdecAsObject *swfdec_as_object_resolve (SwfdecAsObject * object); char * swfdec_as_object_get_debug (SwfdecAsObject * object); void swfdec_as_object_add (SwfdecAsObject * object, diff --git a/libswfdec/swfdec_as_with.c b/libswfdec/swfdec_as_with.c index 9ef6c2e..9fe0720 100644 --- a/libswfdec/swfdec_as_with.c +++ b/libswfdec/swfdec_as_with.c @@ -38,6 +38,14 @@ swfdec_as_with_mark (SwfdecAsObject *obj SWFDEC_AS_OBJECT_CLASS (swfdec_as_with_parent_class)->mark (object); } +static SwfdecAsObject * +swfdec_as_with_resolve (SwfdecAsObject *object) +{ + SwfdecAsWith *with = SWFDEC_AS_WITH (object); + + return with->object; +} + static gboolean swfdec_as_with_get (SwfdecAsObject *object, const char *variable, SwfdecAsValue *val, guint *flags) @@ -96,6 +104,7 @@ swfdec_as_with_class_init (SwfdecAsWithC asobject_class->set_flags = swfdec_as_with_set_flags; asobject_class->delete = swfdec_as_with_delete; asobject_class->foreach = swfdec_as_with_foreach; + asobject_class->resolve = swfdec_as_with_resolve; } static void diff-tree 786973ef96469eef042e077378889e1303453930 (from b26104d4c260fa0f05c08e79f6ab9ffb5671d0c8) Author: Benjamin Otte <otte at gnome.org> Date: Wed Jul 11 23:42:17 2007 +0200 pop the argument in error cases, too diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index e0777e4..3f88deb 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -2041,11 +2041,13 @@ swfdec_action_with (SwfdecAsContext *cx, if (len != 2) { SWFDEC_ERROR ("With action requires a length of 2, but got %u", len); + swfdec_as_stack_pop (cx); return; } object = swfdec_as_value_to_object (cx, swfdec_as_stack_peek (cx, 1)); if (object == NULL) { SWFDEC_ERROR ("With called without an object"); + swfdec_as_stack_pop (cx); return; } swfdec_as_with_new (object, data + len, GUINT16_FROM_LE (*(guint16 *) data)); diff-tree b26104d4c260fa0f05c08e79f6ab9ffb5671d0c8 (from 8e786dcd1797b334f791775772531c14d5c4cecb) Author: Benjamin Otte <otte at gnome.org> Date: Wed Jul 11 21:45:33 2007 +0200 fix memleak diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index e2c535b..8bac537 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -299,7 +299,7 @@ swfdec_sprite_movie_perform_place (Swfde if (move) { if (cur == NULL) { SWFDEC_INFO ("no movie at depth %d, ignoring move command", depth); - return TRUE; + goto out; } if (graphic) { SwfdecMovieClass *klass = SWFDEC_MOVIE_GET_CLASS (cur); @@ -311,10 +311,12 @@ swfdec_sprite_movie_perform_place (Swfde } else { if (cur != NULL && version > 5) { SWFDEC_INFO ("depth %d is already occupied by movie %s, not placing", depth, cur->name); - return TRUE; + goto out; } if (!SWFDEC_IS_GRAPHIC (graphic)) { SWFDEC_FIXME ("character %u is not a graphic (does it even exist?), aborting", id); + if (events) + swfdec_event_list_free (events); return FALSE; } cur = swfdec_movie_new (player, depth, mov, graphic, name); @@ -328,6 +330,9 @@ swfdec_sprite_movie_perform_place (Swfde swfdec_movie_initialize (cur); } +out: + if (events) + swfdec_event_list_free (events); return TRUE; } diff-tree 8e786dcd1797b334f791775772531c14d5c4cecb (from dfcd46a62e9f98d291d4fe80187a1bed1b7a7212) Author: Benjamin Otte <otte at gnome.org> Date: Wed Jul 11 20:02:01 2007 +0200 speed up Array.join() and in turn Array.toString() by using a GString diff --git a/libswfdec/swfdec_as_array.c b/libswfdec/swfdec_as_array.c index 60a13f5..c5070c8 100644 --- a/libswfdec/swfdec_as_array.c +++ b/libswfdec/swfdec_as_array.c @@ -368,16 +368,20 @@ swfdec_as_array_join (SwfdecAsContext *c length = swfdec_as_array_get_length (object); if (length > 0) { + /* FIXME: implement this with the StringBuilder class */ + GString *string; var = swfdec_as_double_to_string (cx, 0); swfdec_as_object_get_variable (object, var, &val); str = swfdec_as_value_to_string (cx, &val); + string = g_string_new (str); for (i = 1; i < length; i++) { var = swfdec_as_double_to_string (cx, i); swfdec_as_object_get_variable (object, var, &val); var = swfdec_as_value_to_string (cx, &val); - str = swfdec_as_str_concat (cx, str, sep); - str = swfdec_as_str_concat (cx, str, var); + g_string_append (string, sep); + g_string_append (string, var); } + str = swfdec_as_context_give_string (cx, g_string_free (string, FALSE)); } else { str = SWFDEC_AS_STR_EMPTY; }
Apparently Analagous Threads
- 15 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_super.c libswfdec/swfdec_as_with.c
- 2 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_super.c libswfdec/swfdec_as_with.c libswfdec/swfdec_movie.c libswfdec/swfdec_player.c libswfdec/swfdec_sprite_movie.c
- 7 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_string.c test/trace
- Branch 'as' - 13 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h
- Branch 'as' - 7 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_super.c libswfdec/swfdec_as_super.h libswfdec/swfdec_as_with.c test/trace