コード例 #1
0
static char *
swfdec_as_native_function_debug (SwfdecAsObject *object)
{
  SwfdecAsNativeFunction *native = SWFDEC_AS_NATIVE_FUNCTION (object);

  return g_strdup_printf ("%s ()", native->name);
}
static void
swfdec_as_native_function_dispose (GObject *object)
{
  SwfdecAsNativeFunction *function = SWFDEC_AS_NATIVE_FUNCTION (object);

  g_free (function->name);
  function->name = NULL;

  G_OBJECT_CLASS (swfdec_as_native_function_parent_class)->dispose (object);
}
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);
}