diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2012-08-29 10:31:09 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2012-08-30 22:37:48 +0100 |
commit | e900884d7e764c21ca90b19f3620bf7ce78d71d0 (patch) | |
tree | 4d093827c860c1dca20f0287c275d683c9e73ce0 /generator | |
parent | 0066519d11477a576b8f18f3861117f7a468864b (diff) | |
download | libguestfs-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.ml | 4 | ||||
-rw-r--r-- | generator/generator_perl.ml | 26 |
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"; |