No current function returns RBufferOut and has optional args. Such
functions would be generated incorrectly.
RBufferOut implies a silent "size_t *size_r" argument is added after
the regular arguments and before the optional arguments. Various
changes to the code generator need to be made to take this into
account.
(cherry picked from commit
adb5db58d850ce6d15380177a63c68276f863c98)
if newline then pr "\n"
(* Generate C call arguments, eg "(handle, foo, bar)" *)
if newline then pr "\n"
(* Generate C call arguments, eg "(handle, foo, bar)" *)
-and generate_c_call_args ?handle (ret, args, optargs) =
+and generate_c_call_args ?handle ?(implicit_size_ptr = "&size")
+ (ret, args, optargs) =
pr "(";
let comma = ref false in
let next () =
pr "(";
let comma = ref false in
let next () =
next ();
pr "%s" (name_of_argt arg)
) args;
next ();
pr "%s" (name_of_argt arg)
) args;
- (* For RBufferOut calls, add implicit &size parameter. *)
+ (* For RBufferOut calls, add implicit size pointer parameter. *)
(match ret with
| RBufferOut _ ->
next ();
(match ret with
| RBufferOut _ ->
next ();
+ pr "%s" implicit_size_ptr
| _ -> ()
);
(* For calls with optional arguments, add implicit optargs parameter. *)
| _ -> ()
);
(* For calls with optional arguments, add implicit optargs parameter. *)
reject_unknown_optargs shortname style;
trace_call shortname style;
pr " r = guestfs__%s " shortname;
reject_unknown_optargs shortname style;
trace_call shortname style;
pr " r = guestfs__%s " shortname;
- generate_c_call_args ~handle:"g" style;
+ generate_c_call_args ~handle:"g" ~implicit_size_ptr:"size_r" style;
pr ";\n";
pr "\n";
(match errcode_of_ret ret with
pr ";\n";
pr "\n";
(match errcode_of_ret ret with
(* Get the name of the last regular argument. *)
let last_arg =
(* Get the name of the last regular argument. *)
let last_arg =
- match args with
- | [] -> "g"
- | args -> name_of_argt (List.hd (List.rev args)) in
+ match ret with
+ | RBufferOut _ -> "size_r"
+ | _ ->
+ match args with
+ | [] -> "g"
+ | args -> name_of_argt (List.hd (List.rev args)) in
let rtype =
match ret with
let rtype =
match ret with
pr "\n";
pr " va_start (optargs, %s);\n" last_arg;
pr " %sr = guestfs_%s_va " rtype shortname;
pr "\n";
pr " va_start (optargs, %s);\n" last_arg;
pr " %sr = guestfs_%s_va " rtype shortname;
- generate_c_call_args ~handle:"g" style;
+ generate_c_call_args ~handle:"g" ~implicit_size_ptr:"size_r" style;
pr ";\n";
pr " va_end (optargs);\n";
pr "\n";
pr ";\n";
pr " va_end (optargs);\n";
pr "\n";
pr " }\n";
pr "\n";
pr " return guestfs_%s_argv " shortname;
pr " }\n";
pr "\n";
pr " return guestfs_%s_argv " shortname;
- generate_c_call_args ~handle:"g" style;
+ generate_c_call_args ~handle:"g" ~implicit_size_ptr:"size_r" style;
pr ";\n";
pr "}\n\n"
| _ -> ()
pr ";\n";
pr "}\n\n"
| _ -> ()
let cols = cols_of_struct typ in
generate_java_struct_list_return typ jtyp cols
| RBufferOut _ ->
let cols = cols_of_struct typ in
generate_java_struct_list_return typ jtyp cols
| RBufferOut _ ->
- pr " jr = (*env)->NewStringUTF (env, r); /* XXX size */\n";
+ pr " jr = (*env)->NewStringUTF (env, r); // XXX size\n";
pr " free (r);\n";
pr " return jr;\n"
);
pr " free (r);\n";
pr " return jr;\n"
);