ocaml: Fix bindings when a function takes more than 10 parameters.
authorRichard W.M. Jones <rjones@redhat.com>
Wed, 9 Nov 2011 17:48:42 +0000 (17:48 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 9 Nov 2011 21:21:49 +0000 (21:21 +0000)
If any function had more than 10 required + optional parameters, OCaml
bindings could not be generated.  Currently there are no such
functions.

generator/generator_ocaml.ml

index 51bc3d6..4f7548c 100644 (file)
@@ -440,13 +440,23 @@ copy_table (char * const * argv)
       pr ")\n";
       pr "{\n";
 
       pr ")\n";
       pr "{\n";
 
+      (* CAMLparam<N> can only take up to 5 parameters.  Further parameters
+       * have to be passed in groups of 5 to CAMLxparam<N> calls.
+       *)
       (match params with
       (match params with
-       | [p1; p2; p3; p4; p5] ->
-           pr "  CAMLparam5 (%s);\n" (String.concat ", " params)
        | p1 :: p2 :: p3 :: p4 :: p5 :: rest ->
            pr "  CAMLparam5 (%s);\n" (String.concat ", " [p1; p2; p3; p4; p5]);
        | p1 :: p2 :: p3 :: p4 :: p5 :: rest ->
            pr "  CAMLparam5 (%s);\n" (String.concat ", " [p1; p2; p3; p4; p5]);
-           pr "  CAMLxparam%d (%s);\n"
-             (List.length rest) (String.concat ", " rest)
+           let rec loop = function
+             | [] -> ()
+             | p1 :: p2 :: p3 :: p4 :: p5 :: rest ->
+               pr "  CAMLxparam5 (%s);\n"
+                 (String.concat ", " [p1; p2; p3; p4; p5]);
+               loop rest
+             | rest ->
+               pr "  CAMLxparam%d (%s);\n"
+                 (List.length rest) (String.concat ", " rest)
+           in
+           loop rest
        | ps ->
            pr "  CAMLparam%d (%s);\n" (List.length ps) (String.concat ", " ps)
       );
        | ps ->
            pr "  CAMLparam%d (%s);\n" (List.length ps) (String.concat ", " ps)
       );