Indent session!
authorTim Horton <hortont@src.gnome.org>
Sat, 7 Feb 2009 09:19:31 +0000 (09:19 +0000)
committerTim Horton <hortont@src.gnome.org>
Sat, 7 Feb 2009 09:19:31 +0000 (09:19 +0000)
svn path=/trunk/; revision=851

libseed/seed-api.c
libseed/seed-builtins.c
libseed/seed-closure.c
libseed/seed-engine.c
libseed/seed-types.c
libseed/seed.h
tools/indent.sh [changed mode: 0644->0755]

index fb9248b..372f5c8 100644 (file)
@@ -32,7 +32,7 @@ void seed_value_unprotect(JSContextRef ctx, JSValueRef value)
 }
 
 JSGlobalContextRef seed_context_create(JSContextGroupRef group,
-                                      JSClassRef global_class)
+                                                                          JSClassRef global_class)
 {
        return JSGlobalContextCreateInGroup(group, global_class);
 }
@@ -53,33 +53,33 @@ JSValueRef seed_make_null(JSContextRef ctx)
 }
 
 JSObjectRef seed_make_object(JSContextRef ctx,
-                            JSClassRef class, gpointer private)
+                                                        JSClassRef class, gpointer private)
 {
        return JSObjectMake(ctx, class, private);
 }
 
 void seed_object_set_property_at_index(JSContextRef ctx,
-                                      JSObjectRef object,
-                                      gint index,
-                                      JSValueRef value, JSValueRef * exception)
+                                                                          JSObjectRef object,
+                                                                          gint index,
+                                                                          JSValueRef value, JSValueRef * exception)
 {
        JSObjectSetPropertyAtIndex(ctx, object, index, value, exception);
 }
 
 JSValueRef seed_object_call(JSContextRef ctx,
-                           JSObjectRef object,
-                           JSObjectRef this,
-                           size_t argument_count,
-                           const JSValueRef arguments[],
-                           JSValueRef * exception)
+                                                       JSObjectRef object,
+                                                       JSObjectRef this,
+                                                       size_t argument_count,
+                                                       const JSValueRef arguments[],
+                                                       JSValueRef * exception)
 {
        return JSObjectCallAsFunction(ctx, object, this,
-                                     argument_count, arguments, exception);
+                                                                 argument_count, arguments, exception);
 }
 
 SeedScript *seed_make_script(JSContextRef ctx,
-                            const gchar * js,
-                            const gchar * source_url, gint line_number)
+                                                        const gchar * js,
+                                                        const gchar * source_url, gint line_number)
 {
        SeedScript *ret = g_new0(SeedScript, 1);
 
@@ -95,18 +95,17 @@ SeedScript *seed_make_script(JSContextRef ctx,
        ret->line_number = line_number;
 
        JSCheckScriptSyntax(ctx, ret->script,
-                           ret->source_url, ret->line_number, &ret->exception);
+                                               ret->source_url, ret->line_number, &ret->exception);
 
        return ret;
 }
 
-SeedScript *seed_script_new_from_file(JSContextRef ctx, 
-                                     gchar *file)
+SeedScript *seed_script_new_from_file(JSContextRef ctx, gchar * file)
 {
        SeedScript *script;
        GError *e = NULL;
        gchar *contents = NULL;
-       
+
        g_file_get_contents(file, &contents, NULL, &e);
        script = seed_make_script(ctx, contents, file, 0);
        if (e)
@@ -114,8 +113,8 @@ SeedScript *seed_script_new_from_file(JSContextRef ctx,
                seed_make_exception_from_gerror(ctx, &script->exception, e);
                g_error_free(e);
        }
-       
-       return script;  
+
+       return script;
 }
 
 JSValueRef seed_evaluate(JSContextRef ctx, SeedScript * js, JSObjectRef this)
@@ -124,8 +123,8 @@ JSValueRef seed_evaluate(JSContextRef ctx, SeedScript * js, JSObjectRef this)
 
        js->exception = 0;
        ret = JSEvaluateScript(ctx,
-                              js->script, this, js->source_url,
-                              js->line_number, &js->exception);
+                                                  js->script, this, js->source_url,
+                                                  js->line_number, &js->exception);
 
        return ret;
 }
@@ -152,7 +151,7 @@ gsize seed_string_get_maximum_size(JSStringRef string)
 }
 
 gsize seed_string_to_utf8_buffer(JSStringRef string, gchar * buffer,
-                                size_t buffer_size)
+                                                                size_t buffer_size)
 {
        return JSStringGetUTF8CString(string, buffer, buffer_size);
 }
@@ -183,8 +182,8 @@ JSClassRef seed_create_class(JSClassDefinition * def)
 }
 
 JSObjectRef seed_make_constructor(JSContextRef ctx,
-                                 JSClassRef class,
-                                 JSObjectCallAsConstructorCallback constructor)
+                                                                 JSClassRef class,
+                                                                 JSObjectCallAsConstructorCallback constructor)
 {
        return JSObjectMakeConstructor(ctx, class, constructor);
 }
@@ -199,22 +198,17 @@ void seed_object_set_private(JSObjectRef object, gpointer value)
        JSObjectSetPrivate(object, value);
 }
 
-gboolean seed_value_is_null(JSContextRef ctx,
-                           JSValueRef value)
+gboolean seed_value_is_null(JSContextRef ctx, JSValueRef value)
 {
        return JSValueIsNull(ctx, value);
 }
 
-gboolean seed_value_is_object(JSContextRef ctx,
-                             JSValueRef value)
+gboolean seed_value_is_object(JSContextRef ctx, JSValueRef value)
 {
-       return !seed_value_is_null(ctx, value) &&
-               JSValueIsObject(ctx, value);
+       return !seed_value_is_null(ctx, value) && JSValueIsObject(ctx, value);
 }
-gboolean seed_value_is_function(JSContextRef ctx,
-                               JSObjectRef value)
+
+gboolean seed_value_is_function(JSContextRef ctx, JSObjectRef value)
 {
-       return seed_value_is_object(ctx, value) && 
-               JSObjectIsFunction(ctx, value);
+       return seed_value_is_object(ctx, value) && JSObjectIsFunction(ctx, value);
 }
-
index 0642b72..ab13612 100644 (file)
@@ -325,9 +325,8 @@ void seed_init_builtins(SeedEngine * local_eng, gint * argc, gchar *** argv)
                        // TODO: exceptions!
 
                        JSObjectSetPropertyAtIndex(local_eng->context, arrayObj, i,
-                                                                          seed_value_from_string(local_eng->
-                                                                                                                         context,
-                                                                                                                         (*argv)[i], 0),
+                                                                          seed_value_from_string
+                                                                          (local_eng->context, (*argv)[i], 0),
                                                                           NULL);
                }
 
index 74bd5eb..60acf6d 100644 (file)
@@ -398,7 +398,7 @@ SeedNativeClosure *seed_make_native_closure(JSContextRef ctx,
        ffi_prep_cif(cif, FFI_DEFAULT_ABI, num_args,
                                 get_ffi_type(return_type), arg_types);
        ffi_prep_closure(closure, cif, seed_handle_closure, privates);
-       
+
        JSValueProtect(ctx, function);
 
        seed_object_set_property(ctx, (JSObjectRef) function,
index a842372..6cfca70 100644 (file)
@@ -877,7 +877,7 @@ seed_gi_import_namespace(JSContextRef ctx,
        JSStringRef extension_script;
        gint n, i;
        GModule *extension;
-       
+
        ctx = eng->context;
 
        if (argumentCount == 0)
index 53d8332..9095e5c 100644 (file)
@@ -31,1528 +31,1530 @@ SeedEngine *eng;
 
 static gboolean seed_value_is_gobject(JSContextRef ctx, JSValueRef value)
 {
-  if (!JSValueIsObject(ctx, value) || JSValueIsNull(ctx, value))
-    return FALSE;
+       if (!JSValueIsObject(ctx, value) || JSValueIsNull(ctx, value))
+               return FALSE;
 
-  return JSValueIsObjectOfClass(ctx, value, gobject_class);
+       return JSValueIsObjectOfClass(ctx, value, gobject_class);
 }
 
 void seed_toggle_ref(gpointer data, GObject * object, gboolean is_last_ref)
 {
-  JSValueRef wrapper;
-
-  wrapper = (JSValueRef) data;
-
-  if (is_last_ref)
-    {
-      JSValueUnprotect(eng->context, wrapper);
-    }
-  else
-    {
-      JSValueProtect(eng->context, wrapper);
-    }
+       JSValueRef wrapper;
+
+       wrapper = (JSValueRef) data;
+
+       if (is_last_ref)
+       {
+               JSValueUnprotect(eng->context, wrapper);
+       }
+       else
+       {
+               JSValueProtect(eng->context, wrapper);
+       }
 }
 
 static void seed_gobject_destroyed(gpointer object)
 {
-  JSValueUnprotect(eng->context, (JSValueRef) object);
-  JSObjectSetPrivate((JSObjectRef) object, 0);
+       JSValueUnprotect(eng->context, (JSValueRef) object);
+       JSObjectSetPrivate((JSObjectRef) object, 0);
 }
 
 static JSValueRef seed_wrap_object(JSContextRef ctx, GObject * object)
 {
-  JSValueRef user_data;
-  JSValueRef js_ref;
-  JSClassRef class;
-  GType type;
-  JSValueRef prototype;
+       JSValueRef user_data;
+       JSValueRef js_ref;
+       JSClassRef class;
+       GType type;
+       JSValueRef prototype;
 
-  type = G_OBJECT_TYPE(object);
+       type = G_OBJECT_TYPE(object);
 
-  user_data = (JSValueRef) g_object_get_data(object, "js-ref");
+       user_data = (JSValueRef) g_object_get_data(object, "js-ref");
 
-  if (user_data)
-    return user_data;
+       if (user_data)
+               return user_data;
 
-  class = seed_gobject_get_class_for_gtype(ctx, type);
+       class = seed_gobject_get_class_for_gtype(ctx, type);
 
-  while (!class && (type = g_type_parent(type)))
-    {
-      class = seed_gobject_get_class_for_gtype(ctx, type);
-    }
+       while (!class && (type = g_type_parent(type)))
+       {
+               class = seed_gobject_get_class_for_gtype(ctx, type);
+       }
 
-  prototype = seed_gobject_get_prototype_for_gtype(type);
-  js_ref = JSObjectMake(ctx, class, object);
-  if (prototype)
-    JSObjectSetPrototype(ctx, (JSObjectRef) js_ref, prototype);
-  else
-    {
-      g_assert_not_reached();
-    }
+       prototype = seed_gobject_get_prototype_for_gtype(type);
+       js_ref = JSObjectMake(ctx, class, object);
+       if (prototype)
+               JSObjectSetPrototype(ctx, (JSObjectRef) js_ref, prototype);
+       else
+       {
+               g_assert_not_reached();
+       }
 
-  g_object_set_data_full(object, "js-ref", (gpointer) js_ref,
-                        seed_gobject_destroyed);
+       g_object_set_data_full(object, "js-ref", (gpointer) js_ref,
+                                                  seed_gobject_destroyed);
 
-  JSValueProtect(eng->context, js_ref);
-  g_object_add_toggle_ref(object, seed_toggle_ref, (gpointer) js_ref);
+       JSValueProtect(eng->context, js_ref);
+       g_object_add_toggle_ref(object, seed_toggle_ref, (gpointer) js_ref);
 
-  return js_ref;
+       return js_ref;
 }
 
 static gboolean seed_release_arg(GITransfer transfer,
-                                GITypeInfo * type_info,
-                                GITypeTag type_tag, GArgument * arg)
+                                                                GITypeInfo * type_info,
+                                                                GITypeTag type_tag, GArgument * arg)
 {
-  GType gtype;
-
-  switch (type_tag)
-    {
-    case GI_TYPE_TAG_UTF8:
-    case GI_TYPE_TAG_FILENAME:
-      g_free(arg->v_string);
-      break;
-    case GI_TYPE_TAG_ARRAY:
-      if (arg->v_pointer)
+       GType gtype;
+
+       switch (type_tag)
        {
-         GITypeInfo *param_type;
-
-         param_type = g_type_info_get_param_type(type_info, 0);
-                       
-         switch (g_type_info_get_tag(param_type))
-           {
-           case GI_TYPE_TAG_UTF8:
-             if (transfer ==  GI_TRANSFER_EVERYTHING)
-               g_strfreev(arg->v_pointer);
-             else if (transfer == GI_TRANSFER_CONTAINER)
-               g_free(arg->v_pointer);
-             break;
-           case GI_TYPE_TAG_GTYPE:
-           case GI_TYPE_TAG_FLOAT:
-           case GI_TYPE_TAG_UINT8:
-             g_free(arg->v_pointer);
-             break;
-           case GI_TYPE_TAG_INTERFACE:
-             // TODOOO FIXME
-             break;
-           default:
-             g_assert_not_reached();
-           }
-
-         g_base_info_unref((GIBaseInfo *) param_type);
+       case GI_TYPE_TAG_UTF8:
+       case GI_TYPE_TAG_FILENAME:
+               g_free(arg->v_string);
+               break;
+       case GI_TYPE_TAG_ARRAY:
+               if (arg->v_pointer)
+               {
+                       GITypeInfo *param_type;
+
+                       param_type = g_type_info_get_param_type(type_info, 0);
+
+                       switch (g_type_info_get_tag(param_type))
+                       {
+                       case GI_TYPE_TAG_UTF8:
+                               if (transfer == GI_TRANSFER_EVERYTHING)
+                                       g_strfreev(arg->v_pointer);
+                               else if (transfer == GI_TRANSFER_CONTAINER)
+                                       g_free(arg->v_pointer);
+                               break;
+                       case GI_TYPE_TAG_GTYPE:
+                       case GI_TYPE_TAG_FLOAT:
+                       case GI_TYPE_TAG_UINT8:
+                               g_free(arg->v_pointer);
+                               break;
+                       case GI_TYPE_TAG_INTERFACE:
+                               // TODOOO FIXME
+                               break;
+                       default:
+                               g_assert_not_reached();
+                       }
+
+                       g_base_info_unref((GIBaseInfo *) param_type);
+               }
+               break;
+       case GI_TYPE_TAG_INTERFACE:
+               {
+                       if (arg->v_pointer)
+                       {
+                               GIBaseInfo *interface_info;
+
+                               interface_info = g_type_info_get_interface(type_info);
+
+                               gtype =
+                                       g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)
+                                                                                                         interface_info);
+
+                               if (g_type_is_a(gtype, G_TYPE_OBJECT)
+                                       || g_type_is_a(gtype, G_TYPE_INTERFACE))
+                               {
+                                       SEED_NOTE(MISC,
+                                                         "Unreffing object of type: %s in"
+                                                         "argument release. Reference count: %d\n",
+                                                         g_type_name(G_OBJECT_TYPE
+                                                                                 (G_OBJECT(arg->v_pointer))),
+                                                         G_OBJECT(arg->v_pointer)->ref_count);
+                                       g_object_unref(G_OBJECT(arg->v_pointer));
+                               }
+                               else if (g_type_is_a(gtype, G_TYPE_VALUE))
+                               {
+                                       GValue *gval = (GValue *) arg->v_pointer;
+                                       // Free/unref the GValue's contents.
+                                       g_value_unset(gval);
+                                       // Free the GValue.
+                                       g_slice_free1(sizeof(GValue), gval);
+                               }
+                               else if (g_type_is_a(gtype, G_TYPE_CLOSURE))
+                               {
+                                       g_closure_unref(arg->v_pointer);
+                               }
+
+                               g_base_info_unref(interface_info);
+                       }
+                       break;
+               }
+       default:
+               break;
+
        }
-      break;
-    case GI_TYPE_TAG_INTERFACE:
-      {
-       if (arg->v_pointer)
-         {
-           GIBaseInfo *interface_info;
-
-           interface_info = g_type_info_get_interface(type_info);
-
-           gtype =
-             g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)
-                                               interface_info);
-
-           if (g_type_is_a(gtype, G_TYPE_OBJECT)
-               || g_type_is_a(gtype, G_TYPE_INTERFACE))
-             {
-               SEED_NOTE(MISC,
-                         "Unreffing object of type: %s in"
-                         "argument release. Reference count: %d\n",
-                         g_type_name(G_OBJECT_TYPE
-                                     (G_OBJECT(arg->v_pointer))),
-                         G_OBJECT(arg->v_pointer)->ref_count);
-               g_object_unref(G_OBJECT(arg->v_pointer));
-             }
-           else if (g_type_is_a(gtype, G_TYPE_VALUE))
-             {
-               GValue *gval = (GValue *) arg->v_pointer;
-               // Free/unref the GValue's contents.
-               g_value_unset(gval);
-               // Free the GValue.
-               g_slice_free1(sizeof(GValue), gval);
-             }
-           else if (g_type_is_a(gtype, G_TYPE_CLOSURE))
-             {
-               g_closure_unref(arg->v_pointer);
-             }
-
-           g_base_info_unref(interface_info);
-         }
-       break;
-      }
-    default:
-      break;
-
-    }
-
-  return TRUE;
+
+       return TRUE;
 }
 
 gboolean seed_gi_release_arg(GITransfer transfer,
-                            GITypeInfo * type_info, GArgument * arg)
+                                                        GITypeInfo * type_info, GArgument * arg)
 {
-  GITypeTag type_tag;
+       GITypeTag type_tag;
 
-  if (transfer == GI_TRANSFER_NOTHING)
-    return TRUE;
+       if (transfer == GI_TRANSFER_NOTHING)
+               return TRUE;
 
-  type_tag = g_type_info_get_tag((GITypeInfo *) type_info);
+       type_tag = g_type_info_get_tag((GITypeInfo *) type_info);
 
-  return seed_release_arg(transfer, type_info, type_tag, arg);
+       return seed_release_arg(transfer, type_info, type_tag, arg);
 }
 
 gboolean seed_gi_release_in_arg(GITransfer transfer,
-                               GITypeInfo * type_info, GArgument * arg)
+                                                               GITypeInfo * type_info, GArgument * arg)
 {
-  GITypeTag type_tag;
-
-  if (transfer == GI_TRANSFER_EVERYTHING)
-    return TRUE;
-
-  type_tag = g_type_info_get_tag((GITypeInfo *) type_info);
-
-  switch (type_tag)
-    {
-      // TODO: FIXME: Leaaaks?
-    case GI_TYPE_TAG_INTERFACE:
-      {
-       // TODO: FIXME: Need some safe way to look for GClosure.
-       break;
-      }
-    case GI_TYPE_TAG_UTF8:
-    case GI_TYPE_TAG_FILENAME:
-    case GI_TYPE_TAG_ARRAY:
-      return seed_release_arg(GI_TRANSFER_EVERYTHING,
-                             type_info, type_tag, arg);
-    default:
-      break;
-    }
-
-  return TRUE;
+       GITypeTag type_tag;
+
+       if (transfer == GI_TRANSFER_EVERYTHING)
+               return TRUE;
+
+       type_tag = g_type_info_get_tag((GITypeInfo *) type_info);
+
+       switch (type_tag)
+       {
+               // TODO: FIXME: Leaaaks?
+       case GI_TYPE_TAG_INTERFACE:
+               {
+                       // TODO: FIXME: Need some safe way to look for GClosure.
+                       break;
+               }
+       case GI_TYPE_TAG_UTF8:
+       case GI_TYPE_TAG_FILENAME:
+       case GI_TYPE_TAG_ARRAY:
+               return seed_release_arg(GI_TRANSFER_EVERYTHING,
+                                                               type_info, type_tag, arg);
+       default:
+               break;
+       }
+
+       return TRUE;
 }
 
 static JSValueRef
 seed_gi_make_jsarray(JSContextRef ctx,
-                    void *array,
-                    GITypeInfo * param_type, JSValueRef * exception)
+                                        void *array,
+                                        GITypeInfo * param_type, JSValueRef * exception)
 {
-  GITypeTag element_type;
-  JSValueRef ret = JSValueMakeNull(ctx);
+       GITypeTag element_type;
+       JSValueRef ret = JSValueMakeNull(ctx);
 
-  element_type = g_type_info_get_tag(param_type);
+       element_type = g_type_info_get_tag(param_type);
 
-  if (element_type == GI_TYPE_TAG_UTF8)
-    {
-      JSValueRef *elements;
-      guint length, i;
-      gchar **str_array = (gchar **) array;
+       if (element_type == GI_TYPE_TAG_UTF8)
+       {
+               JSValueRef *elements;
+               guint length, i;
+               gchar **str_array = (gchar **) array;
 
-      length = g_strv_length(str_array);
-      if (!length)
-       return ret;
+               length = g_strv_length(str_array);
+               if (!length)
+                       return ret;
 
-      elements = g_alloca(sizeof(JSValueRef) * length);
-      for (i = 0; i < length; ++i)
-       {
-         elements[i] = seed_value_from_string(ctx, str_array[i], exception);
-       }
+               elements = g_alloca(sizeof(JSValueRef) * length);
+               for (i = 0; i < length; ++i)
+               {
+                       elements[i] = seed_value_from_string(ctx, str_array[i], exception);
+               }
 
-      ret = (JSValueRef) JSObjectMakeArray(ctx, length, elements, exception);
-    }
+               ret = (JSValueRef) JSObjectMakeArray(ctx, length, elements, exception);
+       }
 
-  return ret;
+       return ret;
 }
 
 static gboolean
 seed_gi_make_array(JSContextRef ctx,
-                  JSValueRef array,
-                  guint length,
-                  GITypeInfo * param_type,
-                  void **array_p, JSValueRef * exception)
+                                  JSValueRef array,
+                                  guint length,
+                                  GITypeInfo * param_type,
+                                  void **array_p, JSValueRef * exception)
 {
-  GITypeTag element_type;
-
-  element_type = g_type_info_get_tag(param_type);
-
-  switch (element_type)
-    {
-    case GI_TYPE_TAG_UTF8:
-      {
-       char **result;
-       guint i;
-
-       result = g_new0(char *, length + 1);
-
-       for (i = 0; i < length; i++)
-         {
-           JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
-                                                        (JSObjectRef) array,
-                                                        i,
-                                                        exception);
-           result[i] = seed_value_to_string(ctx, elem, exception);
-         }
-
-       *array_p = result;
-      }
-      break;
-    case GI_TYPE_TAG_GTYPE:
-      {
-       GType *result;
-       guint i;
-
-       result = g_new0(GType, length + 1);
-
-       for (i = 0; i < length; i++)
-         {
-           JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
-                                                        (JSObjectRef) array,
-                                                        i,
-                                                        exception);
-           result[i] = seed_value_to_int(ctx, elem, exception);
-         }
-
-       *array_p = result;
-      }
-      break;
-    case GI_TYPE_TAG_FLOAT:
-      {
-       gfloat * result;
-       guint i;
-               
-       result = g_new0(gfloat, length+1);
-               
-       for (i = 0; i < length; i++)
-         {
-           JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
-                                                        (JSObjectRef) array,
-                                                        i,
-                                                        exception);
-           result[i] = seed_value_to_float(ctx, elem, exception);
-         }
-               
-       *array_p = result;
-      }
-      break;
-    case GI_TYPE_TAG_UINT8:
-      {
-       guint8 * result;
-       guint i;
-               
-       result = g_new0(guint8, length+1);
-               
-       for (i = 0; i < length; i++)
-         {
-           JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
-                                                        (JSObjectRef) array,
-                                                        i,
-                                                        exception);
-           result[i] = seed_value_to_uchar(ctx, elem, exception);
-         }
-               
-       *array_p = result;
-      }
-      break;
-    case GI_TYPE_TAG_INTERFACE:
-      {
-       GIBaseInfo *interface = 
-         g_type_info_get_interface(param_type);
-       GIInfoType interface_type = g_base_info_get_type(interface);
-       if (interface_type == GI_INFO_TYPE_OBJECT
-           || interface_type == GI_INFO_TYPE_INTERFACE
-           || interface_type == GI_INFO_TYPE_STRUCT)
-         {
-           GType type =
-             g_registered_type_info_get_g_type((GIRegisteredTypeInfo *) 
-                                               interface);
-           if (g_type_is_a(type, G_TYPE_VALUE))
-             {
-               GValue *result;
-               guint i;
-               
-               result = g_new0(GValue, length+1);
-               
-               for (i = 0; i < length; i++)
-                 {
-                   JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
-                                                                (JSObjectRef) array,
-                                                                i, 
-                                                                exception);
-                   seed_gvalue_from_seed_value(ctx, elem,
-                                               (GType) 0,
-                                               &result[i],
-                                               exception);
-                 }
-               *array_p = result;
-
-               g_base_info_unref(interface);
+       GITypeTag element_type;
+
+       element_type = g_type_info_get_tag(param_type);
+
+       switch (element_type)
+       {
+       case GI_TYPE_TAG_UTF8:
+               {
+                       char **result;
+                       guint i;
+
+                       result = g_new0(char *, length + 1);
+
+                       for (i = 0; i < length; i++)
+                       {
+                               JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
+                                                                                                                        (JSObjectRef)
+                                                                                                                        array,
+                                                                                                                        i,
+                                                                                                                        exception);
+                               result[i] = seed_value_to_string(ctx, elem, exception);
+                       }
+
+                       *array_p = result;
+               }
+               break;
+       case GI_TYPE_TAG_GTYPE:
+               {
+                       GType *result;
+                       guint i;
+
+                       result = g_new0(GType, length + 1);
+
+                       for (i = 0; i < length; i++)
+                       {
+                               JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
+                                                                                                                        (JSObjectRef)
+                                                                                                                        array,
+                                                                                                                        i,
+                                                                                                                        exception);
+                               result[i] = seed_value_to_int(ctx, elem, exception);
+                       }
+
+                       *array_p = result;
+               }
+               break;
+       case GI_TYPE_TAG_FLOAT:
+               {
+                       gfloat *result;
+                       guint i;
+
+                       result = g_new0(gfloat, length + 1);
+
+                       for (i = 0; i < length; i++)
+                       {
+                               JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
+                                                                                                                        (JSObjectRef)
+                                                                                                                        array,
+                                                                                                                        i,
+                                                                                                                        exception);
+                               result[i] = seed_value_to_float(ctx, elem, exception);
+                       }
+
+                       *array_p = result;
+               }
+               break;
+       case GI_TYPE_TAG_UINT8:
+               {
+                       guint8 *result;
+                       guint i;
+
+                       result = g_new0(guint8, length + 1);
+
+                       for (i = 0; i < length; i++)
+                       {
+                               JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
+                                                                                                                        (JSObjectRef)
+                                                                                                                        array,
+                                                                                                                        i,
+                                                                                                                        exception);
+                               result[i] = seed_value_to_uchar(ctx, elem, exception);
+                       }
+
+                       *array_p = result;
+               }
                break;
-             }
-         }
-         
-         g_base_info_unref(interface);
-      }
-    default:
-      seed_make_exception(ctx, exception, "ArgumentError",
-                         "Unhandled array element type");
-      return FALSE;
-    }
-
-  return TRUE;
+       case GI_TYPE_TAG_INTERFACE:
+               {
+                       GIBaseInfo *interface = g_type_info_get_interface(param_type);
+                       GIInfoType interface_type = g_base_info_get_type(interface);
+                       if (interface_type == GI_INFO_TYPE_OBJECT
+                               || interface_type == GI_INFO_TYPE_INTERFACE
+                               || interface_type == GI_INFO_TYPE_STRUCT)
+                       {
+                               GType type =
+                                       g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)
+                                                                                                         interface);
+                               if (g_type_is_a(type, G_TYPE_VALUE))
+                               {
+                                       GValue *result;
+                                       guint i;
+
+                                       result = g_new0(GValue, length + 1);
+
+                                       for (i = 0; i < length; i++)
+                                       {
+                                               JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
+                                                                                                                                        (JSObjectRef) array,
+                                                                                                                                        i,
+                                                                                                                                        exception);
+                                               seed_gvalue_from_seed_value(ctx, elem,
+                                                                                                       (GType) 0,
+                                                                                                       &result[i], exception);
+                                       }
+                                       *array_p = result;
+
+                                       g_base_info_unref(interface);
+                                       break;
+                               }
+                       }
+
+                       g_base_info_unref(interface);
+               }
+       default:
+               seed_make_exception(ctx, exception, "ArgumentError",
+                                                       "Unhandled array element type");
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 gboolean
 seed_gi_make_argument(JSContextRef ctx,
-                     JSValueRef value,
-                     GITypeInfo * type_info, GArgument * arg,
-                     JSValueRef * exception)
+                                         JSValueRef value,
+                                         GITypeInfo * type_info, GArgument * arg,
+                                         JSValueRef * exception)
 {
-  GITypeTag gi_tag = g_type_info_get_tag(type_info);
-
-  // FIXME: Some types are not "nullable", also need to check if argument
-  // can be null before doing this.
-  if (!value || JSValueIsNull(ctx, value))
-    {
-      arg->v_pointer = 0;
-      return 1;
-    }
-
-  switch (gi_tag)
-    {
-    case GI_TYPE_TAG_VOID:
-      break;
-    case GI_TYPE_TAG_BOOLEAN:
-      arg->v_boolean = seed_value_to_boolean(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_INT8:
-      arg->v_int8 = seed_value_to_char(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_UINT8:
-      arg->v_uint8 = seed_value_to_uchar(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_INT16:
-      arg->v_int16 = seed_value_to_int(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_UINT16:
-      arg->v_uint16 = seed_value_to_uint(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_INT32:
-      arg->v_int32 = seed_value_to_int(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_UINT32:
-      arg->v_uint32 = seed_value_to_uint(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_LONG:
-    case GI_TYPE_TAG_INT64:
-      arg->v_int64 = seed_value_to_long(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_ULONG:
-    case GI_TYPE_TAG_UINT64:
-      arg->v_uint64 = seed_value_to_ulong(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_INT:
-      arg->v_int = seed_value_to_int(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_UINT:
-      arg->v_uint = seed_value_to_uint(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_SIZE:
-    case GI_TYPE_TAG_SSIZE:
-      arg->v_int = seed_value_to_int(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_FLOAT:
-      arg->v_float = seed_value_to_float(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_DOUBLE:
-      arg->v_double = seed_value_to_double(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_UTF8:
-      arg->v_string = seed_value_to_string(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_FILENAME:
-      arg->v_string = seed_value_to_filename(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_GTYPE:
-      arg->v_int = seed_value_to_int(ctx, value, exception);
-      break;
-    case GI_TYPE_TAG_INTERFACE:
-      {
-       GIBaseInfo *interface;
-       GIInfoType interface_type;
-       GType required_gtype;
-       GObject *gobject;
+       GITypeTag gi_tag = g_type_info_get_tag(type_info);
 
-       interface = g_type_info_get_interface(type_info);
-       interface_type = g_base_info_get_type(interface);
-
-       arg->v_pointer = NULL;
-
-       if (interface_type == GI_INFO_TYPE_OBJECT
-           || interface_type == GI_INFO_TYPE_INTERFACE)
-         {
-           gobject = seed_value_to_object(ctx, value, exception);
-           required_gtype =
-             g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)
-                                               interface);
-
-           // FIXME: Not clear if the g_type_is_a check is desired here.
-           // Possibly 'breaks things' when we don't have introspection
-           // data for some things in an interface hierarchy. Hasn't
-           // provided any problems so far.
-           if (!gobject
-               || !g_type_is_a(G_OBJECT_TYPE(gobject), required_gtype))
-             {
-               g_base_info_unref(interface);
-               return FALSE;
-             }
-
-           arg->v_pointer = gobject;
-           g_base_info_unref(interface);
-           break;
-         }
-       else if (interface_type == GI_INFO_TYPE_ENUM ||
-                interface_type == GI_INFO_TYPE_FLAGS)
-         {
-           arg->v_long = seed_value_to_long(ctx, value, exception);
-           g_base_info_unref(interface);
-           break;
-         }
-       else if (interface_type == GI_INFO_TYPE_STRUCT)
-         {
-           if (JSValueIsObjectOfClass(ctx, value, seed_struct_class))
-             arg->v_pointer = seed_pointer_get_pointer(ctx, value);
-           else
-             {
-               GType type =
-                 g_registered_type_info_get_g_type((GIRegisteredTypeInfo
-                                                    *) interface);
-               if (!type)
-                 {
-                   g_base_info_unref(interface);
-                   return FALSE;
-                 }
-               else if (type == G_TYPE_VALUE)
-                 {
-                   GValue *gval = g_slice_alloc0(sizeof(GValue));
-                   seed_gvalue_from_seed_value(ctx,
-                                               value,
-                                               (GType) NULL,
-                                               gval, exception);
-                   arg->v_pointer = gval;
-
-                   g_base_info_unref(interface);
-                   break;
-                 }
-               // Automatically convert between functions and 
-               // GClosures where expected.
-               else if (g_type_is_a(type, G_TYPE_CLOSURE))
-                 {
-                   if (JSObjectIsFunction(ctx, (JSObjectRef) value))
-                     {
-                       arg->v_pointer =
-                         seed_make_gclosure(ctx, (JSObjectRef) value, 0);
-                     }
-                 }
-               else
-                 {
-                   JSObjectRef strukt =
-                     seed_construct_struct_type_with_parameters(ctx,
-                                                                interface,
-                                                                (JSObjectRef) value,
-                                                                exception);
-                   arg->v_pointer = seed_pointer_get_pointer(ctx, strukt);
-                 }
-             }
-           g_base_info_unref(interface);
-           break;
-         }
-       else if (interface_type == GI_INFO_TYPE_CALLBACK)
-         {
-           if (JSValueIsNull(ctx, value))
-             {
-               arg->v_pointer = NULL;
-               g_base_info_unref(interface);
+       // FIXME: Some types are not "nullable", also need to check if argument
+       // can be null before doing this.
+       if (!value || JSValueIsNull(ctx, value))
+       {
+               arg->v_pointer = 0;
+               return 1;
+       }
+
+       switch (gi_tag)
+       {
+       case GI_TYPE_TAG_VOID:
                break;
-             }
-           // Someone passes in a wrapper around a method where a 
-           // callback is expected, i.e Clutter.sine_inc_func, as an alpha
-           // Have to dlsym the symbol to be able to do this.
-           // NOTE: Some cases where dlsym(NULL, symbol) doesn't work depending
-           // On how libseed is loaded.
-           else if (JSValueIsObjectOfClass(ctx,
-                                           value, gobject_method_class))
-             {
-               GIFunctionInfo *info =
-                 JSObjectGetPrivate((JSObjectRef) value);
-               const gchar *symbol = g_function_info_get_symbol(info);
-               gchar *error;
-               void *fp;
-
-               dlerror();
-               fp = (void *)dlsym(0, symbol);
-               if ((error = dlerror()) != NULL)
-                 {
-                   g_critical("dlerror: %s \n", error);
-                 }
-               else
-                 {
-                   arg->v_pointer = fp;
-                   g_base_info_unref(interface);
-                   break;
-                 }
-             }
-           // Somewhat deprecated from when it was necessary to manually
-           // create closure objects...
-           else if (JSValueIsObjectOfClass(ctx,
-                                           value,
-                                           seed_native_callback_class))
-             {
-               SeedNativeClosure *privates =
-                 (SeedNativeClosure *)
-                 JSObjectGetPrivate((JSObjectRef) value);
-               arg->v_pointer = privates->closure;
-               g_base_info_unref(interface);
+       case GI_TYPE_TAG_BOOLEAN:
+               arg->v_boolean = seed_value_to_boolean(ctx, value, exception);
                break;
-             }
-           // Automagically create closure around function passed in as 
-           // callback. 
-           else if (JSObjectIsFunction(ctx, (JSObjectRef) value))
-             {
-               SeedNativeClosure *privates = seed_make_native_closure(ctx,
-                                                                      (GICallableInfo *) interface,
-                                                                      value);
-               arg->v_pointer = privates->closure;
-               g_base_info_unref(interface);
+       case GI_TYPE_TAG_INT8:
+               arg->v_int8 = seed_value_to_char(ctx, value, exception);
                break;
-             }
-
-         }
-      }
-    case GI_TYPE_TAG_ARRAY:
-      {
-       if (JSValueIsNull(ctx, value))
-         {
-           arg->v_pointer = NULL;
-           break;
-         }
-       else if (!JSValueIsObject(ctx, value))
-         {
-           // TODO: FIXME: Is this right?
-           return FALSE;
-         }
-       else
-         {
-           GITypeInfo *param_type;
-           //TODO: FIXME: Better array test like the cool one on reddit.
-           guint length =
-             seed_value_to_int(ctx, seed_object_get_property(ctx,
-                                                             (JSObjectRef) value,
-                                                             "length"),
-                               exception);
-           if (!length)
-             {
-               arg->v_pointer = NULL;
+       case GI_TYPE_TAG_UINT8:
+               arg->v_uint8 = seed_value_to_uchar(ctx, value, exception);
                break;
-             }
-
-           param_type = g_type_info_get_param_type(type_info, 0);
-           if (!seed_gi_make_array(ctx, value, length, param_type,
-                                   &arg->v_pointer, exception))
-             {
-               g_base_info_unref((GIBaseInfo *) param_type);
+       case GI_TYPE_TAG_INT16:
+               arg->v_int16 = seed_value_to_int(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_UINT16:
+               arg->v_uint16 = seed_value_to_uint(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_INT32:
+               arg->v_int32 = seed_value_to_int(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_UINT32:
+               arg->v_uint32 = seed_value_to_uint(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_LONG:
+       case GI_TYPE_TAG_INT64:
+               arg->v_int64 = seed_value_to_long(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_ULONG:
+       case GI_TYPE_TAG_UINT64:
+               arg->v_uint64 = seed_value_to_ulong(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_INT:
+               arg->v_int = seed_value_to_int(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_UINT:
+               arg->v_uint = seed_value_to_uint(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_SIZE:
+       case GI_TYPE_TAG_SSIZE:
+               arg->v_int = seed_value_to_int(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_FLOAT:
+               arg->v_float = seed_value_to_float(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_DOUBLE:
+               arg->v_double = seed_value_to_double(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_UTF8:
+               arg->v_string = seed_value_to_string(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_FILENAME:
+               arg->v_string = seed_value_to_filename(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_GTYPE:
+               arg->v_int = seed_value_to_int(ctx, value, exception);
+               break;
+       case GI_TYPE_TAG_INTERFACE:
+               {
+                       GIBaseInfo *interface;
+                       GIInfoType interface_type;
+                       GType required_gtype;
+                       GObject *gobject;
+
+                       interface = g_type_info_get_interface(type_info);
+                       interface_type = g_base_info_get_type(interface);
+
+                       arg->v_pointer = NULL;
+
+                       if (interface_type == GI_INFO_TYPE_OBJECT
+                               || interface_type == GI_INFO_TYPE_INTERFACE)
+                       {
+                               gobject = seed_value_to_object(ctx, value, exception);
+                               required_gtype =
+                                       g_registered_type_info_get_g_type((GIRegisteredTypeInfo *)
+                                                                                                         interface);
+
+                               // FIXME: Not clear if the g_type_is_a check is desired here.
+                               // Possibly 'breaks things' when we don't have introspection
+                               // data for some things in an interface hierarchy. Hasn't
+                               // provided any problems so far.
+                               if (!gobject
+                                       || !g_type_is_a(G_OBJECT_TYPE(gobject), required_gtype))
+                               {
+                                       g_base_info_unref(interface);
+                                       return FALSE;
+                               }
+
+                               arg->v_pointer = gobject;
+                               g_base_info_unref(interface);
+                               break;
+                       }
+                       else if (interface_type == GI_INFO_TYPE_ENUM ||
+                                        interface_type == GI_INFO_TYPE_FLAGS)
+                       {
+                               arg->v_long = seed_value_to_long(ctx, value, exception);
+                               g_base_info_unref(interface);
+                               break;
+                       }
+                       else if (interface_type == GI_INFO_TYPE_STRUCT)
+                       {
+                               if (JSValueIsObjectOfClass(ctx, value, seed_struct_class))
+                                       arg->v_pointer = seed_pointer_get_pointer(ctx, value);
+                               else
+                               {
+                                       GType type =
+                                               g_registered_type_info_get_g_type((GIRegisteredTypeInfo
+                                                                                                                  *) interface);
+                                       if (!type)
+                                       {
+                                               g_base_info_unref(interface);
+                                               return FALSE;
+                                       }
+                                       else if (type == G_TYPE_VALUE)
+                                       {
+                                               GValue *gval = g_slice_alloc0(sizeof(GValue));
+                                               seed_gvalue_from_seed_value(ctx,
+                                                                                                       value,
+                                                                                                       (GType) NULL,
+                                                                                                       gval, exception);
+                                               arg->v_pointer = gval;
+
+                                               g_base_info_unref(interface);
+                                               break;
+                                       }
+                                       // Automatically convert between functions and 
+                                       // GClosures where expected.
+                                       else if (g_type_is_a(type, G_TYPE_CLOSURE))
+                                       {
+                                               if (JSObjectIsFunction(ctx, (JSObjectRef) value))
+                                               {
+                                                       arg->v_pointer =
+                                                               seed_make_gclosure(ctx, (JSObjectRef) value, 0);
+                                               }
+                                       }
+                                       else
+                                       {
+                                               JSObjectRef strukt =
+                                                       seed_construct_struct_type_with_parameters(ctx,
+                                                                                                                                          interface,
+                                                                                                                                          (JSObjectRef) value,
+                                                                                                                                          exception);
+                                               arg->v_pointer = seed_pointer_get_pointer(ctx, strukt);
+                                       }
+                               }
+                               g_base_info_unref(interface);
+                               break;
+                       }
+                       else if (interface_type == GI_INFO_TYPE_CALLBACK)
+                       {
+                               if (JSValueIsNull(ctx, value))
+                               {
+                                       arg->v_pointer = NULL;
+                                       g_base_info_unref(interface);
+                                       break;
+                               }
+                               // Someone passes in a wrapper around a method where a 
+                               // callback is expected, i.e Clutter.sine_inc_func, as an alpha
+                               // Have to dlsym the symbol to be able to do this.
+                               // NOTE: Some cases where dlsym(NULL, symbol) doesn't work depending
+                               // On how libseed is loaded.
+                               else if (JSValueIsObjectOfClass(ctx,
+                                                                                               value, gobject_method_class))
+                               {
+                                       GIFunctionInfo *info =
+                                               JSObjectGetPrivate((JSObjectRef) value);
+                                       const gchar *symbol = g_function_info_get_symbol(info);
+                                       gchar *error;
+                                       void *fp;
+
+                                       dlerror();
+                                       fp = (void *)dlsym(0, symbol);
+                                       if ((error = dlerror()) != NULL)
+                                       {
+                                               g_critical("dlerror: %s \n", error);
+                                       }
+                                       else
+                                       {
+                                               arg->v_pointer = fp;
+                                               g_base_info_unref(interface);
+                                               break;
+                                       }
+                               }
+                               // Somewhat deprecated from when it was necessary to manually
+                               // create closure objects...
+                               else if (JSValueIsObjectOfClass(ctx,
+                                                                                               value,
+                                                                                               seed_native_callback_class))
+                               {
+                                       SeedNativeClosure *privates =
+                                               (SeedNativeClosure *)
+                                               JSObjectGetPrivate((JSObjectRef) value);
+                                       arg->v_pointer = privates->closure;
+                                       g_base_info_unref(interface);
+                                       break;
+                               }
+                               // Automagically create closure around function passed in as 
+                               // callback. 
+                               else if (JSObjectIsFunction(ctx, (JSObjectRef) value))
+                               {
+                                       SeedNativeClosure *privates = seed_make_native_closure(ctx,
+                                                                                                                                                  (GICallableInfo *) interface,
+                                                                                                                                                  value);
+                                       arg->v_pointer = privates->closure;
+                                       g_base_info_unref(interface);
+                                       break;
+                               }
+
+                       }
+               }
+       case GI_TYPE_TAG_ARRAY:
+               {
+                       if (JSValueIsNull(ctx, value))
+                       {
+                               arg->v_pointer = NULL;
+                               break;
+                       }
+                       else if (!JSValueIsObject(ctx, value))
+                       {
+                               // TODO: FIXME: Is this right?
+                               return FALSE;
+                       }
+                       else
+                       {
+                               GITypeInfo *param_type;
+                               //TODO: FIXME: Better array test like the cool one on reddit.
+                               guint length =
+                                       seed_value_to_int(ctx, seed_object_get_property(ctx,
+                                                                                                                                       (JSObjectRef) value,
+                                                                                                                                       "length"),
+                                                                         exception);
+                               if (!length)
+                               {
+                                       arg->v_pointer = NULL;
+                                       break;
+                               }
+
+                               param_type = g_type_info_get_param_type(type_info, 0);
+                               if (!seed_gi_make_array(ctx, value, length, param_type,
+                                                                               &arg->v_pointer, exception))
+                               {
+                                       g_base_info_unref((GIBaseInfo *) param_type);
+                                       return FALSE;
+                               }
+                               g_base_info_unref((GIBaseInfo *) param_type);
+                               break;
+                       }
+               }
+       default:
                return FALSE;
-             }
-           g_base_info_unref((GIBaseInfo *) param_type);
-           break;
-         }
-      }
-    default:
-      return FALSE;
 
-    }
-  return TRUE;
+       }
+       return TRUE;
 
 }
 
 JSValueRef
 seed_gi_argument_make_js(JSContextRef ctx,
-                        GArgument * arg, GITypeInfo * type_info,
-                        JSValueRef * exception)
+                                                GArgument * arg, GITypeInfo * type_info,
+                                                JSValueRef * exception)
 {
-  GITypeTag gi_tag = g_type_info_get_tag(type_info);
-  switch (gi_tag)
-    {
-    case GI_TYPE_TAG_VOID:
-      return 0;
-    case GI_TYPE_TAG_BOOLEAN:
-      return seed_value_from_boolean(ctx, arg->v_boolean, exception);
-    case GI_TYPE_TAG_INT8:
-      return seed_value_from_char(ctx, arg->v_int8, exception);
-    case GI_TYPE_TAG_UINT8:
-      return seed_value_from_uchar(ctx, arg->v_uint8, exception);
-    case GI_TYPE_TAG_INT16:
-      return seed_value_from_int(ctx, arg->v_int16, exception);
-    case GI_TYPE_TAG_UINT16:
-      return seed_value_from_uint(ctx, arg->v_uint16, exception);
-    case GI_TYPE_TAG_INT32:
-      return seed_value_from_int(ctx, arg->v_int32, exception);
-    case GI_TYPE_TAG_UINT32:
-      return seed_value_from_uint(ctx, arg->v_uint32, exception);
-    case GI_TYPE_TAG_LONG:
-    case GI_TYPE_TAG_INT64:
-      return seed_value_from_long(ctx, arg->v_int64, exception);
-    case GI_TYPE_TAG_ULONG:
-    case GI_TYPE_TAG_UINT64:
-      return seed_value_from_ulong(ctx, arg->v_uint64, exception);
-    case GI_TYPE_TAG_INT:
-      return seed_value_from_int(ctx, arg->v_int32, exception);
-    case GI_TYPE_TAG_UINT:
-      return seed_value_from_uint(ctx, arg->v_uint32, exception);
-    case GI_TYPE_TAG_SSIZE:
-    case GI_TYPE_TAG_SIZE:
-      return seed_value_from_int(ctx, arg->v_int, exception);
-    case GI_TYPE_TAG_FLOAT:
-      return seed_value_from_float(ctx, arg->v_float, exception);
-    case GI_TYPE_TAG_DOUBLE:
-      return seed_value_from_double(ctx, arg->v_double, exception);
-    case GI_TYPE_TAG_UTF8:
-      return seed_value_from_string(ctx, arg->v_string, exception);
-    case GI_TYPE_TAG_FILENAME:
-      return seed_value_from_filename(ctx, arg->v_string, exception);
-    case GI_TYPE_TAG_GTYPE:
-      return seed_value_from_int(ctx, arg->v_int, exception);
-    case GI_TYPE_TAG_ARRAY:
-      {
-       GITypeInfo *param_type;
-       JSValueRef ret;
-
-       if (arg->v_pointer == NULL)
-         return JSValueMakeNull(ctx);
-       if (!g_type_info_is_zero_terminated(type_info))
-         break;
-
-       param_type = g_type_info_get_param_type(type_info, 0);
-
-       ret = seed_gi_make_jsarray(ctx, arg->v_pointer, param_type,
-                                  exception);
-
-       g_base_info_unref((GIBaseInfo *) param_type);
+       GITypeTag gi_tag = g_type_info_get_tag(type_info);
+       switch (gi_tag)
+       {
+       case GI_TYPE_TAG_VOID:
+               return 0;
+       case GI_TYPE_TAG_BOOLEAN:
+               return seed_value_from_boolean(ctx, arg->v_boolean, exception);
+       case GI_TYPE_TAG_INT8:
+               return seed_value_from_char(ctx, arg->v_int8, exception);
+       case GI_TYPE_TAG_UINT8:
+               return seed_value_from_uchar(ctx, arg->v_uint8, exception);
+       case GI_TYPE_TAG_INT16:
+               return seed_value_from_int(ctx, arg->v_int16, exception);
+       case GI_TYPE_TAG_UINT16:
+               return seed_value_from_uint(ctx, arg->v_uint16, exception);
+       case GI_TYPE_TAG_INT32:
+               return seed_value_from_int(ctx, arg->v_int32, exception);
+       case GI_TYPE_TAG_UINT32:
+               return seed_value_from_uint(ctx, arg->v_uint32, exception);
+       case GI_TYPE_TAG_LONG:
+       case GI_TYPE_TAG_INT64:
+               return seed_value_from_long(ctx, arg->v_int64, exception);
+       case GI_TYPE_TAG_ULONG:
+       case GI_TYPE_TAG_UINT64:
+               return seed_value_from_ulong(ctx, arg->v_uint64, exception);
+       case GI_TYPE_TAG_INT:
+               return seed_value_from_int(ctx, arg->v_int32, exception);
+       case GI_TYPE_TAG_UINT:
+               return seed_value_from_uint(ctx, arg->v_uint32, exception);
+       case GI_TYPE_TAG_SSIZE:
+       case GI_TYPE_TAG_SIZE:
+               return seed_value_from_int(ctx, arg->v_int, exception);
+       case GI_TYPE_TAG_FLOAT:
+               return seed_value_from_float(ctx, arg->v_float, exception);
+       case GI_TYPE_TAG_DOUBLE:
+               return seed_value_from_double(ctx, arg->v_double, exception);
+       case GI_TYPE_TAG_UTF8:
+               return seed_value_from_string(ctx, arg->v_string, exception);
+       case GI_TYPE_TAG_FILENAME:
+               return seed_value_from_filename(ctx, arg->v_string, exception);
+       case GI_TYPE_TAG_GTYPE:
+               return seed_value_from_int(ctx, arg->v_int, exception);
+       case GI_TYPE_TAG_ARRAY:
+               {
+                       GITypeInfo *param_type;
+                       JSValueRef ret;
 
-       return ret;
-      }
-    case GI_TYPE_TAG_INTERFACE:
-      {
-       GIBaseInfo *interface;
-       GIInfoType interface_type;
-
-       interface = g_type_info_get_interface(type_info);
-       interface_type = g_base_info_get_type(interface);
-
-       if (interface_type == GI_INFO_TYPE_OBJECT ||
-           interface_type == GI_INFO_TYPE_INTERFACE)
-         {
-           if (arg->v_pointer == 0)
-             {
-               g_base_info_unref(interface);
-               return JSValueMakeNull(ctx);
-             }
-           g_base_info_unref(interface);
-           return seed_value_from_object(ctx, arg->v_pointer, exception);
-         }
-       else if (interface_type == GI_INFO_TYPE_ENUM
-                || interface_type == GI_INFO_TYPE_FLAGS)
-         {
-           g_base_info_unref(interface);
-           return seed_value_from_double(ctx, arg->v_double, exception);
-         }
-       else if (interface_type == GI_INFO_TYPE_STRUCT)
-         {
-           JSValueRef strukt;
-
-           strukt = seed_make_struct(ctx, arg->v_pointer, interface);
-           g_base_info_unref(interface);
-
-           return strukt;
-         }
-      }
-    case GI_TYPE_TAG_GLIST:
-      {
-       GITypeInfo *list_type;
-       JSObjectRef ret;
-       GArgument larg;
-       gint i = 0;
-       GList *list = arg->v_pointer;
-
-       ret = JSObjectMakeArray(ctx, 0, NULL, exception);
-       list_type = g_type_info_get_param_type(type_info, 0);
-
-       for (; list != NULL; list = list->next)
-         {
-           JSValueRef ival;
-
-           larg.v_pointer = list->data;
-           ival =
-             (JSValueRef) seed_gi_argument_make_js(ctx, &larg,
-                                                   list_type, exception);
-           if (!ival)
-             ival = JSValueMakeNull(ctx);
-           JSObjectSetPropertyAtIndex(ctx, ret, i, ival, NULL);
-           i++;
-         }
-       return ret;
+                       if (arg->v_pointer == NULL)
+                               return JSValueMakeNull(ctx);
+                       if (!g_type_info_is_zero_terminated(type_info))
+                               break;
 
-      }
-    case GI_TYPE_TAG_GSLIST:
-      {
-       GITypeInfo *list_type;
-       JSObjectRef ret;
-       GArgument larg;
-       gint i = 0;
-       GSList *list = arg->v_pointer;
-
-       ret = JSObjectMakeArray(ctx, 0, NULL, exception);
-       list_type = g_type_info_get_param_type(type_info, 0);
-
-       for (; list != NULL; list = list->next)
-         {
-           JSValueRef ival;
-
-           larg.v_pointer = list->data;
-           ival =
-             (JSValueRef) seed_gi_argument_make_js(ctx, &larg,
-                                                   list_type, exception);
-           if (!ival)
-             ival = JSValueMakeNull(ctx);
-           JSObjectSetPropertyAtIndex(ctx, ret, i, ival, NULL);
-           i++;
-         }
-       return ret;
-      }
+                       param_type = g_type_info_get_param_type(type_info, 0);
+
+                       ret = seed_gi_make_jsarray(ctx, arg->v_pointer, param_type,
+                                                                          exception);
 
-    default:
-      return FALSE;
+                       g_base_info_unref((GIBaseInfo *) param_type);
+
+                       return ret;
+               }
+       case GI_TYPE_TAG_INTERFACE:
+               {
+                       GIBaseInfo *interface;
+                       GIInfoType interface_type;
+
+                       interface = g_type_info_get_interface(type_info);
+                       interface_type = g_base_info_get_type(interface);
+
+                       if (interface_type == GI_INFO_TYPE_OBJECT ||
+                               interface_type == GI_INFO_TYPE_INTERFACE)
+                       {
+                               if (arg->v_pointer == 0)
+                               {
+                                       g_base_info_unref(interface);
+                                       return JSValueMakeNull(ctx);
+                               }
+                               g_base_info_unref(interface);
+                               return seed_value_from_object(ctx, arg->v_pointer, exception);
+                       }
+                       else if (interface_type == GI_INFO_TYPE_ENUM
+                                        || interface_type == GI_INFO_TYPE_FLAGS)
+                       {
+                               g_base_info_unref(interface);
+                               return seed_value_from_double(ctx, arg->v_double, exception);
+                       }
+                       else if (interface_type == GI_INFO_TYPE_STRUCT)
+                       {
+                               JSValueRef strukt;
+
+                               strukt = seed_make_struct(ctx, arg->v_pointer, interface);
+                               g_base_info_unref(interface);
+
+                               return strukt;
+                       }
+               }
+       case GI_TYPE_TAG_GLIST:
+               {
+                       GITypeInfo *list_type;
+                       JSObjectRef ret;
+                       GArgument larg;
+                       gint i = 0;
+                       GList *list = arg->v_pointer;
+
+                       ret = JSObjectMakeArray(ctx, 0, NULL, exception);
+                       list_type = g_type_info_get_param_type(type_info, 0);
+
+                       for (; list != NULL; list = list->next)
+                       {
+                               JSValueRef ival;
+
+                               larg.v_pointer = list->data;
+                               ival =
+                                       (JSValueRef) seed_gi_argument_make_js(ctx, &larg,
+                                                                                                                 list_type, exception);
+                               if (!ival)
+                                       ival = JSValueMakeNull(ctx);
+                               JSObjectSetPropertyAtIndex(ctx, ret, i, ival, NULL);
+                               i++;
+                       }
+                       return ret;
 
-    }
-  return 0;
+               }
+       case GI_TYPE_TAG_GSLIST:
+               {
+                       GITypeInfo *list_type;
+                       JSObjectRef ret;
+                       GArgument larg;
+                       gint i = 0;
+                       GSList *list = arg->v_pointer;
+
+                       ret = JSObjectMakeArray(ctx, 0, NULL, exception);
+                       list_type = g_type_info_get_param_type(type_info, 0);
+
+                       for (; list != NULL; list = list->next)
+                       {
+                               JSValueRef ival;
+
+                               larg.v_pointer = list->data;
+                               ival =
+                                       (JSValueRef) seed_gi_argument_make_js(ctx, &larg,
+                                                                                                                 list_type, exception);
+                               if (!ival)
+                                       ival = JSValueMakeNull(ctx);
+                               JSObjectSetPropertyAtIndex(ctx, ret, i, ival, NULL);
+                               i++;
+                       }
+                       return ret;
+               }
+
+       default:
+               return FALSE;
+
+       }
+       return 0;
 }
 
 JSValueRef seed_value_from_gvalue(JSContextRef ctx,
-                                 GValue * gval, JSValueRef * exception)
+                                                                 GValue * gval, JSValueRef * exception)
 {
-  if (!G_IS_VALUE(gval))
-    {
-      return false;
-    }
-  switch (G_VALUE_TYPE(gval))
-    {
-    case G_TYPE_BOOLEAN:
-      return seed_value_from_boolean(ctx,
-                                    g_value_get_boolean(gval), exception);
-    case G_TYPE_CHAR:
-      return seed_value_from_char(ctx, g_value_get_char(gval), exception);
-    case G_TYPE_UCHAR:
-      return seed_value_from_uchar(ctx, g_value_get_uchar(gval), exception);
-    case G_TYPE_INT:
-      return seed_value_from_int(ctx, g_value_get_int(gval), exception);
-    case G_TYPE_UINT:
-      return seed_value_from_uint(ctx, g_value_get_uint(gval), exception);
-    case G_TYPE_LONG:
-      return seed_value_from_long(ctx, g_value_get_long(gval), exception);
-    case G_TYPE_ULONG:
-      return seed_value_from_ulong(ctx, g_value_get_ulong(gval), exception);
-    case G_TYPE_INT64:
-      return seed_value_from_int64(ctx, g_value_get_int64(gval), exception);
-    case G_TYPE_UINT64:
-      return seed_value_from_uint64(ctx, g_value_get_uint64(gval), exception);
-    case G_TYPE_FLOAT:
-      return seed_value_from_float(ctx, g_value_get_float(gval), exception);
-    case G_TYPE_DOUBLE:
-      return seed_value_from_double(ctx, g_value_get_double(gval), exception);
-    case G_TYPE_STRING:
-      return seed_value_from_string(ctx, (gchar *)
-                                   g_value_get_string(gval), exception);
-    case G_TYPE_POINTER:
-      return seed_make_pointer(ctx, g_value_get_pointer(gval));
-    case G_TYPE_PARAM:
-      // Might need to dup and make a boxed.
-      return seed_make_pointer(ctx, g_value_get_param(gval));
-    }
-
-  if (g_type_is_a(G_VALUE_TYPE(gval), G_TYPE_ENUM) ||
-      g_type_is_a(G_VALUE_TYPE(gval), G_TYPE_FLAGS))
-    return seed_value_from_long(ctx, gval->data[0].v_long, exception);
-  else if (g_type_is_a(G_VALUE_TYPE(gval), G_TYPE_ENUM))
-    return seed_value_from_long(ctx, gval->data[0].v_long, exception);
-  else if (g_type_is_a(G_VALUE_TYPE(gval), G_TYPE_OBJECT))
-    {
-      GObject *obj = g_value_get_object(gval);
-      return seed_value_from_object(ctx, obj, exception);
-    }
-  else
-    {
-      GIBaseInfo *info;
-      GIInfoType type;
-
-      info = g_irepository_find_by_gtype(0, G_VALUE_TYPE(gval));
-      if (!info)
-       return FALSE;
-      type = g_base_info_get_type(info);
-
-      if (type == GI_INFO_TYPE_UNION)
+       if (!G_IS_VALUE(gval))
        {
-         return seed_make_union(ctx, g_value_peek_pointer(gval), info);
+               return false;
        }
-      else if (type == GI_INFO_TYPE_STRUCT)
+       switch (G_VALUE_TYPE(gval))
        {
-         return seed_make_struct(ctx, g_value_peek_pointer(gval), info);
+       case G_TYPE_BOOLEAN:
+               return seed_value_from_boolean(ctx,
+                                                                          g_value_get_boolean(gval), exception);
+       case G_TYPE_CHAR:
+               return seed_value_from_char(ctx, g_value_get_char(gval), exception);
+       case G_TYPE_UCHAR:
+               return seed_value_from_uchar(ctx, g_value_get_uchar(gval), exception);
+       case G_TYPE_INT:
+               return seed_value_from_int(ctx, g_value_get_int(gval), exception);
+       case G_TYPE_UINT:
+               return seed_value_from_uint(ctx, g_value_get_uint(gval), exception);
+       case G_TYPE_LONG:
+               return seed_value_from_long(ctx, g_value_get_long(gval), exception);
+       case G_TYPE_ULONG:
+               return seed_value_from_ulong(ctx, g_value_get_ulong(gval), exception);
+       case G_TYPE_INT64:
+               return seed_value_from_int64(ctx, g_value_get_int64(gval), exception);
+       case G_TYPE_UINT64:
+               return seed_value_from_uint64(ctx, g_value_get_uint64(gval), exception);
+       case G_TYPE_FLOAT:
+               return seed_value_from_float(ctx, g_value_get_float(gval), exception);
+       case G_TYPE_DOUBLE:
+               return seed_value_from_double(ctx, g_value_get_double(gval), exception);
+       case G_TYPE_STRING:
+               return seed_value_from_string(ctx, (gchar *)
+                                                                         g_value_get_string(gval), exception);
+       case G_TYPE_POINTER:
+               return seed_make_pointer(ctx, g_value_get_pointer(gval));
+       case G_TYPE_PARAM:
+               // Might need to dup and make a boxed.
+               return seed_make_pointer(ctx, g_value_get_param(gval));
        }
-      else if (type == GI_INFO_TYPE_BOXED)
+
+       if (g_type_is_a(G_VALUE_TYPE(gval), G_TYPE_ENUM) ||
+               g_type_is_a(G_VALUE_TYPE(gval), G_TYPE_FLAGS))
+               return seed_value_from_long(ctx, gval->data[0].v_long, exception);
+       else if (g_type_is_a(G_VALUE_TYPE(gval), G_TYPE_ENUM))
+               return seed_value_from_long(ctx, gval->data[0].v_long, exception);
+       else if (g_type_is_a(G_VALUE_TYPE(gval), G_TYPE_OBJECT))
        {
-         return seed_make_boxed(ctx, g_value_dup_boxed(gval), info);
+               GObject *obj = g_value_get_object(gval);
+               return seed_value_from_object(ctx, obj, exception);
        }
+       else
+       {
+               GIBaseInfo *info;
+               GIInfoType type;
 
-    }
+               info = g_irepository_find_by_gtype(0, G_VALUE_TYPE(gval));
+               if (!info)
+                       return FALSE;
+               type = g_base_info_get_type(info);
 
-  return NULL;
+               if (type == GI_INFO_TYPE_UNION)
+               {
+                       return seed_make_union(ctx, g_value_peek_pointer(gval), info);
+               }
+               else if (type == GI_INFO_TYPE_STRUCT)
+               {
+                       return seed_make_struct(ctx, g_value_peek_pointer(gval), info);
+               }
+               else if (type == GI_INFO_TYPE_BOXED)
+               {
+                       return seed_make_boxed(ctx, g_value_dup_boxed(gval), info);
+               }
+
+       }
+
+       return NULL;
 }
 
 gboolean
 seed_gvalue_from_seed_value(JSContextRef ctx,
-                           JSValueRef val,
-                           GType type, GValue * ret, JSValueRef * exception)
+                                                       JSValueRef val,
+                                                       GType type, GValue * ret, JSValueRef * exception)
 {
-  switch (type)
-    {
-    case G_TYPE_BOOLEAN:
-      {
-       g_value_init(ret, G_TYPE_BOOLEAN);
-       g_value_set_boolean(ret, seed_value_to_boolean(ctx,
-                                                      val, exception));
-       return TRUE;
-      }
-    case G_TYPE_INT:
-    case G_TYPE_UINT:
-      {
-       g_value_init(ret, type);
-       if (type == G_TYPE_INT)
-         g_value_set_int(ret, seed_value_to_int(ctx, val, exception));
-       else
-         g_value_set_uint(ret, seed_value_to_uint(ctx, val, exception));
-       return TRUE;
-      }
-    case G_TYPE_CHAR:
-      {
-       g_value_init(ret, G_TYPE_CHAR);
-       g_value_set_char(ret, seed_value_to_char(ctx, val, exception));
-       return TRUE;
-      }
-    case G_TYPE_UCHAR:
-      {
-       g_value_init(ret, G_TYPE_UCHAR);
-       g_value_set_uchar(ret, seed_value_to_uchar(ctx, val, exception));
-       return TRUE;
-      }
-    case G_TYPE_LONG:
-    case G_TYPE_ULONG:
-    case G_TYPE_INT64:
-    case G_TYPE_UINT64:
-    case G_TYPE_FLOAT:
-    case G_TYPE_DOUBLE:
-      {
        switch (type)
-         {
-         case G_TYPE_LONG:
-           g_value_init(ret, G_TYPE_LONG);
-           g_value_set_long(ret, seed_value_to_long(ctx, val, exception));
-           break;
-         case G_TYPE_ULONG:
-           g_value_init(ret, G_TYPE_ULONG);
-           g_value_set_ulong(ret, seed_value_to_ulong(ctx,
-                                                      val, exception));
-           break;
-         case G_TYPE_INT64:
-           g_value_init(ret, G_TYPE_INT64);
-           g_value_set_int64(ret, seed_value_to_int64(ctx,
-                                                      val, exception));
-           break;
-         case G_TYPE_UINT64:
-           g_value_init(ret, G_TYPE_UINT64);
-           g_value_set_uint64(ret, seed_value_to_uint64(ctx,
-                                                        val, exception));
-           break;
-         case G_TYPE_FLOAT:
-           g_value_init(ret, G_TYPE_FLOAT);
-           g_value_set_float(ret, seed_value_to_float(ctx,
-                                                      val, exception));
-           break;
-         case G_TYPE_DOUBLE:
-           g_value_init(ret, G_TYPE_DOUBLE);
-           g_value_set_double(ret, seed_value_to_double(ctx,
-                                                        val, exception));
-           break;
-         }
-       return TRUE;
-      }
-    case G_TYPE_STRING:
-      {
-       gchar *cval = seed_value_to_string(ctx, val, exception);
+       {
+       case G_TYPE_BOOLEAN:
+               {
+                       g_value_init(ret, G_TYPE_BOOLEAN);
+                       g_value_set_boolean(ret, seed_value_to_boolean(ctx,
+                                                                                                                  val, exception));
+                       return TRUE;
+               }
+       case G_TYPE_INT:
+       case G_TYPE_UINT:
+               {
+                       g_value_init(ret, type);
+                       if (type == G_TYPE_INT)
+                               g_value_set_int(ret, seed_value_to_int(ctx, val, exception));
+                       else
+                               g_value_set_uint(ret, seed_value_to_uint(ctx, val, exception));
+                       return TRUE;
+               }
+       case G_TYPE_CHAR:
+               {
+                       g_value_init(ret, G_TYPE_CHAR);
+                       g_value_set_char(ret, seed_value_to_char(ctx, val, exception));
+                       return TRUE;
+               }
+       case G_TYPE_UCHAR:
+               {
+                       g_value_init(ret, G_TYPE_UCHAR);
+                       g_value_set_uchar(ret, seed_value_to_uchar(ctx, val, exception));
+                       return TRUE;
+               }
+       case G_TYPE_LONG:
+       case G_TYPE_ULONG:
+       case G_TYPE_INT64:
+       case G_TYPE_UINT64:
+       case G_TYPE_FLOAT:
+       case G_TYPE_DOUBLE:
+               {
+                       switch (type)
+                       {
+                       case G_TYPE_LONG:
+                               g_value_init(ret, G_TYPE_LONG);
+                               g_value_set_long(ret, seed_value_to_long(ctx, val, exception));
+                               break;
+                       case G_TYPE_ULONG:
+                               g_value_init(ret, G_TYPE_ULONG);
+                               g_value_set_ulong(ret, seed_value_to_ulong(ctx,
+                                                                                                                  val, exception));
+                               break;
+                       case G_TYPE_INT64:
+                               g_value_init(ret, G_TYPE_INT64);
+                               g_value_set_int64(ret, seed_value_to_int64(ctx,
+                                                                                                                  val, exception));
+                               break;
+                       case G_TYPE_UINT64:
+                               g_value_init(ret, G_TYPE_UINT64);
+                               g_value_set_uint64(ret, seed_value_to_uint64(ctx,
+                                                                                                                        val, exception));
+                               break;
+                       case G_TYPE_FLOAT:
+                               g_value_init(ret, G_TYPE_FLOAT);
+                               g_value_set_float(ret, seed_value_to_float(ctx,
+                                                                                                                  val, exception));
+                               break;
+                       case G_TYPE_DOUBLE:
+                               g_value_init(ret, G_TYPE_DOUBLE);
+                               g_value_set_double(ret, seed_value_to_double(ctx,
+                                                                                                                        val, exception));
+                               break;
+                       }
+                       return TRUE;
+               }
+       case G_TYPE_STRING:
+               {
+                       gchar *cval = seed_value_to_string(ctx, val, exception);
 
-       g_value_init(ret, G_TYPE_STRING);
-       g_value_take_string(ret, cval);
+                       g_value_init(ret, G_TYPE_STRING);
+                       g_value_take_string(ret, cval);
 
-       return TRUE;
-      }
-    default:
-      {
-       // TODO: FIXME: This whole undefined type area
-       // needs some heaaavy improvement.
-
-       // Support [GObject.TYPE_INT, 3]
-       // TODO: FIXME: Might crash.
-       if (type == 0 && JSValueIsObject(ctx, val))
-         {
-           // TODO: FIXME: Better array test like the cool one on reddit.
-           guint length = seed_value_to_int(ctx,
-                                            seed_object_get_property(ctx,
-                                                                     (JSObjectRef) val,
-                                                                     "length"),
-                                            exception);
-
-           if (length)
-             {
-               type = seed_value_to_int(ctx,
-                                        JSObjectGetPropertyAtIndex(ctx,
-                                                                   (JSObjectRef)
-                                                                   val, 0,
-                                                                   exception),
-                                        exception);
-               val =
-                 JSObjectGetPropertyAtIndex(ctx, (JSObjectRef) val, 1,
-                                            exception);
-               if (type)       // Prevents recursion.
-                 {
-                   return seed_gvalue_from_seed_value(ctx, val,
-                                                      type, ret,
-                                                      exception);
-                 }
-               // TODO: FIXME: Handle better?
-               else
-                 g_assert_not_reached();
-             }
-         }
-       switch (JSValueGetType(ctx, val))
-         {
-         case kJSTypeBoolean:
-           {
-             g_value_init(ret, G_TYPE_BOOLEAN);
-             g_value_set_boolean(ret,
-                                 seed_value_to_boolean(ctx,
-                                                       val, exception));
-             return TRUE;
-           }
-         case kJSTypeNumber:
-           {
-             g_value_init(ret, G_TYPE_DOUBLE);
-             g_value_set_double(ret,
-                                seed_value_to_double(ctx,
-                                                     val, exception));
-             return TRUE;
-           }
-         case kJSTypeString:
-           {
-             gchar *cv = seed_value_to_string(ctx, val,
-                                              exception);
-
-             g_value_init(ret, G_TYPE_STRING);
-             g_value_take_string(ret, cv);
-             return TRUE;
-           }
-         default:
-           break;
-         }
-       break;
-      }
-    }
-
-  if (g_type_is_a(type, G_TYPE_ENUM) && JSValueIsNumber(ctx, val))
-    {
-      g_value_init(ret, type);
-      ret->data[0].v_long = seed_value_to_long(ctx, val, exception);
-      return TRUE;
-    }
-  else if (g_type_is_a(type, G_TYPE_FLAGS) && JSValueIsNumber(ctx, val))
-    {
-      g_value_init(ret, type);
-      ret->data[0].v_long = seed_value_to_long(ctx, val, exception);
-      return TRUE;
-    }
-  else if (g_type_is_a(type, G_TYPE_OBJECT)
-          && (JSValueIsNull(ctx, val) || seed_value_is_gobject(ctx, val)))
-    {
-      GObject *o = seed_value_to_object(ctx,
-                                       val, exception);
-
-      if (o == NULL || g_type_is_a(G_OBJECT_TYPE(o), type))
-       {
-         g_value_init(ret, G_TYPE_OBJECT);
-         g_value_set_object(ret, o);
+                       return TRUE;
+               }
+       default:
+               {
+                       // TODO: FIXME: This whole undefined type area
+                       // needs some heaaavy improvement.
+
+                       // Support [GObject.TYPE_INT, 3]
+                       // TODO: FIXME: Might crash.
+                       if (type == 0 && JSValueIsObject(ctx, val))
+                       {
+                               // TODO: FIXME: Better array test like the cool one on reddit.
+                               guint length = seed_value_to_int(ctx,
+                                                                                                seed_object_get_property(ctx,
+                                                                                                                                                 (JSObjectRef) val,
+                                                                                                                                                 "length"),
+                                                                                                exception);
+
+                               if (length)
+                               {
+                                       type = seed_value_to_int(ctx,
+                                                                                        JSObjectGetPropertyAtIndex(ctx,
+                                                                                                                                               (JSObjectRef)
+                                                                                                                                               val, 0,
+                                                                                                                                               exception),
+                                                                                        exception);
+                                       val =
+                                               JSObjectGetPropertyAtIndex(ctx, (JSObjectRef) val, 1,
+                                                                                                  exception);
+                                       if (type)       // Prevents recursion.
+                                       {
+                                               return seed_gvalue_from_seed_value(ctx, val,
+                                                                                                                  type, ret,
+                                                                                                                  exception);
+                                       }
+                                       // TODO: FIXME: Handle better?
+                                       else
+                                               g_assert_not_reached();
+                               }
+                       }
+                       switch (JSValueGetType(ctx, val))
+                       {
+                       case kJSTypeBoolean:
+                               {
+                                       g_value_init(ret, G_TYPE_BOOLEAN);
+                                       g_value_set_boolean(ret,
+                                                                               seed_value_to_boolean(ctx,
+                                                                                                                         val, exception));
+                                       return TRUE;
+                               }
+                       case kJSTypeNumber:
+                               {
+                                       g_value_init(ret, G_TYPE_DOUBLE);
+                                       g_value_set_double(ret,
+                                                                          seed_value_to_double(ctx,
+                                                                                                                       val, exception));
+                                       return TRUE;
+                               }
+                       case kJSTypeString:
+                               {
+                                       gchar *cv = seed_value_to_string(ctx, val,
+                                                                                                        exception);
+
+                                       g_value_init(ret, G_TYPE_STRING);
+                                       g_value_take_string(ret, cv);
+                                       return TRUE;
+                               }
+                       default:
+                               break;
+                       }
+                       break;
+               }
+       }
 
-         return TRUE;
+       if (g_type_is_a(type, G_TYPE_ENUM) && JSValueIsNumber(ctx, val))
+       {
+               g_value_init(ret, type);
+               ret->data[0].v_long = seed_value_to_long(ctx, val, exception);
+               return TRUE;
        }
-    }
-  /* Boxed handling is broken. Will be fixed in struct overhall. */
-  else if (g_type_is_a(type, G_TYPE_BOXED))
-    {
-      gpointer p = seed_pointer_get_pointer(ctx, val);
-      if (p)
+       else if (g_type_is_a(type, G_TYPE_FLAGS) && JSValueIsNumber(ctx, val))
        {
-         g_value_init(ret, type);
-         g_value_set_boxed(ret, p);
-         return TRUE;
+               g_value_init(ret, type);
+               ret->data[0].v_long = seed_value_to_long(ctx, val, exception);
+               return TRUE;
        }
-      else
+       else if (g_type_is_a(type, G_TYPE_OBJECT)
+                        && (JSValueIsNull(ctx, val) || seed_value_is_gobject(ctx, val)))
        {
-         if (JSValueIsObject(ctx, val))
-           {
-             GIBaseInfo *info = g_irepository_find_by_gtype(0, type);
-             JSObjectRef new_struct;
-             if (!info)
-               return FALSE;
+               GObject *o = seed_value_to_object(ctx,
+                                                                                 val, exception);
 
-             new_struct =
-               seed_construct_struct_type_with_parameters(ctx,
-                                                          info,
-                                                          (JSObjectRef)
-                                                          val, exception);
-             p = seed_pointer_get_pointer(ctx, new_struct);
-             if (p)
+               if (o == NULL || g_type_is_a(G_OBJECT_TYPE(o), type))
                {
-                 g_value_init(ret, type);
-                 g_value_set_boxed(ret, p);
-                 g_base_info_unref(info);
-                 return TRUE;
+                       g_value_init(ret, G_TYPE_OBJECT);
+                       g_value_set_object(ret, o);
+
+                       return TRUE;
+               }
+       }
+       /* Boxed handling is broken. Will be fixed in struct overhall. */
+       else if (g_type_is_a(type, G_TYPE_BOXED))
+       {
+               gpointer p = seed_pointer_get_pointer(ctx, val);
+               if (p)
+               {
+                       g_value_init(ret, type);
+                       g_value_set_boxed(ret, p);
+                       return TRUE;
+               }
+               else
+               {
+                       if (JSValueIsObject(ctx, val))
+                       {
+                               GIBaseInfo *info = g_irepository_find_by_gtype(0, type);
+                               JSObjectRef new_struct;
+                               if (!info)
+                                       return FALSE;
+
+                               new_struct =
+                                       seed_construct_struct_type_with_parameters(ctx,
+                                                                                                                          info,
+                                                                                                                          (JSObjectRef)
+                                                                                                                          val, exception);
+                               p = seed_pointer_get_pointer(ctx, new_struct);
+                               if (p)
+                               {
+                                       g_value_init(ret, type);
+                                       g_value_set_boxed(ret, p);
+                                       g_base_info_unref(info);
+                                       return TRUE;
+                               }
+                               g_base_info_unref(info);
+                       }
                }
-             g_base_info_unref(info);
-           }
        }
-    }
 
-  return FALSE;
+       return FALSE;
 }
 
 JSValueRef seed_object_get_property(JSContextRef ctx,
-                                   JSObjectRef val, const gchar * name)
+                                                                       JSObjectRef val, const gchar * name)
 {
 
-  JSStringRef jname = JSStringCreateWithUTF8CString(name);
-  JSValueRef ret = JSObjectGetProperty(ctx,
-                                      (JSObjectRef) val,
-                                      jname, NULL);
+       JSStringRef jname = JSStringCreateWithUTF8CString(name);
+       JSValueRef ret = JSObjectGetProperty(ctx,
+                                                                                (JSObjectRef) val,
+                                                                                jname, NULL);
 
-  JSStringRelease(jname);
+       JSStringRelease(jname);
 
-  return ret;
+       return ret;
 }
 
 gboolean
 seed_object_set_property(JSContextRef ctx, JSObjectRef object,
-                        const gchar * name, JSValueRef value)
+                                                const gchar * name, JSValueRef value)
 {
-  JSStringRef jname = JSStringCreateWithUTF8CString(name);
+       JSStringRef jname = JSStringCreateWithUTF8CString(name);
 
-  if (value)
-    {
-      JSObjectSetProperty(ctx, (JSObjectRef) object, jname, value, 0, 0);
-    }
+       if (value)
+       {
+               JSObjectSetProperty(ctx, (JSObjectRef) object, jname, value, 0, 0);
+       }
 
-  JSStringRelease(jname);
+       JSStringRelease(jname);
 
-  return TRUE;
+       return TRUE;
 }
 
 /* TODO: Make some macros or something for making exceptions, code is littered
    with annoyingness right now */
 gboolean seed_value_to_boolean(JSContextRef ctx,
-                              JSValueRef val, JSValueRef * exception)
+                                                          JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsBoolean(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
+       if (!JSValueIsBoolean(ctx, val))
        {
-         seed_make_exception(eng->context, exception, "ConversionError",
-                             "Can not convert Javascript value to boolean");
-         return 0;
-       }
+               if (!JSValueIsNull(ctx, val))
+               {
+                       seed_make_exception(eng->context, exception, "ConversionError",
+                                                               "Can not convert Javascript value to boolean");
+                       return 0;
+               }
 
-      return 0;
-    }
+               return 0;
+       }
 
-  return JSValueToBoolean(ctx, val);
+       return JSValueToBoolean(ctx, val);
 }
 
 JSValueRef seed_value_from_boolean(JSContextRef ctx,
-                                  gboolean val, JSValueRef * exception)
+                                                                  gboolean val, JSValueRef * exception)
 {
-  return JSValueMakeBoolean(ctx, val);
+       return JSValueMakeBoolean(ctx, val);
 }
 
 guint seed_value_to_uint(JSContextRef ctx,
-                        JSValueRef val, JSValueRef * exception)
+                                                JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
+       if (!JSValueIsNumber(ctx, val))
        {
-         seed_make_exception(ctx, exception, "ConversionError",
-                             "Can not convert Javascript value to"
-                             " boolean");
+               if (!JSValueIsNull(ctx, val))
+               {
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to"
+                                                               " boolean");
+               }
+               return 0;
        }
-      return 0;
-    }
 
-  return (guint) JSValueToNumber(ctx, val, NULL);
+       return (guint) JSValueToNumber(ctx, val, NULL);
 }
 
 JSValueRef seed_value_from_uint(JSContextRef ctx,
-                               guint val, JSValueRef * exception)
+                                                               guint val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 gint seed_value_to_int(JSContextRef ctx, JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to" " int");
-      return 0;
-    }
-
-  return (gint) JSValueToNumber(ctx, val, NULL);
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to" " int");
+               return 0;
+       }
+
+       return (gint) JSValueToNumber(ctx, val, NULL);
 }
 
 JSValueRef seed_value_from_int(JSContextRef ctx,
-                              gint val, JSValueRef * exception)
+                                                          gint val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 gchar seed_value_to_char(JSContextRef ctx,
-                        JSValueRef val, JSValueRef * exception)
+                                                JSValueRef val, JSValueRef * exception)
 {
-  gint cv;
-
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to" " gchar");
-      return 0;
-    }
-
-  cv = JSValueToNumber(ctx, val, NULL);
-
-  if (cv < G_MININT8 || cv > G_MAXINT8)
-    {
-      seed_make_exception(ctx, exception, "ConversionError",
-                         "Javascript number out of range of gchar");
-      return 0;
-    }
-
-  return (char)cv;
+       gint cv;
+
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to" " gchar");
+               return 0;
+       }
+
+       cv = JSValueToNumber(ctx, val, NULL);
+
+       if (cv < G_MININT8 || cv > G_MAXINT8)
+       {
+               seed_make_exception(ctx, exception, "ConversionError",
+                                                       "Javascript number out of range of gchar");
+               return 0;
+       }
+
+       return (char)cv;
 }
 
 JSValueRef seed_value_from_char(JSContextRef ctx,
-                               gchar val, JSValueRef * exception)
+                                                               gchar val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 guchar seed_value_to_uchar(JSContextRef ctx,
-                          JSValueRef val, JSValueRef * exception)
+                                                  JSValueRef val, JSValueRef * exception)
 {
-  guint cv;
-
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to"
-                           " guchar");
-      return 0;
-    }
-
-  cv = JSValueToNumber(ctx, val, NULL);
-
-  if (cv > G_MAXUINT8)
-    {
-      seed_make_exception(ctx, exception, "ConversionError",
-                         "Javascript number out of range of guchar");
-      return 0;
-    }
-
-  return (guchar) cv;
+       guint cv;
+
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to"
+                                                               " guchar");
+               return 0;
+       }
+
+       cv = JSValueToNumber(ctx, val, NULL);
+
+       if (cv > G_MAXUINT8)
+       {
+               seed_make_exception(ctx, exception, "ConversionError",
+                                                       "Javascript number out of range of guchar");
+               return 0;
+       }
+
+       return (guchar) cv;
 }
 
 JSValueRef seed_value_from_uchar(JSContextRef ctx,
-                                guchar val, JSValueRef * exception)
+                                                                guchar val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 glong seed_value_to_long(JSContextRef ctx,
-                        JSValueRef val, JSValueRef * exception)
+                                                JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to" " long");
-      return 0;
-    }
-
-  return (glong) JSValueToNumber(ctx, val, NULL);
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to" " long");
+               return 0;
+       }
+
+       return (glong) JSValueToNumber(ctx, val, NULL);
 }
 
 JSValueRef seed_value_from_long(JSContextRef ctx,
-                               glong val, JSValueRef * exception)
+                                                               glong val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 gulong seed_value_to_ulong(JSContextRef ctx,
-                          JSValueRef val, JSValueRef * exception)
+                                                  JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to" " ulong");
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to" " ulong");
 
-      return 0;
-    }
+               return 0;
+       }
 
-  return (gulong) JSValueToNumber(ctx, val, NULL);
+       return (gulong) JSValueToNumber(ctx, val, NULL);
 }
 
 JSValueRef seed_value_from_ulong(JSContextRef ctx,
-                                gulong val, JSValueRef * exception)
+                                                                gulong val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 gint64 seed_value_to_int64(JSContextRef ctx,
-                          JSValueRef val, JSValueRef * exception)
+                                                  JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to"
-                           " gint64");
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to"
+                                                               " gint64");
 
-      return 0;
-    }
+               return 0;
+       }
 
-  return (gint64) JSValueToNumber(ctx, val, NULL);
+       return (gint64) JSValueToNumber(ctx, val, NULL);
 }
 
 JSValueRef seed_value_from_int64(JSContextRef ctx,
-                                gint64 val, JSValueRef * exception)
+                                                                gint64 val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 guint64 seed_value_to_uint64(JSContextRef ctx,
-                            JSValueRef val, JSValueRef * exception)
+                                                        JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to"
-                           " guint64");
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to"
+                                                               " guint64");
 
-      return 0;
-    }
+               return 0;
+       }
 
-  return (guint64) JSValueToNumber(ctx, val, NULL);
+       return (guint64) JSValueToNumber(ctx, val, NULL);
 }
 
 JSValueRef seed_value_from_uint64(JSContextRef ctx,
-                                 guint64 val, JSValueRef * exception)
+                                                                 guint64 val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 gfloat seed_value_to_float(JSContextRef ctx,
-                          JSValueRef val, JSValueRef * exception)
+                                                  JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to"
-                           " gfloat");
-      return 0;
-    }
-
-  return (gfloat) JSValueToNumber(ctx, val, NULL);
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to"
+                                                               " gfloat");
+               return 0;
+       }
+
+       return (gfloat) JSValueToNumber(ctx, val, NULL);
 }
 
 JSValueRef seed_value_from_float(JSContextRef ctx,
-                                gfloat val, JSValueRef * exception)
+                                                                gfloat val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 gdouble seed_value_to_double(JSContextRef ctx,
-                            JSValueRef val, JSValueRef * exception)
+                                                        JSValueRef val, JSValueRef * exception)
 {
-  if (!JSValueIsNumber(ctx, val))
-    {
-      if (!JSValueIsNull(ctx, val))
-       seed_make_exception(ctx, exception, "ConversionError",
-                           "Can not convert Javascript value to"
-                           " double");
-      return 0;
-    }
-
-  return (gdouble) JSValueToNumber(ctx, val, NULL);
+       if (!JSValueIsNumber(ctx, val))
+       {
+               if (!JSValueIsNull(ctx, val))
+                       seed_make_exception(ctx, exception, "ConversionError",
+                                                               "Can not convert Javascript value to"
+                                                               " double");
+               return 0;
+       }
+
+       return (gdouble) JSValueToNumber(ctx, val, NULL);
 }
 
 JSValueRef seed_value_from_double(JSContextRef ctx,
-                                 gdouble val, JSValueRef * exception)
+                                                                 gdouble val, JSValueRef * exception)
 {
-  return JSValueMakeNumber(ctx, (gdouble) val);
+       return JSValueMakeNumber(ctx, (gdouble) val);
 }
 
 gchar *seed_value_to_string(JSContextRef ctx,
-                           JSValueRef val, JSValueRef * exception)
+                                                       JSValueRef val, JSValueRef * exception)
 {
-  JSStringRef jsstr = 0;
-  JSValueRef func, str;
-  gchar *buf = 0;
-  gint length;
-
-  if (val == NULL)
-    return NULL;
-
-  if (JSValueIsBoolean(ctx, val) || JSValueIsNumber(ctx, val))
-    {
-      buf = g_strdup_printf("%lf", JSValueToNumber(ctx, val, NULL));
-    }
-  else if (JSValueIsNull(ctx, val) || JSValueIsUndefined(ctx, val))
-    {
-      buf = strdup("[null]");
-    }
-  else
-    {
-      if (!JSValueIsString(ctx, val))  // In this case,
-       // it's an object
+       JSStringRef jsstr = 0;
+       JSValueRef func, str;
+       gchar *buf = 0;
+       gint length;
+
+       if (val == NULL)
+               return NULL;
+
+       if (JSValueIsBoolean(ctx, val) || JSValueIsNumber(ctx, val))
        {
-         func = seed_object_get_property(ctx, (JSObjectRef) val, "toString");
-         str =
-           JSObjectCallAsFunction(ctx,
-                                  (JSObjectRef) func,
-                                  (JSObjectRef) val, 0, NULL, NULL);
+               buf = g_strdup_printf("%lf", JSValueToNumber(ctx, val, NULL));
        }
-
-      jsstr = JSValueToStringCopy(ctx, val, NULL);
-      length = JSStringGetMaximumUTF8CStringSize(jsstr);
-      if (length > 0)
+       else if (JSValueIsNull(ctx, val) || JSValueIsUndefined(ctx, val))
        {
-         buf = g_malloc(length * sizeof(gchar));
-         JSStringGetUTF8CString(jsstr, buf, length);
+               buf = strdup("[null]");
        }
-      if (jsstr)
-       JSStringRelease(jsstr);
-    }
+       else
+       {
+               if (!JSValueIsString(ctx, val)) // In this case,
+                       // it's an object
+               {
+                       func = seed_object_get_property(ctx, (JSObjectRef) val, "toString");
+                       str =
+                               JSObjectCallAsFunction(ctx,
+                                                                          (JSObjectRef) func,
+                                                                          (JSObjectRef) val, 0, NULL, NULL);
+               }
 
-  return buf;
+               jsstr = JSValueToStringCopy(ctx, val, NULL);
+               length = JSStringGetMaximumUTF8CStringSize(jsstr);
+               if (length > 0)
+               {
+                       buf = g_malloc(length * sizeof(gchar));
+                       JSStringGetUTF8CString(jsstr, buf, length);
+               }
+               if (jsstr)
+                       JSStringRelease(jsstr);
+       }
+
+       return buf;
 }
 
 JSValueRef seed_value_from_string(JSContextRef ctx,
-                                 const gchar * val, JSValueRef * exception)
+                                                                 const gchar * val, JSValueRef * exception)
 {
-  JSStringRef jsstr = JSStringCreateWithUTF8CString(val);
-  JSValueRef valstr = JSValueMakeString(ctx, jsstr);
-  JSStringRelease(jsstr);
+       JSStringRef jsstr = JSStringCreateWithUTF8CString(val);
+       JSValueRef valstr = JSValueMakeString(ctx, jsstr);
+       JSStringRelease(jsstr);
 
-  return valstr;
+       return valstr;
 }
 
 JSValueRef seed_value_from_filename(JSContextRef ctx,
-                                   const gchar * filename,
-                                   JSValueRef * exception)
+                                                                       const gchar * filename,
+                                                                       JSValueRef * exception)
 {
-  GError *e = NULL;
-  gchar *utf8;
-
-  utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, &e);
-  if (e)
-    {
-      seed_make_exception_from_gerror(ctx, exception, e);
-      g_error_free(e);
-      // TODO: FIXMEShould be JS Null maybe?
-      return NULL;
-    }
-
-  return seed_value_from_string(ctx, utf8, exception);
+       GError *e = NULL;
+       gchar *utf8;
+
+       utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, &e);
+       if (e)
+       {
+               seed_make_exception_from_gerror(ctx, exception, e);
+               g_error_free(e);
+               // TODO: FIXMEShould be JS Null maybe?
+               return NULL;
+       }
+
+       return seed_value_from_string(ctx, utf8, exception);
 }
 
 gchar *seed_value_to_filename(JSContextRef ctx,
-                             JSValueRef val, JSValueRef * exception)
+                                                         JSValueRef val, JSValueRef * exception)
 {
-  GError *e = NULL;
-  gchar *utf8 = seed_value_to_string(ctx, val, exception);
-  gchar *filename;
-
-  filename = g_filename_from_utf8(utf8, -1, NULL, NULL, &e);
-  g_free(utf8);
-  if (e)
-    {
-      seed_make_exception_from_gerror(ctx, exception, e);
-      g_error_free(e);
-      return NULL;
-    }
-
-  return filename;
+       GError *e = NULL;
+       gchar *utf8 = seed_value_to_string(ctx, val, exception);
+       gchar *filename;
+
+       filename = g_filename_from_utf8(utf8, -1, NULL, NULL, &e);
+       g_free(utf8);
+       if (e)
+       {
+               seed_make_exception_from_gerror(ctx, exception, e);
+               g_error_free(e);
+               return NULL;
+       }
+
+       return filename;
 }
 
 GObject *seed_value_to_object(JSContextRef ctx,
-                             JSValueRef val, JSValueRef * exception)
+                                                         JSValueRef val, JSValueRef * exception)
 {
-  GObject *gobject;
-
-  /* 
-   * Worth investigating if this is the best way to handle null. Some of 
-   * the existing code depends on null Objects not throwing an exception 
-   * however, needs testing at higher level if value can be null 
-   * (through GI) 
-   */
-
-  if (JSValueIsNull(ctx, val))
-    return 0;
-  if (!seed_value_is_gobject(ctx, val))
-    {
-      seed_make_exception(ctx, exception, "ConversionError",
-                         "Attempt to convert from"
-                         " non GObject to GObject");
-      return NULL;
-    }
-
-  gobject = (GObject *) JSObjectGetPrivate((JSObjectRef) val);
-
-  return gobject;
+       GObject *gobject;
+
+       /* 
+        * Worth investigating if this is the best way to handle null. Some of 
+        * the existing code depends on null Objects not throwing an exception 
+        * however, needs testing at higher level if value can be null 
+        * (through GI) 
+        */
+
+       if (JSValueIsNull(ctx, val))
+               return 0;
+       if (!seed_value_is_gobject(ctx, val))
+       {
+               seed_make_exception(ctx, exception, "ConversionError",
+                                                       "Attempt to convert from"
+                                                       " non GObject to GObject");
+               return NULL;
+       }
+
+       gobject = (GObject *) JSObjectGetPrivate((JSObjectRef) val);
+
+       return gobject;
 }
 
 JSValueRef seed_value_from_object(JSContextRef ctx,
-                                 GObject * val, JSValueRef * exception)
+                                                                 GObject * val, JSValueRef * exception)
 {
-  if (val == NULL)
-    return JSValueMakeNull(ctx);
-  else
-    return seed_wrap_object(ctx, val);
+       if (val == NULL)
+               return JSValueMakeNull(ctx);
+       else
+               return seed_wrap_object(ctx, val);
 }
index 8c60747..0966e96 100644 (file)
@@ -75,8 +75,7 @@ SeedValue seed_simple_evaluate(SeedContext ctx, gchar * source);
 SeedScript *seed_make_script(SeedContext ctx,
                                                         const gchar * s, const gchar * source_url,
                                                         gint line_number);
-SeedScript *seed_script_new_from_file(SeedContext ctx, 
-                                     gchar *file);
+SeedScript *seed_script_new_from_file(SeedContext ctx, gchar * file);
 SeedException seed_script_exception(SeedScript * s);
 void seed_make_exception(SeedContext ctx, SeedException e,
                                                 gchar * name, gchar * message);
@@ -114,12 +113,9 @@ gsize seed_string_to_utf8_buffer(SeedString string, gchar * buffer,
 gboolean seed_string_is_equal(SeedString a, SeedString b);
 gboolean seed_string_is_equal_utf8(SeedString a, const gchar * b);
 
-gboolean seed_value_is_null(SeedContext ctx,
-                           SeedValue value);
-gboolean seed_value_is_object(SeedContext ctx,
-                             SeedValue value);
-gboolean seed_value_is_function(SeedContext ctx,
-                                SeedObject value);
+gboolean seed_value_is_null(SeedContext ctx, SeedValue value);
+gboolean seed_value_is_object(SeedContext ctx, SeedValue value);
+gboolean seed_value_is_function(SeedContext ctx, SeedObject value);
 
 SeedValue seed_object_call(SeedContext ctx,
                                                   SeedObject object,
old mode 100644 (file)
new mode 100755 (executable)