Beispiel #1
0
void
swfdec_as_super_new (SwfdecAsFrame *frame, SwfdecAsObject *thisp, SwfdecAsObject *ref)
{
  SwfdecAsContext *context;
  SwfdecAsSuper *super;

  g_return_if_fail (frame != NULL);
  g_return_if_fail (SWFDEC_IS_AS_OBJECT (thisp));
  g_return_if_fail (ref == NULL || SWFDEC_IS_AS_OBJECT (ref));
  
  if (frame->super != NULL)
    return;
  context = swfdec_gc_object_get_context (thisp);
  if (context->version <= 5)
    return;

  super = g_object_new (SWFDEC_TYPE_AS_SUPER, "context", context, NULL);
  frame->super = SWFDEC_AS_OBJECT (super);
  super->thisp = swfdec_as_object_resolve (thisp);
  if (context->version <= 5) {
    super->object = NULL;
  } else {
    super->object = ref;
  }
}
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));
}
static void
swfdec_as_native_function_call (SwfdecAsFunction *function, SwfdecAsObject *thisp, 
    gboolean construct, SwfdecAsObject *super_reference, guint n_args, 
    const SwfdecAsValue *args, SwfdecAsValue *return_value)
{
  SwfdecAsNativeFunction *native = SWFDEC_AS_NATIVE_FUNCTION (function);
  SwfdecAsContext *cx = swfdec_gc_object_get_context (function);
  SwfdecAsFrame frame = { NULL, };
  SwfdecAsValue rval = { 0, };
  SwfdecAsValue *argv;

  g_assert (native->name);

  swfdec_as_frame_init_native (&frame, cx);
  frame.construct = construct;
  frame.function = function;
  /* We copy the target here so we have a proper SwfdecMovie reference inside native 
   * functions. This is for example necessary for swfdec_player_get_movie_by_value()
   * and probably other stuff that does variable lookups inside native functions.
   */
  /* FIXME: copy target or original target? */
  if (frame.next) {
    frame.target = frame.next->original_target;
    frame.original_target = frame.target;
  }
  if (thisp) {
    thisp = swfdec_as_object_resolve (thisp);
    swfdec_as_frame_set_this (&frame, thisp);
  }
  frame.argc = n_args;
  frame.argv = args;
  frame.return_value = return_value;
  frame.construct = construct;

  if (frame.argc == 0 || frame.argv != NULL) {
    /* FIXME FIXME FIXME: no casting here please! */
    argv = (SwfdecAsValue *) frame.argv;
  } else {
    SwfdecAsStack *stack;
    SwfdecAsValue *cur;
    guint i;
    if (frame.argc > 128) {
      SWFDEC_FIXME ("allow calling native functions with more than 128 args (this one has %u)",
	  frame.argc);
      frame.argc = 128;
    }
    argv = g_new (SwfdecAsValue, frame.argc);
    stack = cx->stack;
    cur = cx->cur;
    for (i = 0; i < frame.argc; i++) {
      if (cur <= &stack->elements[0]) {
	stack = stack->next;
	cur = &stack->elements[stack->used_elements];
      }
      cur--;
      argv[i] = *cur;
    }
  }
  native->native (cx, thisp, frame.argc, argv, &rval);
  if (argv != frame.argv)
    g_free (argv);
  swfdec_as_context_return (cx, &rval);
}