Pekka Lampila
2007-Oct-25 17:12 UTC
[Swfdec] 6 commits - libswfdec/swfdec_as_interpret.c test/trace
libswfdec/swfdec_as_interpret.c | 89 ++++++++++++++++++++++++------- test/trace/Makefile.am | 9 +++ test/trace/cast-5.swf |binary test/trace/cast-5.swf.trace | 2 test/trace/cast-6.swf |binary test/trace/cast-6.swf.trace | 2 test/trace/cast-7.swf |binary test/trace/cast-7.swf.trace | 2 test/trace/cast-8.swf |binary test/trace/cast-8.swf.trace | 2 test/trace/cast.as | 23 ++++++++ test/trace/text-field-scroll-5.swf |binary test/trace/text-field-scroll-5.swf.trace | 18 +++--- test/trace/text-field-scroll-6.swf |binary test/trace/text-field-scroll-6.swf.trace | 16 ++--- test/trace/text-field-scroll-7.swf |binary test/trace/text-field-scroll-7.swf.trace | 18 +++--- test/trace/text-field-scroll-8.swf |binary test/trace/text-field-scroll-8.swf.trace | 18 +++--- test/trace/text-field-scroll.as | 2 20 files changed, 145 insertions(+), 56 deletions(-) New commits: commit 8b5bfc15c7f60d4cd1787ab3b0d24668ff86a63c Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Oct 25 20:08:05 2007 +0300 Add a test for Cast diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index 5bde4df..b4c1f06 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -239,6 +239,15 @@ EXTRA_DIST = \ case1-6.swf.trace \ case1-7.swf \ case1-7.swf.trace \ + cast.as \ + cast-5.swf \ + cast-5.swf.trace \ + cast-6.swf \ + cast-6.swf.trace \ + cast-7.swf \ + cast-7.swf.trace \ + cast-8.swf \ + cast-8.swf.trace \ charat.as \ charat-5.swf \ charat-5.swf.trace \ diff --git a/test/trace/cast-5.swf b/test/trace/cast-5.swf new file mode 100644 index 0000000..ab4e417 Binary files /dev/null and b/test/trace/cast-5.swf differ diff --git a/test/trace/cast-5.swf.trace b/test/trace/cast-5.swf.trace new file mode 100644 index 0000000..6d36aad --- /dev/null +++ b/test/trace/cast-5.swf.trace @@ -0,0 +1,2 @@ +null +[object Object] diff --git a/test/trace/cast-6.swf b/test/trace/cast-6.swf new file mode 100644 index 0000000..088ca99 Binary files /dev/null and b/test/trace/cast-6.swf differ diff --git a/test/trace/cast-6.swf.trace b/test/trace/cast-6.swf.trace new file mode 100644 index 0000000..6d36aad --- /dev/null +++ b/test/trace/cast-6.swf.trace @@ -0,0 +1,2 @@ +null +[object Object] diff --git a/test/trace/cast-7.swf b/test/trace/cast-7.swf new file mode 100644 index 0000000..f68597c Binary files /dev/null and b/test/trace/cast-7.swf differ diff --git a/test/trace/cast-7.swf.trace b/test/trace/cast-7.swf.trace new file mode 100644 index 0000000..6d36aad --- /dev/null +++ b/test/trace/cast-7.swf.trace @@ -0,0 +1,2 @@ +null +[object Object] diff --git a/test/trace/cast-8.swf b/test/trace/cast-8.swf new file mode 100644 index 0000000..485e287 Binary files /dev/null and b/test/trace/cast-8.swf differ diff --git a/test/trace/cast-8.swf.trace b/test/trace/cast-8.swf.trace new file mode 100644 index 0000000..6d36aad --- /dev/null +++ b/test/trace/cast-8.swf.trace @@ -0,0 +1,2 @@ +null +[object Object] diff --git a/test/trace/cast.as b/test/trace/cast.as new file mode 100644 index 0000000..66ae59d --- /dev/null +++ b/test/trace/cast.as @@ -0,0 +1,23 @@ +// makeswf -v 7 -r 1 -o cast-7.swf cast.as + +var o = new Object (); + +asm { + push "o" + getvariable + push "Object" + getvariable + cast + trace +}; + +asm { + push "Object" + getvariable + push "o" + getvariable + cast + trace +}; + +loadMovie ("FSCommand:quit", ""); commit 85b0e8b36a6ccadd5bd54dbd9e384bc5fa73292d Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Oct 25 20:06:08 2007 +0300 Cast takes the arguments in opposite order than instanceOf diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index b18ddbf..5224538 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -2239,19 +2239,18 @@ swfdec_action_cast (SwfdecAsContext *cx, guint action, const guint8 *data, val = swfdec_as_stack_pop (cx); if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { - constructor = SWFDEC_AS_VALUE_GET_OBJECT (val); + object = SWFDEC_AS_VALUE_GET_OBJECT (val); } else { - constructor = NULL; + object = NULL; } - + val = swfdec_as_stack_pop (cx); if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { - object = SWFDEC_AS_VALUE_GET_OBJECT (val); + constructor = SWFDEC_AS_VALUE_GET_OBJECT (val); } else { - object = NULL; + constructor = NULL; } - if (object == NULL || constructor == NULL) { SWFDEC_AS_VALUE_SET_NULL (swfdec_as_stack_push (cx)); return; commit 0a4255c80ae147befa09d263b6025ee775e95ab5 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Oct 25 19:53:15 2007 +0300 Implement Cast ActionScript action diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 3b45b3b..b18ddbf 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -2231,6 +2231,40 @@ swfdec_action_instance_of (SwfdecAsContext *cx, guint action, } static void +swfdec_action_cast (SwfdecAsContext *cx, guint action, const guint8 *data, + guint len) +{ + SwfdecAsValue *val; + SwfdecAsObject *object, *constructor; + + val = swfdec_as_stack_pop (cx); + if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { + constructor = SWFDEC_AS_VALUE_GET_OBJECT (val); + } else { + constructor = NULL; + } + + val = swfdec_as_stack_pop (cx); + if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { + object = SWFDEC_AS_VALUE_GET_OBJECT (val); + } else { + object = NULL; + } + + + if (object == NULL || constructor == NULL) { + SWFDEC_AS_VALUE_SET_NULL (swfdec_as_stack_push (cx)); + return; + } + + if (swfdec_action_is_instance_of (object, constructor)) { + SWFDEC_AS_VALUE_SET_OBJECT (swfdec_as_stack_push (cx), object); + } else { + SWFDEC_AS_VALUE_SET_NULL (swfdec_as_stack_push (cx)); + } +} + +static void swfdec_action_extends (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { SwfdecAsValue *superclass, *subclass, proto; @@ -2873,7 +2907,7 @@ const SwfdecActionSpec swfdec_as_actions[256] = { [SWFDEC_AS_ACTION_STRING_LESS] = { "StringLess", NULL, 2, 1, { NULL, swfdec_action_string_compare, swfdec_action_string_compare, swfdec_action_string_compare, swfdec_action_string_compare } }, /* version 7 */ [SWFDEC_AS_ACTION_THROW] = { "Throw", NULL }, - [SWFDEC_AS_ACTION_CAST] = { "Cast", NULL }, + [SWFDEC_AS_ACTION_CAST] = { "Cast", NULL, 2, 1, { NULL, NULL, NULL, NULL, swfdec_action_cast } }, [SWFDEC_AS_ACTION_IMPLEMENTS] = { "Implements", NULL }, /* version 4 */ [0x30] = { "RandomNumber", NULL, 1, 1, { NULL, swfdec_action_random_number, swfdec_action_random_number, swfdec_action_random_number, swfdec_action_random_number } }, commit 78828b96e49c946e2c3aab29fc9bbd0fbd2dfeb0 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Oct 25 19:21:53 2007 +0300 Reorganize instanceOf code to get separate swfdec_action_is_instance_of func diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index f2867a3..3b45b3b 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -2174,45 +2174,60 @@ swfdec_action_get_time (SwfdecAsContext *cx, guint action, const guint8 *data, g SWFDEC_AS_VALUE_SET_INT (swfdec_as_stack_push (cx), diff); } +static gboolean +swfdec_action_is_instance_of (SwfdecAsObject *object, + SwfdecAsObject *constructor) +{ + SwfdecAsValue val; + SwfdecAsObject *class, *prototype; + + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), FALSE); + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (constructor), FALSE); + + // FIXME: propflag tests are wrong, and we shouldn't get __proto__.prototype + swfdec_as_object_get_variable (constructor, SWFDEC_AS_STR_prototype, &val); + if (!SWFDEC_AS_VALUE_IS_OBJECT (&val)) + return FALSE; + prototype = SWFDEC_AS_VALUE_GET_OBJECT (&val); + + class = object; + while ((class = swfdec_as_object_get_prototype (class)) != NULL) { + if (class == prototype) + return TRUE; + } + + return FALSE; +} + static void swfdec_action_instance_of (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecAsValue val, *val_p; - SwfdecAsObject *object, *class, *constructor, *prototype; + SwfdecAsValue *val; + SwfdecAsObject *object, *constructor; - val_p = swfdec_as_stack_pop (cx); - if (SWFDEC_AS_VALUE_IS_OBJECT (val_p)) { - constructor = SWFDEC_AS_VALUE_GET_OBJECT (val_p); + val = swfdec_as_stack_pop (cx); + if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { + constructor = SWFDEC_AS_VALUE_GET_OBJECT (val); } else { constructor = NULL; } - val_p = swfdec_as_stack_pop (cx); - if (SWFDEC_AS_VALUE_IS_OBJECT (val_p)) { - object = SWFDEC_AS_VALUE_GET_OBJECT (val_p); + val = swfdec_as_stack_pop (cx); + if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { + object = SWFDEC_AS_VALUE_GET_OBJECT (val); } else { object = NULL; } - SWFDEC_AS_VALUE_SET_BOOLEAN (swfdec_as_stack_push (cx), FALSE); - if (object == NULL || constructor == NULL) - return; - - // FIXME: propflag tests are wrong, and we shouldn't get __proto__.prototype - swfdec_as_object_get_variable (constructor, SWFDEC_AS_STR_prototype, &val); - if (!SWFDEC_AS_VALUE_IS_OBJECT (&val)) + if (object == NULL || constructor == NULL) { + SWFDEC_AS_VALUE_SET_BOOLEAN (swfdec_as_stack_push (cx), FALSE); return; - prototype = SWFDEC_AS_VALUE_GET_OBJECT (&val); - - class = object; - while ((class = swfdec_as_object_get_prototype (class)) != NULL) { - if (class == prototype) { - SWFDEC_AS_VALUE_SET_BOOLEAN (swfdec_as_stack_peek (cx, 1), TRUE); - break; - } } + + SWFDEC_AS_VALUE_SET_BOOLEAN (swfdec_as_stack_push (cx), + swfdec_action_is_instance_of (object, constructor)); } static void commit c20df1bc66973049550097a853e19c7d9d2e5dfd Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Oct 25 19:08:29 2007 +0300 Add FIXME comment to instanceOf diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index b30bde8..f2867a3 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -2200,6 +2200,7 @@ swfdec_action_instance_of (SwfdecAsContext *cx, guint action, if (object == NULL || constructor == NULL) return; + // FIXME: propflag tests are wrong, and we shouldn't get __proto__.prototype swfdec_as_object_get_variable (constructor, SWFDEC_AS_STR_prototype, &val); if (!SWFDEC_AS_VALUE_IS_OBJECT (&val)) return; commit 7b7e186ddf576b4514c643db21c5280e37373c85 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Thu Oct 25 19:04:36 2007 +0300 Hopefully text-field-scroll now really doesn't depend on the font diff --git a/test/trace/text-field-scroll-5.swf b/test/trace/text-field-scroll-5.swf index 578d1fe..a9ea84b 100644 Binary files a/test/trace/text-field-scroll-5.swf and b/test/trace/text-field-scroll-5.swf differ diff --git a/test/trace/text-field-scroll-5.swf.trace b/test/trace/text-field-scroll-5.swf.trace index 4d134cd..3cc5df5 100644 --- a/test/trace/text-field-scroll-5.swf.trace +++ b/test/trace/text-field-scroll-5.swf.trace @@ -2,53 +2,53 @@ bottomScroll: hscroll: maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: # WITH TEXT bottomScroll: hscroll: 200 maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: 3 # WITH WORD WRAP bottomScroll: hscroll: 200 maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: 3 # WITHOUT WORD WRAP bottomScroll: hscroll: 200 maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: 3 # WITH WORD WRAP - SCROLL RESET bottomScroll: hscroll: 200 maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: 3 # WITH WORD WRAP - FORMAT RESET bottomScroll: hscroll: 200 maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: 3 # WITH WORD WRAP - TEXT RESET bottomScroll: hscroll: 200 maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: 3 # WITHOUT WORD WRAP - FORMAT RESET bottomScroll: hscroll: 200 maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: 30 # WITHOUT WORD WRAP - TEXT RESET bottomScroll: hscroll: 200 maxhscroll > 0: false -maxscroll: +maxscroll > 0: false scroll: 30 diff --git a/test/trace/text-field-scroll-6.swf b/test/trace/text-field-scroll-6.swf index 8b0b513..d5420f7 100644 Binary files a/test/trace/text-field-scroll-6.swf and b/test/trace/text-field-scroll-6.swf differ diff --git a/test/trace/text-field-scroll-6.swf.trace b/test/trace/text-field-scroll-6.swf.trace index 73460cd..3c6948b 100644 --- a/test/trace/text-field-scroll-6.swf.trace +++ b/test/trace/text-field-scroll-6.swf.trace @@ -2,47 +2,47 @@ bottomScroll: 1 hscroll: 0 maxhscroll > 0: false -maxscroll: 1 +maxscroll > 0: true scroll: 1 # WITH TEXT bottomScroll: 8 hscroll: 200 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP bottomScroll: 8 hscroll: 200 maxhscroll > 0: false -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITHOUT WORD WRAP bottomScroll: 8 hscroll: 200 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP - SCROLL RESET bottomScroll: 8 hscroll: 200 maxhscroll > 0: false -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP - TEXT RESET bottomScroll: 8 hscroll: 0 maxhscroll > 0: false -maxscroll: 79 +maxscroll > 0: true scroll: 3 # WITHOUT WORD WRAP - FORMAT RESET bottomScroll: 30 hscroll: 0 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 30 # WITHOUT WORD WRAP - TEXT RESET bottomScroll: 16 hscroll: 0 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 11 diff --git a/test/trace/text-field-scroll-7.swf b/test/trace/text-field-scroll-7.swf index 67c1847..90292cf 100644 Binary files a/test/trace/text-field-scroll-7.swf and b/test/trace/text-field-scroll-7.swf differ diff --git a/test/trace/text-field-scroll-7.swf.trace b/test/trace/text-field-scroll-7.swf.trace index 38002d0..abccb32 100644 --- a/test/trace/text-field-scroll-7.swf.trace +++ b/test/trace/text-field-scroll-7.swf.trace @@ -2,53 +2,53 @@ bottomScroll: 1 hscroll: 0 maxhscroll > 0: false -maxscroll: 1 +maxscroll > 0: true scroll: 1 # WITH TEXT bottomScroll: 8 hscroll: 200 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP bottomScroll: 8 hscroll: 200 maxhscroll > 0: false -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITHOUT WORD WRAP bottomScroll: 8 hscroll: 200 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP - SCROLL RESET bottomScroll: 8 hscroll: 200 maxhscroll > 0: false -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP - FORMAT RESET bottomScroll: 8 hscroll: 200 maxhscroll > 0: false -maxscroll: 79 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP - TEXT RESET bottomScroll: 8 hscroll: 0 maxhscroll > 0: false -maxscroll: 79 +maxscroll > 0: true scroll: 3 # WITHOUT WORD WRAP - FORMAT RESET bottomScroll: 30 hscroll: 0 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 30 # WITHOUT WORD WRAP - TEXT RESET bottomScroll: 16 hscroll: 0 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 11 diff --git a/test/trace/text-field-scroll-8.swf b/test/trace/text-field-scroll-8.swf index 4b1656e..f78ca7d 100644 Binary files a/test/trace/text-field-scroll-8.swf and b/test/trace/text-field-scroll-8.swf differ diff --git a/test/trace/text-field-scroll-8.swf.trace b/test/trace/text-field-scroll-8.swf.trace index 38002d0..abccb32 100644 --- a/test/trace/text-field-scroll-8.swf.trace +++ b/test/trace/text-field-scroll-8.swf.trace @@ -2,53 +2,53 @@ bottomScroll: 1 hscroll: 0 maxhscroll > 0: false -maxscroll: 1 +maxscroll > 0: true scroll: 1 # WITH TEXT bottomScroll: 8 hscroll: 200 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP bottomScroll: 8 hscroll: 200 maxhscroll > 0: false -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITHOUT WORD WRAP bottomScroll: 8 hscroll: 200 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP - SCROLL RESET bottomScroll: 8 hscroll: 200 maxhscroll > 0: false -maxscroll: 11 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP - FORMAT RESET bottomScroll: 8 hscroll: 200 maxhscroll > 0: false -maxscroll: 79 +maxscroll > 0: true scroll: 3 # WITH WORD WRAP - TEXT RESET bottomScroll: 8 hscroll: 0 maxhscroll > 0: false -maxscroll: 79 +maxscroll > 0: true scroll: 3 # WITHOUT WORD WRAP - FORMAT RESET bottomScroll: 30 hscroll: 0 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 30 # WITHOUT WORD WRAP - TEXT RESET bottomScroll: 16 hscroll: 0 maxhscroll > 0: true -maxscroll: 11 +maxscroll > 0: true scroll: 11 diff --git a/test/trace/text-field-scroll.as b/test/trace/text-field-scroll.as index bd60a7d..77cbb82 100644 --- a/test/trace/text-field-scroll.as +++ b/test/trace/text-field-scroll.as @@ -4,7 +4,7 @@ function trace_scroll_properties () { trace ("bottomScroll: " + t.bottomScroll); trace ("hscroll: " + t.hscroll); trace ("maxhscroll > 0: " + (t.maxhscroll > 0)); - trace ("maxscroll: " + t.maxscroll); + trace ("maxscroll > 0: " + (t.maxscroll > 0)); trace ("scroll: " + t.scroll); }
Reasonably Related Threads
- 14 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_interpret.h libswfdec/swfdec_net_stream.c libswfdec/swfdec_script.c libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_tag.c libswfdec/swfdec_text_field_movie.c
- 11 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie.h test/trace
- 18 commits - libswfdec/swfdec_player_internal.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_format.c libswfdec/swfdec_text_format.h libswfdec/swfdec_xml.c libswfdec/swfdec_xml_node.c libswfdec/swfdec_xml_node.h test/trace
- 12 commits - libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c test/trace
- 2 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.h test/trace