[libglib-object-introspection-perl] 01/02: Fix return value handling on big-endian architectures
Intrigeri
intrigeri at moszumanska.debian.org
Fri Aug 29 21:57:45 UTC 2014
This is an automated email from the git hooks/post-receive script.
intrigeri pushed a commit to annotated tag rel-0-02-3
in repository libglib-object-introspection-perl.
commit 7e87f0cf10c0816b14415e4429a934be119fed05
Author: Torsten Schönfeld <kaffeetisch at gmx.de>
Date: Wed Jan 22 23:14:07 2014 +0100
Fix return value handling on big-endian architectures
https://rt.cpan.org/Ticket/Display.html?id=89552
---
NEWS | 5 +++++
gperl-i11n-invoke-c.c | 31 +++++++++++++++++++++++++++++--
2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/NEWS b/NEWS
index b10dfe3..882196e 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,8 @@
+Overview of changes in Glib::Object::Introspection <next>
+========================================================
+
+* Fix return value handling on big-endian architectures.
+
Overview of changes in Glib::Object::Introspection 0.022
========================================================
diff --git a/gperl-i11n-invoke-c.c b/gperl-i11n-invoke-c.c
index 19f6317..1b00543 100644
--- a/gperl-i11n-invoke-c.c
+++ b/gperl-i11n-invoke-c.c
@@ -29,6 +29,10 @@ invoke_c_code (GICallableInfo *info,
guint i;
GPerlI11nInvocationInfo iinfo = {0,};
guint n_return_values;
+#if GI_CHECK_VERSION (1, 32, 0)
+ GIFFIReturnValue ffi_return_value;
+#endif
+ gpointer return_value_p;
GIArgument return_value;
GError * local_error = NULL;
gpointer local_error_address = &local_error;
@@ -46,6 +50,10 @@ invoke_c_code (GICallableInfo *info,
iinfo.args[0] = &instance;
}
+ /*
+ * --- handle arguments -----------------------------------------------
+ */
+
for (i = 0 ; i < iinfo.n_args ; i++) {
GIArgInfo * arg_info;
GITypeInfo * arg_type;
@@ -172,6 +180,10 @@ invoke_c_code (GICallableInfo *info,
iinfo.arg_types[iinfo.n_invoke_args - 1] = &ffi_type_pointer;
}
+ /*
+ * --- prepare & call -------------------------------------------------
+ */
+
/* prepare and call the function */
if (FFI_OK != ffi_prep_cif (&cif, FFI_DEFAULT_ABI, iinfo.n_invoke_args,
iinfo.return_type_ffi, iinfo.arg_types))
@@ -180,7 +192,13 @@ invoke_c_code (GICallableInfo *info,
ccroak ("Could not prepare a call interface");
}
- ffi_call (&cif, func_pointer, &return_value, iinfo.args);
+#if GI_CHECK_VERSION (1, 32, 0)
+ return_value_p = &ffi_return_value;
+#else
+ return_value_p = &return_value;
+#endif
+
+ ffi_call (&cif, func_pointer, return_value_p, iinfo.args);
/* free call-scoped data */
_invoke_free_after_call_handlers (&iinfo);
@@ -190,8 +208,17 @@ invoke_c_code (GICallableInfo *info,
}
/*
- * handle return values
+ * --- handle return values -------------------------------------------
*/
+
+#if GI_CHECK_VERSION (1, 32, 0)
+ /* libffi has special semantics for return value storage; see `man
+ * ffi_call`. We use gobject-introspection's extraction helper. */
+ gi_type_info_extract_ffi_return_value (iinfo.return_type_info,
+ &ffi_return_value,
+ &return_value);
+#endif
+
n_return_values = 0;
/* place return value and output args on the stack */
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libglib-object-introspection-perl.git
More information about the Pkg-perl-cvs-commits
mailing list