X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=generator%2Fgenerator_ocaml.ml;h=10c18e37b06bd7bd458111b4cafe7ee16a68d90b;hb=f23352aefd96dc873111e5e5d55ea22b30c3e0ad;hp=51bc3d66f6456ddf9bdb86c4627984c88d79951c;hpb=cd00157efca760ce043dcae216d921841dd25ff9;p=libguestfs.git diff --git a/generator/generator_ocaml.ml b/generator/generator_ocaml.ml index 51bc3d6..10c18e3 100644 --- a/generator/generator_ocaml.ml +++ b/generator/generator_ocaml.ml @@ -440,13 +440,23 @@ copy_table (char * const * argv) pr ")\n"; pr "{\n"; + (* CAMLparam can only take up to 5 parameters. Further parameters + * have to be passed in groups of 5 to CAMLxparam calls. + *) (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]); - 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) ); @@ -615,6 +625,7 @@ copy_table (char * const * argv) | RBufferOut _ -> pr " rv = caml_alloc_string (size);\n"; pr " memcpy (String_val (rv), r, size);\n"; + pr " free (r);\n" ); pr " CAMLreturn (rv);\n";