perl-Glib r1081 - in branches/stable-1-20: . t



Author: tsch
Date: Thu Feb  5 16:36:12 2009
New Revision: 1081
URL: http://svn.gnome.org/viewvc/perl-Glib?rev=1081&view=rev

Log:
Merge r1078:1080 from trunk.


Added:
   branches/stable-1-20/t/signal_marshal.t
      - copied unchanged from r1079, /trunk/t/signal_marshal.t
Modified:
   branches/stable-1-20/   (props changed)
   branches/stable-1-20/ChangeLog
   branches/stable-1-20/GClosure.xs
   branches/stable-1-20/GType.xs
   branches/stable-1-20/MANIFEST

Modified: branches/stable-1-20/GClosure.xs
==============================================================================
--- branches/stable-1-20/GClosure.xs	(original)
+++ branches/stable-1-20/GClosure.xs	Thu Feb  5 16:36:12 2009
@@ -69,6 +69,7 @@
 		       gpointer invocation_hint,
 		       gpointer marshal_data)
 {
+	gboolean want_return_value;
 	int flags;
 	guint i;
 	dGPERL_CLOSURE_MARSHAL_ARGS;
@@ -99,18 +100,15 @@
 
 	PUTBACK;
 
-	flags = return_value ? G_SCALAR : G_DISCARD;
+	want_return_value = return_value && G_VALUE_TYPE (return_value);
+	flags = want_return_value ? G_SCALAR : G_VOID|G_DISCARD;
 
 	SPAGAIN;
 
 	GPERL_CLOSURE_MARSHAL_CALL (flags);
 
-	if (return_value) {
-		/* we need to remove the value to from the stack,
-		 * regardless of whether we do anything with it. */
-		SV * sv = POPs;
-		if (G_VALUE_TYPE (return_value))
-			gperl_value_from_sv (return_value, sv);
+	if (want_return_value) {
+		gperl_value_from_sv (return_value, POPs);
 		PUTBACK; /* vitally important */
 	}
 

Modified: branches/stable-1-20/GType.xs
==============================================================================
--- branches/stable-1-20/GType.xs	(original)
+++ branches/stable-1-20/GType.xs	Thu Feb  5 16:36:12 2009
@@ -219,10 +219,13 @@
 GPerlValueWrapperClass *
 gperl_fundamental_wrapper_class_from_type (GType gtype)
 {
-	GPerlValueWrapperClass * res;
+	GPerlValueWrapperClass * res = NULL;
 	G_LOCK (wrapper_class_by_type);
-	res = (GPerlValueWrapperClass *)
-		g_hash_table_lookup (wrapper_class_by_type, (gpointer) gtype);
+	if (wrapper_class_by_type) {
+		res = (GPerlValueWrapperClass *)
+			g_hash_table_lookup (wrapper_class_by_type,
+			                     (gpointer) gtype);
+	}
 	G_UNLOCK (wrapper_class_by_type);
 	return res;
 }
@@ -926,6 +929,7 @@
         /* does the function exist? then call it. */
         if (slot && GvCV (*slot)) {
 		SV * save_errsv;
+		gboolean want_return_value;
 		int flags;
 		dSP;
 
@@ -950,13 +954,14 @@
 		/* note: keep this as closely sync'ed as possible with the
 		 * definition of GPERL_CLOSURE_MARSHAL_CALL. */
 		save_errsv = sv_2mortal (newSVsv (ERRSV));
-		flags = G_EVAL | (return_value ? G_SCALAR : G_VOID|G_DISCARD);
+		want_return_value = return_value && G_VALUE_TYPE (return_value);
+		flags = G_EVAL | (want_return_value ? G_SCALAR : G_VOID|G_DISCARD);
 		call_method (SvPV_nolen (method_name), flags);
 		SPAGAIN;
 		if (SvTRUE (ERRSV)) {
 			gperl_run_exception_handlers ();
 
-		} else if (return_value) {
+		} else if (want_return_value) {
 			gperl_value_from_sv (return_value, POPs);
 			PUTBACK;
 		}

Modified: branches/stable-1-20/MANIFEST
==============================================================================
--- branches/stable-1-20/MANIFEST	(original)
+++ branches/stable-1-20/MANIFEST	Thu Feb  5 16:36:12 2009
@@ -60,6 +60,7 @@
 t/lazy-loader.t
 t/make_helper.t
 t/signal_emission_hooks.t
+t/signal_marshal.t
 t/signal_query.t
 t/tied_definedness.t
 TODO



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]