summaryrefslogtreecommitdiffstats
path: root/generator
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2012-08-29 10:31:09 +0100
committerRichard W.M. Jones <rjones@redhat.com>2012-08-30 22:37:48 +0100
commite900884d7e764c21ca90b19f3620bf7ce78d71d0 (patch)
tree4d093827c860c1dca20f0287c275d683c9e73ce0 /generator
parent0066519d11477a576b8f18f3861117f7a468864b (diff)
downloadlibguestfs-e900884d7e764c21ca90b19f3620bf7ce78d71d0.tar.gz
libguestfs-e900884d7e764c21ca90b19f3620bf7ce78d71d0.tar.xz
libguestfs-e900884d7e764c21ca90b19f3620bf7ce78d71d0.zip
perl: bindtests: Fix 64 bit integers on input on 32 bit Perl interpreter.
(cherry picked from commit 15cd9dde5e0e4a7d510de71ef8991750971cf6d1)
Diffstat (limited to 'generator')
-rw-r--r--generator/generator_bindtests.ml4
-rw-r--r--generator/generator_perl.ml26
2 files changed, 26 insertions, 4 deletions
diff --git a/generator/generator_bindtests.ml b/generator/generator_bindtests.ml
index f81537b6..2b777771 100644
--- a/generator/generator_bindtests.ml
+++ b/generator/generator_bindtests.ml
@@ -307,7 +307,7 @@ my $g = Sys::Guestfs->new ();
| CallStringList xs ->
"[" ^ String.concat "," (List.map (sprintf "\"%s\"") xs) ^ "]"
| CallInt i -> string_of_int i
- | CallInt64 i -> Int64.to_string i
+ | CallInt64 i -> "\"" ^ Int64.to_string i ^ "\""
| CallBool b -> if b then "1" else "0"
| CallBuffer s -> "\"" ^ c_quote s ^ "\""
) args
@@ -316,7 +316,7 @@ my $g = Sys::Guestfs->new ();
function
| CallOBool (n, v) -> "'" ^ n ^ "' => " ^ if v then "1" else "0"
| CallOInt (n, v) -> "'" ^ n ^ "' => " ^ string_of_int v
- | CallOInt64 (n, v) -> "'" ^ n ^ "' => " ^ Int64.to_string v
+ | CallOInt64 (n, v) -> "'" ^ n ^ "' => \"" ^ Int64.to_string v ^ "\""
| CallOString (n, v) -> "'" ^ n ^ "' => '" ^ v ^ "'"
) optargs
)
diff --git a/generator/generator_perl.ml b/generator/generator_perl.ml
index 80ea1201..5cef7029 100644
--- a/generator/generator_perl.ml
+++ b/generator/generator_perl.ml
@@ -75,6 +75,28 @@ my_newSVull(unsigned long long val) {
#endif
}
+/* Convert a 64 bit int on input. To cope with the case of having
+ * a 32 bit Perl interpreter, we allow the user to pass a string
+ * here which is scanned as a 64 bit integer.
+ */
+static int64_t
+my_SvIV64 (SV *sv)
+{
+#ifdef USE_64_BIT_ALL
+ return SvIV (sv);
+#else
+ if (SvTYPE (sv) == SVt_PV) {
+ const char *str = SvPV_nolen (sv);
+ int64_t r;
+
+ sscanf (str, \"%%\" SCNi64, &r);
+ return r;
+ }
+ else
+ return SvIV (sv);
+#endif
+}
+
/* http://www.perlmonks.org/?node_id=680842 */
static char **
XS_unpack_charPtrPtr (SV *arg) {
@@ -420,8 +442,8 @@ user_cancel (g)
pr " optargs_s.%s = " n;
(match argt with
| OBool _
- | OInt _
- | OInt64 _ -> pr "SvIV (ST (items_i+1))"
+ | OInt _ -> pr "SvIV (ST (items_i+1))"
+ | OInt64 _ -> pr "my_SvIV64 (ST (items_i+1))"
| OString _ -> pr "SvPV_nolen (ST (items_i+1))"
);
pr ";\n";