seed r465 - trunk/libseed



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, &params[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, &params[i].value);
-		g_value_unset(&params[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]