Benjamin Otte
2007-May-21 19:56 UTC
[Swfdec] 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
libswfdec/swfdec_as_frame.c | 45 ++++++++++++++++++++++------------ libswfdec/swfdec_as_frame.h | 6 +++- libswfdec/swfdec_as_function.c | 4 ++- libswfdec/swfdec_as_function.h | 3 -- libswfdec/swfdec_as_native_function.c | 4 +-- libswfdec/swfdec_as_object.c | 3 +- libswfdec/swfdec_as_script_function.c | 4 +-- 7 files changed, 44 insertions(+), 25 deletions(-) New commits: diff-tree 9611954464237c3162a09458e506840adb0943e5 (from 210bee663edb435f5f15cd5e8e9649faecd982d9) Author: Benjamin Otte <otte at gnome.org> Date: Mon May 21 21:52:06 2007 +0200 add swfdec_as_frame_set_this to allow calling functions without a this object diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 23b3c41..75e0534 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -68,7 +68,8 @@ swfdec_as_frame_mark (SwfdecAsObject *ob if (frame->script) { swfdec_as_object_mark (frame->var_object); } - swfdec_as_object_mark (frame->thisp); + if (frame->thisp) + swfdec_as_object_mark (frame->thisp); if (frame->target) swfdec_as_object_mark (frame->target); if (frame->function) @@ -76,7 +77,6 @@ swfdec_as_frame_mark (SwfdecAsObject *ob for (i = 0; i < frame->n_registers; i++) { swfdec_as_value_mark (&frame->registers[i]); } - /* FIXME: do we want this? */ for (i = 0; i < frame->argc; i++) { swfdec_as_value_mark (&frame->argv[i]); } @@ -102,18 +102,15 @@ swfdec_as_frame_init (SwfdecAsFrame *fra } SwfdecAsFrame * -swfdec_as_frame_new (SwfdecAsObject *thisp, SwfdecScript *script) +swfdec_as_frame_new (SwfdecAsContext *context, SwfdecScript *script) { - SwfdecAsContext *context; SwfdecAsFrame *frame; SwfdecAsStack *stack; gsize size; - g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (thisp), NULL); - g_return_val_if_fail (thisp->properties, NULL); + g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL); g_return_val_if_fail (script != NULL, NULL); - context = thisp->context; stack = swfdec_as_stack_new (context, 100); /* FIXME: invent better numbers here */ if (!stack) return NULL; @@ -130,10 +127,10 @@ swfdec_as_frame_new (SwfdecAsObject *thi frame->pc = script->buffer->data; frame->stack = stack; frame->scope = NULL; - frame->var_object = frame->next ? frame->next->var_object : thisp; + if (frame->next) + frame->var_object = frame->next->var_object; frame->n_registers = script->n_registers; frame->registers = g_slice_alloc0 (sizeof (SwfdecAsValue) * frame->n_registers); - frame->thisp = thisp; if (script->constant_pool) { frame->constant_pool_buffer = swfdec_buffer_ref (script->constant_pool); frame->constant_pool = swfdec_constant_pool_new_from_action ( @@ -148,16 +145,13 @@ swfdec_as_frame_new (SwfdecAsObject *thi } SwfdecAsFrame * -swfdec_as_frame_new_native (SwfdecAsObject *thisp) +swfdec_as_frame_new_native (SwfdecAsContext *context) { - SwfdecAsContext *context; SwfdecAsFrame *frame; gsize size; - g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (thisp), NULL); - g_return_val_if_fail (thisp->properties, NULL); + g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL); - context = thisp->context; size = sizeof (SwfdecAsFrame); if (!swfdec_as_context_use_mem (context, size)) return NULL; @@ -166,11 +160,32 @@ swfdec_as_frame_new_native (SwfdecAsObje swfdec_as_object_add (SWFDEC_AS_OBJECT (frame), context, size); frame->next = context->frame; context->frame = frame; - frame->thisp = thisp; return frame; } /** + * swfdec_as_frame_set_this: + * @frame: a #SwfdecAsFrame + * @thisp: object to use as the this object + * + * Sets the object to be used as this pointer. If this function is not called, + * the this value will be undefined. + * You may only call this function once per @frame and it must be called + * directly after creating the frame and before calling swfdec_as_frame_preload(). + **/ +void +swfdec_as_frame_set_this (SwfdecAsFrame *frame, SwfdecAsObject *thisp) +{ + g_return_if_fail (SWFDEC_IS_AS_FRAME (frame)); + g_return_if_fail (frame->thisp == NULL); + g_return_if_fail (SWFDEC_IS_AS_OBJECT (thisp)); + + frame->thisp = thisp; + if (frame->var_object == NULL) + frame->var_object = thisp; +} + +/** * swfdec_as_frame_find_variable: * @frame: a #SwfdecAsFrame * @variable: name of the variable to find diff --git a/libswfdec/swfdec_as_frame.h b/libswfdec/swfdec_as_frame.h index 126d410..3cacbb1 100644 --- a/libswfdec/swfdec_as_frame.h +++ b/libswfdec/swfdec_as_frame.h @@ -67,9 +67,11 @@ struct _SwfdecAsFrameClass { GType swfdec_as_frame_get_type (void); -SwfdecAsFrame * swfdec_as_frame_new (SwfdecAsObject * thisp, +SwfdecAsFrame * swfdec_as_frame_new (SwfdecAsContext * context, SwfdecScript * script); -SwfdecAsFrame * swfdec_as_frame_new_native (SwfdecAsObject * thisp); +SwfdecAsFrame * swfdec_as_frame_new_native (SwfdecAsContext * context); +void swfdec_as_frame_set_this (SwfdecAsFrame * frame, + SwfdecAsObject * thisp); void swfdec_as_frame_preload (SwfdecAsFrame * frame); SwfdecAsObject *swfdec_as_frame_find_variable (SwfdecAsFrame * frame, diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c index dd91fcc..8928f68 100644 --- a/libswfdec/swfdec_as_function.c +++ b/libswfdec/swfdec_as_function.c @@ -83,8 +83,10 @@ swfdec_as_function_call (SwfdecAsFunctio SWFDEC_AS_VALUE_SET_UNDEFINED (return_value); klass = SWFDEC_AS_FUNCTION_GET_CLASS (function); g_assert (klass->call); - klass->call (function, thisp); + klass->call (function); frame = context->frame; + if (thisp) + swfdec_as_frame_set_this (frame, thisp); frame->var_object = SWFDEC_AS_OBJECT (frame); frame->argc = n_args; frame->argv = args; diff --git a/libswfdec/swfdec_as_function.h b/libswfdec/swfdec_as_function.h index 951911e..ddc92d9 100644 --- a/libswfdec/swfdec_as_function.h +++ b/libswfdec/swfdec_as_function.h @@ -44,8 +44,7 @@ struct _SwfdecAsFunctionClass { SwfdecAsObjectClass object_class; /* call this function: push a new frame onto the stack */ - void (* call) (SwfdecAsFunction * function, - SwfdecAsObject * thisp); + void (* call) (SwfdecAsFunction * function); }; GType swfdec_as_function_get_type (void); diff --git a/libswfdec/swfdec_as_native_function.c b/libswfdec/swfdec_as_native_function.c index b373e3a..edc2a09 100644 --- a/libswfdec/swfdec_as_native_function.c +++ b/libswfdec/swfdec_as_native_function.c @@ -30,12 +30,12 @@ G_DEFINE_TYPE (SwfdecAsNativeFunction, swfdec_as_native_function, SWFDEC_TYPE_AS_FUNCTION) static void -swfdec_as_native_function_call (SwfdecAsFunction *function, SwfdecAsObject *thisp) +swfdec_as_native_function_call (SwfdecAsFunction *function) { SwfdecAsNativeFunction *native = SWFDEC_AS_NATIVE_FUNCTION (function); SwfdecAsFrame *frame; - frame = swfdec_as_frame_new_native (thisp); + frame = swfdec_as_frame_new_native (SWFDEC_AS_OBJECT (function)->context); g_assert (native->name); frame->function_name = native->name; } diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 1c53e0d..6152d51 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -501,9 +501,10 @@ swfdec_as_object_run (SwfdecAsObject *ob g_return_if_fail (SWFDEC_AS_OBJECT_HAS_CONTEXT (object)); g_return_if_fail (script != NULL); - frame = swfdec_as_frame_new (object, script); + frame = swfdec_as_frame_new (object->context, script); if (frame == NULL) return; + swfdec_as_frame_set_this (frame, object); swfdec_as_frame_preload (frame); swfdec_as_context_run (object->context); } diff --git a/libswfdec/swfdec_as_script_function.c b/libswfdec/swfdec_as_script_function.c index 2f75150..bbe4eec 100644 --- a/libswfdec/swfdec_as_script_function.c +++ b/libswfdec/swfdec_as_script_function.c @@ -30,12 +30,12 @@ G_DEFINE_TYPE (SwfdecAsScriptFunction, swfdec_as_script_function, SWFDEC_TYPE_AS_FUNCTION) static void -swfdec_as_script_function_call (SwfdecAsFunction *function, SwfdecAsObject *thisp) +swfdec_as_script_function_call (SwfdecAsFunction *function) { SwfdecAsScriptFunction *script = SWFDEC_AS_SCRIPT_FUNCTION (function); SwfdecAsFrame *frame; - frame = swfdec_as_frame_new (thisp, script->script); + 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); }
Reasonably Related Threads
- 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
- 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
- 3 commits - doc/Makefile.am doc/swfdec-docs.sgml doc/swfdec-sections.txt libswfdec/Makefile.am libswfdec/swfdec_as_array.c libswfdec/swfdec_as_boolean.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.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
- 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