Benjamin Otte
2007-Aug-15 21:16 UTC
[Swfdec] 4 commits - 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_net_stream.c libswfdec/swfdec_sprite_movie.c test/trace
libswfdec/swfdec_as_object.c | 21 +++++++++++---------- libswfdec/swfdec_as_object.h | 1 + libswfdec/swfdec_as_super.c | 4 ++-- libswfdec/swfdec_as_with.c | 7 +++++-- libswfdec/swfdec_movie.c | 6 +++--- libswfdec/swfdec_net_stream.c | 6 +++--- libswfdec/swfdec_sprite_movie.c | 6 +++--- test/trace/Makefile.am | 18 ++++++++++++++++++ test/trace/addProperty-delete-5.swf |binary test/trace/addProperty-delete-5.swf.trace | 3 +++ test/trace/addProperty-delete-6.swf |binary test/trace/addProperty-delete-6.swf.trace | 3 +++ test/trace/addProperty-delete-7.swf |binary test/trace/addProperty-delete-7.swf.trace | 3 +++ test/trace/addProperty-delete-8.swf |binary test/trace/addProperty-delete-8.swf.trace | 3 +++ test/trace/addProperty-delete.as | 11 +++++++++++ test/trace/addProperty-get-prototypes-5.swf |binary test/trace/addProperty-get-prototypes-5.swf.trace | 6 ++++++ test/trace/addProperty-get-prototypes-6.swf |binary test/trace/addProperty-get-prototypes-6.swf.trace | 9 +++++++++ test/trace/addProperty-get-prototypes-7.swf |binary test/trace/addProperty-get-prototypes-7.swf.trace | 9 +++++++++ test/trace/addProperty-get-prototypes-8.swf |binary test/trace/addProperty-get-prototypes-8.swf.trace | 9 +++++++++ test/trace/addProperty-get-prototypes.as | 18 ++++++++++++++++++ 26 files changed, 120 insertions(+), 23 deletions(-) New commits: diff-tree bf81efebf34c71944530945a70c24532de6ea111 (from 565cb315b34355849f0de3c656b3d9497b1164d2) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 15 23:14:01 2007 +0200 add test for deleting addProperty()'d properties diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index 6ec5d28..45b56a8 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -37,6 +37,15 @@ EXTRA_DIST = \ addProperty-7.swf.trace \ addProperty-8.swf \ addProperty-8.swf.trace \ + addProperty-delete.as \ + addProperty-delete-5.swf \ + addProperty-delete-5.swf.trace \ + addProperty-delete-6.swf \ + addProperty-delete-6.swf.trace \ + addProperty-delete-7.swf \ + addProperty-delete-7.swf.trace \ + addProperty-delete-8.swf \ + addProperty-delete-8.swf.trace \ addProperty-get-prototypes.as \ addProperty-get-prototypes-5.swf \ addProperty-get-prototypes-5.swf.trace \ diff --git a/test/trace/addProperty-delete-5.swf b/test/trace/addProperty-delete-5.swf new file mode 100644 index 0000000..e10fec5 Binary files /dev/null and b/test/trace/addProperty-delete-5.swf differ diff --git a/test/trace/addProperty-delete-5.swf.trace b/test/trace/addProperty-delete-5.swf.trace new file mode 100644 index 0000000..2796bd0 --- /dev/null +++ b/test/trace/addProperty-delete-5.swf.trace @@ -0,0 +1,3 @@ +check if deleting a property added with addProperty works +undefined +undefined diff --git a/test/trace/addProperty-delete-6.swf b/test/trace/addProperty-delete-6.swf new file mode 100644 index 0000000..86571b2 Binary files /dev/null and b/test/trace/addProperty-delete-6.swf differ diff --git a/test/trace/addProperty-delete-6.swf.trace b/test/trace/addProperty-delete-6.swf.trace new file mode 100644 index 0000000..ec5834a --- /dev/null +++ b/test/trace/addProperty-delete-6.swf.trace @@ -0,0 +1,3 @@ +check if deleting a property added with addProperty works +42 +undefined diff --git a/test/trace/addProperty-delete-7.swf b/test/trace/addProperty-delete-7.swf new file mode 100644 index 0000000..ef3db72 Binary files /dev/null and b/test/trace/addProperty-delete-7.swf differ diff --git a/test/trace/addProperty-delete-7.swf.trace b/test/trace/addProperty-delete-7.swf.trace new file mode 100644 index 0000000..ec5834a --- /dev/null +++ b/test/trace/addProperty-delete-7.swf.trace @@ -0,0 +1,3 @@ +check if deleting a property added with addProperty works +42 +undefined diff --git a/test/trace/addProperty-delete-8.swf b/test/trace/addProperty-delete-8.swf new file mode 100644 index 0000000..cdf6511 Binary files /dev/null and b/test/trace/addProperty-delete-8.swf differ diff --git a/test/trace/addProperty-delete-8.swf.trace b/test/trace/addProperty-delete-8.swf.trace new file mode 100644 index 0000000..ec5834a --- /dev/null +++ b/test/trace/addProperty-delete-8.swf.trace @@ -0,0 +1,3 @@ +check if deleting a property added with addProperty works +42 +undefined diff --git a/test/trace/addProperty-delete.as b/test/trace/addProperty-delete.as new file mode 100644 index 0000000..2c8076b --- /dev/null +++ b/test/trace/addProperty-delete.as @@ -0,0 +1,11 @@ +// makeswf -v 7 -s 200x150 -r 1 -o addProperty-delete.swf addProperty-delete.as + +trace ("check if deleting a property added with addProperty works"); + +o = {}; +o.addProperty ("x", function () { return 42; }, null); +trace (o.x); +delete o.x; +trace (o.x); + +loadMovie ("FSCommand:quit", ""); diff-tree 565cb315b34355849f0de3c656b3d9497b1164d2 (from b9d80cd0852b204c03e5828bfb4210e3ed98a2a4) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 15 23:11:31 2007 +0200 porperties added with addProperty aren't permanent. diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 8999597..b5dcd25 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -991,7 +991,7 @@ swfdec_as_object_add_variable (SwfdecAsO return; var->get = get; var->set = set; - var->flags = SWFDEC_AS_VARIABLE_PERMANENT; + var->flags = 0; if (set == NULL) var->flags |= SWFDEC_AS_VARIABLE_READONLY; } diff-tree b9d80cd0852b204c03e5828bfb4210e3ed98a2a4 (from c94ea432d4a4a30c76cd89d701d8cb9395347647) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 15 23:09:59 2007 +0200 fix getting of properties added with addProperty We need access to the original object, so we can call the getter function with that object. diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index b1d06e5..8999597 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -172,8 +172,8 @@ swfdec_as_object_hash_create (SwfdecAsOb } static gboolean -swfdec_as_object_do_get (SwfdecAsObject *object, const char *variable, - SwfdecAsValue *val, guint *flags) +swfdec_as_object_do_get (SwfdecAsObject *object, SwfdecAsObject *orig, + const char *variable, SwfdecAsValue *val, guint *flags) { SwfdecAsVariable *var = swfdec_as_object_hash_lookup (object, variable); @@ -184,7 +184,7 @@ swfdec_as_object_do_get (SwfdecAsObject return FALSE; if (var->get) { - swfdec_as_function_call (var->get, object, 0, NULL, val); + swfdec_as_function_call (var->get, orig, 0, NULL, val); swfdec_as_context_run (object->context); *flags = var->flags; } else { @@ -602,7 +602,7 @@ swfdec_as_object_get_variable_and_flags guint i; SwfdecAsValue tmp_val; guint tmp_flags; - SwfdecAsObject *tmp_pobject; + SwfdecAsObject *tmp_pobject, *cur; g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), FALSE); g_return_val_if_fail (variable != NULL, FALSE); @@ -614,13 +614,14 @@ swfdec_as_object_get_variable_and_flags if (pobject == NULL) pobject = &tmp_pobject; - for (i = 0; i < 256 && object != NULL; i++) { - klass = SWFDEC_AS_OBJECT_GET_CLASS (object); - if (klass->get (object, variable, value, flags)) { - *pobject = object; + cur = object; + for (i = 0; i < 256 && cur != NULL; i++) { + klass = SWFDEC_AS_OBJECT_GET_CLASS (cur); + if (klass->get (cur, object, variable, value, flags)) { + *pobject = cur; return TRUE; } - object = object->prototype; + cur = cur->prototype; } if (i == 256) { swfdec_as_context_abort (object->context, "Prototype recursion limit exceeded"); diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h index f82cd9c..265c6cb 100644 --- a/libswfdec/swfdec_as_object.h +++ b/libswfdec/swfdec_as_object.h @@ -65,6 +65,7 @@ struct _SwfdecAsObjectClass { void (* add) (SwfdecAsObject * object); /* get the value and flags for a variables */ gboolean (* get) (SwfdecAsObject * object, + SwfdecAsObject * orig, const char * variable, SwfdecAsValue * val, guint * flags); diff --git a/libswfdec/swfdec_as_super.c b/libswfdec/swfdec_as_super.c index 5447bcd..653c30a 100644 --- a/libswfdec/swfdec_as_super.c +++ b/libswfdec/swfdec_as_super.c @@ -68,8 +68,8 @@ swfdec_as_super_call (SwfdecAsFunction * } static gboolean -swfdec_as_super_get (SwfdecAsObject *object, const char *variable, - SwfdecAsValue *val, guint *flags) +swfdec_as_super_get (SwfdecAsObject *object, SwfdecAsObject *orig, + const char *variable, SwfdecAsValue *val, guint *flags) { SwfdecAsSuper *super = SWFDEC_AS_SUPER (object); diff --git a/libswfdec/swfdec_as_with.c b/libswfdec/swfdec_as_with.c index a000ca3..62af9b8 100644 --- a/libswfdec/swfdec_as_with.c +++ b/libswfdec/swfdec_as_with.c @@ -47,11 +47,14 @@ swfdec_as_with_resolve (SwfdecAsObject * } static gboolean -swfdec_as_with_get (SwfdecAsObject *object, const char *variable, - SwfdecAsValue *val, guint *flags) +swfdec_as_with_get (SwfdecAsObject *object, SwfdecAsObject *orig, + const char *variable, SwfdecAsValue *val, guint *flags) { SwfdecAsWith *with = SWFDEC_AS_WITH (object); + if (orig != object) { + SWFDEC_FIXME ("write tests for this case"); + } return swfdec_as_object_get_variable_and_flags (with->object, variable, val, flags, NULL); } diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 776e2b1..3bac79f 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -841,15 +841,15 @@ swfdec_movie_get_by_name (SwfdecPlayer * } static gboolean -swfdec_movie_get_variable (SwfdecAsObject *object, const char *variable, - SwfdecAsValue *val, guint *flags) +swfdec_movie_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig, + const char *variable, SwfdecAsValue *val, guint *flags) { SwfdecMovie *movie = SWFDEC_MOVIE (object); if (movie->state == SWFDEC_MOVIE_STATE_DESTROYED) return FALSE; - if (SWFDEC_AS_OBJECT_CLASS (swfdec_movie_parent_class)->get (object, variable, val, flags)) + if (SWFDEC_AS_OBJECT_CLASS (swfdec_movie_parent_class)->get (object, orig, variable, val, flags)) return TRUE; if (swfdec_movie_get_asprop (movie, variable, val)) { diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index b95f7a4..fac0886 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -350,12 +350,12 @@ swfdec_net_stream_dispose (GObject *obje } static gboolean -swfdec_net_stream_get_variable (SwfdecAsObject *object, const char *variable, - SwfdecAsValue *val, guint *flags) +swfdec_net_stream_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig, + const char *variable, SwfdecAsValue *val, guint *flags) { SwfdecNetStream *stream; - if (SWFDEC_AS_OBJECT_CLASS (swfdec_net_stream_parent_class)->get (object, variable, val, flags)) + if (SWFDEC_AS_OBJECT_CLASS (swfdec_net_stream_parent_class)->get (object, orig, variable, val, flags)) return TRUE; stream = SWFDEC_NET_STREAM (object); diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 488864c..4f9067d 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -622,12 +622,12 @@ swfdec_sprite_movie_get_by_name (SwfdecM } static gboolean -swfdec_sprite_movie_get_variable (SwfdecAsObject *object, const char *variable, - SwfdecAsValue *val, guint *flags) +swfdec_sprite_movie_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig, + const char *variable, SwfdecAsValue *val, guint *flags) { SwfdecMovie *movie; - if (SWFDEC_AS_OBJECT_CLASS (swfdec_sprite_movie_parent_class)->get (object, variable, val, flags)) + if (SWFDEC_AS_OBJECT_CLASS (swfdec_sprite_movie_parent_class)->get (object, orig, variable, val, flags)) return TRUE; movie = swfdec_sprite_movie_get_by_name (SWFDEC_MOVIE (object), variable); diff-tree c94ea432d4a4a30c76cd89d701d8cb9395347647 (from 01e8d90362605acf52d171de350853bd773e7edb) Author: Benjamin Otte <otte at gnome.org> Date: Wed Aug 15 23:09:10 2007 +0200 add test case for next commit diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index 591144a..6ec5d28 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -37,6 +37,15 @@ EXTRA_DIST = \ addProperty-7.swf.trace \ addProperty-8.swf \ addProperty-8.swf.trace \ + addProperty-get-prototypes.as \ + addProperty-get-prototypes-5.swf \ + addProperty-get-prototypes-5.swf.trace \ + addProperty-get-prototypes-6.swf \ + addProperty-get-prototypes-6.swf.trace \ + addProperty-get-prototypes-7.swf \ + addProperty-get-prototypes-7.swf.trace \ + addProperty-get-prototypes-8.swf \ + addProperty-get-prototypes-8.swf.trace \ addProperty-set-prototypes.as \ addProperty-set-prototypes-5.swf \ addProperty-set-prototypes-5.swf.trace \ diff --git a/test/trace/addProperty-get-prototypes-5.swf b/test/trace/addProperty-get-prototypes-5.swf new file mode 100644 index 0000000..171fd19 Binary files /dev/null and b/test/trace/addProperty-get-prototypes-5.swf differ diff --git a/test/trace/addProperty-get-prototypes-5.swf.trace b/test/trace/addProperty-get-prototypes-5.swf.trace new file mode 100644 index 0000000..f9ebb80 --- /dev/null +++ b/test/trace/addProperty-get-prototypes-5.swf.trace @@ -0,0 +1,6 @@ +Check getting of variables when addProperty has been used on prototypes. +10 +10 +15 +undefined +20 diff --git a/test/trace/addProperty-get-prototypes-6.swf b/test/trace/addProperty-get-prototypes-6.swf new file mode 100644 index 0000000..9207fd8 Binary files /dev/null and b/test/trace/addProperty-get-prototypes-6.swf differ diff --git a/test/trace/addProperty-get-prototypes-6.swf.trace b/test/trace/addProperty-get-prototypes-6.swf.trace new file mode 100644 index 0000000..1082851 --- /dev/null +++ b/test/trace/addProperty-get-prototypes-6.swf.trace @@ -0,0 +1,9 @@ +Check getting of variables when addProperty has been used on prototypes. +10 +10 +15 +o +42 +o set +o +42 diff --git a/test/trace/addProperty-get-prototypes-7.swf b/test/trace/addProperty-get-prototypes-7.swf new file mode 100644 index 0000000..cd76446 Binary files /dev/null and b/test/trace/addProperty-get-prototypes-7.swf differ diff --git a/test/trace/addProperty-get-prototypes-7.swf.trace b/test/trace/addProperty-get-prototypes-7.swf.trace new file mode 100644 index 0000000..1082851 --- /dev/null +++ b/test/trace/addProperty-get-prototypes-7.swf.trace @@ -0,0 +1,9 @@ +Check getting of variables when addProperty has been used on prototypes. +10 +10 +15 +o +42 +o set +o +42 diff --git a/test/trace/addProperty-get-prototypes-8.swf b/test/trace/addProperty-get-prototypes-8.swf new file mode 100644 index 0000000..c2b4add Binary files /dev/null and b/test/trace/addProperty-get-prototypes-8.swf differ diff --git a/test/trace/addProperty-get-prototypes-8.swf.trace b/test/trace/addProperty-get-prototypes-8.swf.trace new file mode 100644 index 0000000..1082851 --- /dev/null +++ b/test/trace/addProperty-get-prototypes-8.swf.trace @@ -0,0 +1,9 @@ +Check getting of variables when addProperty has been used on prototypes. +10 +10 +15 +o +42 +o set +o +42 diff --git a/test/trace/addProperty-get-prototypes.as b/test/trace/addProperty-get-prototypes.as new file mode 100644 index 0000000..e617cc2 --- /dev/null +++ b/test/trace/addProperty-get-prototypes.as @@ -0,0 +1,18 @@ +// makeswf -v 7 -s 200x150 -r 1 -o addProperty-get-prototypes.swf addProperty-get-prototypes.as + +trace ("Check getting of variables when addProperty has been used on prototypes."); + +o = {name: "o"}; +o.__proto__ = {name: "proto"}; +o.x = 10; +trace (o.x); +o.__proto__.addProperty ("x", function () { trace (this.name); return 42; }, function () { trace (this.name + " set"); }); +trace (o.x); +o.x = 15; +trace (o.x); +delete o.x; +trace (o.x); +o.x = 20; +trace (o.x); + +loadMovie ("FSCommand:quit", "");
Possibly Parallel Threads
- Branch 'vivi' - 23 commits - 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_net_stream.c libswfdec/swfdec_sprite_movie.c test/trace vivified/core
- 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
- 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
- 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
- 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