Benjamin Otte
2007-Apr-11 12:10 UTC
[Swfdec] Branch 'as' - 4 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_types.c libswfdec/swfdec_as_types.h
libswfdec/swfdec_as_interpret.c | 129 +++++++++++++++++----------------------- libswfdec/swfdec_as_types.c | 52 ++++++++++++++++ libswfdec/swfdec_as_types.h | 8 ++ 3 files changed, 116 insertions(+), 73 deletions(-) New commits: diff-tree bf5b82f30cd63edfe3e508e785583e6e4356cde9 (from 01beffe72234bcdfb4d3b33b5f30996413f3b933) Author: Benjamin Otte <otte@gnome.org> Date: Wed Apr 11 21:09:52 2007 +0200 implement And and Or actions diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 249f9cc..3989186 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1831,41 +1831,24 @@ swfdec_action_enumerate2 (SwfdecAsContex JS_DestroyIdArray (cx, array); return JS_TRUE; } +#endif static void -swfdec_action_logical_5 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) -{ - void l, r; - - l = swfdec_value_to_boolean_5 (cx, cx->fp->sp[-1]); - r = swfdec_value_to_boolean_5 (cx, cx->fp->sp[-2]); - - cx->fp->sp--; - if (action == 0x10) - cx->fp->sp[-1] = l && r ? JSVAL_TRUE : JSVAL_FALSE; - else - cx->fp->sp[-1] = l || r ? JSVAL_TRUE : JSVAL_FALSE; - return JS_TRUE; -} - -static void -swfdec_action_logical_7 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) +swfdec_action_logical (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - void l, r; + SwfdecAsValue *val; + gboolean l, r; - l = swfdec_value_to_boolean_7 (cx, cx->fp->sp[-1]); - r = swfdec_value_to_boolean_7 (cx, cx->fp->sp[-2]); + l = swfdec_as_value_to_boolean (cx, swfdec_as_stack_pop (cx->frame->stack)); + val = swfdec_as_stack_peek (cx->frame->stack, 1); + r = swfdec_as_value_to_boolean (cx, val); - cx->fp->sp--; - if (action == 0x10) - cx->fp->sp[-1] = l && r ? JSVAL_TRUE : JSVAL_FALSE; - else - cx->fp->sp[-1] = l || r ? JSVAL_TRUE : JSVAL_FALSE; - return JS_TRUE; + SWFDEC_AS_VALUE_SET_BOOLEAN (val, (action == 0x10) ? (l && r) : (l || r)); } /*** PRINT FUNCTIONS ***/ +#if 0 static char * swfdec_action_print_store_register (guint action, const guint8 *data, guint len) { @@ -2168,9 +2151,9 @@ const SwfdecActionSpec swfdec_as_actions #if 0 [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, 2, 1, { NULL, /* FIXME */NULL, swfdec_action_logical_5, swfdec_action_logical_5, swfdec_action_logical_7 } }, - [0x11] = { "Or", NULL, 2, 1, { NULL, /* FIXME */NULL, swfdec_action_logical_5, swfdec_action_logical_5, swfdec_action_logical_7 } }, #endif + [SWFDEC_AS_ACTION_AND] = { "And", NULL, 2, 1, { NULL, /* FIXME */NULL, swfdec_action_logical, swfdec_action_logical, swfdec_action_logical } }, + [SWFDEC_AS_ACTION_OR] = { "Or", NULL, 2, 1, { NULL, /* FIXME */NULL, swfdec_action_logical, swfdec_action_logical, swfdec_action_logical } }, [SWFDEC_AS_ACTION_NOT] = { "Not", NULL, 1, 1, { NULL, swfdec_action_not_4, swfdec_action_not_5, swfdec_action_not_5, swfdec_action_not_5 } }, #if 0 [0x13] = { "StringEquals", NULL }, diff-tree 01beffe72234bcdfb4d3b33b5f30996413f3b933 (from a8742b1e3de562504c5980a9477d89aed83819ab) Author: Benjamin Otte <otte@gnome.org> Date: Wed Apr 11 21:09:20 2007 +0200 new function swfdec_as_value_to_boolean diff --git a/libswfdec/swfdec_as_types.c b/libswfdec/swfdec_as_types.c index 2446681..ee8c403 100644 --- a/libswfdec/swfdec_as_types.c +++ b/libswfdec/swfdec_as_types.c @@ -227,6 +227,9 @@ swfdec_as_value_to_integer (SwfdecAsCont SwfdecAsObject * swfdec_as_value_to_object (SwfdecAsContext *context, const SwfdecAsValue *value) { + g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL); + g_return_val_if_fail (SWFDEC_IS_AS_VALUE (value), NULL); + switch (value->type) { case SWFDEC_TYPE_AS_UNDEFINED: case SWFDEC_TYPE_AS_NULL: @@ -244,3 +247,46 @@ swfdec_as_value_to_object (SwfdecAsConte } } +/** + * swfdec_as_value_to_boolean: + * @context: a #SwfdecAsContext + * @value: value to convert + * + * Converts the given value to a boolean according to Flash's rules. Note that + * these rules changed significantly for strings between Flash 6 and 7. + * + * Returns: either %TRUE or %FALSE. + **/ +gboolean +swfdec_as_value_to_boolean (SwfdecAsContext *context, const SwfdecAsValue *value) +{ + g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), FALSE); + g_return_val_if_fail (SWFDEC_IS_AS_VALUE (value), FALSE); + + /* FIXME: what do we do when called in flash 4? */ + switch (value->type) { + case SWFDEC_TYPE_AS_UNDEFINED: + case SWFDEC_TYPE_AS_NULL: + return FALSE; + case SWFDEC_TYPE_AS_BOOLEAN: + return SWFDEC_AS_VALUE_GET_BOOLEAN (value); + case SWFDEC_TYPE_AS_NUMBER: + { + double d = SWFDEC_AS_VALUE_GET_NUMBER (value); + return d != 0.0 && !isnan (d); + } + case SWFDEC_TYPE_AS_STRING: + if (context->version <= 6) { + double d = swfdec_as_value_to_number (context, value); + return d != 0.0 && !isnan (d); + } else { + return SWFDEC_AS_VALUE_GET_STRING (value) != SWFDEC_AS_STR_EMPTY; + } + case SWFDEC_TYPE_AS_ASOBJECT: + return TRUE; + default: + g_assert_not_reached (); + return FALSE; + } +} + diff --git a/libswfdec/swfdec_as_types.h b/libswfdec/swfdec_as_types.h index dc390cd..10f3a9c 100644 --- a/libswfdec/swfdec_as_types.h +++ b/libswfdec/swfdec_as_types.h @@ -265,6 +265,8 @@ typedef enum { SWFDEC_AS_ACTION_GOTO_FRAME2 = 0x9F } SwfdecAsAction; +gboolean swfdec_as_value_to_boolean (SwfdecAsContext * context, + const SwfdecAsValue * value); int swfdec_as_value_to_integer (SwfdecAsContext * context, const SwfdecAsValue * value); double swfdec_as_value_to_number (SwfdecAsContext * context, diff-tree a8742b1e3de562504c5980a9477d89aed83819ab (from b2d93e32881e59cee6f5cb189b10014a0f2b9ee5) Author: Benjamin Otte <otte@gnome.org> Date: Wed Apr 11 20:50:52 2007 +0200 reenabled TypeOf action untested diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 2421fbd..249f9cc 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1719,46 +1719,50 @@ swfdec_action_to_string (SwfdecAsContext swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx->frame->stack, 1))); } -#if 0 static void swfdec_action_type_of (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - jsval val; + SwfdecAsValue *val; const char *type; - JSString *string; - val = cx->fp->sp[-1]; - if (JSVAL_IS_NUMBER (val)) { - type = "number"; - } else if (JSVAL_IS_BOOLEAN (val)) { - type = "boolean"; - } else if (JSVAL_IS_STRING (val)) { - type = "string"; - } else if (JSVAL_IS_VOID (val)) { - type = "undefined"; - } else if (JSVAL_IS_NULL (val)) { - type = "null"; - } else if (JSVAL_IS_OBJECT (val)) { - JSObject *obj = JSVAL_TO_OBJECT (val); - if (swfdec_js_is_movieclip (cx, obj)) { - type = "movieclip"; - } else if (JS_ObjectIsFunction (cx, obj)) { - type = "function"; - } else { - type = "object"; - } - } else { - g_assert_not_reached (); - return JS_FALSE; + val = swfdec_as_stack_peek (cx->frame->stack, 1); + switch (val->type) { + case SWFDEC_TYPE_AS_NUMBER: + type = SWFDEC_AS_STR_NUMBER; + break; + case SWFDEC_TYPE_AS_BOOLEAN: + type = SWFDEC_AS_STR_BOOLEAN; + break; + case SWFDEC_TYPE_AS_STRING: + type = SWFDEC_AS_STR_STRING; + break; + case SWFDEC_TYPE_AS_UNDEFINED: + type = SWFDEC_AS_STR_UNDEFINED; + break; + case SWFDEC_TYPE_AS_NULL: + type = SWFDEC_AS_STR_NULL; + break; + case SWFDEC_TYPE_AS_ASOBJECT: + { + SwfdecAsObject *obj = SWFDEC_AS_VALUE_GET_OBJECT (val); + if (SWFDEC_IS_MOVIE (obj)) { + type = SWFDEC_AS_STR_MOVIECLIP; + } else if (SWFDEC_IS_AS_FUNCTION (obj)) { + type = SWFDEC_AS_STR_FUNCTION; + } else { + type = SWFDEC_AS_STR_OBJECT; + } + } + break; + default: + g_assert_not_reached (); + type = SWFDEC_AS_STR_EMPTY; + break; } - /* can't use InternString here because of case sensitivity issues */ - string = JS_NewStringCopyZ (cx, type); - if (string == NULL) - return JS_FALSE; - cx->fp->sp[-1] = STRING_TO_JSVAL (string); - return JS_TRUE; + SWFDEC_AS_VALUE_SET_STRING (val, type); } +#if 0 static void swfdec_action_get_time (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { @@ -2218,7 +2222,9 @@ const SwfdecActionSpec swfdec_as_actions [0x41] = { "DefineLocal2", NULL, 1, 0, { NULL, NULL, swfdec_action_define_local2, swfdec_action_define_local2, swfdec_action_define_local2 } }, [0x42] = { "InitArray", NULL, -1, 1, { NULL, NULL, swfdec_action_init_array, swfdec_action_init_array, swfdec_action_init_array } }, [0x43] = { "InitObject", NULL, -1, 1, { NULL, NULL, swfdec_action_init_object, swfdec_action_init_object, swfdec_action_init_object } }, - [0x44] = { "TypeOf", NULL, 1, 1, { NULL, NULL, swfdec_action_type_of, swfdec_action_type_of, swfdec_action_type_of } }, +#endif + [SWFDEC_AS_ACTION_TYPE_OF] = { "TypeOf", NULL, 1, 1, { NULL, NULL, swfdec_action_type_of, swfdec_action_type_of, swfdec_action_type_of } }, +#if 0 [0x45] = { "TargetPath", NULL, 1, 1, { NULL, NULL, swfdec_action_target_path, swfdec_action_target_path, swfdec_action_target_path } }, [0x46] = { "Enumerate", NULL }, #endif diff --git a/libswfdec/swfdec_as_types.c b/libswfdec/swfdec_as_types.c index b39f592..2446681 100644 --- a/libswfdec/swfdec_as_types.c +++ b/libswfdec/swfdec_as_types.c @@ -92,6 +92,12 @@ const char *swfdec_as_strings[] = { SWFDEC_AS_CONSTANT_STRING ("_xmouse"), SWFDEC_AS_CONSTANT_STRING ("_ymouse"), SWFDEC_AS_CONSTANT_STRING ("#ERROR#"), + SWFDEC_AS_CONSTANT_STRING ("number"), + SWFDEC_AS_CONSTANT_STRING ("boolean"), + SWFDEC_AS_CONSTANT_STRING ("string"), + SWFDEC_AS_CONSTANT_STRING ("movieclip"), + SWFDEC_AS_CONSTANT_STRING ("function"), + SWFDEC_AS_CONSTANT_STRING ("object"), /* add more here */ NULL }; diff --git a/libswfdec/swfdec_as_types.h b/libswfdec/swfdec_as_types.h index 22b6bde..dc390cd 100644 --- a/libswfdec/swfdec_as_types.h +++ b/libswfdec/swfdec_as_types.h @@ -159,6 +159,12 @@ extern const char *swfdec_as_strings[]; #define SWFDEC_AS_STR__XMOUSE SWFDEC_AS_STR_CONSTANT(59) #define SWFDEC_AS_STR__YMOUSE SWFDEC_AS_STR_CONSTANT(60) #define SWFDEC_AS_STR_HASH_ERROR SWFDEC_AS_STR_CONSTANT(61) +#define SWFDEC_AS_STR_NUMBER SWFDEC_AS_STR_CONSTANT(62) +#define SWFDEC_AS_STR_BOOLEAN SWFDEC_AS_STR_CONSTANT(63) +#define SWFDEC_AS_STR_STRING SWFDEC_AS_STR_CONSTANT(64) +#define SWFDEC_AS_STR_MOVIECLIP SWFDEC_AS_STR_CONSTANT(65) +#define SWFDEC_AS_STR_FUNCTION SWFDEC_AS_STR_CONSTANT(66) +#define SWFDEC_AS_STR_OBJECT SWFDEC_AS_STR_CONSTANT(67) /* all existing actions */ typedef enum { diff-tree b2d93e32881e59cee6f5cb189b10014a0f2b9ee5 (from 7f254e5e30a3907a6e8418159d1f62914cd988e9) Author: Benjamin Otte <otte@gnome.org> Date: Wed Apr 11 19:58:44 2007 +0200 reenable ToNumber and ToString code untested... diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index a679c0a..2421fbd 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1705,27 +1705,21 @@ swfdec_action_swap (SwfdecAsContext *cx, *swfdec_as_stack_peek (cx->frame->stack, 2) = val; } -#if 0 static void swfdec_action_to_number (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - double d; - if (!JS_ValueToNumber (cx, cx->fp->sp[-1], &d)) - return JS_FALSE; - return JS_NewNumberValue (cx, d, &cx->fp->sp[-1]); + SWFDEC_AS_VALUE_SET_NUMBER (swfdec_as_stack_peek (cx->frame->stack, 1), + swfdec_as_value_to_number (cx, swfdec_as_stack_peek (cx->frame->stack, 1))); } static void swfdec_action_to_string (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - JSString *s; - s = JS_ValueToString(cx, cx->fp->sp[-1]); - if (!s) - return JS_FALSE; - cx->fp->sp[-1] = STRING_TO_JSVAL (s); - return JS_TRUE; + SWFDEC_AS_VALUE_SET_STRING (swfdec_as_stack_peek (cx->frame->stack, 1), + swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx->frame->stack, 1))); } +#if 0 static void swfdec_action_type_of (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { @@ -2232,9 +2226,9 @@ const SwfdecActionSpec swfdec_as_actions #if 0 [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, 1, 1, { NULL, NULL, swfdec_action_to_number, swfdec_action_to_number, swfdec_action_to_number } }, - [0x4b] = { "ToString", NULL, 1, 1, { NULL, NULL, swfdec_action_to_string, swfdec_action_to_string, swfdec_action_to_string } }, #endif + [SWFDEC_AS_ACTION_TO_NUMBER] = { "ToNumber", NULL, 1, 1, { NULL, NULL, swfdec_action_to_number, swfdec_action_to_number, swfdec_action_to_number } }, + [SWFDEC_AS_ACTION_TO_STRING] = { "ToString", NULL, 1, 1, { NULL, NULL, swfdec_action_to_string, swfdec_action_to_string, swfdec_action_to_string } }, [SWFDEC_AS_ACTION_PUSH_DUPLICATE] = { "PushDuplicate", NULL, 1, 2, { NULL, NULL, swfdec_action_push_duplicate, swfdec_action_push_duplicate, swfdec_action_push_duplicate } }, [SWFDEC_AS_ACTION_SWAP] = { "Swap", NULL, 2, 2, { NULL, NULL, swfdec_action_swap, swfdec_action_swap, swfdec_action_swap } }, [SWFDEC_AS_ACTION_GET_MEMBER] = { "GetMember", NULL, 2, 1, { NULL, swfdec_action_get_member, swfdec_action_get_member, swfdec_action_get_member, swfdec_action_get_member } },
Possibly Parallel Threads
- Branch 'as' - 15 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h libswfdec/swfdec_as_interpret.c
- 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
- Branch 'as' - 14 commits - libswfdec-gtk/swfdec_playback_alsa.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h
- Branch 'as' - 9 commits - configure.ac libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h
- 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