seed r465 - trunk/libseed
- From: racarr svn gnome org
- To: svn-commits-list gnome org
- Subject: seed r465 - trunk/libseed
- Date: Mon, 15 Dec 2008 00:42:20 +0000 (UTC)
Author: racarr
Date: Mon Dec 15 00:42:19 2008
New Revision: 465
URL: http://svn.gnome.org/viewvc/seed?rev=465&view=rev
Log:
A proper implementation of supporting non "strict" construction
params in JSON constructors.
Modified:
trunk/libseed/seed-engine.c
Modified: trunk/libseed/seed-engine.c
==============================================================================
--- trunk/libseed/seed-engine.c (original)
+++ trunk/libseed/seed-engine.c Mon Dec 15 00:42:19 2008
@@ -89,13 +89,13 @@
JSValueRef * exception)
{
GType type;
- GParameter *params;
+ GParameter *construct_params, *after_params;
GObjectClass *oclass;
GObject *gobject;
// Do we free GParamSpecs...? It's not clear.
GParamSpec *param_spec;
gchar *prop_name;
- gint i, nparams = 0, length;
+ gint i, nafter_params = 0, nconstruct_params = 0, nparams = 0, length;
JSObjectRef ret;
JSPropertyNameArrayRef jsprops = 0;
JSStringRef jsprop_name;
@@ -133,13 +133,15 @@
}
i = 0;
- params = g_new0(GParameter, nparams + 1);
+ construct_params = g_new0(GParameter, nparams + 1);
+ after_params = g_new0(GParameter, nparams + 1);
SEED_NOTE(INITIALIZATION, "Constructing object of type %s",
g_type_name(type));
while (i < nparams)
{
GType type;
+ gboolean construct;
jsprop_name = JSPropertyNameArrayGetNameAtIndex(jsprops, i);
length = JSStringGetMaximumUTF8CStringSize(jsprop_name);
@@ -155,11 +157,13 @@
seed_make_exception(ctx, exception, "PropertyError", mes);
g_free(mes);
- g_free(params);
+ g_free(construct_params);
+ g_free(after_params);
JSPropertyNameArrayRelease(jsprops);
return (JSObjectRef) JSValueMakeNull(ctx);
}
+ construct = param_spec->flags & G_PARAM_CONSTRUCT;
// TODO: exception handling
jsprop_value = JSObjectGetProperty(ctx,
(JSObjectRef) arguments[0],
@@ -169,27 +173,44 @@
type = G_TYPE_INT;
else
type = param_spec->value_type;
+
+ if (construct)
+ seed_gvalue_from_seed_value(ctx, jsprop_value,
+ type, &construct_params[i].value,
+ exception);
+ else
+ seed_gvalue_from_seed_value(ctx, jsprop_value,
+ type, &after_params[i].value,
+ exception);
- seed_gvalue_from_seed_value(ctx, jsprop_value,
- type, ¶ms[i].value, exception);
-
+
if (*exception)
{
g_free(prop_name);
- g_free(params);
+ g_free(construct_params);
+ g_free(after_params);
JSPropertyNameArrayRelease(jsprops);
return 0;
}
- params[i].name = prop_name;
-
+
+ if (construct)
+ construct_params[i].name = prop_name;
+ else
+ after_params[i].name = prop_name;
+
+ if (param_spec->flags & G_PARAM_CONSTRUCT)
+ nconstruct_params++;
+ else
+ nafter_params++;
+
++i;
}
if (jsprops)
JSPropertyNameArrayRelease(jsprops);
- gobject = g_object_newv(type, nparams, params);
+ gobject = g_object_newv(type, nconstruct_params, construct_params);
g_object_ref_sink(gobject);
@@ -198,18 +219,20 @@
else
ret = (JSObjectRef) seed_value_from_object(ctx, gobject, exception);
-/*
- for (i = 0; i < nparams; i++)
+
+ for (i = 0; i < nafter_params; i++)
{
- g_object_set_property(gobject, params[i].name, ¶ms[i].value);
- g_value_unset(¶ms[i].value);
+ g_object_set_property(gobject,
+ after_params[i].name,
+ &after_params[i].value);
+ g_value_unset(&after_params[i].value);
}
-*/
+
g_object_unref(gobject);
g_type_class_unref(oclass);
-
- g_free(params);
+ g_free(after_params);
+ g_free(construct_params);
return ret;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]