[libnet-dbus-perl] 237/335: Allow use of 64-bit types by serializing to/from strings as needed

Intrigeri intrigeri at moszumanska.debian.org
Sat Mar 21 01:08:04 UTC 2015


This is an automated email from the git hooks/post-receive script.

intrigeri pushed a commit to branch experimental
in repository libnet-dbus-perl.

commit 9b5656ccccf71ceea64cdf873e9075184787f64c
Author: Daniel P. Berrange <berrange at redhat.com>
Date:   Tue Nov 14 23:32:09 2006 -0500

    Allow use of 64-bit types by serializing to/from strings as needed
---
 CHANGES                          |  3 ++
 DBus.xs                          | 63 ++++++++++++++++++++++++++++++++++++++++
 lib/Net/DBus/Binding/Iterator.pm | 15 ----------
 t/15-message.t                   | 33 +++++++++------------
 typemap                          | 20 +++++++++++--
 5 files changed, 98 insertions(+), 36 deletions(-)

diff --git a/CHANGES b/CHANGES
index 74b0ce5..c4aa989 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,9 @@ Changes since 0.33.4
  - Added support for getting private bus connections for apps which
    don't want to deal with a shared bus
  - Fix test case to use a private connection
+ - On Perl builds where integers are 32-bits, the DBus 64 bit integer
+   types will be serialized to/from the Perl String type instead of
+   calling 'die'.
 
 Changes since 0.33.3
 
diff --git a/DBus.xs b/DBus.xs
index 3fb6459..51a0cde 100644
--- a/DBus.xs
+++ b/DBus.xs
@@ -31,6 +31,69 @@ static int net_dbus_debug = 0;
 #endif
 
 
+/*
+ * On 32-bit OS (and some 64-bit) Perl does not have an
+ * integer type capable of storing 64 bit numbers. So
+ * we serialize to/from strings on these platforms
+ */
+
+dbus_int64_t
+_dbus_parse_int64(SV *sv) {
+#ifdef USE_64_BIT_ALL
+    return SvIV(sv);
+#else
+    //DEBUG_MSG("Parrse %s\n", SvPV_nolen(sv));
+    return strtoll(SvPV_nolen(sv), NULL, 10);
+#endif
+}
+
+dbus_uint64_t
+_dbus_parse_uint64(SV *sv) {
+#ifdef USE_64_BIT_ALL
+    return SvUV(sv);
+#else
+    //DEBUG_MSG("Parrse %s\n", SvPV_nolen(sv));
+    return strtoull(SvPV_nolen(sv), NULL, 10);
+#endif
+}
+
+
+#ifndef PRId64
+#define PRId64 "lld"
+#endif
+
+SV *
+_dbus_format_int64(dbus_int64_t val) {
+#ifdef USE_64_BIT_ALL
+    return newSViv(val);
+#else
+    char buf[100];
+    int len;
+    len = snprintf(buf, 100, "%" PRId64, val);
+    //DEBUG_MSG("Format i64 [%" PRId64 "] to [%s]\n", val, buf);
+    return newSVpv(buf, len);
+#endif
+}
+
+#ifndef PRIu64
+#define PRIu64 "llu"
+#endif
+
+SV *
+_dbus_format_uint64(dbus_uint64_t val) {
+#ifdef USE_64_BIT_ALL
+    return newSVuv(val);
+#else
+    char buf[100];
+    int len;
+    len = snprintf(buf, 100, "%" PRIu64, val);
+    //DEBUG_MSG("Format u64 [%" PRIu64 "] to [%s]\n", val, buf);
+    return newSVpv(buf, len);
+#endif
+}
+
+
+
 /* The -1 is required by the contract for
    dbus_{server,connection}_allocate_slot
    initialization */
diff --git a/lib/Net/DBus/Binding/Iterator.pm b/lib/Net/DBus/Binding/Iterator.pm
index 62036a8..4ff4bae 100644
--- a/lib/Net/DBus/Binding/Iterator.pm
+++ b/lib/Net/DBus/Binding/Iterator.pm
@@ -72,17 +72,6 @@ use warnings;
 
 use Net::DBus;
 
-our $have_quads = 0;
-
-BEGIN {
-  eval "pack 'Q', 1243456";
-  if ($@) {
-    $have_quads = 0;
-  } else {
-    $have_quads = 1;
-  }
-}
-
 =item $res = $iter->has_next()
 
 Determines if there are any more fields in the message
@@ -185,25 +174,21 @@ from/to the message iterator
 
 sub get_int64 {
     my $self = shift;
-    die "Quads not supported on this platform\n" unless $have_quads;
     return $self->_get_int64;
 }
 
 sub get_uint64 {
     my $self = shift;
-    die "Quads not supported on this platform\n" unless $have_quads;
     return $self->_get_uint64;
 }
 
 sub append_int64 {
     my $self = shift;
-    die "Quads not supported on this platform\n" unless $have_quads;
     $self->_append_int64(shift);
 }
 
 sub append_uint64 {
     my $self = shift;
-    die "Quads not supported on this platform\n" unless $have_quads;
     $self->_append_uint64(shift);
 }
 
diff --git a/t/15-message.t b/t/15-message.t
index 0ccbeb7..d8c5b7b 100644
--- a/t/15-message.t
+++ b/t/15-message.t
@@ -1,5 +1,5 @@
 # -*- perl -*-
-use Test::More tests => 25;
+use Test::More tests => 29;
 
 use strict;
 use warnings;
@@ -24,13 +24,10 @@ $iter->append_int16(123);
 $iter->append_uint16(456);
 $iter->append_int32(123);
 $iter->append_uint32(456);
-if ($Net::DBus::Binding::Iterator::have_quads) {
-  $iter->append_int64(12345645645);
-  $iter->append_uint64(12312312312);
-} else {
-  $iter->append_boolean(1);
-  $iter->append_boolean(1);
-}
+$iter->append_int64("12345645645");
+$iter->append_uint64("12312312312");
+$iter->append_int64("12345645645123456");
+$iter->append_uint64("12312312312123456");
 $iter->append_string("Hello world");
 $iter->append_double(1.424141);
 
@@ -50,17 +47,15 @@ ok($iter->next(), "next");
 ok($iter->get_uint32() == 456, "uint32");
 ok($iter->next(), "next");
 
-if (!$Net::DBus::Binding::Iterator::have_quads) {
-  ok(1, "int64 skipped");
-  ok($iter->next(), "next");
-  ok(1, "uint64 skipped");
-  ok($iter->next(), "next");
-} else {
-  ok($iter->get_int64() == 12345645645, "int64");
-  ok($iter->next(), "next");
-  ok($iter->get_uint64() == 12312312312, "uint64");
-  ok($iter->next(), "next");
-}
+ok($iter->get_int64() == "12345645645", "int64");
+ok($iter->next(), "next");
+ok($iter->get_uint64() == "12312312312", "uint64");
+ok($iter->next(), "next");
+
+ok($iter->get_int64() == "12345645645123456", "int64");
+ok($iter->next(), "next");
+ok($iter->get_uint64() == "12312312312123456", "uint64");
+ok($iter->next(), "next");
 
 ok($iter->get_string() eq "Hello world", "string");
 ok($iter->next(), "next");
diff --git a/typemap b/typemap
index 36c887f..b43477f 100644
--- a/typemap
+++ b/typemap
@@ -13,8 +13,24 @@ dbus_int16_t T_IV
 dbus_uint16_t T_UV
 dbus_int32_t T_IV
 dbus_uint32_t T_UV
-dbus_int64_t T_IV
-dbus_uint64_t T_UV
+dbus_int64_t T_DBUS_INT64
+dbus_uint64_t T_DBUS_UINT64
+
+INPUT
+T_DBUS_INT64
+    $var = _dbus_parse_int64($arg);
+
+OUTPUT
+T_DBUS_INT64
+    $arg = _dbus_format_int64($var);
+
+INPUT
+T_DBUS_UINT64
+    $var = _dbus_parse_uint64($arg);
+
+OUTPUT
+T_DBUS_UINT64
+    $arg = _dbus_format_uint64($var);
 
 INPUT
 O_OBJECT_connection

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libnet-dbus-perl.git



More information about the Pkg-perl-cvs-commits mailing list