[seed] libseed: Allow setting of non gobject properties in constructor
- From: Robert Carr <racarr src gnome org>
- To: svn-commits-list gnome org
- Subject: [seed] libseed: Allow setting of non gobject properties in constructor
- Date: Mon, 25 May 2009 10:50:28 -0400 (EDT)
commit 6606d44fd9751ed135307a4a5c095c5fe9abea08
Author: Robert Carr <racarr svn gnome org>
Date: Mon May 25 10:50:14 2009 -0400
libseed: Allow setting of non gobject properties in constructor
---
libseed/seed-engine.c | 41 +++++++++++++++++++++--------------------
1 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/libseed/seed-engine.c b/libseed/seed-engine.c
index 77f87af..42a3479 100644
--- a/libseed/seed-engine.c
+++ b/libseed/seed-engine.c
@@ -108,10 +108,9 @@ seed_gobject_constructor_invoked (JSContextRef ctx,
GParameter *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, nparams = 0, length, ri;
JSObjectRef ret;
JSPropertyNameArrayRef jsprops = 0;
JSStringRef jsprop_name;
@@ -145,12 +144,14 @@ seed_gobject_constructor_invoked (JSContextRef ctx,
jsprops = JSObjectCopyPropertyNames (ctx, (JSObjectRef) arguments[0]);
nparams = JSPropertyNameArrayGetCount (jsprops);
}
- i = 0;
+ ri = i = 0;
params = g_new0 (GParameter, nparams + 1);
SEED_NOTE (INITIALIZATION, "Constructing object of type %s",
g_type_name (type));
+ seed_next_gobject_wrapper = seed_make_wrapper_for_type (ctx, type);
+
while (i < nparams)
{
GType type;
@@ -161,47 +162,46 @@ seed_gobject_constructor_invoked (JSContextRef ctx,
JSStringGetUTF8CString (jsprop_name, prop_name, length);
param_spec = g_object_class_find_property (oclass, prop_name);
- if (param_spec == NULL)
- {
- seed_make_exception (ctx, exception, "PropertyError",
- "Invalid property for construction: %s",
- prop_name);
- g_free (params);
-
- JSPropertyNameArrayRelease (jsprops);
- return (JSObjectRef) JSValueMakeNull (ctx);
- }
- // TODO: exception handling
jsprop_value = JSObjectGetProperty (ctx,
(JSObjectRef) arguments[0],
jsprop_name, NULL);
+ if (param_spec == NULL)
+ {
+ JSObjectSetProperty (ctx, seed_next_gobject_wrapper, jsprop_name,
+ jsprop_value, 0, NULL);
+ ++i;
+ continue;
+ }
+ // TODO: exception handling
+
if (g_type_is_a (param_spec->value_type, G_TYPE_ENUM))
type = G_TYPE_INT;
else
type = param_spec->value_type;
seed_gvalue_from_seed_value (ctx, jsprop_value,
- type, ¶ms[i].value, exception);
+ type, ¶ms[ri].value, exception);
if (*exception)
{
g_free (params);
JSPropertyNameArrayRelease (jsprops);
+ seed_next_gobject_wrapper = NULL;
return 0;
}
- params[i].name = prop_name;
+ params[ri].name = prop_name;
++i;
+ ++ri;
}
if (jsprops)
JSPropertyNameArrayRelease (jsprops);
- seed_next_gobject_wrapper = seed_make_wrapper_for_type (ctx, type);
- gobject = g_object_newv (type, nparams, params);
+ gobject = g_object_newv (type, ri, params);
if (G_IS_INITIALLY_UNOWNED (gobject) &&
@@ -215,7 +215,7 @@ seed_gobject_constructor_invoked (JSContextRef ctx,
else
ret = (JSObjectRef) seed_value_from_object (ctx, gobject, exception);
- for (i = 0; i < nparams; i++)
+ for (i = 0; i < ri; i++)
{
g_value_unset (¶ms[i].value);
}
@@ -912,8 +912,9 @@ seed_gobject_set_property (JSContextRef context,
gchar *cproperty_name;
gint length;
- if (JSValueIsNull (context, value))
+ if (seed_next_gobject_wrapper || JSValueIsNull (context, value))
return 0;
+
obj = seed_value_to_object (context, object, 0);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]