generator: Fix functions with both RBufferOut and optional args.
authorRichard W.M. Jones <rjones@redhat.com>
Tue, 28 Jun 2011 07:50:14 +0000 (08:50 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 13 Jul 2011 15:51:18 +0000 (16:51 +0100)
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)

generator/generator_c.ml
generator/generator_java.ml

index 071b83c..1a16c9e 100644 (file)
@@ -135,7 +135,8 @@ let rec generate_prototype ?(extern = true) ?(static = false)
   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 () =
@@ -155,11 +156,11 @@ and generate_c_call_args ?handle (ret, args, optargs) =
         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 "&size"
+       pr "%s" implicit_size_ptr
    | _ -> ()
   );
   (* For calls with optional arguments, add implicit optargs parameter. *)
    | _ -> ()
   );
   (* For calls with optional arguments, add implicit optargs parameter. *)
@@ -992,7 +993,7 @@ trace_send_line (guestfs_h *g)
       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
@@ -1338,9 +1339,12 @@ trace_send_line (guestfs_h *g)
 
         (* 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
@@ -1361,7 +1365,7 @@ trace_send_line (guestfs_h *g)
         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";
@@ -1418,7 +1422,7 @@ trace_send_line (guestfs_h *g)
         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"
     | _ -> ()
index 767c94c..97bee84 100644 (file)
@@ -576,7 +576,7 @@ Java_com_redhat_et_libguestfs_GuestFS__1close
            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"
       );