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; }
SwfdecColorTransformAs * swfdec_color_transform_as_new_from_transform (SwfdecAsContext *context, const SwfdecColorTransform *transform) { SwfdecColorTransformAs *transform_as; SwfdecAsObject *object; g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), NULL); g_return_val_if_fail (transform != NULL, NULL); transform_as = g_object_new (SWFDEC_TYPE_COLOR_TRANSFORM_AS, "context", context, NULL); /* do it this way so the constructor isn't called */ object = swfdec_as_object_new (context, NULL); swfdec_as_object_set_relay (object, SWFDEC_AS_RELAY (transform_as)); swfdec_as_object_set_constructor_by_name (object, SWFDEC_AS_STR_flash, SWFDEC_AS_STR_geom, SWFDEC_AS_STR_ColorTransform, NULL); transform_as->ra = transform->ra / 256.0; transform_as->ga = transform->ga / 256.0; transform_as->ba = transform->ba / 256.0; transform_as->aa = transform->aa / 256.0; transform_as->rb = transform->rb; transform_as->gb = transform->gb; transform_as->bb = transform->bb; transform_as->ab = transform->ab; return transform_as; }
static guint check_objects (void) { SwfdecAsObject *object; guint errors = 0; SwfdecAsContext *context; SwfdecAsValue val; gpointer check = GUINT_TO_POINTER (-1); /* NOT NULL */ context = g_object_new (SWFDEC_TYPE_AS_CONTEXT, NULL); swfdec_as_context_startup (context); g_assert (check != NULL); object = swfdec_as_object_new (context); g_object_add_weak_pointer (G_OBJECT (object), &check); SWFDEC_AS_VALUE_SET_OBJECT (&val, object); swfdec_as_object_set_variable (context->global, SWFDEC_AS_STR__root, &val); swfdec_as_context_gc (context); if (check == NULL) { ERROR ("GC collected a rooted object, bailing"); g_object_unref (context); return errors; } swfdec_as_object_delete_variable (context->global, SWFDEC_AS_STR__root); swfdec_as_context_gc (context); if (check != NULL) { ERROR ("GC did not collect an unreferenced object"); } g_object_unref (context); return errors; }
static gboolean swfdec_amf_parse_object (SwfdecAsContext *context, SwfdecBits *bits, SwfdecAsValue *val) { SwfdecAsObject *object; object = swfdec_as_object_new (context); if (!swfdec_amf_parse_properties (context, bits, object)) return FALSE; SWFDEC_AS_VALUE_SET_OBJECT (val, object); return TRUE; }