void swfdec_bitmap_data_get_rectangle (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { SwfdecBitmapData *bitmap; SwfdecAsObject *o; SwfdecAsValue args[4]; SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, ""); SWFDEC_AS_VALUE_SET_INT (ret, -1); if (bitmap->surface == NULL) return; swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_flash, args); if (!SWFDEC_AS_VALUE_IS_OBJECT (args)) return; o = SWFDEC_AS_VALUE_GET_OBJECT (args); swfdec_as_object_get_variable (o, SWFDEC_AS_STR_geom, args); if (!SWFDEC_AS_VALUE_IS_OBJECT (args)) return; o = SWFDEC_AS_VALUE_GET_OBJECT (args); swfdec_as_object_get_variable (o, SWFDEC_AS_STR_Rectangle, args); if (!SWFDEC_AS_VALUE_IS_OBJECT (args)) return; o = SWFDEC_AS_VALUE_GET_OBJECT (args); if (!SWFDEC_IS_AS_FUNCTION (o)) return; SWFDEC_AS_VALUE_SET_INT (&args[0], 0); SWFDEC_AS_VALUE_SET_INT (&args[1], 0); SWFDEC_AS_VALUE_SET_INT (&args[2], cairo_image_surface_get_width (bitmap->surface)); SWFDEC_AS_VALUE_SET_INT (&args[3], cairo_image_surface_get_height (bitmap->surface)); swfdec_as_object_create (SWFDEC_AS_FUNCTION (o), 4, args, ret); }
static void swfdec_print_job_init_properties (SwfdecAsContext *cx) { SwfdecAsValue val; SwfdecAsObject *xml, *proto; // FIXME: We should only initialize if the prototype Object has not been // initialized by any object's constructor with native properties // (TextField, TextFormat, XML, XMLNode at least) g_return_if_fail (SWFDEC_IS_AS_CONTEXT (cx)); swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_PrintJob, &val); if (!SWFDEC_AS_VALUE_IS_OBJECT (val)) return; xml = SWFDEC_AS_VALUE_GET_OBJECT (val); swfdec_as_object_get_variable (xml, SWFDEC_AS_STR_prototype, &val); if (!SWFDEC_AS_VALUE_IS_OBJECT (val)) return; proto = SWFDEC_AS_VALUE_GET_OBJECT (val); swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_orientation, swfdec_print_job_get_orientation, NULL); swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_pageHeight, swfdec_print_job_get_pageHeight, NULL); swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_pageWidth, swfdec_print_job_get_pageWidth, NULL); swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_paperHeight, swfdec_print_job_get_paperHeight, NULL); swfdec_as_object_add_native_variable (proto, SWFDEC_AS_STR_paperWidth, swfdec_print_job_get_paperWidth, NULL); }
static guint check_object_variables (void) { SwfdecAsObject *o, *o2; guint errors = 0; SwfdecAsContext *context; const char *s; gpointer check = GUINT_TO_POINTER (-1); /* NOT NULL */ gpointer check2 = GUINT_TO_POINTER (-1); /* NOT NULL */ SwfdecAsValue v1, v2; context = g_object_new (SWFDEC_TYPE_AS_CONTEXT, NULL); swfdec_as_context_startup (context); g_assert (check != NULL); o = swfdec_as_object_new (context); o2 = swfdec_as_object_new (context); g_object_add_weak_pointer (G_OBJECT (o), &check); g_object_add_weak_pointer (G_OBJECT (o2), &check2); s = swfdec_as_context_get_string (context, "foo"); /* step one: set a variable */ SWFDEC_AS_VALUE_SET_OBJECT (&v1, o); swfdec_as_object_set_variable (context->global, s, &v1); SWFDEC_AS_VALUE_SET_OBJECT (&v2, o2); swfdec_as_object_set_variable (o, s, &v2); SWFDEC_AS_VALUE_SET_UNDEFINED (&v2); swfdec_as_object_get_variable (o, s, &v2); if (!SWFDEC_AS_VALUE_IS_OBJECT (&v2)) { ERROR ("variable changed type"); } else if (o2 != SWFDEC_AS_VALUE_GET_OBJECT (&v2)) { ERROR ("variable changed value"); } /* step 2: gc */ swfdec_as_context_gc (context); if (check == NULL || check2 == NULL) { ERROR ("GC collected a used object, bailing"); g_object_unref (context); return errors; } /* step 3: unset root reference and set cyclic variable */ swfdec_as_object_delete_variable (context->global, s); swfdec_as_object_set_variable (o2, s, &v1); SWFDEC_AS_VALUE_SET_UNDEFINED (&v1); swfdec_as_object_get_variable (o2, s, &v1); if (!SWFDEC_AS_VALUE_IS_OBJECT (&v1)) { ERROR ("variable changed type"); } else if (o != SWFDEC_AS_VALUE_GET_OBJECT (&v1)) { ERROR ("variable changed value"); } /* step 4: gc, ensure that both objects disappears */ swfdec_as_context_gc (context); if (check != NULL || check2 != NULL) { ERROR ("GC didn't collect unused object"); } g_object_unref (context); return errors; }
void swfdec_as_array_sort (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { guint pos; SortOption options; SwfdecAsFunction *custom_function; if (object == NULL || SWFDEC_IS_MOVIE (object)) return; pos = 0; if (argc > pos && !SWFDEC_AS_VALUE_IS_NUMBER (&argv[pos])) { SwfdecAsFunction *fun; if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[pos]) || !SWFDEC_IS_AS_FUNCTION ( fun = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&argv[pos]))) return; custom_function = fun; pos++; } else { custom_function = NULL; } if (argc > pos) { options = swfdec_as_value_to_integer (cx, &argv[pos]) & MASK_SORT_OPTION; } else { options = 0; } swfdec_as_array_do_sort (cx, object, &options, custom_function, NULL, ret); }
static void swfdec_as_super_call (SwfdecAsFunction *function, SwfdecAsObject *thisp, gboolean construct, SwfdecAsObject *super_reference, guint n_args, const SwfdecAsValue *args, SwfdecAsValue *return_value) { SwfdecAsSuper *super = SWFDEC_AS_SUPER (function); SwfdecAsFunction *fun; SwfdecAsValue val; if (super->object == NULL) { SWFDEC_WARNING ("super () called without an object."); return; } swfdec_as_object_get_variable (super->object, 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; if (construct) { SWFDEC_FIXME ("What happens with \"new super()\"?"); } swfdec_as_function_call_full (fun, super->thisp, construct || swfdec_as_context_is_constructing (swfdec_gc_object_get_context (super)), super->object->prototype, n_args, args, return_value); }
void swfdec_as_array_sortOn (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { const char **fields; SortOption *options; gint32 i, num_fields; SwfdecAsObject *array; SwfdecAsValue val; if (object == NULL || SWFDEC_IS_MOVIE (object)) return; if (argc < 1) return; if (SWFDEC_AS_VALUE_IS_OBJECT (&argv[0])) { array = SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]); if (!SWFDEC_IS_AS_ARRAY (array)) { SWFDEC_AS_VALUE_SET_OBJECT (ret, object); return; } num_fields = swfdec_as_array_get_length (SWFDEC_AS_ARRAY (array)); if (num_fields <= 0) { SWFDEC_AS_VALUE_SET_OBJECT (ret, object); return; } fields = g_new (const char *, num_fields + 1); for (i = 0; i < num_fields; i++) { swfdec_as_array_get_value (SWFDEC_AS_ARRAY (array), i, &val); if (SWFDEC_AS_VALUE_IS_OBJECT (&val) && SWFDEC_IS_AS_STRING (SWFDEC_AS_VALUE_GET_OBJECT (&val))) { fields[i] = SWFDEC_AS_STRING (SWFDEC_AS_VALUE_GET_OBJECT (&val))->string; } else { fields[i] = swfdec_as_value_to_string (cx, &val); } } fields[i] = NULL; } else {
void swfdec_as_array_concat (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { guint j; SwfdecAsObject *object_new; SwfdecAsArray *array_new; const char *var; if (object == NULL || SWFDEC_IS_MOVIE (object)) return; object_new = swfdec_as_array_new (cx); if (object_new == NULL) return; array_new = SWFDEC_AS_ARRAY (object_new); swfdec_as_array_append_array (array_new, object); for (j = 0; j < argc; j++) { if (SWFDEC_AS_VALUE_IS_OBJECT (&argv[j]) && SWFDEC_IS_AS_ARRAY (SWFDEC_AS_VALUE_GET_OBJECT (&argv[j]))) { swfdec_as_array_append_array (array_new, SWFDEC_AS_VALUE_GET_OBJECT (&argv[j])); } else { var = swfdec_as_integer_to_string (swfdec_gc_object_get_context (object), swfdec_as_array_length (object_new)); swfdec_as_object_set_variable (object_new, var, &argv[j]); } } SWFDEC_AS_VALUE_SET_OBJECT (ret, object_new); }
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); } }