Benjamin Otte
2007-Jul-30 13:54 UTC
[Swfdec] 10 commits - libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_super.c libswfdec/swfdec_video_movie_as.c test/trace
libswfdec/swfdec_as_frame.c | 144 +++++++-------- libswfdec/swfdec_as_interpret.c | 7 libswfdec/swfdec_as_super.c | 1 libswfdec/swfdec_video_movie_as.c | 2 test/trace/Makefile.am | 15 + test/trace/definefunction2-arguments-registers.swf |binary test/trace/definefunction2-arguments-registers.swf.trace | 3 test/trace/definefunction2-arguments-registers.xml | 49 +++++ test/trace/definefunction2-arguments.swf |binary test/trace/definefunction2-arguments.swf.trace | 3 test/trace/definefunction2-arguments.xml | 45 ++++ test/trace/definefunction2-overwrite.swf |binary test/trace/definefunction2-overwrite.swf.trace | 4 test/trace/definefunction2-overwrite.xml | 56 +++++ test/trace/definefunction2-this.swf |binary test/trace/definefunction2-this.swf.trace | 3 test/trace/definefunction2-this.xml | 45 ++++ 17 files changed, 300 insertions(+), 77 deletions(-) New commits: diff-tree 687fb9322f3f8ef29953d523c503c341e1bc6299 (from 33e2ea86862093d73fc9be0ff9cf9eac39d8f1bc) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 15:51:25 2007 +0200 add tests for swfdec_as_frame_preload order diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index d840712..4136972 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -209,9 +209,18 @@ EXTRA_DIST = \ countdown.swf.trace \ currentframe.swf \ currentframe.swf.trace \ + definefunction2-arguments.swf \ + definefunction2-arguments.swf.trace \ + definefunction2-arguments.xml \ definefunction2-arguments-registers.swf \ definefunction2-arguments-registers.swf.trace \ definefunction2-arguments-registers.xml \ + definefunction2-overwrite.swf \ + definefunction2-overwrite.swf.trace \ + definefunction2-overwrite.xml \ + definefunction2-this.swf \ + definefunction2-this.swf.trace \ + definefunction2-this.xml \ definelocal-function-target.as \ definelocal-function-target-5.swf \ definelocal-function-target-5.swf.trace \ diff --git a/test/trace/definefunction2-arguments.swf b/test/trace/definefunction2-arguments.swf new file mode 100644 index 0000000..0ad9b4e Binary files /dev/null and b/test/trace/definefunction2-arguments.swf differ diff --git a/test/trace/definefunction2-arguments.swf.trace b/test/trace/definefunction2-arguments.swf.trace new file mode 100644 index 0000000..f53472a --- /dev/null +++ b/test/trace/definefunction2-arguments.swf.trace @@ -0,0 +1,3 @@ +Check how DefineFunction2 handles flags involving this +undefined + diff --git a/test/trace/definefunction2-arguments.xml b/test/trace/definefunction2-arguments.xml new file mode 100644 index 0000000..fa0c345 --- /dev/null +++ b/test/trace/definefunction2-arguments.xml @@ -0,0 +1,45 @@ +<?xml version="1.0"?> +<swf version="7" compressed="1"> + <!-- swfmill xml2swf definefunction2-arguments.xml definefunction2-arguments.swf --> + <Header framerate="25" frames="1"> + <size> + <Rectangle left="0" right="4000" top="0" bottom="3000"/> + </size> + <tags> + <DoAction> + <actions> + <PushData> + <items> + <StackString value="Check how DefineFunction2 handles flags involving arguments"/> + </items> + </PushData> + <Trace/> + <DeclareFunction2 name="foo" argc="0" regc="2" preloadArguments="1" suppressArguments="1" reserved="0"> + <actions> + <PushData> + <items> + <StackRegister reg="1"/> + <StackString value="arguments"/> + </items> + </PushData> + <GetVariable/> + <Trace/> + <Trace/> + </actions> + </DeclareFunction2> + <PushData> + <items> + <StackInteger value="0"/> + <StackString value="foo"/> + </items> + </PushData> + <CallFunction/> + <Pop/> + <GetURL url="fscommand:quit" target=""/> + </actions> + </DoAction> + <ShowFrame/> + <End/> + </tags> + </Header> +</swf> diff --git a/test/trace/definefunction2-overwrite.swf b/test/trace/definefunction2-overwrite.swf new file mode 100644 index 0000000..71f2367 Binary files /dev/null and b/test/trace/definefunction2-overwrite.swf differ diff --git a/test/trace/definefunction2-overwrite.swf.trace b/test/trace/definefunction2-overwrite.swf.trace new file mode 100644 index 0000000..292c902 --- /dev/null +++ b/test/trace/definefunction2-overwrite.swf.trace @@ -0,0 +1,4 @@ +Check if arguments override default variables this, arguments and super +126 +84 +42 diff --git a/test/trace/definefunction2-overwrite.xml b/test/trace/definefunction2-overwrite.xml new file mode 100644 index 0000000..4b5b2aa --- /dev/null +++ b/test/trace/definefunction2-overwrite.xml @@ -0,0 +1,56 @@ +<?xml version="1.0"?> +<swf version="7" compressed="1"> + <!-- swfmill xml2swf definefunction2-overwrite.xml definefunction2-overwrite.swf --> + <Header framerate="25" frames="1"> + <size> + <Rectangle left="0" right="4000" top="0" bottom="3000"/> + </size> + <tags> + <DoAction> + <actions> + <PushData> + <items> + <StackString value="Check if arguments override default variables this, arguments and super"/> + </items> + </PushData> + <Trace/> + <DeclareFunction2 name="foo" argc="3" regc="0" reserved="0"> + <args> + <Parameter reg="0" name="arguments"/> + <Parameter reg="0" name="this"/> + <Parameter reg="0" name="super"/> + </args> + <actions> + <PushData> + <items> + <StackString value="arguments"/> + <StackString value="this"/> + <StackString value="super"/> + </items> + </PushData> + <GetVariable/> + <Trace/> + <GetVariable/> + <Trace/> + <GetVariable/> + <Trace/> + </actions> + </DeclareFunction2> + <PushData> + <items> + <StackInteger value="126"/> + <StackInteger value="84"/> + <StackInteger value="42"/> + <StackInteger value="3"/> + <StackString value="foo"/> + </items> + </PushData> + <CallFunction/> + <GetURL url="fscommand:quit" target=""/> + </actions> + </DoAction> + <ShowFrame/> + <End/> + </tags> + </Header> +</swf> diff --git a/test/trace/definefunction2-this.swf b/test/trace/definefunction2-this.swf new file mode 100644 index 0000000..e8f44f8 Binary files /dev/null and b/test/trace/definefunction2-this.swf differ diff --git a/test/trace/definefunction2-this.swf.trace b/test/trace/definefunction2-this.swf.trace new file mode 100644 index 0000000..5405199 --- /dev/null +++ b/test/trace/definefunction2-this.swf.trace @@ -0,0 +1,3 @@ +Check how DefineFunction2 handles flags involving this +_level0 +undefined diff --git a/test/trace/definefunction2-this.xml b/test/trace/definefunction2-this.xml new file mode 100644 index 0000000..5222b46 --- /dev/null +++ b/test/trace/definefunction2-this.xml @@ -0,0 +1,45 @@ +<?xml version="1.0"?> +<swf version="7" compressed="1"> + <!-- swfmill xml2swf definefunction2-this.xml definefunction2-this.swf --> + <Header framerate="25" frames="1"> + <size> + <Rectangle left="0" right="4000" top="0" bottom="3000"/> + </size> + <tags> + <DoAction> + <actions> + <PushData> + <items> + <StackString value="Check how DefineFunction2 handles flags involving this"/> + </items> + </PushData> + <Trace/> + <DeclareFunction2 name="foo" argc="0" regc="2" preloadThis="1" suppressThis="1" reserved="0"> + <actions> + <PushData> + <items> + <StackRegister reg="1"/> + <StackString value="this"/> + </items> + </PushData> + <GetVariable/> + <Trace/> + <Trace/> + </actions> + </DeclareFunction2> + <PushData> + <items> + <StackInteger value="0"/> + <StackString value="foo"/> + </items> + </PushData> + <CallFunction/> + <Pop/> + <GetURL url="fscommand:quit" target=""/> + </actions> + </DoAction> + <ShowFrame/> + <End/> + </tags> + </Header> +</swf> diff-tree 33e2ea86862093d73fc9be0ff9cf9eac39d8f1bc (from 0e8eceb483eaae6b2d3dca35b846287061728182) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 15:47:23 2007 +0200 reorganize swfdec_as_frame_preload() order to match tests diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 87ff71a..fec2389 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -549,10 +549,10 @@ swfdec_as_frame_set_target (SwfdecAsFram void swfdec_as_frame_preload (SwfdecAsFrame *frame) { - SwfdecAsObject *object; + SwfdecAsObject *object, *args; guint i, current_reg = 1; SwfdecScript *script; - SwfdecAsValue val; + SwfdecAsValue val = { 0, }; const SwfdecAsValue *cur; SwfdecAsContext *context; SwfdecAsStackIterator iter; @@ -561,17 +561,30 @@ swfdec_as_frame_preload (SwfdecAsFrame * if (frame->script == NULL) return; - + /* setup */ object = SWFDEC_AS_OBJECT (frame); context = object->context; script = frame->script; - if (script->flags & SWFDEC_SCRIPT_PRELOAD_THIS) { - if (frame->thisp) { - SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], frame->thisp); - } else { - current_reg++; + + /* create arguments and super object if necessary */ + if ((script->flags & (SWFDEC_SCRIPT_PRELOAD_ARGS | SWFDEC_SCRIPT_SUPPRESS_ARGS)) != SWFDEC_SCRIPT_SUPPRESS_ARGS) { + args = swfdec_as_array_new (context); + if (!args) + return; + for (cur = swfdec_as_stack_iterator_init_arguments (&iter, frame); cur != NULL; + cur = swfdec_as_stack_iterator_next (&iter)) { + swfdec_as_array_push (SWFDEC_AS_ARRAY (args), cur); } - } else if (!(script->flags & SWFDEC_SCRIPT_SUPPRESS_THIS)) { + } else { + /* silence gcc */ + args = NULL; + } + if ((script->flags & (SWFDEC_SCRIPT_PRELOAD_SUPER | SWFDEC_SCRIPT_SUPPRESS_SUPER)) != SWFDEC_SCRIPT_SUPPRESS_SUPER) { + frame->super = swfdec_as_super_new (frame); + } + + /* set the default variables (unless suppressed */ + if (!(script->flags & SWFDEC_SCRIPT_SUPPRESS_THIS)) { if (frame->thisp) { SWFDEC_AS_VALUE_SET_OBJECT (&val, frame->thisp); } else { @@ -580,34 +593,59 @@ swfdec_as_frame_preload (SwfdecAsFrame * swfdec_as_object_set_variable (object, SWFDEC_AS_STR_this, &val); } if (!(script->flags & SWFDEC_SCRIPT_SUPPRESS_ARGS)) { - SwfdecAsObject *args = swfdec_as_array_new (context); + SWFDEC_AS_VALUE_SET_OBJECT (&val, args); + swfdec_as_object_set_variable (object, SWFDEC_AS_STR_arguments, &val); + } + if (!(script->flags & SWFDEC_SCRIPT_SUPPRESS_SUPER)) { + if (frame->super) { + SWFDEC_AS_VALUE_SET_OBJECT (&val, frame->super); + } else { + SWFDEC_AS_VALUE_SET_UNDEFINED (&val); + } + swfdec_as_object_set_variable (object, SWFDEC_AS_STR_super, &val); + } - if (!args) - return; - for (cur = swfdec_as_stack_iterator_init_arguments (&iter, frame); cur != NULL; - cur = swfdec_as_stack_iterator_next (&iter)) { - swfdec_as_array_push (SWFDEC_AS_ARRAY (args), cur); + /* set and preload argument variables */ + cur = swfdec_as_stack_iterator_init_arguments (&iter, frame); + for (i = 0; i < script->n_arguments; i++) { + if (cur == NULL) + cur = &val; + /* set this value at the right place */ + if (script->arguments[i].preload) { + if (script->arguments[i].preload < frame->n_registers) { + frame->registers[script->arguments[i].preload] = *cur; + } else { + SWFDEC_ERROR ("trying to set %uth argument %s in nonexisting register %u", + i, script->arguments[i].name, script->arguments[i].preload); + } + } else { + const char *tmp = swfdec_as_context_get_string (context, script->arguments[i].name); + swfdec_as_object_set_variable (object, tmp, cur); } - /* FIXME: implement callee/caller */ - if (script->flags & SWFDEC_SCRIPT_PRELOAD_ARGS) { - SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], args); + /* get the next argument */ + cur = swfdec_as_stack_iterator_next (&iter); + } + + /* preload from flags */ + if ((script->flags & (SWFDEC_SCRIPT_PRELOAD_THIS | SWFDEC_SCRIPT_SUPPRESS_THIS)) == SWFDEC_SCRIPT_PRELOAD_THIS + && current_reg < script->n_registers) { + if (frame->thisp) { + SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], frame->thisp); } else { - SWFDEC_AS_VALUE_SET_OBJECT (&val, args); - swfdec_as_object_set_variable (object, SWFDEC_AS_STR_arguments, &val); + SWFDEC_AS_VALUE_SET_UNDEFINED (&frame->registers[current_reg++]); } } - if (!(script->flags & SWFDEC_SCRIPT_SUPPRESS_SUPER)) { - frame->super = swfdec_as_super_new (frame); + if (script->flags & SWFDEC_SCRIPT_PRELOAD_ARGS && current_reg < script->n_registers) { + SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], args); + } + if (script->flags & SWFDEC_SCRIPT_PRELOAD_SUPER && current_reg < script->n_registers) { if (frame->super) { - if (script->flags & SWFDEC_SCRIPT_PRELOAD_SUPER) { - SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], frame->super); - } else { - SWFDEC_AS_VALUE_SET_OBJECT (&val, frame->super); - swfdec_as_object_set_variable (object, SWFDEC_AS_STR_super, &val); - } + SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], frame->super); + } else { + SWFDEC_AS_VALUE_SET_UNDEFINED (&frame->registers[current_reg++]); } } - if (script->flags & SWFDEC_SCRIPT_PRELOAD_ROOT) { + if (script->flags & SWFDEC_SCRIPT_PRELOAD_ROOT && current_reg < script->n_registers) { SwfdecAsObject *obj; obj = swfdec_as_frame_find_variable (frame, SWFDEC_AS_STR__root); @@ -615,10 +653,10 @@ swfdec_as_frame_preload (SwfdecAsFrame * swfdec_as_object_get_variable (obj, SWFDEC_AS_STR__root, &frame->registers[current_reg]); } else { SWFDEC_WARNING ("no root to preload"); + SWFDEC_AS_VALUE_SET_UNDEFINED (&frame->registers[current_reg++]); } - current_reg++; } - if (script->flags & SWFDEC_SCRIPT_PRELOAD_PARENT) { + if (script->flags & SWFDEC_SCRIPT_PRELOAD_PARENT && current_reg < script->n_registers) { SwfdecAsObject *obj; obj = swfdec_as_frame_find_variable (frame, SWFDEC_AS_STR__parent); @@ -626,33 +664,13 @@ swfdec_as_frame_preload (SwfdecAsFrame * swfdec_as_object_get_variable (obj, SWFDEC_AS_STR__parent, &frame->registers[current_reg++]); } else { SWFDEC_WARNING ("no parent to preload"); + SWFDEC_AS_VALUE_SET_UNDEFINED (&frame->registers[current_reg++]); } current_reg++; } - if (script->flags & SWFDEC_SCRIPT_PRELOAD_GLOBAL) { + if (script->flags & SWFDEC_SCRIPT_PRELOAD_GLOBAL && current_reg < script->n_registers) { SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], context->global); } - - cur = swfdec_as_stack_iterator_init_arguments (&iter, frame); - SWFDEC_AS_VALUE_SET_UNDEFINED (&val); - for (i = 0; i < script->n_arguments; i++) { - if (cur == NULL) - cur = &val; - /* set this value at the right place */ - if (script->arguments[i].preload) { - if (script->arguments[i].preload < frame->n_registers) { - frame->registers[script->arguments[i].preload] = *cur; - } else { - SWFDEC_ERROR ("trying to set %uth argument %s in nonexisting register %u", - i, script->arguments[i].name, script->arguments[i].preload); - } - } else { - const char *tmp = swfdec_as_context_get_string (context, script->arguments[i].name); - swfdec_as_object_set_variable (object, tmp, cur); - } - /* get the next argument */ - cur = swfdec_as_stack_iterator_next (&iter); - } } /** diff-tree 0e8eceb483eaae6b2d3dca35b846287061728182 (from 6f76b7e91fa0d0ea68a56cddcc8a416419b48945) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 14:55:01 2007 +0200 add a test for how registers are handled diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index efa9946..d840712 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -726,6 +726,9 @@ EXTRA_DIST = \ preload.swf.trace \ prototypes.swf \ prototypes.swf.trace \ + register-count.swf \ + register-count.swf.trace \ + register-count.xml \ registerclass-previous.c \ registerclass-previous.swf \ registerclass-previous.swf.trace \ diff-tree 6f76b7e91fa0d0ea68a56cddcc8a416419b48945 (from 63d07e3882ee47cffd2a69b1c1e84b22fc52c64d) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 14:53:36 2007 +0200 if not enoguh registers are available, push undefined diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 4802133..ecc828a 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -349,9 +349,10 @@ swfdec_action_push (SwfdecAsContext *cx, guint regnum = swfdec_bits_get_u8 (&bits); if (!swfdec_action_has_register (cx, regnum)) { SWFDEC_ERROR ("cannot Push register %u: not enough registers", regnum); - return; + SWFDEC_AS_VALUE_SET_UNDEFINED (swfdec_as_stack_push (cx)); + } else { + *swfdec_as_stack_push (cx) = cx->frame->registers[regnum]; } - *swfdec_as_stack_push (cx) = cx->frame->registers[regnum]; break; } case 5: /* boolean */ diff-tree 63d07e3882ee47cffd2a69b1c1e84b22fc52c64d (from ad8ff3e999a5e7fcae04ba5d9843dfdd303643d8) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 14:46:41 2007 +0200 use the right number of registers diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index b04136e..4802133 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1497,7 +1497,7 @@ swfdec_action_define_function (SwfdecAsC return; n_args = swfdec_bits_get_u16 (&bits); if (v2) { - n_registers = swfdec_bits_get_u8 (&bits) + 1; + n_registers = swfdec_bits_get_u8 (&bits); flags = swfdec_bits_get_u16 (&bits); } else { n_registers = 5; diff-tree ad8ff3e999a5e7fcae04ba5d9843dfdd303643d8 (from 7f22de1374ffd9c35a0f0262e53b2388c974c1de) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 14:34:32 2007 +0200 add test for argument preloading in registers diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index 7e5e2c4..efa9946 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -209,6 +209,9 @@ EXTRA_DIST = \ countdown.swf.trace \ currentframe.swf \ currentframe.swf.trace \ + definefunction2-arguments-registers.swf \ + definefunction2-arguments-registers.swf.trace \ + definefunction2-arguments-registers.xml \ definelocal-function-target.as \ definelocal-function-target-5.swf \ definelocal-function-target-5.swf.trace \ diff --git a/test/trace/definefunction2-arguments-registers.swf b/test/trace/definefunction2-arguments-registers.swf new file mode 100644 index 0000000..8a6b9dd Binary files /dev/null and b/test/trace/definefunction2-arguments-registers.swf differ diff --git a/test/trace/definefunction2-arguments-registers.swf.trace b/test/trace/definefunction2-arguments-registers.swf.trace new file mode 100644 index 0000000..3fcd243 --- /dev/null +++ b/test/trace/definefunction2-arguments-registers.swf.trace @@ -0,0 +1,3 @@ +Check that variables in registers don't get assigned to their value +undefined +42 diff --git a/test/trace/definefunction2-arguments-registers.xml b/test/trace/definefunction2-arguments-registers.xml new file mode 100644 index 0000000..3a1861b --- /dev/null +++ b/test/trace/definefunction2-arguments-registers.xml @@ -0,0 +1,49 @@ +<?xml version="1.0"?> +<swf version="7" compressed="1"> + <!-- swfmill xml2swf definefunction2-arguments-registers.xml definefunction2-arguments-registers.swf --> + <Header framerate="25" frames="1"> + <size> + <Rectangle left="0" right="4000" top="0" bottom="3000"/> + </size> + <tags> + <DoAction> + <actions> + <PushData> + <items> + <StackString value="Check that variables in registers don't get assigned to their value"/> + </items> + </PushData> + <Trace/> + <DeclareFunction2 name="foo" argc="1" regc="2" reserved="0"> + <args> + <Parameter reg="1" name="a"/> + </args> + <actions> + <PushData> + <items> + <StackRegister reg="1"/> + <StackString value="a"/> + </items> + </PushData> + <GetVariable/> + <Trace/> + <Trace/> + </actions> + </DeclareFunction2> + <PushData> + <items> + <StackInteger value="42"/> + <StackInteger value="1"/> + <StackString value="foo"/> + </items> + </PushData> + <CallFunction/> + <Pop/> + <GetURL url="fscommand:quit" target=""/> + </actions> + </DoAction> + <ShowFrame/> + <End/> + </tags> + </Header> +</swf> diff-tree 7f22de1374ffd9c35a0f0262e53b2388c974c1de (from d6b5bd737f94823a1f2846443fe355aba770251d) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 13:28:36 2007 +0200 fix typo diff --git a/libswfdec/swfdec_video_movie_as.c b/libswfdec/swfdec_video_movie_as.c index e40b473..bebcd58 100644 --- a/libswfdec/swfdec_video_movie_as.c +++ b/libswfdec/swfdec_video_movie_as.c @@ -36,7 +36,7 @@ swfdec_video_attach_video (SwfdecAsConte if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[0]) || !SWFDEC_IS_NET_STREAM (stream = (SwfdecNetStream *) SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]))) { - SWFDEC_WARNING ("calling attachVideo without a NetStraem object"); + SWFDEC_WARNING ("calling attachVideo without a NetStream object"); swfdec_video_movie_set_input (video, NULL); return; } diff-tree d6b5bd737f94823a1f2846443fe355aba770251d (from 6f884b0d25ff56871fd1dc99458e15a8cc96546e) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 12:42:27 2007 +0200 create arguments variable using a SwfdecAsStackIterator diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 76b6181..87ff71a 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -552,7 +552,6 @@ swfdec_as_frame_preload (SwfdecAsFrame * SwfdecAsObject *object; guint i, current_reg = 1; SwfdecScript *script; - SwfdecAsStack *stack; SwfdecAsValue val; const SwfdecAsValue *cur; SwfdecAsContext *context; @@ -585,21 +584,9 @@ swfdec_as_frame_preload (SwfdecAsFrame * if (!args) return; - if (frame->argc > 0) { - if (frame->argv) { - swfdec_as_array_append (SWFDEC_AS_ARRAY (args), frame->argc, frame->argv); - } else { - stack = context->stack; - cur = context->cur; - for (i = 0; i < frame->argc; i++) { - if (cur <= &stack->elements[0]) { - stack = stack->next; - cur = &stack->elements[stack->used_elements]; - } - cur--; - swfdec_as_array_push (SWFDEC_AS_ARRAY (args), cur); - } - } + for (cur = swfdec_as_stack_iterator_init_arguments (&iter, frame); cur != NULL; + cur = swfdec_as_stack_iterator_next (&iter)) { + swfdec_as_array_push (SWFDEC_AS_ARRAY (args), cur); } /* FIXME: implement callee/caller */ if (script->flags & SWFDEC_SCRIPT_PRELOAD_ARGS) { diff-tree 6f884b0d25ff56871fd1dc99458e15a8cc96546e (from fd2d4d8ae9c0d00efc638d93dab8723e25fdc4c6) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 12:40:50 2007 +0200 switch argument handling to use SwfdecAsStackIterator diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 77f51f4..76b6181 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -556,6 +556,7 @@ swfdec_as_frame_preload (SwfdecAsFrame * SwfdecAsValue val; const SwfdecAsValue *cur; SwfdecAsContext *context; + SwfdecAsStackIterator iter; g_return_if_fail (SWFDEC_IS_AS_FRAME (frame)); @@ -644,23 +645,13 @@ swfdec_as_frame_preload (SwfdecAsFrame * if (script->flags & SWFDEC_SCRIPT_PRELOAD_GLOBAL) { SWFDEC_AS_VALUE_SET_OBJECT (&frame->registers[current_reg++], context->global); } - stack = context->stack; + + cur = swfdec_as_stack_iterator_init_arguments (&iter, frame); SWFDEC_AS_VALUE_SET_UNDEFINED (&val); - cur = frame->argv ? frame->argv - 1 : context->cur; for (i = 0; i < script->n_arguments; i++) { - /* first figure out the right value to set */ - if (i >= frame->argc) { + if (cur == NULL) cur = &val; - } else if (frame->argv) { - cur++; - } else { - if (cur <= &stack->elements[0]) { - stack = stack->next; - cur = &stack->elements[stack->used_elements]; - } - cur--; - } - /* now set this value at the right place */ + /* set this value at the right place */ if (script->arguments[i].preload) { if (script->arguments[i].preload < frame->n_registers) { frame->registers[script->arguments[i].preload] = *cur; @@ -672,6 +663,8 @@ swfdec_as_frame_preload (SwfdecAsFrame * const char *tmp = swfdec_as_context_get_string (context, script->arguments[i].name); swfdec_as_object_set_variable (object, tmp, cur); } + /* get the next argument */ + cur = swfdec_as_stack_iterator_next (&iter); } } diff-tree fd2d4d8ae9c0d00efc638d93dab8723e25fdc4c6 (from b9079d14ce23c4ff652934c1ef222ec2d966fa5c) Author: Benjamin Otte <otte at gnome.org> Date: Mon Jul 30 12:39:21 2007 +0200 when calling super() we're still constructing FIXME: write test for this diff --git a/libswfdec/swfdec_as_super.c b/libswfdec/swfdec_as_super.c index 41a58f2..5447bcd 100644 --- a/libswfdec/swfdec_as_super.c +++ b/libswfdec/swfdec_as_super.c @@ -61,6 +61,7 @@ swfdec_as_super_call (SwfdecAsFunction * * in a debugger */ frame->function = fun; + frame->construct = frame->next->construct; /* FIXME: this is ugly */ swfdec_as_frame_set_this (frame, super->object); return frame;
Maybe Matching Threads
- Branch 'vivi' - 13 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_debugger.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_script_function.c test/trace vivified/core vivified/ui
- 5 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_scope.c libswfdec/swfdec_as_scope.h libswfdec/swfdec_as_script_function.c
- 163 commits - autogen.sh configure.ac doc/swfdec-sections.txt libswfdec-gtk/swfdec_gtk_player.c libswfdec-gtk/swfdec_gtk_player.h libswfdec-gtk/swfdec_gtk_widget.c libswfdec-gtk/swfdec_source.c libswfdec/Makefile.am libswfdec/swfdec_as_array.c
- Branch 'as' - libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h libswfdec/swfdec_as_native_function.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_script_function.c
- Branch 'as' - 9 commits - libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_native_function.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_script_function.c