diff options
-rw-r--r-- | generator/generator_bindtests.ml | 4 | ||||
-rw-r--r-- | generator/generator_perl.ml | 26 | ||||
-rw-r--r-- | perl/typemap | 5 |
3 files changed, 30 insertions, 5 deletions
diff --git a/generator/generator_bindtests.ml b/generator/generator_bindtests.ml index bc0e846d..38614282 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"; diff --git a/perl/typemap b/perl/typemap index d978e601..43e79485 100644 --- a/perl/typemap +++ b/perl/typemap @@ -2,7 +2,7 @@ TYPEMAP char * T_PV const char * T_PV guestfs_h * O_OBJECT_guestfs_h -int64_t T_IV +int64_t O_OBJECT_int64 INPUT O_OBJECT_guestfs_h @@ -18,6 +18,9 @@ O_OBJECT_guestfs_h croak (\"${Package}::$func_name(): $var is not a blessed HV reference\"); } +O_OBJECT_int64 + $var = my_SvIV64 ($arg); + OUTPUT O_OBJECT_guestfs_h sv_setiv ($arg, PTR2IV ($var)); |