@@ -92837,7 +92837,12 @@ module Lam_compile_external_obj : sig
92837
92837
val assemble_args_obj :
92838
92838
Ast_arg.kind list ->
92839
92839
J.expression list ->
92840
- J.expression
92840
+ J.block * J.expression
92841
+ (* It returns a block in cases we need set the property dynamically: we need
92842
+ create a place holder assignment first and then set it accordingly
92843
+ *)
92844
+
92845
+
92841
92846
92842
92847
end = struct
92843
92848
#1 "lam_compile_external_obj.ml"
@@ -92869,7 +92874,7 @@ end = struct
92869
92874
92870
92875
92871
92876
module E = Js_exp_make
92872
-
92877
+ module S = Js_stmt_make
92873
92878
92874
92879
(* Note: can potentially be inconsistent, sometimes
92875
92880
{[
@@ -92881,57 +92886,90 @@ module E = Js_exp_make
92881
92886
]}
92882
92887
But the default to be undefined seems reasonable
92883
92888
*)
92884
-
92885
- let assemble_args_obj (labels : Ast_arg.kind list) (args : J.expression list) =
92886
- let rec aux (labels : Ast_arg.kind list) args
92887
- : (Js_op.property_name * E.t ) list * _ =
92889
+
92890
+ (* TODO: check stackoverflow *)
92891
+ let assemble_args_obj (labels : Ast_arg.kind list) (args : J.expression list)
92892
+ : J.block * J.expression =
92893
+ let rec aux (labels : Ast_arg.kind list) args
92894
+ : (Js_op.property_name * E.t ) list * J.expression list * _ =
92888
92895
match labels, args with
92889
- | [] , [] as empty_pair -> empty_pair
92896
+ | [] , [] -> [], [], []
92890
92897
| {arg_label = Label (label, Some cst )} :: labels , args ->
92891
- let accs, eff = aux labels args in
92892
- (Key label, Lam_compile_const.translate_arg_cst cst )::accs, eff
92898
+ let accs, eff, assign = aux labels args in
92899
+ (Key label, Lam_compile_const.translate_arg_cst cst )::accs, eff, assign
92893
92900
| {arg_label = Empty (Some _) } :: rest , args -> assert false
92894
92901
| {arg_label = Empty None }::labels, arg::args
92895
- ->
92896
- let (accs, eff) as r = aux labels args in
92902
+ -> (* unit type*)
92903
+ let (accs, eff, assign ) as r = aux labels args in
92897
92904
if Js_analyzer.no_side_effect_expression arg then r
92898
- else (accs, arg::eff)
92905
+ else (accs, arg::eff, assign )
92899
92906
| ({arg_label = Label (label,None) } as arg_kind)::labels, arg::args
92900
92907
->
92901
- let accs, eff = aux labels args in
92908
+ let accs, eff, assign = aux labels args in
92902
92909
let acc, new_eff = Lam_compile_external_call.ocaml_to_js_eff arg_kind arg in
92903
92910
begin match acc with
92904
92911
| [ ] -> assert false
92905
92912
| x::xs ->
92906
- (Key label, E.fuse_to_seq x xs ) :: accs , new_eff @ eff
92913
+ (Key label, E.fuse_to_seq x xs ) :: accs , new_eff @ eff , assign
92907
92914
end (* evaluation order is undefined *)
92908
92915
92909
- | ({arg_label = Optional label } as arg_kind)::labels, arg::args
92916
+ | ({arg_label = Optional label; arg_type } as arg_kind)::labels, arg::args
92910
92917
->
92911
- let (accs, eff) as r = aux labels args in
92918
+ let (accs, eff, assign ) as r = aux labels args in
92912
92919
begin match arg.expression_desc with
92913
92920
| Number _ -> (*Invariant: None encoding*)
92914
92921
r
92915
- | _ ->
92916
- let acc, new_eff = Lam_compile_external_call.ocaml_to_js_eff arg_kind arg in
92922
+ | Array ([x],_)
92923
+ | Caml_block ([x],_,_,_) ->
92924
+ let acc, new_eff = Lam_compile_external_call.ocaml_to_js_eff
92925
+ ({Ast_arg.arg_label = Ast_arg.label label None; arg_type}) x in
92917
92926
begin match acc with
92918
- | [] -> assert false
92919
- | x::xs ->
92920
- (Key label, E.fuse_to_seq x xs)::accs ,
92921
- new_eff @ eff
92922
- end
92927
+ | [] -> assert false
92928
+ | x::xs ->
92929
+ (Key label, E.fuse_to_seq x xs ) :: accs , new_eff @ eff , assign
92930
+ end
92931
+ | _ ->
92932
+ accs, eff , (arg_kind,arg)::assign
92923
92933
end
92924
-
92925
92934
| {arg_label = Empty None | Label (_,None) | Optional _ } :: _ , [] -> assert false
92926
92935
| [], _ :: _ -> assert false
92927
92936
in
92928
- let map, eff = aux labels args in
92929
-
92930
- match eff with
92937
+ let map, eff, assignment = aux labels args in
92938
+ match assignment with
92931
92939
| [] ->
92932
- E.obj map
92933
- | x::xs -> E.seq (E.fuse_to_seq x xs) (E.obj map)
92934
-
92940
+ [], begin match eff with
92941
+ | [] ->
92942
+ E.obj map
92943
+ | x::xs -> E.seq (E.fuse_to_seq x xs) (E.obj map)
92944
+ end
92945
+ | _ ->
92946
+ let v = Ext_ident.gen_js () in
92947
+ let var_v = E.var v in
92948
+ S.define ~kind:Variable v
92949
+ (begin match eff with
92950
+ | [] ->
92951
+ E.obj map
92952
+ | x::xs -> E.seq (E.fuse_to_seq x xs) (E.obj map)
92953
+ end) ::
92954
+ (Ext_list.flat_map (fun
92955
+ ((label : Ast_arg.kind), (arg : J.expression )) ->
92956
+ match label with
92957
+ | {arg_label = Optional label } ->
92958
+ (* Need make sure whether assignment is effectful or not
92959
+ to avoid code duplication
92960
+ *)
92961
+ begin match Js_ast_util.named_expression arg with
92962
+ | None ->
92963
+ [S.if_ arg [S.exp (E.assign (E.dot var_v label) arg) ] ]
92964
+ | Some (st,id) ->
92965
+ let var_id = E.var id in
92966
+ st ::
92967
+ [S.if_ var_id [S.exp (E.assign (E.dot var_v label) var_id) ]]
92968
+ end
92969
+ | _ -> assert false
92970
+ )
92971
+ assignment)
92972
+ , var_v
92935
92973
92936
92974
end
92937
92975
module Js_of_lam_exception : sig
@@ -96640,10 +96678,10 @@ and
96640
96678
| _ -> assert false ) args
96641
96679
in
96642
96680
let args_code = List.concat args_block in
96643
- let exp =
96681
+ let block, exp =
96644
96682
Lam_compile_external_obj.assemble_args_obj labels args_expr
96645
96683
in
96646
- Js_output.handle_block_return st should_return lam args_code exp
96684
+ Js_output.handle_block_return st should_return lam ( args_code @ block) exp
96647
96685
96648
96686
| Lprim{primitive = prim; args = args_lambda; loc} ->
96649
96687
let args_block, args_expr =
@@ -96654,7 +96692,7 @@ and
96654
96692
| _ -> assert false ) args_lambda
96655
96693
96656
96694
in
96657
- let args_code = List.concat args_block in
96695
+ let args_code : J.block = List.concat args_block in
96658
96696
let exp = (* TODO: all can be done in [compile_primitive] *)
96659
96697
Lam_compile_primitive.translate loc cxt prim args_expr in
96660
96698
Js_output.handle_block_return st should_return lam args_code exp
0 commit comments