seed r851 - in trunk: libseed tools
- From: hortont svn gnome org
- To: svn-commits-list gnome org
- Subject: seed r851 - in trunk: libseed tools
- Date: Sat, 7 Feb 2009 09:19:32 +0000 (UTC)
Author: hortont
Date: Sat Feb 7 09:19:31 2009
New Revision: 851
URL: http://svn.gnome.org/viewvc/seed?rev=851&view=rev
Log:
Indent session!
Modified:
trunk/libseed/seed-api.c
trunk/libseed/seed-builtins.c
trunk/libseed/seed-closure.c
trunk/libseed/seed-engine.c
trunk/libseed/seed-types.c
trunk/libseed/seed.h
trunk/tools/indent.sh (props changed)
Modified: trunk/libseed/seed-api.c
==============================================================================
--- trunk/libseed/seed-api.c (original)
+++ trunk/libseed/seed-api.c Sat Feb 7 09:19:31 2009
@@ -32,7 +32,7 @@
}
JSGlobalContextRef seed_context_create(JSContextGroupRef group,
- JSClassRef global_class)
+ JSClassRef global_class)
{
return JSGlobalContextCreateInGroup(group, global_class);
}
@@ -53,33 +53,33 @@
}
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 @@
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 @@
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 @@
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_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 @@
}
JSObjectRef seed_make_constructor(JSContextRef ctx,
- JSClassRef class,
- JSObjectCallAsConstructorCallback constructor)
+ JSClassRef class,
+ JSObjectCallAsConstructorCallback constructor)
{
return JSObjectMakeConstructor(ctx, class, constructor);
}
@@ -199,22 +198,17 @@
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);
}
-
Modified: trunk/libseed/seed-builtins.c
==============================================================================
--- trunk/libseed/seed-builtins.c (original)
+++ trunk/libseed/seed-builtins.c Sat Feb 7 09:19:31 2009
@@ -325,9 +325,8 @@
// 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);
}
Modified: trunk/libseed/seed-closure.c
==============================================================================
--- trunk/libseed/seed-closure.c (original)
+++ trunk/libseed/seed-closure.c Sat Feb 7 09:19:31 2009
@@ -398,7 +398,7 @@
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,
Modified: trunk/libseed/seed-engine.c
==============================================================================
--- trunk/libseed/seed-engine.c (original)
+++ trunk/libseed/seed-engine.c Sat Feb 7 09:19:31 2009
@@ -877,7 +877,7 @@
JSStringRef extension_script;
gint n, i;
GModule *extension;
-
+
ctx = eng->context;
if (argumentCount == 0)
Modified: trunk/libseed/seed-types.c
==============================================================================
--- trunk/libseed/seed-types.c (original)
+++ trunk/libseed/seed-types.c Sat Feb 7 09:19:31 2009
@@ -31,1528 +31,1530 @@
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;
+ JSValueRef wrapper;
- wrapper = (JSValueRef) data;
+ wrapper = (JSValueRef) data;
- if (is_last_ref)
- {
- JSValueUnprotect(eng->context, wrapper);
- }
- else
- {
- JSValueProtect(eng->context, wrapper);
- }
+ 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;
-
- type = G_OBJECT_TYPE(object);
-
- user_data = (JSValueRef) g_object_get_data(object, "js-ref");
-
- if (user_data)
- return user_data;
-
- 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();
- }
+ JSValueRef user_data;
+ JSValueRef js_ref;
+ JSClassRef class;
+ GType type;
+ JSValueRef prototype;
+
+ type = G_OBJECT_TYPE(object);
+
+ user_data = (JSValueRef) g_object_get_data(object, "js-ref");
- g_object_set_data_full(object, "js-ref", (gpointer) js_ref,
- seed_gobject_destroyed);
+ if (user_data)
+ return user_data;
+
+ 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();
+ }
- JSValueProtect(eng->context, js_ref);
- g_object_add_toggle_ref(object, seed_toggle_ref, (gpointer) js_ref);
+ g_object_set_data_full(object, "js-ref", (gpointer) js_ref,
+ seed_gobject_destroyed);
- return js_ref;
+ JSValueProtect(eng->context, js_ref);
+ g_object_add_toggle_ref(object, seed_toggle_ref, (gpointer) 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;
+ 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)
+ {
+ GITypeInfo *param_type;
- 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)
- {
- 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;
+ 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();
+ }
- return TRUE;
+ 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;
+
+ }
+
+ 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;
+ GITypeTag type_tag;
- if (transfer == GI_TRANSFER_EVERYTHING)
- return TRUE;
+ if (transfer == GI_TRANSFER_EVERYTHING)
+ return TRUE;
- type_tag = g_type_info_get_tag((GITypeInfo *) type_info);
+ 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;
- }
+ 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;
+ 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)
-{
- 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);
- break;
- }
- }
-
- g_base_info_unref(interface);
- }
- default:
- seed_make_exception(ctx, exception, "ArgumentError",
- "Unhandled array element type");
- return FALSE;
- }
+ JSValueRef array,
+ guint length,
+ GITypeInfo * param_type,
+ void **array_p, JSValueRef * exception)
+{
+ GITypeTag element_type;
- return TRUE;
-}
+ element_type = g_type_info_get_tag(param_type);
-gboolean
-seed_gi_make_argument(JSContextRef ctx,
- 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;
+ 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;
- interface = g_type_info_get_interface(type_info);
- interface_type = g_base_info_get_type(interface);
+ result = g_new0(gfloat, length + 1);
- arg->v_pointer = NULL;
+ for (i = 0; i < length; i++)
+ {
+ JSValueRef elem = JSObjectGetPropertyAtIndex(ctx,
+ (JSObjectRef)
+ array,
+ i,
+ exception);
+ result[i] = seed_value_to_float(ctx, elem, exception);
+ }
- 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);
+ *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);
+ break;
+ }
+ }
+
+ g_base_info_unref(interface);
+ }
+ default:
+ seed_make_exception(ctx, exception, "ArgumentError",
+ "Unhandled array element type");
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 TRUE;
+}
+
+gboolean
+seed_gi_make_argument(JSContextRef ctx,
+ 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;
+
+ 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;
+ 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;
- param_type = g_type_info_get_param_type(type_info, 0);
+ if (arg->v_pointer == NULL)
+ return JSValueMakeNull(ctx);
+ if (!g_type_info_is_zero_terminated(type_info))
+ break;
- ret = seed_gi_make_jsarray(ctx, arg->v_pointer, param_type,
- exception);
+ param_type = g_type_info_get_param_type(type_info, 0);
- g_base_info_unref((GIBaseInfo *) param_type);
+ ret = seed_gi_make_jsarray(ctx, arg->v_pointer, param_type,
+ exception);
- 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;
+ g_base_info_unref((GIBaseInfo *) param_type);
- }
- 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;
- }
+ 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;
- default:
- return FALSE;
+ 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;
- }
- }
- /* 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;
+ return TRUE;
+ }
+ default:
+ {
+ // TODO: FIXME: This whole undefined type area
+ // needs some heaaavy improvement.
- 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;
+ // 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;
}
- g_base_info_unref(info);
- }
}
- }
- return FALSE;
+ 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;
+ }
+ }
+ /* 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);
+ }
+ }
+ }
+
+ 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;
- }
+ 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);
+ 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;
+ 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;
- }
+ if (!JSValueIsNumber(ctx, val))
+ {
+ if (!JSValueIsNull(ctx, val))
+ seed_make_exception(ctx, exception, "ConversionError",
+ "Can not convert Javascript value to" " gchar");
+ return 0;
+ }
- return (char)cv;
+ 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;
+ 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;
- }
+ if (!JSValueIsNumber(ctx, val))
+ {
+ if (!JSValueIsNull(ctx, val))
+ seed_make_exception(ctx, exception, "ConversionError",
+ "Can not convert Javascript value to"
+ " guchar");
+ return 0;
+ }
- return (guchar) cv;
+ 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;
- }
+ 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);
+ 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;
- }
+ 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);
+ 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;
- }
+ 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);
+ 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
- {
- func = seed_object_get_property(ctx, (JSObjectRef) val, "toString");
- str =
- JSObjectCallAsFunction(ctx,
- (JSObjectRef) func,
- (JSObjectRef) val, 0, NULL, NULL);
- }
-
- jsstr = JSValueToStringCopy(ctx, val, NULL);
- length = JSStringGetMaximumUTF8CStringSize(jsstr);
- if (length > 0)
+ 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_malloc(length * sizeof(gchar));
- JSStringGetUTF8CString(jsstr, buf, length);
+ 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
+ {
+ func = seed_object_get_property(ctx, (JSObjectRef) val, "toString");
+ str =
+ JSObjectCallAsFunction(ctx,
+ (JSObjectRef) func,
+ (JSObjectRef) val, 0, NULL, NULL);
+ }
+
+ 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);
}
- if (jsstr)
- JSStringRelease(jsstr);
- }
- return buf;
+ 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;
+ 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;
- }
+ 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);
+ 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;
- }
+ 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;
+ return filename;
}
GObject *seed_value_to_object(JSContextRef ctx,
- JSValueRef val, JSValueRef * exception)
+ JSValueRef val, JSValueRef * exception)
{
- GObject *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;
- }
+ /*
+ * 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);
+ gobject = (GObject *) JSObjectGetPrivate((JSObjectRef) val);
- return gobject;
+ 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);
}
Modified: trunk/libseed/seed.h
==============================================================================
--- trunk/libseed/seed.h (original)
+++ trunk/libseed/seed.h Sat Feb 7 09:19:31 2009
@@ -75,8 +75,7 @@
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 @@
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,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]