Benjamin Otte
2007-Jan-31 12:43 UTC
[Swfdec] Branch 'interpreter' - 3 commits - libswfdec/js libswfdec/swfdec_script.c
libswfdec/js/jsinterp.c | 2 libswfdec/swfdec_script.c | 114 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 104 insertions(+), 12 deletions(-) New commits: diff-tree ae64862c94f18618313c90c28b4071d84693b7b5 (from 71b090ccdeedb1e96b2f8590844844139b00bd85) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 31 21:35:50 2007 +0100 implement BitAnd, BitOr, BitXor, DefineLocal, DefineLocal2 and Return diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index 9b3a328..46ba618 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -1359,6 +1359,35 @@ swfdec_action_define_function (JSContext } static JSBool +swfdec_action_bitwise (JSContext *cx, guint action, const guint8 *data, guint len) +{ + guint32 a, b; + double d; + + if (!JS_ValueToECMAUint32 (cx, cx->fp->sp[-1], &a) || + !JS_ValueToECMAUint32 (cx, cx->fp->sp[-2], &b)) + return JS_FALSE; + + switch (action) { + case 0x60: + d = (int) (a & b); + break; + case 0x61: + d = (int) (a | b); + break; + case 0x62: + d = (int) (a ^ b); + break; + default: + g_assert_not_reached (); + return JS_FALSE; + } + + cx->fp->sp--; + return JS_NewNumberValue (cx, d, &cx->fp->sp[-1]); +} + +static JSBool swfdec_action_shift (JSContext *cx, guint action, const guint8 *data, guint len) { guint32 amount, value; @@ -1414,6 +1443,54 @@ swfdec_action_target_path (JSContext *cx return JS_TRUE; } +static JSBool +swfdec_action_define_local (JSContext *cx, guint action, const guint8 *data, guint len) +{ + const char *name; + + if (cx->fp->callobj == NULL) { + SWFDEC_ERROR ("FIXME: no local scope"); + return JS_FALSE; + } + name = swfdec_js_to_string (cx, cx->fp->sp[-2]); + if (name == NULL) + return JS_FALSE; + if (!JS_SetProperty (cx, cx->fp->callobj, name, &cx->fp->sp[-1])) + return JS_FALSE; + cx->fp->sp -= 2; + return JS_TRUE; +} + +static JSBool +swfdec_action_define_local2 (JSContext *cx, guint action, const guint8 *data, guint len) +{ + const char *name; + jsval val = JSVAL_VOID; + + if (cx->fp->callobj == NULL) { + SWFDEC_ERROR ("FIXME: no local scope"); + return JS_FALSE; + } + name = swfdec_js_to_string (cx, cx->fp->sp[-1]); + if (name == NULL) + return JS_FALSE; + if (!JS_SetProperty (cx, cx->fp->callobj, name, &val)) + return JS_FALSE; + cx->fp->sp--; + return JS_TRUE; +} + +static JSBool +swfdec_action_return (JSContext *cx, guint action, const guint8 *data, guint len) +{ + SwfdecScript *script = cx->fp->swf; + + cx->fp->rval = cx->fp->sp[-1]; + cx->fp->pc = script->buffer->data + script->buffer->length; + cx->fp->sp--; + return JS_TRUE; +} + /*** PRINT FUNCTIONS ***/ static char * @@ -1703,12 +1780,12 @@ static const SwfdecActionSpec actions[25 /* version 5 */ [0x3a] = { "Delete", NULL }, [0x3b] = { "Delete2", NULL }, - [0x3c] = { "DefineLocal", NULL }, //, 2, 0, { NULL, NULL, swfdec_action_define_local, swfdec_action_define_local, swfdec_action_define_local } }, + [0x3c] = { "DefineLocal", NULL, 2, 0, { NULL, NULL, swfdec_action_define_local, swfdec_action_define_local, swfdec_action_define_local } }, [0x3d] = { "CallFunction", NULL, -1, 1, { NULL, NULL, swfdec_action_call_function, swfdec_action_call_function, swfdec_action_call_function } }, - [0x3e] = { "Return", NULL }, + [0x3e] = { "Return", NULL, 1, 0, { NULL, NULL, swfdec_action_return, swfdec_action_return, swfdec_action_return } }, [0x3f] = { "Modulo", NULL }, [0x40] = { "NewObject", NULL, -1, 1, { NULL, NULL, swfdec_action_new_object, swfdec_action_new_object, swfdec_action_new_object } }, - [0x41] = { "DefineLocal2", NULL }, + [0x41] = { "DefineLocal2", NULL, 1, 0, { NULL, NULL, swfdec_action_define_local2, swfdec_action_define_local2, swfdec_action_define_local2 } }, [0x42] = { "InitArray", NULL }, [0x43] = { "InitObject", NULL, -1, 1, { NULL, NULL, swfdec_action_init_object, swfdec_action_init_object, swfdec_action_init_object } }, [0x44] = { "Typeof", NULL }, @@ -1731,9 +1808,9 @@ static const SwfdecActionSpec actions[25 [0x54] = { "InstanceOf", NULL }, [0x55] = { "Enumerate2", NULL }, /* version 5 */ - [0x60] = { "BitAnd", NULL }, - [0x61] = { "BitOr", NULL }, - [0x62] = { "BitXor", NULL }, + [0x60] = { "BitAnd", NULL, 2, 1, { NULL, NULL, swfdec_action_bitwise, swfdec_action_bitwise, swfdec_action_bitwise } }, + [0x61] = { "BitOr", NULL, 2, 1, { NULL, NULL, swfdec_action_bitwise, swfdec_action_bitwise, swfdec_action_bitwise } }, + [0x62] = { "BitXor", NULL, 2, 1, { NULL, NULL, swfdec_action_bitwise, swfdec_action_bitwise, swfdec_action_bitwise } }, [0x63] = { "BitLShift", NULL, 2, 1, { NULL, NULL, swfdec_action_shift, swfdec_action_shift, swfdec_action_shift } }, [0x64] = { "BitRShift", NULL, 2, 1, { NULL, NULL, swfdec_action_shift, swfdec_action_shift, swfdec_action_shift } }, [0x65] = { "BitURShift", NULL, 2, 1, { NULL, NULL, swfdec_action_shift, swfdec_action_shift, swfdec_action_shift } }, @@ -1994,8 +2071,11 @@ swfdec_script_interpret (SwfdecScript *s while (TRUE) { /* check pc */ - if (pc == endpc) /* needed for scripts created via DefineFunction */ + if (pc == endpc) { + /* scripts created via DefineFunction or the Return action use this way out */ + *rval = fp->rval; break; + } if (pc < startpc || pc >= endpc) { SWFDEC_ERROR ("pc %p not in valid range [%p, %p) anymore", pc, startpc, endpc); goto internal_error; diff-tree 71b090ccdeedb1e96b2f8590844844139b00bd85 (from fa4f57c436b5f6232efacfa2b4ac94d14af1f409) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 31 19:59:15 2007 +0100 initialize the constant pool as empty diff --git a/libswfdec/js/jsinterp.c b/libswfdec/js/jsinterp.c index ce8d014..910087a 100644 --- a/libswfdec/js/jsinterp.c +++ b/libswfdec/js/jsinterp.c @@ -847,6 +847,7 @@ have_fun: frame.sharpArray = NULL; frame.dormantNext = NULL; frame.objAtomMap = NULL; + frame.constant_pool = NULL; /* Compute the 'this' parameter and store it in frame as frame.thisp. */ ok = ComputeThis(cx, thisp, &frame); @@ -1140,6 +1141,7 @@ js_Execute(JSContext *cx, JSObject *chai frame.flags = special; frame.dormantNext = NULL; frame.objAtomMap = NULL; + frame.constant_pool = NULL; /* * Here we wrap the call to js_Interpret with code to (conditionally) diff-tree fa4f57c436b5f6232efacfa2b4ac94d14af1f409 (from 9335e136a9a1f2f3dbbbda7a7b156b55d94e7c4c) Author: Benjamin Otte <otte@gnome.org> Date: Wed Jan 31 17:28:14 2007 +0100 implement Equals This is the last action that the compiler had implemented and this branch hadn't diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index 7c24b10..9b3a328 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -1019,7 +1019,7 @@ swfdec_action_random_number (JSContext * } static JSBool -swfdec_action_less (JSContext *cx, guint action, const guint8 *data, guint len) +swfdec_action_old_compare (JSContext *cx, guint action, const guint8 *data, guint len) { jsval rval, lval; double l, r; @@ -1029,7 +1029,17 @@ swfdec_action_less (JSContext *cx, guint lval = cx->fp->sp[-2]; l = swfdec_action_to_number (cx, lval); r = swfdec_action_to_number (cx, rval); - cond = l < r; + switch (action) { + case 0x0e: + cond = l == r; + break; + case 0x0f: + cond = l < r; + break; + default: + g_assert_not_reached (); + return JS_FALSE; + } cx->fp->sp--; if (((SwfdecScript *) cx->fp->swf)->version < 5) { cx->fp->sp[-1] = INT_TO_JSVAL (cond ? 1 : 0); @@ -1655,8 +1665,8 @@ static const SwfdecActionSpec actions[25 [0x0b] = { "Subtract", NULL, 2, 1, { NULL, swfdec_action_binary, swfdec_action_binary, swfdec_action_binary, swfdec_action_binary } }, [0x0c] = { "Multiply", NULL, 2, 1, { NULL, swfdec_action_binary, swfdec_action_binary, swfdec_action_binary, swfdec_action_binary } }, [0x0d] = { "Divide", NULL, 2, 1, { NULL, swfdec_action_binary, swfdec_action_binary, swfdec_action_binary, swfdec_action_binary } }, - [0x0e] = { "Equals", NULL }, - [0x0f] = { "Less", NULL, 2, 1, { NULL, swfdec_action_less, swfdec_action_less, swfdec_action_less, swfdec_action_less } }, + [0x0e] = { "Equals", NULL, 2, 1, { NULL, swfdec_action_old_compare, swfdec_action_old_compare, swfdec_action_old_compare, swfdec_action_old_compare } }, + [0x0f] = { "Less", NULL, 2, 1, { NULL, swfdec_action_old_compare, swfdec_action_old_compare, swfdec_action_old_compare, swfdec_action_old_compare } }, [0x10] = { "And", NULL }, [0x11] = { "Or", NULL }, [0x12] = { "Not", NULL, 1, 1, { NULL, swfdec_action_not_4, swfdec_action_not_5, swfdec_action_not_5, swfdec_action_not_5 } }, @@ -1705,7 +1715,7 @@ static const SwfdecActionSpec actions[25 [0x45] = { "TargetPath", NULL, 1, 1, { NULL, NULL, swfdec_action_target_path, swfdec_action_target_path, swfdec_action_target_path } }, [0x46] = { "Enumerate", NULL }, [0x47] = { "Add2", NULL, 2, 1, { NULL, NULL, swfdec_action_add2_5, swfdec_action_add2_5, swfdec_action_add2_7 } }, - [0x48] = { "Less2", NULL, 2, 1, { NULL, NULL, swfdec_action_new_comparison_6, swfdec_action_new_comparison_6, swfdec_action_new_comparison_7 } }, + [0x48] = { "Less2", NULL, 2, 1, { NULL, NULL, swfdec_action_new_comparison_6, swfdec_action_new_comparison_6, swfdec_action_new_comparison_7 } }, [0x49] = { "Equals2", NULL, 2, 1, { NULL, NULL, swfdec_action_equals2, swfdec_action_equals2, swfdec_action_equals2 } }, [0x4a] = { "ToNumber", NULL }, [0x4b] = { "ToString", NULL },
Apparently Analagous Threads
- Branch 'as' - 4 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_interpret.h libswfdec/swfdec_as_object.c libswfdec/swfdec_as_types.c libswfdec/swfdec_as_types.h
- 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 - configure.ac libswfdec/swfdec_js_movie.c libswfdec/swfdec_root_movie.c libswfdec/swfdec_root_movie.h libswfdec/swfdec_script.c libswfdec/swfdec_sprite.c libswfdec/swfdec_sprite.h libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_swf_decoder.c
- 109 commits - configure.ac libswfdec/js libswfdec/Makefile.am libswfdec/swfdec_bits.c libswfdec/swfdec_bits.h libswfdec/swfdec_buffer.c libswfdec/swfdec_button_movie.c libswfdec/swfdec_codec_screen.c libswfdec/swfdec_color.c libswfdec/swfdec_color.h
- 11 commits - libswfdec/swfdec_font.c libswfdec/swfdec_font.h libswfdec/swfdec_js_movie.c libswfdec/swfdec_script.c libswfdec/swfdec_script.h test/.gitignore test/trace