@@ -151,6 +151,27 @@ type specs = External_arg_spec.params
151
151
152
152
type exprs = E .t list
153
153
154
+ let keep_non_undefined_args (arg_types : specs ) (args : exprs ) =
155
+ let rec has_undefined_trailing_args arg_types args =
156
+ match (arg_types, args) with
157
+ | ( [{External_arg_spec. arg_label = Arg_optional ; _}],
158
+ [{J. expression_desc = Undefined {isUnit = false }; _}] ) ->
159
+ true
160
+ | ( _ :: arg_types_rest , _ :: args_rest ) ->
161
+ has_undefined_trailing_args arg_types_rest args_rest
162
+ | _ -> false
163
+ in
164
+ let rec aux arg_types args =
165
+ match (arg_types, args) with
166
+ | ( {External_arg_spec. arg_label = Arg_optional ; _} :: arg_types_rest,
167
+ {J. expression_desc = Undefined {isUnit = false }; _} :: args_rest ) ->
168
+ aux arg_types_rest args_rest
169
+ | _ -> args
170
+ in
171
+ if (has_undefined_trailing_args arg_types args) then
172
+ aux (List. rev arg_types) (List. rev args) |> List. rev
173
+ else args
174
+
154
175
(* TODO: fix splice,
155
176
we need a static guarantee that it is static array construct
156
177
otherwise, we should provide a good error message here,
@@ -176,7 +197,7 @@ let assemble_args_no_splice (arg_types : specs) (args : exprs) :
176
197
| _ :: _ , [] -> assert false
177
198
in
178
199
let args, eff = aux arg_types args in
179
- ( args,
200
+ ( keep_non_undefined_args arg_types args,
180
201
match eff with
181
202
| [] -> None
182
203
| x :: xs ->
@@ -271,16 +292,6 @@ let translate_ffi (cxt : Lam_compile_context.t) arg_types
271
292
else E. call ~info: { arity = Full ; call_info = Call_na } fn args)
272
293
else
273
294
let args, eff = assemble_args_no_splice arg_types args in
274
- let rec keepNonUndefinedArgs argsList (argTypes : specs ) =
275
- match (argsList, argTypes) with
276
- | ( {J. expression_desc = Undefined {isUnit = false }; _} :: rest,
277
- {External_arg_spec. arg_label = Arg_optional ; _} :: argTypes ) ->
278
- keepNonUndefinedArgs rest argTypes
279
- | _ -> argsList
280
- in
281
- let args =
282
- keepNonUndefinedArgs (List. rev args) (List. rev arg_types) |> List. rev
283
- in
284
295
add_eff eff
285
296
@@ E. call ~info: { arity = Full ; call_info = Call_na } fn args
286
297
| Js_module_as_fn { external_module_name; splice } ->
0 commit comments