Benjamin Otte
2007-May-24 22:31 UTC
[Swfdec] Branch 'as' - 11 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_native_function.c libswfdec/swfdec_as_number.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_script_function.c libswfdec/swfdec_as_super.c libswfdec/swfdec_as_types.c libswfdec/swfdec_as_types.h libswfdec/swfdec_player.c libswfdec/swfdec_sprite_movie.c
libswfdec/swfdec_as_array.c | 2 - libswfdec/swfdec_as_context.c | 1 libswfdec/swfdec_as_function.c | 13 ++---- libswfdec/swfdec_as_interpret.c | 5 +- libswfdec/swfdec_as_native_function.c | 1 libswfdec/swfdec_as_number.c | 2 - libswfdec/swfdec_as_object.c | 20 +++++++--- libswfdec/swfdec_as_object.h | 6 ++- libswfdec/swfdec_as_script_function.c | 1 libswfdec/swfdec_as_super.c | 67 +++++++++++++++++++++++++++++++--- libswfdec/swfdec_as_types.c | 46 ++++++++++++++++------- libswfdec/swfdec_as_types.h | 1 libswfdec/swfdec_player.c | 2 - libswfdec/swfdec_sprite_movie.c | 2 - 14 files changed, 129 insertions(+), 40 deletions(-) New commits: diff-tree b0c6f9795a20bb5e9f98e3f1afe286d81bbef7a2 (from 8e153b97a76a8fa425210bf62dadfcf1aa1e979a) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 19:05:05 2007 +0200 really delete a variable diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index bee692a..451d5bc 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -150,6 +150,9 @@ swfdec_as_object_do_delete (SwfdecAsObje var = g_hash_table_lookup (object->properties, variable); g_assert (var); swfdec_as_object_free_property (NULL, var, object); + if (!g_hash_table_remove (object->properties, variable)) { + g_assert_not_reached (); + } } typedef struct { diff-tree 8e153b97a76a8fa425210bf62dadfcf1aa1e979a (from 9750fc7b351d4971b5027d7e7317955c2de4322a) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 18:43:33 2007 +0200 add swfdec_as_value_to_primitive diff --git a/libswfdec/swfdec_as_types.c b/libswfdec/swfdec_as_types.c index 07aa538..2004e71 100644 --- a/libswfdec/swfdec_as_types.c +++ b/libswfdec/swfdec_as_types.c @@ -230,24 +230,29 @@ swfdec_as_value_to_printable (SwfdecAsCo double swfdec_as_value_to_number (SwfdecAsContext *context, const SwfdecAsValue *value) { + SwfdecAsValue tmp; + 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) { + tmp = *value; + swfdec_as_value_to_primitive (&tmp); + + switch (tmp.type) { case SWFDEC_AS_TYPE_UNDEFINED: case SWFDEC_AS_TYPE_NULL: return (context->version >= 7) ? NAN : 0.0; case SWFDEC_AS_TYPE_BOOLEAN: - return SWFDEC_AS_VALUE_GET_BOOLEAN (value) ? 1 : 0; + return SWFDEC_AS_VALUE_GET_BOOLEAN (&tmp) ? 1 : 0; case SWFDEC_AS_TYPE_NUMBER: - return SWFDEC_AS_VALUE_GET_NUMBER (value); + return SWFDEC_AS_VALUE_GET_NUMBER (&tmp); case SWFDEC_AS_TYPE_STRING: { const char *s; char *end; double d; - s = SWFDEC_AS_VALUE_GET_STRING (value); + s = SWFDEC_AS_VALUE_GET_STRING (&tmp); if (s == SWFDEC_AS_STR_EMPTY) return NAN; d = g_ascii_strtod (s, &end); @@ -257,15 +262,6 @@ swfdec_as_value_to_number (SwfdecAsConte return NAN; } case SWFDEC_AS_TYPE_OBJECT: - { - SwfdecAsValue ret; - swfdec_as_object_call (SWFDEC_AS_VALUE_GET_OBJECT (value), SWFDEC_AS_STR_valueOf, - 0, NULL, &ret); - if (SWFDEC_AS_VALUE_IS_OBJECT (&ret)) - return NAN; - else - return swfdec_as_value_to_number (context, &ret); - } default: g_assert_not_reached (); return NAN; @@ -359,3 +355,27 @@ swfdec_as_value_to_boolean (SwfdecAsCont } } +/** + * swfdec_as_value_to_primitive: + * @context: a #SwfdecAsContext + * @value: value to convert + * + * Converts the given @value inline to its primitive value. Primitive values + * are values that are not objects. If the value is an object, the object's + * valueOf function is called. If the result of that function is still an + * object, @value is set to undefined. + **/ +void +swfdec_as_value_to_primitive (SwfdecAsValue *value) +{ + g_return_if_fail (SWFDEC_IS_AS_VALUE (value)); + + if (SWFDEC_AS_VALUE_IS_OBJECT (value)) { + swfdec_as_object_call (SWFDEC_AS_VALUE_GET_OBJECT (value), SWFDEC_AS_STR_valueOf, + 0, NULL, value); + if (SWFDEC_AS_VALUE_IS_OBJECT (value)) { + SWFDEC_AS_VALUE_SET_UNDEFINED (value); + } + } +} + diff --git a/libswfdec/swfdec_as_types.h b/libswfdec/swfdec_as_types.h index e89a656..2d02b48 100644 --- a/libswfdec/swfdec_as_types.h +++ b/libswfdec/swfdec_as_types.h @@ -215,6 +215,7 @@ double swfdec_as_value_to_number (Swfde const SwfdecAsValue * value); SwfdecAsObject *swfdec_as_value_to_object (SwfdecAsContext * context, const SwfdecAsValue * value); +void swfdec_as_value_to_primitive (SwfdecAsValue * value); const char * swfdec_as_value_to_printable (SwfdecAsContext * context, const SwfdecAsValue * value); const char * swfdec_as_value_to_string (SwfdecAsContext * context, diff-tree 9750fc7b351d4971b5027d7e7317955c2de4322a (from cb168347a7ab95b8918e3d4d737e37bd693fda10) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 17:13:15 2007 +0200 Flash <= 5 has no Function object diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c index 2f0f0e7..1f174fb 100644 --- a/libswfdec/swfdec_as_function.c +++ b/libswfdec/swfdec_as_function.c @@ -101,12 +101,6 @@ swfdec_as_function_call (SwfdecAsFunctio /*** AS CODE ***/ -static void -swfdec_as_function_construct (SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) -{ - -} - void swfdec_as_function_init_context (SwfdecAsContext *context, guint version) { @@ -116,9 +110,13 @@ swfdec_as_function_init_context (SwfdecA g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context)); function = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, - SWFDEC_AS_STR_Function, 0, swfdec_as_function_construct, 0)); + SWFDEC_AS_STR_Function, 0, NULL, 0)); if (!function) return; + if (version < 6) { + /* deleting it later on is easier than duplicating swfdec_as_object_add_function() */ + swfdec_as_object_delete_variable (context->global, SWFDEC_AS_STR_Function); + } context->Function = function; SWFDEC_AS_VALUE_SET_OBJECT (&val, function); swfdec_as_object_set_variable (function, SWFDEC_AS_STR_constructor, &val); diff-tree cb168347a7ab95b8918e3d4d737e37bd693fda10 (from 12a24b52a62b851c41bc2393312ff5a5f18dc2df) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 17:11:28 2007 +0200 cosmetic fix diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 1cd8c89..bee692a 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -353,8 +353,7 @@ swfdec_as_object_get_variable (SwfdecAsO } void -swfdec_as_object_delete_variable (SwfdecAsObject *object, - const char *variable) +swfdec_as_object_delete_variable (SwfdecAsObject *object, const char *variable) { SwfdecAsObjectClass *klass; guint i, flags; diff-tree 12a24b52a62b851c41bc2393312ff5a5f18dc2df (from 88aa562b59d1b3193b06d3bdcf4b8a167a72152d) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 16:37:09 2007 +0200 fix ActionExtends to set __constructor__, not constructor diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index f0d27ce..70f5f78 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1675,7 +1675,7 @@ swfdec_action_extends (SwfdecAsContext * swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (super), SWFDEC_AS_STR_prototype, &proto); swfdec_as_object_set_variable (prototype, SWFDEC_AS_STR___proto__, &proto); - swfdec_as_object_set_variable (prototype, SWFDEC_AS_STR_constructor, + swfdec_as_object_set_variable (prototype, SWFDEC_AS_STR___constructor__, superclass); SWFDEC_AS_VALUE_SET_OBJECT (&proto, prototype); swfdec_as_object_set_variable (SWFDEC_AS_VALUE_GET_OBJECT (subclass), diff-tree 88aa562b59d1b3193b06d3bdcf4b8a167a72152d (from dd221847f7a93e4f7815b967a11d356f3603709d) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 16:36:43 2007 +0200 fix Super to look at the right variables diff --git a/libswfdec/swfdec_as_super.c b/libswfdec/swfdec_as_super.c index 5665e1a..6f5902f 100644 --- a/libswfdec/swfdec_as_super.c +++ b/libswfdec/swfdec_as_super.c @@ -35,20 +35,29 @@ static SwfdecAsFrame * swfdec_as_super_call (SwfdecAsFunction *function) { SwfdecAsSuper *super = SWFDEC_AS_SUPER (function); + SwfdecAsValue val; + SwfdecAsFunction *fun; SwfdecAsFunctionClass *klass; SwfdecAsFrame *frame; - if (super->constructor == NULL) { - SWFDEC_FIXME ("figure out what happens when super doesn't have a constructor"); + if (super->object == NULL) { + SWFDEC_WARNING ("super () called without a this object."); return NULL; } - klass = SWFDEC_AS_FUNCTION_GET_CLASS (super->constructor); - frame = klass->call (super->constructor); + if (super->object->prototype == NULL) + return NULL; + swfdec_as_object_get_variable (super->object->prototype, SWFDEC_AS_STR___constructor__, &val); + if (!SWFDEC_AS_VALUE_IS_OBJECT (&val) || + !SWFDEC_IS_AS_FUNCTION (fun = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val))) + return NULL; + + klass = SWFDEC_AS_FUNCTION_GET_CLASS (fun); + frame = klass->call (fun); /* We set the real function here. 1) swfdec_as_context_run() requires it. * And b) it makes more sense reading the constructor's name than reading "super" * in a debugger */ - frame->function = super->constructor; + frame->function = fun; /* FIXME: this is ugly */ swfdec_as_frame_set_this (frame, super->object); return frame; @@ -58,18 +67,16 @@ static gboolean swfdec_as_super_get (SwfdecAsObject *object, const char *variable, SwfdecAsValue *val, guint *flags) { - SwfdecAsValue value; SwfdecAsSuper *super = SWFDEC_AS_SUPER (object); - if (super->object == NULL) + if (super->object == NULL) { + SWFDEC_WARNING ("super () called without a this object."); return FALSE; - swfdec_as_object_get_variable (super->object, SWFDEC_AS_STR___proto__, &value); - if (!SWFDEC_AS_VALUE_IS_OBJECT (&value)) - return FALSE; - swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&value), SWFDEC_AS_STR___proto__, &value); - if (!SWFDEC_AS_VALUE_IS_OBJECT (&value)) + } + if (super->object->prototype == NULL || + super->object->prototype->prototype == NULL) return FALSE; - if (!swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&value), variable, val)) + if (!swfdec_as_object_get_variable (super->object->prototype->prototype, variable, val)) return FALSE; *flags = 0; return TRUE; diff-tree dd221847f7a93e4f7815b967a11d356f3603709d (from 68121d108e78a7fc7ebb1d0b73cf91bae255af09) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 16:25:39 2007 +0200 handle constructor variable sometimes being called __constructor__ diff --git a/libswfdec/swfdec_as_array.c b/libswfdec/swfdec_as_array.c index 74caec5..b47faac 100644 --- a/libswfdec/swfdec_as_array.c +++ b/libswfdec/swfdec_as_array.c @@ -129,7 +129,7 @@ swfdec_as_array_new (SwfdecAsContext *co g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL); g_return_val_if_fail (context->Array != NULL, NULL); - ret = swfdec_as_object_create (SWFDEC_AS_FUNCTION (context->Array), 0, NULL); + ret = swfdec_as_object_create (SWFDEC_AS_FUNCTION (context->Array), 0, NULL, FALSE); swfdec_as_object_root (ret); swfdec_as_context_run (context); swfdec_as_object_unroot (ret); diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index a1a3625..f0d27ce 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1112,7 +1112,7 @@ swfdec_action_create (SwfdecAsFunction * } if (n_args) swfdec_as_stack_pop_n (stack, n_args); - object = swfdec_as_object_create (fun, n_args, swfdec_as_stack_peek (stack, 0)); + object = swfdec_as_object_create (fun, n_args, swfdec_as_stack_peek (stack, 0), TRUE); g_assert (object); SWFDEC_AS_VALUE_SET_OBJECT (swfdec_as_stack_peek (stack, 1), object); } diff --git a/libswfdec/swfdec_as_number.c b/libswfdec/swfdec_as_number.c index 7fff37b..9aed973 100644 --- a/libswfdec/swfdec_as_number.c +++ b/libswfdec/swfdec_as_number.c @@ -61,7 +61,7 @@ swfdec_as_number_new (SwfdecAsContext *c g_return_val_if_fail (context->Number != NULL, NULL); SWFDEC_AS_VALUE_SET_NUMBER (&val, number); - ret = swfdec_as_object_create (SWFDEC_AS_FUNCTION (context->Number), 1, &val); + ret = swfdec_as_object_create (SWFDEC_AS_FUNCTION (context->Number), 1, &val, FALSE); swfdec_as_object_root (ret); swfdec_as_context_run (context); swfdec_as_object_unroot (ret); diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index a6dd6cd..1cd8c89 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -588,6 +588,7 @@ swfdec_as_object_has_function (SwfdecAsO * @construct: constructor * @n_args: number of arguments * @args: arguments to pass to constructor + * @scripted: If this variable is %TRUE, the variable "constructor" will be named "__constructor__" * * Creates a new object for the given constructor and pushes the constructor on * top of the stack. To actually run the constructor, you need to call @@ -597,7 +598,7 @@ swfdec_as_object_has_function (SwfdecAsO * so the returned object will always be valid. **/ SwfdecAsObject * -swfdec_as_object_create (SwfdecAsFunction *construct, guint n_args, SwfdecAsValue *args) +swfdec_as_object_create (SwfdecAsFunction *construct, guint n_args, SwfdecAsValue *args, gboolean scripted) { SwfdecAsValue val; SwfdecAsObject *new; @@ -620,6 +621,8 @@ swfdec_as_object_create (SwfdecAsFunctio break; } } +#if 0 + This doesn't work. It's supposed to figure out the last native object in the inheritance chain. swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (cur), SWFDEC_AS_STR___constructor__, &val); if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) { cur = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val); @@ -628,6 +631,9 @@ swfdec_as_object_create (SwfdecAsFunctio } else { cur = NULL; } +#else + cur = NULL; +#endif } if (type == 0) { type = SWFDEC_TYPE_AS_OBJECT; @@ -645,14 +651,14 @@ swfdec_as_object_create (SwfdecAsFunctio } new = g_object_new (type, NULL); swfdec_as_object_add (new, context, size); - swfdec_as_object_set_constructor (new, SWFDEC_AS_OBJECT (construct)); + swfdec_as_object_set_constructor (new, SWFDEC_AS_OBJECT (construct), FALSE); swfdec_as_function_call (construct, new, n_args, args, &val); context->frame->construct = TRUE; return new; } void -swfdec_as_object_set_constructor (SwfdecAsObject *object, SwfdecAsObject *construct) +swfdec_as_object_set_constructor (SwfdecAsObject *object, SwfdecAsObject *construct, gboolean scripted) { SwfdecAsValue val; SwfdecAsObject *proto; @@ -670,7 +676,7 @@ swfdec_as_object_set_constructor (Swfdec SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); swfdec_as_object_set_variable (object, SWFDEC_AS_STR___proto__, &val); SWFDEC_AS_VALUE_SET_OBJECT (&val, construct); - swfdec_as_object_set_variable (object, SWFDEC_AS_STR_constructor, &val); + swfdec_as_object_set_variable (object, scripted ? SWFDEC_AS_STR_constructor : SWFDEC_AS_STR___constructor__, &val); } /*** AS CODE ***/ diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h index c834310..6f17010 100644 --- a/libswfdec/swfdec_as_object.h +++ b/libswfdec/swfdec_as_object.h @@ -94,9 +94,11 @@ GType swfdec_as_object_get_type (void); SwfdecAsObject *swfdec_as_object_new (SwfdecAsContext * context); SwfdecAsObject *swfdec_as_object_create (SwfdecAsFunction * construct, guint n_args, - SwfdecAsValue * args); + SwfdecAsValue * args, + gboolean scripted); void swfdec_as_object_set_constructor(SwfdecAsObject * object, - SwfdecAsObject * construct); + SwfdecAsObject * construct, + gboolean scripted); void swfdec_as_object_add (SwfdecAsObject * object, SwfdecAsContext * context, diff --git a/libswfdec/swfdec_as_super.c b/libswfdec/swfdec_as_super.c index f4c09a6..5665e1a 100644 --- a/libswfdec/swfdec_as_super.c +++ b/libswfdec/swfdec_as_super.c @@ -54,11 +54,56 @@ swfdec_as_super_call (SwfdecAsFunction * return frame; } +static gboolean +swfdec_as_super_get (SwfdecAsObject *object, const char *variable, + SwfdecAsValue *val, guint *flags) +{ + SwfdecAsValue value; + SwfdecAsSuper *super = SWFDEC_AS_SUPER (object); + + if (super->object == NULL) + return FALSE; + swfdec_as_object_get_variable (super->object, SWFDEC_AS_STR___proto__, &value); + if (!SWFDEC_AS_VALUE_IS_OBJECT (&value)) + return FALSE; + swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&value), SWFDEC_AS_STR___proto__, &value); + if (!SWFDEC_AS_VALUE_IS_OBJECT (&value)) + return FALSE; + if (!swfdec_as_object_get_variable (SWFDEC_AS_VALUE_GET_OBJECT (&value), variable, val)) + return FALSE; + *flags = 0; + return TRUE; +} + +static void +swfdec_as_super_set (SwfdecAsObject *object, const char *variable, const SwfdecAsValue *val) +{ + /* This seems to be ignored completely */ +} + +static void +swfdec_as_super_set_flags (SwfdecAsObject *object, const char *variable, guint flags, guint mask) +{ + /* if we have no variables, we also can't set its flags... */ +} + +static void +swfdec_as_super_delete (SwfdecAsObject *object, const char *variable) +{ + /* if we have no variables... */ +} + static void swfdec_as_super_class_init (SwfdecAsSuperClass *klass) { + SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass); SwfdecAsFunctionClass *function_class = SWFDEC_AS_FUNCTION_CLASS (klass); + asobject_class->get = swfdec_as_super_get; + asobject_class->set = swfdec_as_super_set; + asobject_class->set_flags = swfdec_as_super_set_flags; + asobject_class->delete = swfdec_as_super_delete; + function_class->call = swfdec_as_super_call; } diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 74a8e7c..965f021 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1056,7 +1056,7 @@ swfdec_player_initialize (SwfdecPlayer * swfdec_movie_color_init_context (player, version); if (context->state == SWFDEC_AS_CONTEXT_NEW) { context->state = SWFDEC_AS_CONTEXT_RUNNING; - swfdec_as_object_set_constructor (player->roots->data, player->MovieClip); + swfdec_as_object_set_constructor (player->roots->data, player->MovieClip, FALSE); } } SWFDEC_INFO ("initializing player to size %ux%u", width, height); diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 5643222..319c878 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -349,7 +349,7 @@ swfdec_sprite_movie_add (SwfdecAsObject } else { constructor = SWFDEC_PLAYER (object->context)->MovieClip; } - swfdec_as_object_set_constructor (object, constructor); + swfdec_as_object_set_constructor (object, constructor, FALSE); SWFDEC_AS_OBJECT_CLASS (swfdec_sprite_movie_parent_class)->add (object); } diff-tree 68121d108e78a7fc7ebb1d0b73cf91bae255af09 (from 014141b47e8d4f0cd3be137a6d2af1cd5efdf356) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 14:44:26 2007 +0200 Super now calls the parent constructor properly diff --git a/libswfdec/swfdec_as_super.c b/libswfdec/swfdec_as_super.c index ffbc0b5..f4c09a6 100644 --- a/libswfdec/swfdec_as_super.c +++ b/libswfdec/swfdec_as_super.c @@ -44,6 +44,11 @@ swfdec_as_super_call (SwfdecAsFunction * } klass = SWFDEC_AS_FUNCTION_GET_CLASS (super->constructor); frame = klass->call (super->constructor); + /* We set the real function here. 1) swfdec_as_context_run() requires it. + * And b) it makes more sense reading the constructor's name than reading "super" + * in a debugger + */ + frame->function = super->constructor; /* FIXME: this is ugly */ swfdec_as_frame_set_this (frame, super->object); return frame; @@ -82,7 +87,7 @@ swfdec_as_super_new (SwfdecAsFrame *fram swfdec_as_object_get_variable (frame->thisp, SWFDEC_AS_STR___proto__, &val); if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) { SwfdecAsObject *proto = SWFDEC_AS_VALUE_GET_OBJECT (&val); - swfdec_as_object_get_variable (proto, SWFDEC_AS_STR___constructor__, &val); + swfdec_as_object_get_variable (proto, SWFDEC_AS_STR_constructor, &val); if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) { super->constructor = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val); if (!SWFDEC_IS_AS_FUNCTION (super->constructor)) diff-tree 014141b47e8d4f0cd3be137a6d2af1cd5efdf356 (from e62297aa4f0430285e9350049bf06cd4163a831f) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 14:44:03 2007 +0200 set the frame's function in the call vfunc This is needed to get the riht function in super's implementation diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c index 8a27b9f..2f0f0e7 100644 --- a/libswfdec/swfdec_as_function.c +++ b/libswfdec/swfdec_as_function.c @@ -93,7 +93,6 @@ swfdec_as_function_call (SwfdecAsFunctio frame->argc = n_args; frame->argv = args; frame->return_value = return_value; - frame->function = function; swfdec_as_frame_preload (frame); /* FIXME: make this a seperate function? */ frame->next = context->frame; diff --git a/libswfdec/swfdec_as_native_function.c b/libswfdec/swfdec_as_native_function.c index 626a380..4b8d40e 100644 --- a/libswfdec/swfdec_as_native_function.c +++ b/libswfdec/swfdec_as_native_function.c @@ -38,6 +38,7 @@ swfdec_as_native_function_call (SwfdecAs frame = swfdec_as_frame_new_native (SWFDEC_AS_OBJECT (function)->context); g_assert (native->name); frame->function_name = native->name; + frame->function = function; return frame; } diff --git a/libswfdec/swfdec_as_script_function.c b/libswfdec/swfdec_as_script_function.c index 9278ffe..14873d1 100644 --- a/libswfdec/swfdec_as_script_function.c +++ b/libswfdec/swfdec_as_script_function.c @@ -38,6 +38,7 @@ swfdec_as_script_function_call (SwfdecAs frame = swfdec_as_frame_new (SWFDEC_AS_OBJECT (function)->context, script->script); SWFDEC_AS_SCOPE (frame)->next = script->scope; frame->scope = SWFDEC_AS_SCOPE (frame); + frame->function = function; return frame; } diff-tree e62297aa4f0430285e9350049bf06cd4163a831f (from eff27731c8ce11922acc4c925c98188d9049296c) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 14:43:25 2007 +0200 fix up ActionExtends to actually do the right thing diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index f5503fb..a1a3625 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1675,10 +1675,11 @@ swfdec_action_extends (SwfdecAsContext * swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (super), SWFDEC_AS_STR_prototype, &proto); swfdec_as_object_set_variable (prototype, SWFDEC_AS_STR___proto__, &proto); - swfdec_as_object_set_variable (prototype, SWFDEC_AS_STR___constructor__, + swfdec_as_object_set_variable (prototype, SWFDEC_AS_STR_constructor, superclass); + SWFDEC_AS_VALUE_SET_OBJECT (&proto, prototype); swfdec_as_object_set_variable (SWFDEC_AS_VALUE_GET_OBJECT (subclass), - SWFDEC_AS_STR_prototype, superclass); + SWFDEC_AS_STR_prototype, &proto); } static gboolean diff-tree eff27731c8ce11922acc4c925c98188d9049296c (from 37f9a4467fe9e82fdc7fe6d6e73aaf9291cbbe7d) Author: Benjamin Otte <otte at gnome.org> Date: Thu May 24 13:05:12 2007 +0200 assert we have a script before we start executing it SwfdecAsSuper being a function broke the IS_NATIVE check above, I wanna have that blow up faster next time diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index c88c66a..d44024d 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -426,6 +426,7 @@ start: swfdec_as_context_return (context); goto start; } + g_assert (frame->script); script = frame->script; stack = frame->stack; version = SWFDEC_AS_EXTRACT_SCRIPT_VERSION (script->version);
Maybe Matching Threads
- 12 commits - AUTHORS doc/Makefile.am doc/swfdec-docs.sgml doc/swfdec-sections.txt libswfdec/Makefile.am libswfdec/swfdec_as_array.c libswfdec/swfdec_as_array.h libswfdec/swfdec_as_context.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h
- Branch 'as' - libswfdec/Makefile.am libswfdec/swfdec_as_context.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_native_function.h
- Branch 'as' - 25 commits - libswfdec/Makefile.am libswfdec/swfdec_as_boolean.c libswfdec/swfdec_as_boolean.h 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
- 7 commits - libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_super.c libswfdec/swfdec_as_super.h
- 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