void swfdec_as_function_init_context (SwfdecAsContext *context) { SwfdecAsObject *function, *proto; SwfdecAsValue val; g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context)); function = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, SWFDEC_AS_STR_Function, NULL)); swfdec_as_object_set_variable_flags (context->global, SWFDEC_AS_STR_Function, SWFDEC_AS_VARIABLE_VERSION_6_UP); context->Function = function; SWFDEC_AS_VALUE_SET_OBJECT (&val, function); swfdec_as_object_set_variable_and_flags (function, SWFDEC_AS_STR_constructor, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); proto = swfdec_as_object_new_empty (context); context->Function_prototype = proto; SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); swfdec_as_object_set_variable_and_flags (function, SWFDEC_AS_STR_prototype, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); swfdec_as_object_set_variable_and_flags (function, SWFDEC_AS_STR___proto__, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT | SWFDEC_AS_VARIABLE_VERSION_6_UP); SWFDEC_AS_VALUE_SET_OBJECT (&val, function); swfdec_as_object_set_variable_and_flags (proto, SWFDEC_AS_STR_constructor, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); }
void swfdec_as_super_new (SwfdecAsFrame *frame, SwfdecAsObject *thisp, SwfdecAsObject *ref) { SwfdecAsContext *context; SwfdecAsObject *object; SwfdecAsSuper *super; g_return_if_fail (frame != NULL); g_return_if_fail (thisp != NULL); if (frame->super != NULL) return; context = thisp->context; if (context->version <= 5) return; super = g_object_new (SWFDEC_TYPE_AS_SUPER, "context", context, NULL); frame->super = super; super->thisp = swfdec_as_object_resolve (thisp); if (context->version <= 5) { super->object = NULL; } else { super->object = ref; } object = swfdec_as_object_new_empty (context); object->super = TRUE; swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (super)); }
void swfdec_video_movie_init_context (SwfdecPlayer *player) { SwfdecAsContext *context; SwfdecAsObject *video, *proto; SwfdecAsValue val; g_return_if_fail (SWFDEC_IS_PLAYER (player)); context = SWFDEC_AS_CONTEXT (player); video = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, SWFDEC_AS_STR_Video, NULL)); SWFDEC_SANDBOX (context->global)->Video = video; proto = swfdec_as_object_new_empty (context); /* set the right properties on the Video object */ SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); swfdec_as_object_set_variable_and_flags (video, SWFDEC_AS_STR_prototype, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); /* set the right properties on the Video.prototype object */ SWFDEC_AS_VALUE_SET_OBJECT (&val, video); swfdec_as_object_set_variable_and_flags (proto, SWFDEC_AS_STR_constructor, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Object_prototype); swfdec_as_object_set_variable_and_flags (proto, SWFDEC_AS_STR___proto__, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); }
void swfdec_as_function_apply (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { SwfdecAsValue *argv_pass = NULL; int length = 0; SwfdecAsFunction *fun; SwfdecAsObject *thisp = NULL; SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_FUNCTION, &fun, "|O", &thisp); if (thisp == NULL) thisp = swfdec_as_object_new_empty (cx); if (argc > 1 && SWFDEC_AS_VALUE_IS_OBJECT (&argv[1])) { int i; SwfdecAsObject *array; SwfdecAsValue val; array = SWFDEC_AS_VALUE_GET_OBJECT (&argv[1]); swfdec_as_object_get_variable (array, SWFDEC_AS_STR_length, &val); length = swfdec_as_value_to_integer (cx, &val); if (length > 0) { /* FIXME: find a smarter way to do this, like providing argv not as an array */ if (!swfdec_as_context_try_use_mem (cx, sizeof (SwfdecAsValue) * length)) { swfdec_as_context_abort (cx, "too many arguments to Function.apply"); return; } argv_pass = g_malloc (sizeof (SwfdecAsValue) * length); for (i = 0; i < length; i++) { swfdec_as_object_get_variable (array, swfdec_as_integer_to_string (cx, i), &argv_pass[i]); } } else { length = 0; } } swfdec_as_function_call (fun, thisp, length, argv_pass, ret); if (argv_pass) { swfdec_as_context_unuse_mem (cx, sizeof (SwfdecAsValue) * length); g_free (argv_pass); } }
void swfdec_as_function_do_call (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { SwfdecAsFunction *fun; SwfdecAsObject *thisp = NULL; SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_FUNCTION, &fun, "|O", &thisp); if (thisp == NULL) { thisp = swfdec_as_object_new_empty (cx); } if (argc > 0) { argc--; argv++; } swfdec_as_function_call (fun, thisp, argc, argv, ret); }
SwfdecAsFunction * swfdec_as_native_function_new_bare (SwfdecAsContext *context, const char *name, SwfdecAsNative native) { SwfdecAsNativeFunction *fun; SwfdecAsObject *object; g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL); g_return_val_if_fail (native != NULL, NULL); fun = g_object_new (SWFDEC_TYPE_AS_NATIVE_FUNCTION, "context", context, NULL); fun->native = native; fun->name = g_strdup (name); object = swfdec_as_object_new_empty (context); swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (fun)); return SWFDEC_AS_FUNCTION (fun); }