[libglib-object-introspection-perl] 10/13: Imported Upstream version 0.028
Intrigeri
intrigeri at moszumanska.debian.org
Fri Mar 13 19:45:53 UTC 2015
This is an automated email from the git hooks/post-receive script.
intrigeri pushed a commit to branch experimental
in repository libglib-object-introspection-perl.
commit d9b10c1501ae03988a2ec3856fb326cb35c12ebb
Author: intrigeri <intrigeri at boum.org>
Date: Fri Mar 13 11:31:49 2015 +0000
Imported Upstream version 0.028
---
GObjectIntrospection.xs | 10 +++---
META.json | 4 +--
META.yml | 4 +--
NEWS | 18 +++++++++++
gperl-i11n-field.c | 66 ++++++++++++++++++++++++++--------------
gperl-i11n-invoke-c.c | 23 ++++++++++++--
gperl-i11n-invoke-perl.c | 2 +-
gperl-i11n-marshal-arg.c | 9 ------
lib/Glib/Object/Introspection.pm | 2 +-
t/enums.t | 4 +--
10 files changed, 94 insertions(+), 48 deletions(-)
diff --git a/GObjectIntrospection.xs b/GObjectIntrospection.xs
index afcc98a..3ed829d 100644
--- a/GObjectIntrospection.xs
+++ b/GObjectIntrospection.xs
@@ -397,7 +397,7 @@ _register_types (class, namespace, package)
info_type = g_base_info_get_type (info);
name = g_base_info_get_name (info);
- dwarn ("setting up %s.%s\n", namespace, name);
+ dwarn ("setting up %s::%s\n", namespace, name);
if (info_type == GI_INFO_TYPE_CONSTANT) {
av_push (constants, newSVpv (name, 0));
@@ -448,7 +448,7 @@ _register_types (class, namespace, package)
type = get_gtype ((GIRegisteredTypeInfo *) info);
if (!type) {
- ccroak ("Could not find GType for type %s::%s",
+ ccroak ("Could not find GType for type %s%s",
namespace, name);
}
if (type == G_TYPE_NONE) {
@@ -543,7 +543,7 @@ _register_boxed_synonym (class, const gchar *reg_basename, const gchar *reg_name
reg_info = g_irepository_find_by_name (repository, reg_basename, reg_name);
reg_type = reg_info ? get_gtype (reg_info) : 0;
if (!reg_type)
- ccroak ("Could not lookup GType for type %s.%s",
+ ccroak ("Could not lookup GType for type %s%s",
reg_basename, reg_name);
/* The GType in question (e.g., GdkRectangle) hasn't been loaded yet,
@@ -759,7 +759,7 @@ _install_overrides (class, basename, object_name, target_package)
GType gtype;
gpointer klass;
CODE:
- dwarn ("_install_overrides: %s.%s for %s\n",
+ dwarn ("_install_overrides: %s%s for %s\n",
basename, object_name, target_package);
repository = g_irepository_get_default ();
info = g_irepository_find_by_name (repository, basename, object_name);
@@ -856,7 +856,7 @@ _invoke_fallback_vfunc (class, vfunc_package, vfunc_name, target_package, ...)
gint field_offset;
gpointer func_pointer;
PPCODE:
- dwarn ("_invoke_fallback_vfunc: %s.%s, target = %s\n",
+ dwarn ("_invoke_fallback_vfunc: %s::%s, target = %s\n",
vfunc_package, vfunc_name, target_package);
gtype = gperl_object_type_from_package (target_package);
klass = g_type_class_peek (gtype);
diff --git a/META.json b/META.json
index cb10c60..f603c4b 100644
--- a/META.json
+++ b/META.json
@@ -4,7 +4,7 @@
"Glib::Object::Introspection Team <gtk-perl-list at gnome dot org>"
],
"dynamic_config" : 1,
- "generated_by" : "ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.141520",
+ "generated_by" : "ExtUtils::MakeMaker version 7.04, CPAN::Meta::Converter version 2.143240",
"license" : [
"lgpl_2_1"
],
@@ -66,5 +66,5 @@
"x_IRC" : "irc://irc.gimp.org/#gtk-perl",
"x_MailingList" : "https://mail.gnome.org/mailman/listinfo/gtk-perl-list"
},
- "version" : "0.025"
+ "version" : "0.028"
}
diff --git a/META.yml b/META.yml
index 04528d0..49855da 100644
--- a/META.yml
+++ b/META.yml
@@ -10,7 +10,7 @@ configure_requires:
ExtUtils::PkgConfig: '1'
Glib: '1.28'
dynamic_config: 1
-generated_by: 'ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.141520'
+generated_by: 'ExtUtils::MakeMaker version 7.04, CPAN::Meta::Converter version 2.143240'
license: lgpl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -36,4 +36,4 @@ resources:
homepage: http://gtk2-perl.sourceforge.net
license: http://www.gnu.org/licenses/lgpl-2.1.html
repository: git://git.gnome.org/perl-Glib-Object-Introspection
-version: '0.025'
+version: '0.028'
diff --git a/NEWS b/NEWS
index 6421b3f..5c760e3 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,21 @@
+Overview of changes in Glib::Object::Introspection 0.028
+========================================================
+
+* Harmonize the format of type names in error messages
+* Add a FIXME about a corner case of GInitiallyUnowned handling
+
+Overview of changes in Glib::Object::Introspection 0.027
+========================================================
+
+* Fix compilation problems when NOISY is defined
+* Move the handling of void record fields into the field accessors
+* Rename a few variables for clarity
+
+Overview of changes in Glib::Object::Introspection 0.026
+========================================================
+
+* Fix t/enums.t for older versions of Test::More
+
Overview of changes in Glib::Object::Introspection 0.025
========================================================
diff --git a/gperl-i11n-field.c b/gperl-i11n-field.c
index 39de231..e43c731 100644
--- a/gperl-i11n-field.c
+++ b/gperl-i11n-field.c
@@ -55,31 +55,52 @@ static SV *
get_field (GIFieldInfo *field_info, gpointer mem, GITransfer transfer)
{
GITypeInfo *field_type;
+ GITypeTag field_tag;
GIBaseInfo *interface_info;
+ GIInfoType interface_type;
GIArgument value;
SV *sv = NULL;
field_type = g_field_info_get_type (field_info);
+ field_tag = g_type_info_get_tag (field_type);
interface_info = g_type_info_get_interface (field_type);
+ interface_type = interface_info
+ ? g_base_info_get_type (interface_info)
+ : GI_INFO_TYPE_INVALID;
- /* This case is not handled by g_field_info_set_field. */
+ /* Non-pointer structs are not handled by g_field_info_get_field. */
if (!g_type_info_is_pointer (field_type) &&
- g_type_info_get_tag (field_type) == GI_TYPE_TAG_INTERFACE &&
- g_base_info_get_type (interface_info) == GI_INFO_TYPE_STRUCT)
+ field_tag == GI_TYPE_TAG_INTERFACE &&
+ interface_type == GI_INFO_TYPE_STRUCT)
{
- gint offset;
- offset = g_field_info_get_offset (field_info);
- value.v_pointer = mem + offset;
+ gint offset = g_field_info_get_offset (field_info);
+ value.v_pointer = G_STRUCT_MEMBER_P (mem, offset);
sv = arg_to_sv (&value,
field_type,
GI_TRANSFER_NOTHING,
NULL);
- } else if (g_field_info_get_field (field_info, mem, &value)) {
+ }
+
+ /* Neither are void pointers. We retrieve the RV to the SV that
+ * set_field put into them. */
+ else if (field_tag == GI_TYPE_TAG_VOID &&
+ g_type_info_is_pointer (field_type))
+ {
+ gint offset = g_field_info_get_offset (field_info);
+ value.v_pointer = G_STRUCT_MEMBER (gpointer, mem, offset);
+ sv = value.v_pointer
+ ? newRV (value.v_pointer)
+ : &PL_sv_undef;
+ }
+
+ else if (g_field_info_get_field (field_info, mem, &value)) {
sv = arg_to_sv (&value,
field_type,
transfer,
NULL);
- } else {
+ }
+
+ else {
ccroak ("Could not get field '%s'",
g_base_info_get_name (field_info));
}
@@ -95,21 +116,21 @@ static void
set_field (GIFieldInfo *field_info, gpointer mem, GITransfer transfer, SV *sv)
{
GITypeInfo *field_type;
+ GITypeTag field_tag;
GIBaseInfo *interface_info;
- GITypeTag tag;
- GIInfoType info_type;
+ GIInfoType interface_type;
GIArgument arg;
field_type = g_field_info_get_type (field_info);
- tag = g_type_info_get_tag (field_type);
+ field_tag = g_type_info_get_tag (field_type);
interface_info = g_type_info_get_interface (field_type);
- info_type = interface_info
+ interface_type = interface_info
? g_base_info_get_type (interface_info)
: GI_INFO_TYPE_INVALID;
/* Structs are not handled by g_field_info_set_field. */
- if (tag == GI_TYPE_TAG_INTERFACE &&
- info_type == GI_INFO_TYPE_STRUCT)
+ if (field_tag == GI_TYPE_TAG_INTERFACE &&
+ interface_type == GI_INFO_TYPE_STRUCT)
{
/* FIXME: No GIArgInfo and no GPerlI11nInvocationInfo here.
* What if the struct contains an object pointer, or a callback
@@ -122,10 +143,10 @@ set_field (GIFieldInfo *field_info, gpointer mem, GITransfer transfer, SV *sv)
* 'mem' */
arg.v_pointer = sv_to_struct (GI_TRANSFER_NOTHING,
interface_info,
- info_type,
+ interface_type,
sv);
size = g_struct_info_get_size (interface_info);
- g_memmove (mem + offset, arg.v_pointer, size);
+ g_memmove (G_STRUCT_MEMBER_P (mem, offset), arg.v_pointer, size);
} else { /* Pointer */
GType gtype = get_gtype (interface_info);
if (g_type_is_a (gtype, G_TYPE_BOXED)) {
@@ -150,22 +171,21 @@ set_field (GIFieldInfo *field_info, gpointer mem, GITransfer transfer, SV *sv)
G_STRUCT_MEMBER (gpointer, mem, offset) =
sv_to_struct (GI_TRANSFER_NOTHING,
interface_info,
- info_type,
+ interface_type,
sv);
}
}
}
/* Neither are void pointers. We put an RV to the SV into them, which
- * goes hand in hand with what get_field() is doing above via
- * arg_to_sv(). */
- else if (tag == GI_TYPE_TAG_VOID &&
+ * goes hand in hand with what get_field() is doing above. */
+ else if (field_tag == GI_TYPE_TAG_VOID &&
g_type_info_is_pointer (field_type))
{
gint offset = g_field_info_get_offset (field_info);
- sv_to_arg (sv, &arg, NULL, field_type,
- transfer, TRUE, NULL);
- G_STRUCT_MEMBER (gpointer, mem, offset) = arg.v_pointer;
+ if (!gperl_sv_is_ref (sv))
+ ccroak ("Can only put references into void fields");
+ G_STRUCT_MEMBER (gpointer, mem, offset) = SvRV (sv);
}
else {
diff --git a/gperl-i11n-invoke-c.c b/gperl-i11n-invoke-c.c
index b8509d0..80ac875 100644
--- a/gperl-i11n-invoke-c.c
+++ b/gperl-i11n-invoke-c.c
@@ -350,8 +350,8 @@ _prepare_c_invocation_info (GPerlI11nCInvocationInfo *iinfo,
dwarn ("C invoke: %s\n"
" n_args: %d, n_invoke_args: %d, n_given_args: %d\n"
" is_constructor: %d, is_method: %d\n",
- iinfo->is_vfunc ? g_base_info_get_name (info) : g_function_info_get_symbol (info),
- iinfo->n_args, iinfo->n_invoke_args, iinfo->n_given_args,
+ iinfo->base.is_vfunc ? g_base_info_get_name (info) : g_function_info_get_symbol (info),
+ iinfo->base.n_args, iinfo->n_invoke_args, iinfo->n_given_args,
iinfo->is_constructor, iinfo->is_method);
/* allocate enough space for all args in both the out and in lists.
@@ -438,7 +438,24 @@ _prepare_c_invocation_info (GPerlI11nCInvocationInfo *iinfo,
/* We need to undo the special handling that GInitiallyUnowned
* descendants receive from gobject-introspection: values of this type
- * are always marked transfer=none, even for constructors. */
+ * are always marked transfer=none, even for constructors.
+ *
+ * FIXME: This is not correct for GtkWindow and its descendants, as
+ * gtk+ keeps an internal reference to each window. Hence,
+ * constructors like gtk_window_new return a non-floating object and do
+ * not pass ownership of a reference on to us. But the sink func
+ * currently registered for GInitiallyUnowned (sink_initially_unowned
+ * in GObject.xs in Glib) is actually inadvertently conforming to this
+ * requirement. It runs ref_sink+unref regardless of whether the
+ * object is floating or not. So, in the non-floating window case, it
+ * does nothing, resulting in an extra reference taken, despite the
+ * request to transfer ownership.
+ *
+ * If we ever encounter a constructor of a GInitiallyUnowned descendant
+ * that returns a non-floating object and passes ownership of a
+ * reference on to us, or a constructor of a GInitiallyUnowned
+ * descendant that returns a floating object but passes no reference on
+ * to us, then we need to revisit this. */
if (iinfo->is_constructor &&
g_type_info_get_tag (iinfo->base.return_type_info) == GI_TYPE_TAG_INTERFACE)
{
diff --git a/gperl-i11n-invoke-perl.c b/gperl-i11n-invoke-perl.c
index 4eb6c33..c4b612d 100644
--- a/gperl-i11n-invoke-perl.c
+++ b/gperl-i11n-invoke-perl.c
@@ -367,7 +367,7 @@ _prepare_perl_invocation_info (GPerlI11nPerlInvocationInfo *iinfo,
GITypeInfo *length_arg_type = iinfo->base.arg_types[pos];
raw_to_arg (args[pos], &iinfo->base.aux_args[pos], length_arg_type);
dwarn (" pos %d is array length => %"G_GSIZE_FORMAT"\n",
- pos, iinfo->aux_args[pos].v_size);
+ pos, iinfo->base.aux_args[pos].v_size);
}
}
}
diff --git a/gperl-i11n-marshal-arg.c b/gperl-i11n-marshal-arg.c
index d14d2e5..ce41ee7 100644
--- a/gperl-i11n-marshal-arg.c
+++ b/gperl-i11n-marshal-arg.c
@@ -32,11 +32,6 @@ sv_to_arg (SV * sv,
case GI_TYPE_TAG_VOID:
/* returns NULL if no match is found */
arg->v_pointer = sv_to_callback_data (sv, invocation_info);
- if (!arg->v_pointer && g_type_info_is_pointer (type_info)
- && gperl_sv_is_ref (sv))
- {
- arg->v_pointer = SvRV (sv);
- }
dwarn (" argument with no type information -> pointer %p\n",
arg->v_pointer);
break;
@@ -168,10 +163,6 @@ arg_to_sv (GIArgument * arg,
SV *sv = callback_data_to_sv (arg->v_pointer, iinfo);
if (sv) {
SvREFCNT_inc (sv);
- } else {
- if (arg->v_pointer && g_type_info_is_pointer (info)) {
- sv = newRV (arg->v_pointer);
- }
}
dwarn (" argument with no type information -> SV %p\n", sv);
return sv ? sv : &PL_sv_undef;
diff --git a/lib/Glib/Object/Introspection.pm b/lib/Glib/Object/Introspection.pm
index dabe2d3..f1af35f 100644
--- a/lib/Glib/Object/Introspection.pm
+++ b/lib/Glib/Object/Introspection.pm
@@ -19,7 +19,7 @@ use strict;
use warnings;
use Glib;
-our $VERSION = '0.025';
+our $VERSION = '0.028';
use Carp;
$Carp::Internal{(__PACKAGE__)}++;
diff --git a/t/enums.t b/t/enums.t
index e5cecdd..707a4e7 100644
--- a/t/enums.t
+++ b/t/enums.t
@@ -9,12 +9,12 @@ plan tests => 4;
is (Regress::test_enum_param ('value1'), 'value1');
is (Regress::test_unsigned_enum_param ('value2'), 'value2');
-ok (Regress::global_get_flags_out () == ['flag1', 'flag3']);
+cmp_ok (Regress::global_get_flags_out (), '==', ['flag1', 'flag3']);
SKIP: {
skip 'non-GType flags tests', 1
unless (check_gi_version (0, 10, 3));
GI::no_type_flags_in ([qw/value2/]);
- is (GI::no_type_flags_returnv (), [qw/value2/]);
+ cmp_ok (GI::no_type_flags_returnv (), '==', [qw/value2/]);
}
--
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