Benjamin Otte
2007-Apr-05 06:52 UTC
[Swfdec] 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 libswfdec/swfdec_as_stack.h libswfdec/swfdec_as_types.c libswfdec/swfdec_as_types.h libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_net_stream.c
configure.ac | 3 libswfdec/swfdec_as_context.c | 46 +++--- libswfdec/swfdec_as_frame.c | 24 +++ libswfdec/swfdec_as_frame.h | 4 libswfdec/swfdec_as_function.h | 2 libswfdec/swfdec_as_interpret.c | 285 ++++++++++++++++------------------------ libswfdec/swfdec_as_object.c | 23 +++ libswfdec/swfdec_as_object.h | 3 libswfdec/swfdec_as_stack.h | 1 libswfdec/swfdec_as_types.c | 66 +++++++++ libswfdec/swfdec_as_types.h | 114 +++++++++------- libswfdec/swfdec_flv_decoder.c | 3 libswfdec/swfdec_net_stream.c | 2 13 files changed, 338 insertions(+), 238 deletions(-) New commits: diff-tree d56c79c4f98469d9bfa85e47781dcd51d6acf43c (from bcf8141b997f93bcc6581c5effa8abfdc2131d2e) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:34:42 2007 +0200 implement [GS]et(Member|Property) and Pop actions diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index aab5f44..893adbd 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -532,10 +532,116 @@ swfdec_action_set_variable (SwfdecAsCont const char *s; s = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx->frame->stack, 2)); - swfdec_as_context_eval_set (cx, NULL, s, swfdec_as_stack_pop (cx->frame->stack)); + swfdec_as_context_eval_set (cx, NULL, s, swfdec_as_stack_peek (cx->frame->stack, 1)); + swfdec_as_stack_pop_n (cx->frame->stack, 2); +} + +static const char * +swfdec_as_interpret_eval (SwfdecAsContext *cx, SwfdecAsObject *obj, + SwfdecAsValue *val) +{ + if (SWFDEC_AS_VALUE_IS_STRING (val)) { + const char *s = SWFDEC_AS_VALUE_GET_STRING (val); + if (s != SWFDEC_AS_STR_EMPTY) { + swfdec_as_context_eval (cx, obj, s, val); + return s; + } + } + if (obj != NULL) + SWFDEC_AS_VALUE_SET_OBJECT (val, obj); + else + SWFDEC_AS_VALUE_SET_UNDEFINED (val); + return SWFDEC_AS_STR_EMPTY; +} + +#define CONSTANT_INDEX 39 +static void +swfdec_action_get_property (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) +{ + SwfdecAsValue *val; + SwfdecAsObject *obj; + guint id; + + id = swfdec_as_value_to_integer (cx, swfdec_as_stack_pop (cx->frame->stack)); + if (id > (cx->version > 4 ? 21 : 18)) { + SWFDEC_WARNING ("trying to SetProperty %u, not allowed", id); + goto out; + } + val = swfdec_as_stack_peek (cx->frame->stack, 1); + swfdec_as_interpret_eval (cx, NULL, val); + if (SWFDEC_AS_VALUE_IS_UNDEFINED (val)) { + obj = cx->frame->scope; + } else if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { + obj = SWFDEC_AS_VALUE_GET_OBJECT (val); + } else { + SWFDEC_WARNING ("not an object, can't GetProperty"); + goto out; + } + swfdec_as_object_get (obj, SWFDEC_AS_STR_CONSTANT (CONSTANT_INDEX + id), + swfdec_as_stack_peek (cx->frame->stack, 1)); + return; + +out: + SWFDEC_AS_VALUE_SET_UNDEFINED (swfdec_as_stack_peek (cx->frame->stack, 1)); +} + +static void +swfdec_action_set_property (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) +{ + SwfdecAsValue *val; + SwfdecAsObject *obj; + guint id; + + id = swfdec_as_value_to_integer (cx, swfdec_as_stack_peek (cx->frame->stack, 1)); + if (id > (cx->version > 4 ? 21 : 18)) { + SWFDEC_WARNING ("trying to SetProperty %u, not allowed", id); + goto out; + } + val = swfdec_as_stack_peek (cx->frame->stack, 2); + swfdec_as_interpret_eval (cx, NULL, val); + if (SWFDEC_AS_VALUE_IS_UNDEFINED (val)) { + obj = cx->frame->var_object; + } else if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { + obj = SWFDEC_AS_VALUE_GET_OBJECT (val); + } else { + SWFDEC_WARNING ("not an object, can't get SetProperty"); + goto out; + } + swfdec_as_object_set (obj, SWFDEC_AS_STR_CONSTANT (CONSTANT_INDEX + id), + swfdec_as_stack_peek (cx->frame->stack, 3)); +out: + swfdec_as_stack_pop_n (cx->frame->stack, 3); +} + +static void +swfdec_action_get_member (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) +{ + /* FIXME: do we need a "convert to object" function here? */ + if (SWFDEC_AS_VALUE_IS_OBJECT (swfdec_as_stack_peek (cx->frame->stack, 2))) { + SwfdecAsObject *o = SWFDEC_AS_VALUE_GET_OBJECT (swfdec_as_stack_peek (cx->frame->stack, 2)); + swfdec_as_object_get_variable (o, swfdec_as_stack_peek (cx->frame->stack, 1), + swfdec_as_stack_peek (cx->frame->stack, 1)); +#ifdef SWFDEC_WARN_MISSING_PROPERTIES + if (SWFDEC_AS_VALUE_IS_UNDEFINED (swfdec_as_stack_peek (cx->frame->stack, 1))) { + SWFDEC_WARNING ("no variable named %s:%s", G_OBJECT_TYPE_NAME (o), s); + } +#endif + } else { + SWFDEC_AS_VALUE_SET_UNDEFINED (swfdec_as_stack_peek (cx->frame->stack, 2)); + } swfdec_as_stack_pop (cx->frame->stack); } +static void +swfdec_action_set_member (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) +{ + if (SWFDEC_AS_VALUE_IS_OBJECT (swfdec_as_stack_peek (cx->frame->stack, 3))) { + swfdec_as_object_set_variable (SWFDEC_AS_VALUE_GET_OBJECT (swfdec_as_stack_peek (cx->frame->stack, 3)), + swfdec_as_stack_peek (cx->frame->stack, 2), swfdec_as_stack_peek (cx->frame->stack, 1)); + } + swfdec_as_stack_pop_n (cx->frame->stack, 3); +} + #if 0 static void swfdec_action_trace (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) @@ -674,128 +780,15 @@ fail: fp->sp[-1] = JSVAL_VOID; return JS_TRUE; } +#endif static void swfdec_action_pop (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - cx->fp->sp--; - return JS_TRUE; -} - -static const char * -swfdec_eval_jsval (SwfdecAsContext *cx, JSObject *obj, jsval *val) -{ - if (JSVAL_IS_STRING (*val)) { - const char *bytes = swfdec_js_to_string (cx, *val); - if (bytes == NULL) - return NULL; - *val = swfdec_js_eval (cx, obj, bytes); - return bytes; - } else { - if (obj == NULL) { - obj = OBJ_THIS_OBJECT (cx, cx->fp->scopeChain); - } - *val = OBJECT_TO_JSVAL (obj); - return "."; - } -} - -static const char *properties[22] = { - "_x", "_y", "_xscale", "_yscale", "_currentframe", - "_totalframes", "_alpha", "_visible", "_width", "_height", - "_rotation", "_target", "_framesloaded", "_name", "_droptarget", - "_url", "_highquality", "_focusrect", "_soundbuftime", "_quality", - "_xmouse", "_ymouse" -}; - -static void -swfdec_action_get_property (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) -{ - jsval val; - SwfdecMovie *movie; - JSObject *jsobj; - guint32 id; - const char *bytes; - - if (!JS_ValueToECMAUint32 (cx, cx->fp->sp[-1], &id)) - return JS_FALSE; - val = cx->fp->sp[-2]; - bytes = swfdec_eval_jsval (cx, NULL, &val); - if (id > (((SwfdecScript *) cx->fp->swf)->version > 4 ? 21 : 18)) { - SWFDEC_WARNING ("trying to SetProperty %u, not allowed", id); - goto out; - } - - if (bytes == NULL) - return JS_FALSE; - if (*bytes == '\0') { - JSObject *pobj; - JSProperty *prop; - JSAtom *atom = js_Atomize (cx, properties[id], strlen (properties[id]), 0); - if (atom == NULL) - return JS_FALSE; - if (!js_FindProperty (cx, (jsid) atom, &jsobj, &pobj, &prop)) - return JS_FALSE; - if (!prop) - return JS_FALSE; - if (!OBJ_GET_PROPERTY (cx, jsobj, (jsid) prop->id, &val)) - return JS_FALSE; - } else { - movie = swfdec_scriptable_from_jsval (cx, val, SWFDEC_TYPE_MOVIE); - if (movie == NULL) { - SWFDEC_WARNING ("specified target does not reference a movie clip"); - goto out; - } - - jsobj = JSVAL_TO_OBJECT (val); - val = JSVAL_VOID; - - if (!JS_GetProperty (cx, jsobj, properties[id], &val)) - return JS_FALSE; - } - -out: - cx->fp->sp -= 1; - cx->fp->sp[-1] = val; - return JS_TRUE; -} - -static void -swfdec_action_set_property (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) -{ - jsval val; - SwfdecMovie *movie; - JSObject *jsobj; - guint32 id; - const char *bytes; - - val = cx->fp->sp[-3]; - if (!JS_ValueToECMAUint32 (cx, cx->fp->sp[-2], &id)) - return JS_FALSE; - bytes = swfdec_eval_jsval (cx, NULL, &val); - if (!bytes) - return JS_FALSE; - if (id > (((SwfdecScript *) cx->fp->swf)->version > 4 ? 21 : 18)) { - SWFDEC_WARNING ("trying to SetProperty %u, not allowed", id); - goto out; - } - if (*bytes == '\0' || *bytes == '.') - val = OBJECT_TO_JSVAL (cx->fp->varobj); - movie = swfdec_scriptable_from_jsval (cx, val, SWFDEC_TYPE_MOVIE); - if (movie == NULL) { - SWFDEC_WARNING ("specified target does not reference a movie clip"); - goto out; - } - jsobj = JSVAL_TO_OBJECT (val); - - if (!JS_SetProperty (cx, jsobj, properties[id], &cx->fp->sp[-1])) - return JS_FALSE; - -out: - cx->fp->sp -= 3; - return JS_TRUE; + swfdec_as_stack_pop (cx->frame->stack); } +#if 0 static void swfdec_action_binary (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { @@ -925,52 +918,6 @@ swfdec_action_add2_7 (SwfdecAsContext *c } static void -swfdec_action_get_member (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) -{ - const char *s; - jsval o; - - s = swfdec_js_to_string (cx, cx->fp->sp[-1]); - if (s == NULL) - return JS_FALSE; - - o = cx->fp->sp[-2]; - if (JSVAL_IS_OBJECT (o) && !JSVAL_IS_NULL (o)) { - if (!JS_GetProperty (cx, JSVAL_TO_OBJECT (o), s, &cx->fp->sp[-2])) - return JS_FALSE; -#ifdef SWFDEC_WARN_MISSING_PROPERTIES - if (cx->fp->sp[-2] == JSVAL_VOID) { - const JSClass *clasp = JS_GetClass (JSVAL_TO_OBJECT (o)); - if (clasp != &js_ObjectClass) { - SWFDEC_WARNING ("no variable named %s:%s", clasp->name, s); - } - } -#endif - } else { - cx->fp->sp[-2] = JSVAL_VOID; - } - cx->fp->sp--; - return JS_TRUE; -} - -static void -swfdec_action_set_member (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) -{ - const char *s; - - s = swfdec_js_to_string (cx, cx->fp->sp[-2]); - if (s == NULL) - return JS_FALSE; - - if (JSVAL_IS_OBJECT (cx->fp->sp[-3]) && !JSVAL_IS_NULL (cx->fp->sp[-3])) { - if (!JS_SetProperty (cx, JSVAL_TO_OBJECT (cx->fp->sp[-3]), s, &cx->fp->sp[-1])) - return JS_FALSE; - } - cx->fp->sp -= 3; - return JS_TRUE; -} - -static void swfdec_action_new_comparison_6 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { jsval lval, rval; @@ -2347,7 +2294,9 @@ const SwfdecActionSpec swfdec_as_actions [0x13] = { "StringEquals", NULL }, [0x14] = { "StringLength", NULL }, [0x15] = { "StringExtract", NULL }, - [0x17] = { "Pop", NULL, 1, 0, { NULL, swfdec_action_pop, swfdec_action_pop, swfdec_action_pop, swfdec_action_pop } }, +#endif + [SWFDEC_AS_ACTION_POP] = { "Pop", NULL, 1, 0, { NULL, swfdec_action_pop, swfdec_action_pop, swfdec_action_pop, swfdec_action_pop } }, +#if 0 [0x18] = { "ToInteger", NULL, 1, 1, { NULL, swfdec_action_to_integer, swfdec_action_to_integer, swfdec_action_to_integer, swfdec_action_to_integer } }, #endif [SWFDEC_AS_ACTION_GET_VARIABLE] = { "GetVariable", NULL, 1, 1, { NULL, swfdec_action_get_variable, swfdec_action_get_variable, swfdec_action_get_variable, swfdec_action_get_variable } }, @@ -2355,8 +2304,10 @@ const SwfdecActionSpec swfdec_as_actions #if 0 [0x20] = { "SetTarget2", NULL, 1, 0, { swfdec_action_set_target2, swfdec_action_set_target2, swfdec_action_set_target2, swfdec_action_set_target2, swfdec_action_set_target2 } }, [0x21] = { "StringAdd", NULL, 2, 1, { NULL, swfdec_action_string_add, swfdec_action_string_add, swfdec_action_string_add, swfdec_action_string_add } }, +#endif [0x22] = { "GetProperty", NULL, 2, 1, { NULL, swfdec_action_get_property, swfdec_action_get_property, swfdec_action_get_property, swfdec_action_get_property } }, [0x23] = { "SetProperty", NULL, 3, 0, { NULL, swfdec_action_set_property, swfdec_action_set_property, swfdec_action_set_property, swfdec_action_set_property } }, +#if 0 [0x24] = { "CloneSprite", NULL }, [0x25] = { "RemoveSprite", NULL }, [0x26] = { "Trace", NULL, 1, 0, { NULL, swfdec_action_trace, swfdec_action_trace, swfdec_action_trace, swfdec_action_trace } }, @@ -2397,8 +2348,10 @@ const SwfdecActionSpec swfdec_as_actions [0x4b] = { "ToString", NULL, 1, 1, { NULL, NULL, swfdec_action_to_string, swfdec_action_to_string, swfdec_action_to_string } }, [0x4c] = { "PushDuplicate", NULL, 1, 2, { NULL, NULL, swfdec_action_push_duplicate, swfdec_action_push_duplicate, swfdec_action_push_duplicate } }, [0x4d] = { "Swap", NULL, 2, 2, { NULL, NULL, swfdec_action_swap, swfdec_action_swap, swfdec_action_swap } }, - [0x4e] = { "GetMember", NULL, 2, 1, { NULL, swfdec_action_get_member, swfdec_action_get_member, swfdec_action_get_member, swfdec_action_get_member } }, - [0x4f] = { "SetMember", NULL, 3, 0, { NULL, swfdec_action_set_member, swfdec_action_set_member, swfdec_action_set_member, swfdec_action_set_member } }, +#endif + [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 } }, + [SWFDEC_AS_ACTION_SET_MEMBER] = { "SetMember", NULL, 3, 0, { NULL, swfdec_action_set_member, swfdec_action_set_member, swfdec_action_set_member, swfdec_action_set_member } }, +#if 0 [0x50] = { "Increment", NULL, 1, 1, { NULL, NULL, swfdec_action_increment, swfdec_action_increment, swfdec_action_increment } }, [0x51] = { "Decrement", NULL, 1, 1, { NULL, NULL, swfdec_action_decrement, swfdec_action_decrement, swfdec_action_decrement } }, [0x52] = { "CallMethod", NULL, -1, 1, { NULL, NULL, swfdec_action_call_method, swfdec_action_call_method, swfdec_action_call_method } }, diff-tree bcf8141b997f93bcc6581c5effa8abfdc2131d2e (from 7f368a0aa96f48fd8e99c40c42b0f22cadef75a5) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:33:49 2007 +0200 implement eval completely diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 47458b9..1adebe6 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -505,16 +505,18 @@ swfdec_as_context_eval_get_property (Swf if (obj) { swfdec_as_object_get (obj, name, ret); } else { - g_assert_not_reached (); -#if 0 - if (cx->fp == NULL || cx->fp->scopeChain == NULL) - return JS_FALSE; - if (!js_FindProperty (cx, (jsid) atom, &obj, &pobj, &prop)) - return JS_FALSE; - if (!prop) - return JS_FALSE; - return OBJ_GET_PROPERTY (cx, obj, (jsid) prop->id, ret); -#endif + SwfdecAsValue val; + SWFDEC_AS_VALUE_SET_STRING (&val, name); + if (cx->frame) { + obj = swfdec_as_frame_find_variable (cx->frame, &val); + if (obj) { + swfdec_as_object_get_variable (obj, &val, ret); + return; + } + } else { + SWFDEC_ERROR ("no frame in eval?"); + } + SWFDEC_AS_VALUE_SET_UNDEFINED (ret); } } @@ -523,21 +525,17 @@ swfdec_as_context_eval_set_property (Swf SwfdecAsObject *obj, const char *name, const SwfdecAsValue *ret) { if (obj == NULL) { - g_assert_not_reached (); -#if 0 - JSObject *pobj; - JSProperty *prop; - if (cx->fp == NULL || cx->fp->varobj == NULL) - return JS_FALSE; - if (!js_FindProperty (cx, (jsid) atom, &obj, &pobj, &prop)) - return JS_FALSE; - if (pobj) - obj = pobj; - else - obj = cx->fp->varobj; -#endif + SwfdecAsValue val; + SWFDEC_AS_VALUE_SET_STRING (&val, name); + if (cx->frame == NULL) { + SWFDEC_ERROR ("no frame in eval_set?"); + return; + } + obj = swfdec_as_frame_find_variable (cx->frame, &val); + if (obj == NULL) + obj = cx->frame->var_object; } - return swfdec_as_object_set (obj, name, ret); + swfdec_as_object_set (obj, name, ret); } static void diff-tree 7f368a0aa96f48fd8e99c40c42b0f22cadef75a5 (from d4da7e1074456705c898d9bb14d431ef21472cb7) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:32:37 2007 +0200 Require C99 and implement some functions I'm too lazy to define NaN and +-Infinity myself. And swfdec_as_value_to_number needs those. diff --git a/configure.ac b/configure.ac index fdf2a31..d04bd19 100644 --- a/configure.ac +++ b/configure.ac @@ -37,6 +37,9 @@ SWFDEC_LIBVERSION="3:0:0" AC_SUBST(SWFDEC_LIBVERSION) AM_PROG_LIBTOOL +dnl C99 is only required to get definitions for NAN and INFINITY. +GLOBAL_CFLAGS="$GLOBAL_CFLAGS -std=c99" + dnl Add parameters for aclocal dnl (This must come after AM_INIT_AUTOMAKE, since it modifies ACLOCAL) #ACLOCAL_AMFLAGS="-I m4 $ACLOCAL_AMFLAGS" diff --git a/libswfdec/swfdec_as_types.c b/libswfdec/swfdec_as_types.c index 14cb0e4..45fd7ce 100644 --- a/libswfdec/swfdec_as_types.c +++ b/libswfdec/swfdec_as_types.c @@ -21,6 +21,8 @@ #include "config.h" #endif +#include <math.h> + #include "swfdec_as_types.h" #include "swfdec_as_object.h" #include "swfdec_as_context.h" @@ -67,6 +69,28 @@ const char *swfdec_as_strings[] = { SWFDEC_AS_CONSTANT_STRING ("[object Object]"), SWFDEC_AS_CONSTANT_STRING ("true"), SWFDEC_AS_CONSTANT_STRING ("false"), + SWFDEC_AS_CONSTANT_STRING ("_x"), + SWFDEC_AS_CONSTANT_STRING ("_y"), + SWFDEC_AS_CONSTANT_STRING ("_xscale"), + SWFDEC_AS_CONSTANT_STRING ("_yscale"), + SWFDEC_AS_CONSTANT_STRING ("_currentframe"), + SWFDEC_AS_CONSTANT_STRING ("_totalframes"), + SWFDEC_AS_CONSTANT_STRING ("_alpha"), + SWFDEC_AS_CONSTANT_STRING ("_visible"), + SWFDEC_AS_CONSTANT_STRING ("_width"), + SWFDEC_AS_CONSTANT_STRING ("_height"), + SWFDEC_AS_CONSTANT_STRING ("_rotation"), + SWFDEC_AS_CONSTANT_STRING ("_target"), + SWFDEC_AS_CONSTANT_STRING ("_framesloaded"), + SWFDEC_AS_CONSTANT_STRING ("_name"), + SWFDEC_AS_CONSTANT_STRING ("_droptarget"), + SWFDEC_AS_CONSTANT_STRING ("_url"), + SWFDEC_AS_CONSTANT_STRING ("_highquality"), + SWFDEC_AS_CONSTANT_STRING ("_focusrect"), + SWFDEC_AS_CONSTANT_STRING ("_soundbuftime"), + SWFDEC_AS_CONSTANT_STRING ("_quality"), + SWFDEC_AS_CONSTANT_STRING ("_xmouse"), + SWFDEC_AS_CONSTANT_STRING ("_ymouse"), /* add more here */ NULL }; @@ -107,10 +131,50 @@ swfdec_as_value_to_string (SwfdecAsConte return ret; } case SWFDEC_TYPE_AS_ASOBJECT: - /* FIXME! */ + SWFDEC_ERROR ("FIXME"); return SWFDEC_AS_STR_OBJECT_OBJECT; default: g_assert_not_reached (); return SWFDEC_AS_STR_EMPTY; } } + +double +swfdec_as_value_to_number (SwfdecAsContext *context, const SwfdecAsValue *value) +{ + g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), 0.0); + g_return_val_if_fail (SWFDEC_IS_AS_VALUE (value), 0.0); + + switch (value->type) { + case SWFDEC_TYPE_AS_UNDEFINED: + case SWFDEC_TYPE_AS_NULL: + return (context->version >= 7) ? NAN : 0.0; + case SWFDEC_TYPE_AS_BOOLEAN: + return SWFDEC_AS_VALUE_GET_BOOLEAN (value) ? 1 : 0; + case SWFDEC_TYPE_AS_NUMBER: + return SWFDEC_AS_VALUE_GET_NUMBER (value); + case SWFDEC_TYPE_AS_STRING: + { + char *end; + double d = g_ascii_strtod (SWFDEC_AS_VALUE_GET_STRING (value), &end); + if (*end == '\0') + return d; + else + return NAN; + } + case SWFDEC_TYPE_AS_ASOBJECT: + SWFDEC_ERROR ("FIXME"); + return NAN; + default: + g_assert_not_reached (); + return NAN; + } +} + +int +swfdec_as_value_to_integer (SwfdecAsContext *context, const SwfdecAsValue *value) +{ + /* FIXME */ + return swfdec_as_value_to_number (context, value); +} + diff --git a/libswfdec/swfdec_as_types.h b/libswfdec/swfdec_as_types.h index fe25c3f..b85a094 100644 --- a/libswfdec/swfdec_as_types.h +++ b/libswfdec/swfdec_as_types.h @@ -58,7 +58,7 @@ struct _SwfdecAsValue { #define SWFDEC_AS_VALUE_SET_UNDEFINED(val) (val)->type = SWFDEC_TYPE_AS_UNDEFINED #define SWFDEC_AS_VALUE_IS_BOOLEAN(val) ((val)->type == SWFDEC_TYPE_AS_BOOLEAN) -#define SWFDEC_AS_VALUE_GET_BOOLEAN(val) (g_assert ((val)->type == SWFDEC_TYPE_AS_BOOLEAN), (val)->value.boolean) +#define SWFDEC_AS_VALUE_GET_BOOLEAN(val) ((val)->value.boolean) #define SWFDEC_AS_VALUE_SET_BOOLEAN(val,b) G_STMT_START { \ SwfdecAsValue *__val = (val); \ (__val)->type = SWFDEC_TYPE_AS_BOOLEAN; \ @@ -66,7 +66,7 @@ struct _SwfdecAsValue { } G_STMT_END #define SWFDEC_AS_VALUE_IS_NUMBER(val) ((val)->type == SWFDEC_TYPE_AS_NUMBER) -#define SWFDEC_AS_VALUE_GET_NUMBER(val) (g_assert ((val)->type == SWFDEC_TYPE_AS_NUMBER), (val)->value.number) +#define SWFDEC_AS_VALUE_GET_NUMBER(val) ((val)->value.number) #define SWFDEC_AS_VALUE_SET_NUMBER(val,d) G_STMT_START { \ SwfdecAsValue *__val = (val); \ (__val)->type = SWFDEC_TYPE_AS_NUMBER; \ @@ -74,7 +74,7 @@ struct _SwfdecAsValue { } G_STMT_END #define SWFDEC_AS_VALUE_IS_STRING(val) ((val)->type == SWFDEC_TYPE_AS_STRING) -#define SWFDEC_AS_VALUE_GET_STRING(val) (g_assert ((val)->type == SWFDEC_TYPE_AS_STRING), (val)->value.string) +#define SWFDEC_AS_VALUE_GET_STRING(val) ((val)->value.string) #define SWFDEC_AS_VALUE_SET_STRING(val,s) G_STMT_START { \ SwfdecAsValue *__val = (val); \ (__val)->type = SWFDEC_TYPE_AS_STRING; \ @@ -85,7 +85,7 @@ struct _SwfdecAsValue { #define SWFDEC_AS_VALUE_SET_NULL(val) (val)->type = SWFDEC_TYPE_AS_NULL #define SWFDEC_AS_VALUE_IS_OBJECT(val) ((val)->type == SWFDEC_TYPE_AS_ASOBJECT) -#define SWFDEC_AS_VALUE_GET_OBJECT(val) (g_assert ((val)->type == SWFDEC_TYPE_AS_ASOBJECT), (val)->value.object) +#define SWFDEC_AS_VALUE_GET_OBJECT(val) ((val)->value.object) #define SWFDEC_AS_VALUE_SET_OBJECT(val,o) G_STMT_START { \ SwfdecAsValue *__val = (val); \ (__val)->type = SWFDEC_TYPE_AS_ASOBJECT; \ @@ -95,45 +95,69 @@ struct _SwfdecAsValue { /* List of static strings that are required all the time */ extern const char *swfdec_as_strings[]; -#define SWFDEC_AS_STR_EMPTY (swfdec_as_strings[0] + 1) -#define SWFDEC_AS_STR_PROTO (swfdec_as_strings[1] + 1) -#define SWFDEC_AS_STR_THIS (swfdec_as_strings[2] + 1) -#define SWFDEC_AS_STR_CODE (swfdec_as_strings[3] + 1) -#define SWFDEC_AS_STR_LEVEL (swfdec_as_strings[4] + 1) -#define SWFDEC_AS_STR_DESCRIPTION (swfdec_as_strings[5] + 1) -#define SWFDEC_AS_STR_STATUS (swfdec_as_strings[6] + 1) -#define SWFDEC_AS_STR_SUCCESS (swfdec_as_strings[7] + 1) -#define SWFDEC_AS_STR_NET_CONNECTION_CONNECT_SUCCESS (swfdec_as_strings[8] + 1) -#define SWFDEC_AS_STR_ON_LOAD (swfdec_as_strings[9] + 1) -#define SWFDEC_AS_STR_ON_ENTER_FRAME (swfdec_as_strings[10] + 1) -#define SWFDEC_AS_STR_ON_UNLOAD (swfdec_as_strings[11] + 1) -#define SWFDEC_AS_STR_ON_MOUSE_MOVE (swfdec_as_strings[12] + 1) -#define SWFDEC_AS_STR_ON_MOUSE_DOWN (swfdec_as_strings[13] + 1) -#define SWFDEC_AS_STR_ON_MOUSE_UP (swfdec_as_strings[14] + 1) -#define SWFDEC_AS_STR_ON_KEY_UP (swfdec_as_strings[15] + 1) -#define SWFDEC_AS_STR_ON_KEY_DOWN (swfdec_as_strings[16] + 1) -#define SWFDEC_AS_STR_ON_DATA (swfdec_as_strings[17] + 1) -#define SWFDEC_AS_STR_ON_PRESS (swfdec_as_strings[18] + 1) -#define SWFDEC_AS_STR_ON_RELEASE (swfdec_as_strings[19] + 1) -#define SWFDEC_AS_STR_ON_RELEASE_OUTSIDE (swfdec_as_strings[20] + 1) -#define SWFDEC_AS_STR_ON_ROLL_OVER (swfdec_as_strings[21] + 1) -#define SWFDEC_AS_STR_ON_ROLL_OUT (swfdec_as_strings[22] + 1) -#define SWFDEC_AS_STR_ON_DRAG_OVER (swfdec_as_strings[23] + 1) -#define SWFDEC_AS_STR_ON_DRAG_OUT (swfdec_as_strings[24] + 1) -#define SWFDEC_AS_STR_ON_CONSTRUCT (swfdec_as_strings[25] + 1) -#define SWFDEC_AS_STR_ON_STATUS (swfdec_as_strings[26] + 1) -#define SWFDEC_AS_STR_ERROR (swfdec_as_strings[27] + 1) -#define SWFDEC_AS_STR_NETSTREAM_BUFFER_EMPTY (swfdec_as_strings[28] + 1) -#define SWFDEC_AS_STR_NETSTREAM_BUFFER_FULL (swfdec_as_strings[29] + 1) -#define SWFDEC_AS_STR_NETSTREAM_BUFFER_FLUSH (swfdec_as_strings[30] + 1) -#define SWFDEC_AS_STR_NETSTREAM_PLAY_START (swfdec_as_strings[31] + 1) -#define SWFDEC_AS_STR_NETSTREAM_PLAY_STOP (swfdec_as_strings[32] + 1) -#define SWFDEC_AS_STR_NETSTREAM_PLAY_STREAMNOTFOUND (swfdec_as_strings[33] + 1) -#define SWFDEC_AS_STR_UNDEFINED (swfdec_as_strings[34] + 1) -#define SWFDEC_AS_STR_NULL (swfdec_as_strings[35] + 1) -#define SWFDEC_AS_STR_OBJECT_OBJECT (swfdec_as_strings[36] + 1) -#define SWFDEC_AS_STR_TRUE (swfdec_as_strings[37] + 1) -#define SWFDEC_AS_STR_FALSE (swfdec_as_strings[38] + 1) +#define SWFDEC_AS_STR_CONSTANT(n) (swfdec_as_strings[(n)] + 1) + +#define SWFDEC_AS_STR_EMPTY SWFDEC_AS_STR_CONSTANT(0) +#define SWFDEC_AS_STR_PROTO SWFDEC_AS_STR_CONSTANT(1) +#define SWFDEC_AS_STR_THIS SWFDEC_AS_STR_CONSTANT(2) +#define SWFDEC_AS_STR_CODE SWFDEC_AS_STR_CONSTANT(3) +#define SWFDEC_AS_STR_LEVEL SWFDEC_AS_STR_CONSTANT(4) +#define SWFDEC_AS_STR_DESCRIPTION SWFDEC_AS_STR_CONSTANT(5) +#define SWFDEC_AS_STR_STATUS SWFDEC_AS_STR_CONSTANT(6) +#define SWFDEC_AS_STR_SUCCESS SWFDEC_AS_STR_CONSTANT(7) +#define SWFDEC_AS_STR_NET_CONNECTION_CONNECT_SUCCESS SWFDEC_AS_STR_CONSTANT(8) +#define SWFDEC_AS_STR_ON_LOAD SWFDEC_AS_STR_CONSTANT(9) +#define SWFDEC_AS_STR_ON_ENTER_FRAME SWFDEC_AS_STR_CONSTANT(10) +#define SWFDEC_AS_STR_ON_UNLOAD SWFDEC_AS_STR_CONSTANT(11) +#define SWFDEC_AS_STR_ON_MOUSE_MOVE SWFDEC_AS_STR_CONSTANT(12) +#define SWFDEC_AS_STR_ON_MOUSE_DOWN SWFDEC_AS_STR_CONSTANT(13) +#define SWFDEC_AS_STR_ON_MOUSE_UP SWFDEC_AS_STR_CONSTANT(14) +#define SWFDEC_AS_STR_ON_KEY_UP SWFDEC_AS_STR_CONSTANT(15) +#define SWFDEC_AS_STR_ON_KEY_DOWN SWFDEC_AS_STR_CONSTANT(16) +#define SWFDEC_AS_STR_ON_DATA SWFDEC_AS_STR_CONSTANT(17) +#define SWFDEC_AS_STR_ON_PRESS SWFDEC_AS_STR_CONSTANT(18) +#define SWFDEC_AS_STR_ON_RELEASE SWFDEC_AS_STR_CONSTANT(19) +#define SWFDEC_AS_STR_ON_RELEASE_OUTSIDE SWFDEC_AS_STR_CONSTANT(20) +#define SWFDEC_AS_STR_ON_ROLL_OVER SWFDEC_AS_STR_CONSTANT(21) +#define SWFDEC_AS_STR_ON_ROLL_OUT SWFDEC_AS_STR_CONSTANT(22) +#define SWFDEC_AS_STR_ON_DRAG_OVER SWFDEC_AS_STR_CONSTANT(23) +#define SWFDEC_AS_STR_ON_DRAG_OUT SWFDEC_AS_STR_CONSTANT(24) +#define SWFDEC_AS_STR_ON_CONSTRUCT SWFDEC_AS_STR_CONSTANT(25) +#define SWFDEC_AS_STR_ON_STATUS SWFDEC_AS_STR_CONSTANT(26) +#define SWFDEC_AS_STR_ERROR SWFDEC_AS_STR_CONSTANT(27) +#define SWFDEC_AS_STR_NETSTREAM_BUFFER_EMPTY SWFDEC_AS_STR_CONSTANT(28) +#define SWFDEC_AS_STR_NETSTREAM_BUFFER_FULL SWFDEC_AS_STR_CONSTANT(29) +#define SWFDEC_AS_STR_NETSTREAM_BUFFER_FLUSH SWFDEC_AS_STR_CONSTANT(30) +#define SWFDEC_AS_STR_NETSTREAM_PLAY_START SWFDEC_AS_STR_CONSTANT(31) +#define SWFDEC_AS_STR_NETSTREAM_PLAY_STOP SWFDEC_AS_STR_CONSTANT(32) +#define SWFDEC_AS_STR_NETSTREAM_PLAY_STREAMNOTFOUND SWFDEC_AS_STR_CONSTANT(33) +#define SWFDEC_AS_STR_UNDEFINED SWFDEC_AS_STR_CONSTANT(34) +#define SWFDEC_AS_STR_NULL SWFDEC_AS_STR_CONSTANT(35) +#define SWFDEC_AS_STR_OBJECT_OBJECT SWFDEC_AS_STR_CONSTANT(36) +#define SWFDEC_AS_STR_TRUE SWFDEC_AS_STR_CONSTANT(37) +#define SWFDEC_AS_STR_FALSE SWFDEC_AS_STR_CONSTANT(38) +#define SWFDEC_AS_STR__X SWFDEC_AS_STR_CONSTANT(39) +#define SWFDEC_AS_STR__Y SWFDEC_AS_STR_CONSTANT(40) +#define SWFDEC_AS_STR__XSCALE SWFDEC_AS_STR_CONSTANT(41) +#define SWFDEC_AS_STR__YSCALE SWFDEC_AS_STR_CONSTANT(42) +#define SWFDEC_AS_STR__CURRENTFRAME SWFDEC_AS_STR_CONSTANT(43) +#define SWFDEC_AS_STR__TOTALFRAMES SWFDEC_AS_STR_CONSTANT(44) +#define SWFDEC_AS_STR__ALPHA SWFDEC_AS_STR_CONSTANT(45) +#define SWFDEC_AS_STR__VISIBLE SWFDEC_AS_STR_CONSTANT(46) +#define SWFDEC_AS_STR__WIDTH SWFDEC_AS_STR_CONSTANT(47) +#define SWFDEC_AS_STR__HEIGHT SWFDEC_AS_STR_CONSTANT(48) +#define SWFDEC_AS_STR__ROTATION SWFDEC_AS_STR_CONSTANT(49) +#define SWFDEC_AS_STR__TARGET SWFDEC_AS_STR_CONSTANT(50) +#define SWFDEC_AS_STR__FRAMESLOADED SWFDEC_AS_STR_CONSTANT(51) +#define SWFDEC_AS_STR__NAME SWFDEC_AS_STR_CONSTANT(52) +#define SWFDEC_AS_STR__DROPTARGET SWFDEC_AS_STR_CONSTANT(53) +#define SWFDEC_AS_STR__URL SWFDEC_AS_STR_CONSTANT(54) +#define SWFDEC_AS_STR__HIGHQUALITY SWFDEC_AS_STR_CONSTANT(55) +#define SWFDEC_AS_STR__FOCUSRECT SWFDEC_AS_STR_CONSTANT(56) +#define SWFDEC_AS_STR__SOUNDBUFTIME SWFDEC_AS_STR_CONSTANT(57) +#define SWFDEC_AS_STR__QUALITY SWFDEC_AS_STR_CONSTANT(58) +#define SWFDEC_AS_STR__XMOUSE SWFDEC_AS_STR_CONSTANT(59) +#define SWFDEC_AS_STR__YMOUSE SWFDEC_AS_STR_CONSTANT(60) /* all existing actions */ typedef enum { @@ -236,6 +260,10 @@ typedef enum { const char * swfdec_as_value_to_string (SwfdecAsContext * context, const SwfdecAsValue * value); +double swfdec_as_value_to_number (SwfdecAsContext * context, + const SwfdecAsValue * value); +int swfdec_as_value_to_integer (SwfdecAsContext * context, + const SwfdecAsValue * value); G_END_DECLS diff-tree d4da7e1074456705c898d9bb14d431ef21472cb7 (from 565b17764bca8304bb09120bc492d2459ebec791) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:30:45 2007 +0200 improve comment diff --git a/libswfdec/swfdec_as_function.h b/libswfdec/swfdec_as_function.h index 818d7cb..b8457e5 100644 --- a/libswfdec/swfdec_as_function.h +++ b/libswfdec/swfdec_as_function.h @@ -48,7 +48,7 @@ struct _SwfdecAsFunction { /* for script functions */ SwfdecScript * script; /* script being executed or NULL when native */ - SwfdecAsObject * scope; /* scope object coming after this */ + SwfdecAsObject * scope; /* scope this function was defined in or NULL */ }; struct _SwfdecAsFunctionClass { diff-tree 565b17764bca8304bb09120bc492d2459ebec791 (from cd7d3ebecd447ea26d88958ad2856f4e43e2e843) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:30:30 2007 +0200 Add swfdec_as_frame_find_variable Finds the variable in the current scope chain or NULL diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 4614f7c..d2f3256 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -117,3 +117,27 @@ swfdec_as_frame_new (SwfdecAsObject *thi return frame; } +SwfdecAsObject * +swfdec_as_frame_find_variable (SwfdecAsFrame *frame, const SwfdecAsValue *variable) +{ + SwfdecAsObject *ret = NULL; + guint i; + + g_return_val_if_fail (SWFDEC_IS_AS_FRAME (frame), NULL); + g_return_val_if_fail (SWFDEC_IS_AS_VALUE (variable), NULL); + + for (i = 0; i < 256 && frame != NULL; i++) { + ret = swfdec_as_object_find_variable (frame->scope, variable); + if (ret) + break; + if (!SWFDEC_IS_AS_FRAME (frame->scope)) + break; + frame = SWFDEC_AS_FRAME (frame->scope); + } + if (i == 256) { + swfdec_as_context_abort (SWFDEC_AS_OBJECT (frame)->context, "Scope recursion limit exceeded"); + return NULL; + } + return ret; +} + diff --git a/libswfdec/swfdec_as_frame.h b/libswfdec/swfdec_as_frame.h index dd627cd..1753137 100644 --- a/libswfdec/swfdec_as_frame.h +++ b/libswfdec/swfdec_as_frame.h @@ -40,7 +40,7 @@ struct _SwfdecAsFrame { SwfdecAsFrame * next; /* next frame (FIXME: keep a list in the context instead?) */ SwfdecScript * script; /* script being executed */ - SwfdecAsObject * scope; /* scope object coming after this */ + SwfdecAsObject * scope; /* scope object coming after this or NULL */ SwfdecAsObject * var_object; /* new variables go here */ SwfdecAsValue * registers; /* the registers */ guint n_registers; /* number of allocated registers */ @@ -59,6 +59,8 @@ GType swfdec_as_frame_get_type (void); SwfdecAsFrame * swfdec_as_frame_new (SwfdecAsObject * thisp, SwfdecScript * script); +SwfdecAsObject *swfdec_as_frame_find_variable (SwfdecAsFrame * frame, + const SwfdecAsValue * variable); G_END_DECLS diff-tree cd7d3ebecd447ea26d88958ad2856f4e43e2e843 (from 04caa48b48e55a62787a5b5bd7f2ee77d330ebbf) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:28:14 2007 +0200 Add swfdec_as_object_find_variable Finds the object in the prototype chain that defines the variable or NULL diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index a8cb206..588094f 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -250,6 +250,29 @@ swfdec_as_object_delete_variable (Swfdec } } +SwfdecAsObject * +swfdec_as_object_find_variable (SwfdecAsObject *object, + const SwfdecAsValue *variable) +{ + const char *s; + guint i; + + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL); + g_return_val_if_fail (SWFDEC_IS_AS_VALUE (variable), NULL); + + s = swfdec_as_value_to_string (object->context, variable); + for (i = 0; i < 256 && object != NULL; i++) { + if (g_hash_table_lookup (object->properties, s)) + return object; + object = object->prototype; + } + if (i == 256) { + swfdec_as_context_abort (object->context, "Prototype recursion limit exceeded"); + return NULL; + } + return NULL; +} + /** * swfdec_as_object_run: * @object: a #SwfdecAsObject diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h index 6462784..b7f7a2a 100644 --- a/libswfdec/swfdec_as_object.h +++ b/libswfdec/swfdec_as_object.h @@ -80,6 +80,9 @@ void swfdec_as_object_get_variable (Swf SwfdecAsValue * value); void swfdec_as_object_delete_variable(SwfdecAsObject * object, const SwfdecAsValue * variable); +SwfdecAsObject *swfdec_as_object_find_variable (SwfdecAsObject * object, + const SwfdecAsValue * variable); + /* shortcuts, you probably don't want to bind them */ #define swfdec_as_object_set(object, name, value) G_STMT_START { \ SwfdecAsValue __variable; \ diff-tree 04caa48b48e55a62787a5b5bd7f2ee77d330ebbf (from 737748443383004fd830136283af95dc9f8c2a20) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:27:06 2007 +0200 add swfdec_as_stack_pop_n diff --git a/libswfdec/swfdec_as_stack.h b/libswfdec/swfdec_as_stack.h index a5b14a6..49c57a7 100644 --- a/libswfdec/swfdec_as_stack.h +++ b/libswfdec/swfdec_as_stack.h @@ -40,6 +40,7 @@ void swfdec_as_stack_free (SwfdecAsSta #define swfdec_as_stack_peek(stack,n) (&(stack)->cur[-(gssize)(n)]) #define swfdec_as_stack_pop(stack) (--(stack)->cur) +#define swfdec_as_stack_pop_n(stack, n) ((stack)->cur -= (n)) #define swfdec_as_stack_push(stack) ((stack)->cur++) #define swfdec_as_stack_get_size(stack) ((guint)((stack)->cur - (stack)->base)) diff-tree 737748443383004fd830136283af95dc9f8c2a20 (from 6fde0b1cfdf42ab05cf00b60030f926be534efd2) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:26:50 2007 +0200 fix gcc warning diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 04d89a3..b9d39ed 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -472,7 +472,7 @@ swfdec_net_stream_seek (SwfdecNetStream if (stream->flvdecoder == NULL) return; - if (!finite (secs) || secs < 0) { + if (!isfinite (secs) || secs < 0) { SWFDEC_ERROR ("seeking to %g doesn't work", secs); return; } diff-tree 6fde0b1cfdf42ab05cf00b60030f926be534efd2 (from d646f6672f12f65ebab2bf3afd607df71af77dd6) Author: Benjamin Otte <otte@gnome.org> Date: Thu Apr 5 15:26:43 2007 +0200 fix gcc warning diff --git a/libswfdec/swfdec_flv_decoder.c b/libswfdec/swfdec_flv_decoder.c index fe35ed2..10b97c3 100644 --- a/libswfdec/swfdec_flv_decoder.c +++ b/libswfdec/swfdec_flv_decoder.c @@ -385,8 +385,9 @@ swfdec_flv_decoder_parse_tag (SwfdecFlvD swfdec_bits_init (&bits, buffer); type = swfdec_bits_get_u8 (&bits); /* I think I'm paranoid and complicated. I think I'm paranoid, manipulated */ - if (size != swfdec_bits_get_bu24 (&bits)) + if (size != swfdec_bits_get_bu24 (&bits)) { g_assert_not_reached (); + } timestamp = swfdec_bits_get_bu24 (&bits); swfdec_bits_get_bu32 (&bits); SWFDEC_LOG ("new tag");
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
- Branch 'as' - 4 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_types.c libswfdec/swfdec_as_types.h
- 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' - 7 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_strings.c
- Branch 'as' - 16 commits - configure.ac libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_script_function.c