Pekka Lampila
2007-Aug-17 20:00 UTC
[Swfdec] 4 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h test/trace
libswfdec/swfdec_as_context.c | 22 ++++------ libswfdec/swfdec_as_interpret.c | 4 + libswfdec/swfdec_as_object.c | 21 +++++++-- libswfdec/swfdec_as_object.h | 4 - test/trace/propflags-5.swf |binary test/trace/propflags-5.swf.trace | 3 + test/trace/propflags-6.swf |binary test/trace/propflags-6.swf.trace | 3 + test/trace/propflags-7.swf |binary test/trace/propflags-7.swf.trace | 3 + test/trace/propflags.as | 83 +++++++++++++++++++++++++++++++++++++++ 11 files changed, 121 insertions(+), 22 deletions(-) New commits: diff-tree 8ea0acbb24b2faaa135c7ca793483b818c5621b9 (from bd0bd75bc96be5c3be3a5cb3aa4c3bb26ac0a3c2) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 17 22:52:50 2007 +0300 Fix propflags test case by sorting the traced arrays. diff --git a/test/trace/propflags-5.swf b/test/trace/propflags-5.swf index b26242b..644c5ac 100644 Binary files a/test/trace/propflags-5.swf and b/test/trace/propflags-5.swf differ diff --git a/test/trace/propflags-5.swf.trace b/test/trace/propflags-5.swf.trace index 7026d1f..eeaa55a 100644 --- a/test/trace/propflags-5.swf.trace +++ b/test/trace/propflags-5.swf.trace @@ -1,3 +1,3 @@ -Hidden: 7,5,3,1,__constructor__,constructor,__proto__ -Constant: 7,6,5,4 +Hidden: 1,3,5,7,__constructor__,__proto__,constructor +Constant: 4,5,6,7 Permanent: diff --git a/test/trace/propflags-6.swf b/test/trace/propflags-6.swf index 93c2e52..2af13d8 100644 Binary files a/test/trace/propflags-6.swf and b/test/trace/propflags-6.swf differ diff --git a/test/trace/propflags-6.swf.trace b/test/trace/propflags-6.swf.trace index a7eb732..8d59d4e 100644 --- a/test/trace/propflags-6.swf.trace +++ b/test/trace/propflags-6.swf.trace @@ -1,3 +1,3 @@ -Hidden: 7,5,3,1,__constructor__,constructor,__proto__ -Constant: 7,6,5,4 -Permanent: 7,6,3,2,__proto__ +Hidden: 1,3,5,7,__constructor__,__proto__,constructor +Constant: 4,5,6,7 +Permanent: 2,3,6,7,__proto__ diff --git a/test/trace/propflags-7.swf b/test/trace/propflags-7.swf index 9903ec0..9ae55c5 100644 Binary files a/test/trace/propflags-7.swf and b/test/trace/propflags-7.swf differ diff --git a/test/trace/propflags-7.swf.trace b/test/trace/propflags-7.swf.trace index 614873e..74b639d 100644 --- a/test/trace/propflags-7.swf.trace +++ b/test/trace/propflags-7.swf.trace @@ -1,3 +1,3 @@ -Hidden: 7,5,3,1,__constructor__,__proto__ -Constant: 7,6,5,4 -Permanent: 7,6,3,2,__proto__ +Hidden: 1,3,5,7,__constructor__,__proto__ +Constant: 4,5,6,7 +Permanent: 2,3,6,7,__proto__ diff --git a/test/trace/propflags.as b/test/trace/propflags.as index 25ab56b..34ce251 100644 --- a/test/trace/propflags.as +++ b/test/trace/propflags.as @@ -19,7 +19,7 @@ function hidden_properties (obj) } ASSetPropFlags (obj, hidden, 1, 0); - return hidden; + return hidden.sort (); } // loses flags from the properties that are not permanent @@ -44,7 +44,7 @@ function permanent_properties (obj) ASSetPropFlags (obj, hidden, 1, 0); ASSetPropFlags (obj, constant, 3, 0); - return permanent; + return permanent.sort (); } function constant_properties (obj) @@ -67,7 +67,7 @@ function constant_properties (obj) ASSetPropFlags (obj, hidden, 1, 0); - return constant; + return constant.sort (); } var obj = new Object (); diff-tree bd0bd75bc96be5c3be3a5cb3aa4c3bb26ac0a3c2 (from a37dad992ab5fe037d4ef153d6a80ee0327262d9) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 17 21:55:16 2007 +0300 Set __proto__ and __constructor__ properties flags diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 46c590d..a5e4b08 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -942,7 +942,8 @@ swfdec_as_object_create (SwfdecAsFunctio * object.__proto__ = construct.prototype; ]| **/ void -swfdec_as_object_set_constructor (SwfdecAsObject *object, SwfdecAsObject *construct, gboolean scripted) +swfdec_as_object_set_constructor (SwfdecAsObject *object, + SwfdecAsObject *construct, gboolean scripted) { SwfdecAsValue val; SwfdecAsObject *proto; @@ -950,7 +951,8 @@ swfdec_as_object_set_constructor (Swfdec g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); g_return_if_fail (SWFDEC_IS_AS_OBJECT (construct)); - swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (construct), SWFDEC_AS_STR_prototype, &val); + swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (construct), + SWFDEC_AS_STR_prototype, &val); if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) { proto = SWFDEC_AS_VALUE_GET_OBJECT (&val); } else { @@ -959,8 +961,15 @@ swfdec_as_object_set_constructor (Swfdec } SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); swfdec_as_object_set_variable (object, SWFDEC_AS_STR___proto__, &val); + swfdec_as_object_set_variable_flags (object, SWFDEC_AS_STR___proto__, + SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); SWFDEC_AS_VALUE_SET_OBJECT (&val, construct); - swfdec_as_object_set_variable (object, scripted ? SWFDEC_AS_STR_constructor : SWFDEC_AS_STR___constructor__, &val); + swfdec_as_object_set_variable (object, + scripted ? SWFDEC_AS_STR_constructor : SWFDEC_AS_STR___constructor__, + &val); + swfdec_as_object_set_variable_flags (object, + scripted ? SWFDEC_AS_STR_constructor : SWFDEC_AS_STR___constructor__, + SWFDEC_AS_VARIABLE_HIDDEN); } /** diff-tree a37dad992ab5fe037d4ef153d6a80ee0327262d9 (from 87b80853e78f8281e206db513eb9471b192fffaf) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 17 21:52:19 2007 +0300 Fix ASSetProbFlags function. diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 49ec05e..d0017d0 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -1004,21 +1004,18 @@ swfdec_as_context_eval_set (SwfdecAsCont /*** AS CODE ***/ static void -swfdec_as_context_ASSetPropFlags_set_one_flag (SwfdecAsObject *object, const char *s, guint *flags) +swfdec_as_context_ASSetPropFlags_set_one_flag (SwfdecAsObject *object, + const char *s, guint *flags) { guint real; - /* first set all relevant flags */ - real = flags[0] & flags[1]; - swfdec_as_object_set_variable_flags (object, s, real); - /* then unset all relevant flags */ - real = ~flags[0] & flags[1]; - swfdec_as_object_unset_variable_flags (object, s, real); + swfdec_as_object_unset_variable_flags (object, s, flags[1]); + swfdec_as_object_set_variable_flags (object, s, flags[0]); } static gboolean -swfdec_as_context_ASSetPropFlags_foreach (SwfdecAsObject *object, const char *s, - SwfdecAsValue *val, guint cur_flags, gpointer data) +swfdec_as_context_ASSetPropFlags_foreach (SwfdecAsObject *object, + const char *s, SwfdecAsValue *val, guint cur_flags, gpointer data) { guint *flags = data; @@ -1047,16 +1044,15 @@ swfdec_as_context_ASSetPropFlags (Swfdec flags[1] = (argc > 3) ? swfdec_as_value_to_integer (cx, &argv[3]) : -1; if (SWFDEC_AS_VALUE_IS_NULL (&argv[1])) { swfdec_as_object_foreach (obj, swfdec_as_context_ASSetPropFlags_foreach, flags); - } else if (SWFDEC_AS_VALUE_IS_STRING (&argv[1])) { - char **split = g_strsplit (SWFDEC_AS_VALUE_GET_STRING (&argv[1]), ",", -1); + } else { + char **split + g_strsplit (swfdec_as_value_to_string (cx, &argv[1]), ",", -1); guint i; for (i = 0; split[i]; i++) { swfdec_as_context_ASSetPropFlags_set_one_flag (obj, swfdec_as_context_get_string (cx, split[i]), flags); } g_strfreev (split); - } else { - SWFDEC_FIXME ("ASSetPropFlags for non-null properties not implemented yet"); } } diff-tree 87b80853e78f8281e206db513eb9471b192fffaf (from afdf9987d560b315469d8747f56916dcd3235ecb) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 17 16:42:12 2007 +0300 Add test case for propflags. Rename couple of SwfdecAsVariableFlags. SWFDEC_AS_VARIABLE_NO_ENUM is now SWFDEC_AS_VARIABLE_HIDDEN and SWFDEC_AS_VARIABLE_READONLY is now SWFDEC_AS_VARIABLE_CONSTANT diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 47e62d5..f9a2cc2 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1870,6 +1870,8 @@ swfdec_action_extends (SwfdecAsContext * swfdec_as_object_delete_variable (prototype, SWFDEC_AS_STR_constructor); swfdec_as_object_set_variable (prototype, SWFDEC_AS_STR___constructor__, superclass); + swfdec_as_object_set_variable_flags (prototype, SWFDEC_AS_STR___constructor__, + SWFDEC_AS_VARIABLE_HIDDEN); SWFDEC_AS_VALUE_SET_OBJECT (&proto, prototype); swfdec_as_object_set_variable (SWFDEC_AS_VALUE_GET_OBJECT (subclass), SWFDEC_AS_STR_prototype, &proto); @@ -1883,7 +1885,7 @@ swfdec_action_do_enumerate (SwfdecAsObje { SwfdecAsContext *cx = cxp; - if (flags & SWFDEC_AS_VARIABLE_DONT_ENUM) + if (flags & SWFDEC_AS_VARIABLE_HIDDEN) return TRUE; swfdec_as_stack_ensure_free (cx, 1); SWFDEC_AS_VALUE_SET_STRING (swfdec_as_stack_push (cx), variable); diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index b5dcd25..46c590d 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -245,7 +245,7 @@ swfdec_as_object_do_set (SwfdecAsObject if (var == NULL) return; } - if (var->flags & SWFDEC_AS_VARIABLE_READONLY) + if (var->flags & SWFDEC_AS_VARIABLE_CONSTANT) return; if (var->get) { if (var->set) { @@ -773,7 +773,7 @@ swfdec_as_object_add_function (SwfdecAsO SWFDEC_AS_VALUE_SET_OBJECT (&val, SWFDEC_AS_OBJECT (function)); /* FIXME: I'd like to make sure no such property exists yet */ swfdec_as_object_set_variable (object, name, &val); - swfdec_as_object_set_variable_flags (object, name, SWFDEC_AS_VARIABLE_DONT_ENUM); + swfdec_as_object_set_variable_flags (object, name, SWFDEC_AS_VARIABLE_HIDDEN); return function; } @@ -993,7 +993,7 @@ swfdec_as_object_add_variable (SwfdecAsO var->set = set; var->flags = 0; if (set == NULL) - var->flags |= SWFDEC_AS_VARIABLE_READONLY; + var->flags |= SWFDEC_AS_VARIABLE_CONSTANT; } /*** AS CODE ***/ diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h index 265c6cb..55bfc05 100644 --- a/libswfdec/swfdec_as_object.h +++ b/libswfdec/swfdec_as_object.h @@ -27,9 +27,9 @@ G_BEGIN_DECLS /* NB: matches ASSetPropFlags */ typedef enum { - SWFDEC_AS_VARIABLE_DONT_ENUM = (1 << 0), + SWFDEC_AS_VARIABLE_HIDDEN = (1 << 0), SWFDEC_AS_VARIABLE_PERMANENT = (1 << 1), - SWFDEC_AS_VARIABLE_READONLY = (1 << 2), + SWFDEC_AS_VARIABLE_CONSTANT = (1 << 2), SWFDEC_AS_VARIABLE_FLASH6_UP = (1 << 7) } SwfdecAsVariableFlag; diff --git a/test/trace/propflags-5.swf b/test/trace/propflags-5.swf new file mode 100644 index 0000000..b26242b Binary files /dev/null and b/test/trace/propflags-5.swf differ diff --git a/test/trace/propflags-5.swf.trace b/test/trace/propflags-5.swf.trace new file mode 100644 index 0000000..7026d1f --- /dev/null +++ b/test/trace/propflags-5.swf.trace @@ -0,0 +1,3 @@ +Hidden: 7,5,3,1,__constructor__,constructor,__proto__ +Constant: 7,6,5,4 +Permanent: diff --git a/test/trace/propflags-6.swf b/test/trace/propflags-6.swf new file mode 100644 index 0000000..93c2e52 Binary files /dev/null and b/test/trace/propflags-6.swf differ diff --git a/test/trace/propflags-6.swf.trace b/test/trace/propflags-6.swf.trace new file mode 100644 index 0000000..a7eb732 --- /dev/null +++ b/test/trace/propflags-6.swf.trace @@ -0,0 +1,3 @@ +Hidden: 7,5,3,1,__constructor__,constructor,__proto__ +Constant: 7,6,5,4 +Permanent: 7,6,3,2,__proto__ diff --git a/test/trace/propflags-7.swf b/test/trace/propflags-7.swf new file mode 100644 index 0000000..9903ec0 Binary files /dev/null and b/test/trace/propflags-7.swf differ diff --git a/test/trace/propflags-7.swf.trace b/test/trace/propflags-7.swf.trace new file mode 100644 index 0000000..614873e --- /dev/null +++ b/test/trace/propflags-7.swf.trace @@ -0,0 +1,3 @@ +Hidden: 7,5,3,1,__constructor__,__proto__ +Constant: 7,6,5,4 +Permanent: 7,6,3,2,__proto__ diff --git a/test/trace/propflags.as b/test/trace/propflags.as new file mode 100644 index 0000000..25ab56b --- /dev/null +++ b/test/trace/propflags.as @@ -0,0 +1,83 @@ +// makeswf -v 7 -r 1 -o test-7.swf test.as + +function hidden_properties (obj) +{ + normal = new Array (); + for (prop in obj) { + normal.push (prop); + } + + hidden = new Array (); + ASSetPropFlags (obj, null, 0, 1); + for (prop in obj) { + for (i = 0; i < normal.length; i++) { + if (normal[i] == prop) + break; + } + if (i == normal.length) + hidden.push (prop); + } + ASSetPropFlags (obj, hidden, 1, 0); + + return hidden; +} + +// loses flags from the properties that are not permanent +function permanent_properties (obj) +{ + hidden = hidden_properties (obj); + constant = constant_properties (obj); + + ASSetPropFlags (obj, hidden, 0, 1); + + permanent = new Array(); + for (var prop in obj) { + var old = obj[prop]; + delete obj[prop]; + if (obj.hasOwnProperty (prop)) { + permanent.push (prop); + } else { + obj[prop] = old; + } + } + + ASSetPropFlags (obj, hidden, 1, 0); + ASSetPropFlags (obj, constant, 3, 0); + + return permanent; +} + +function constant_properties (obj) +{ + hidden = hidden_properties (obj); + + ASSetPropFlags (obj, hidden, 0, 1); + + constant = new Array(); + for (var prop in obj) { + var old = obj[prop]; + var val = "hello " + obj[prop]; + obj[prop] = val; + if (obj[prop] != val) { + constant.push (prop); + } else { + obj[prop] = old; + } + } + + ASSetPropFlags (obj, hidden, 1, 0); + + return constant; +} + +var obj = new Object (); +obj[0] = 0; +for (var i = 1; i <= 7; i++) { + obj[i] = i; + ASSetPropFlags (obj, i, i, 0); +} +trace ("Hidden: " + hidden_properties (obj)); +trace ("Constant: " + constant_properties (obj)); +trace ("Permanent: " + permanent_properties (obj)); + +loadMovie ("FSCommand:quit", "");
Apparently Analagous Threads
- Branch 'vivi' - 60 commits - libswfdec-gtk/swfdec_gtk_loader.c libswfdec/Makefile.am libswfdec/swfdec_as_array.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_interpret.c
- 3 commits - libswfdec/swfdec_as_context.c test/trace
- 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
- 4 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_boolean.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_number.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_string.c libswfdec/swfdec_color_as.c test/trace
- 20 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_initialize.as libswfdec/swfdec_as_initialize.h libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_number.c