Skip to content

Commit 6137ceb

Browse files
committed
add new polyvar -compiling scheme (default off)
1 parent 578688d commit 6137ceb

File tree

4 files changed

+98
-51
lines changed

4 files changed

+98
-51
lines changed

jscomp/core/bs_conditional_initial.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ let setup_env () =
3030
Translcore.wrap_single_field_record := Transl_single_field_record.wrap_single_field_record;
3131
Translmod.eval_rec_bindings := Compile_rec_module.eval_rec_bindings;
3232
Typemod.should_hide := Typemod_hide.should_hide;
33+
#if 0 then
34+
Matching.make_test_sequence_variant_constant := Polyvar_pattern_match.make_test_sequence_variant_constant;
35+
Matching.call_switcher_variant_constant := Polyvar_pattern_match.call_switcher_variant_constant;
36+
Matching.call_switcher_variant_constr := Polyvar_pattern_match.call_switcher_variant_constr;
37+
#end
3338
Clflags.no_std_include := true;
3439
Warnings.parse_options false Bsc_warnings.defaults_w;
3540
Warnings.parse_options true Bsc_warnings.defaults_warn_error;

lib/4.06.1/unstable/js_compiler.ml

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65169,7 +65169,7 @@ val call_switcher_variant_constant :
6516965169
(Location.t ->
6517065170
Lambda.lambda option ->
6517165171
Lambda.lambda ->
65172-
(int * Lambda.lambda) list ->
65172+
(int * (string * Lambda.lambda)) list ->
6517365173
Lambda.switch_names option ->
6517465174
Lambda.lambda)
6517565175
ref
@@ -65178,15 +65178,15 @@ val call_switcher_variant_constr :
6517865178
(Location.t ->
6517965179
Lambda.lambda option ->
6518065180
Lambda.lambda ->
65181-
(int * Lambda.lambda) list ->
65181+
(int * (string * Lambda.lambda)) list ->
6518265182
Lambda.switch_names option ->
6518365183
Lambda.lambda)
6518465184
ref
6518565185

6518665186
val make_test_sequence_variant_constant :
6518765187
(Lambda.lambda option ->
6518865188
Lambda.lambda ->
65189-
(int * Lambda.lambda) list ->
65189+
(int * (string * Lambda.lambda)) list ->
6519065190
Lambda.lambda)
6519165191
ref
6519265192

@@ -66650,10 +66650,10 @@ let divide_variant row ctx {cases = cl; args = al; default=def} =
6665066650
match pato with
6665166651
None ->
6665266652
add (make_variant_matching_constant p lab def ctx) variants
66653-
(=) (Cstr_constant tag) (patl, action) al
66653+
(=) (lab,Cstr_constant tag) (patl, action) al
6665466654
| Some pat ->
6665566655
add (make_variant_matching_nonconst p lab def ctx) variants
66656-
(=) (Cstr_block tag) (pat :: patl, action) al
66656+
(=) (lab,Cstr_block tag) (pat :: patl, action) al
6665766657
end
6665866658
| _ -> []
6665966659
in
@@ -67541,6 +67541,21 @@ let split_cases tag_lambda_list =
6754167541
let const, nonconst = split_rec tag_lambda_list in
6754267542
sort_int_lambda_list const,
6754367543
sort_int_lambda_list nonconst
67544+
67545+
(* refine [split_cases] and [split_variant_cases] *)
67546+
let split_variant_cases tag_lambda_list =
67547+
let rec split_rec = function
67548+
[] -> ([], [])
67549+
| ((name,cstr), act) :: rem ->
67550+
let (consts, nonconsts) = split_rec rem in
67551+
match cstr with
67552+
Cstr_constant n -> ((n, (name, act)) :: consts, nonconsts)
67553+
| Cstr_block n -> (consts, (n, (name, act)) :: nonconsts)
67554+
| Cstr_unboxed -> assert false
67555+
| Cstr_extension _ -> assert false in
67556+
let const, nonconst = split_rec tag_lambda_list in
67557+
sort_int_lambda_list const,
67558+
sort_int_lambda_list nonconst
6754467559

6754567560
let split_extension_cases tag_lambda_list =
6754667561
let rec split_rec = function
@@ -67668,33 +67683,33 @@ let combine_constructor sw_names loc arg ex_pat cstr partial ctx def
6766867683

6766967684
let make_test_sequence_variant_constant fail arg int_lambda_list =
6767067685
let _, (cases, actions) =
67671-
as_interval fail min_int max_int int_lambda_list in
67686+
as_interval fail min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) in
6767267687
Switcher.test_sequence arg cases actions
6767367688

6767467689
let call_switcher_variant_constant loc fail arg int_lambda_list names =
67675-
call_switcher loc fail arg min_int max_int int_lambda_list names
67690+
call_switcher loc fail arg min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) names
6767667691

6767767692

6767867693
let call_switcher_variant_constr loc fail arg int_lambda_list names =
6767967694
let v = Ident.create "variant" in
6768067695
Llet(Alias, Pgenval, v, Lprim(Pfield (0, Fld_poly_var_tag), [arg], loc),
6768167696
call_switcher loc
67682-
fail (Lvar v) min_int max_int int_lambda_list names)
67697+
fail (Lvar v) min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) names)
6768367698

6768467699
let call_switcher_variant_constant :
6768567700
(Location.t ->
6768667701
Lambda.lambda option ->
6768767702
Lambda.lambda ->
67688-
(int * Lambda.lambda) list ->
67703+
(int * (string * Lambda.lambda)) list ->
6768967704
Lambda.switch_names option ->
6769067705
Lambda.lambda)
6769167706
ref= ref call_switcher_variant_constant
67692-
67707+
6769367708
let call_switcher_variant_constr :
6769467709
(Location.t ->
6769567710
Lambda.lambda option ->
6769667711
Lambda.lambda ->
67697-
(int * Lambda.lambda) list ->
67712+
(int * (string * Lambda.lambda)) list ->
6769867713
Lambda.switch_names option ->
6769967714
Lambda.lambda)
6770067715
ref
@@ -67703,7 +67718,7 @@ let call_switcher_variant_constr :
6770367718
let make_test_sequence_variant_constant :
6770467719
(Lambda.lambda option ->
6770567720
Lambda.lambda ->
67706-
(int * Lambda.lambda) list ->
67721+
(int * (string * Lambda.lambda)) list ->
6770767722
Lambda.lambda)
6770867723
ref
6770967724
= ref make_test_sequence_variant_constant
@@ -67732,12 +67747,12 @@ let combine_variant names loc row arg partial ctx def
6773267747
None, jumps_empty
6773367748
else
6773467749
mk_failaction_neg partial ctx def in
67735-
let (consts, nonconsts) = split_cases tag_lambda_list in
67750+
let (consts, nonconsts) = split_variant_cases tag_lambda_list in
6773667751
let lambda1 = match fail, one_action with
6773767752
| None, Some act -> act
6773867753
| _,_ ->
6773967754
match (consts, nonconsts) with
67740-
| ([_, act1], [_, act2]) when fail=None ->
67755+
| ([_, (_,act1)], [_, (_,act2)]) when fail=None ->
6774167756
test_int_or_block arg act1 act2
6774267757
| (_, []) -> (* One can compare integers and pointers *)
6774367758
!make_test_sequence_variant_constant fail arg consts
@@ -68053,9 +68068,7 @@ and do_compile_matching repr partial ctx arg pmh = match pmh with
6805368068
(combine_constant names pat.pat_loc arg cst partial)
6805468069
ctx pm
6805568070
| Tpat_construct (_, cstr, _) ->
68056-
let sw_names = if !Config.bs_only
68057-
then !names_from_construct_pattern pat
68058-
else None in
68071+
let sw_names = !names_from_construct_pattern pat in
6805968072
compile_test
6806068073
(compile_match repr partial) partial
6806168074
divide_constructor
@@ -81133,6 +81146,7 @@ let setup_env () =
8113381146
Translcore.wrap_single_field_record := Transl_single_field_record.wrap_single_field_record;
8113481147
Translmod.eval_rec_bindings := Compile_rec_module.eval_rec_bindings;
8113581148
Typemod.should_hide := Typemod_hide.should_hide;
81149+
8113681150
Clflags.no_std_include := true;
8113781151
Warnings.parse_options false Bsc_warnings.defaults_w;
8113881152
Warnings.parse_options true Bsc_warnings.defaults_warn_error;

lib/4.06.1/unstable/js_refmt_compiler.ml

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65169,7 +65169,7 @@ val call_switcher_variant_constant :
6516965169
(Location.t ->
6517065170
Lambda.lambda option ->
6517165171
Lambda.lambda ->
65172-
(int * Lambda.lambda) list ->
65172+
(int * (string * Lambda.lambda)) list ->
6517365173
Lambda.switch_names option ->
6517465174
Lambda.lambda)
6517565175
ref
@@ -65178,15 +65178,15 @@ val call_switcher_variant_constr :
6517865178
(Location.t ->
6517965179
Lambda.lambda option ->
6518065180
Lambda.lambda ->
65181-
(int * Lambda.lambda) list ->
65181+
(int * (string * Lambda.lambda)) list ->
6518265182
Lambda.switch_names option ->
6518365183
Lambda.lambda)
6518465184
ref
6518565185

6518665186
val make_test_sequence_variant_constant :
6518765187
(Lambda.lambda option ->
6518865188
Lambda.lambda ->
65189-
(int * Lambda.lambda) list ->
65189+
(int * (string * Lambda.lambda)) list ->
6519065190
Lambda.lambda)
6519165191
ref
6519265192

@@ -66650,10 +66650,10 @@ let divide_variant row ctx {cases = cl; args = al; default=def} =
6665066650
match pato with
6665166651
None ->
6665266652
add (make_variant_matching_constant p lab def ctx) variants
66653-
(=) (Cstr_constant tag) (patl, action) al
66653+
(=) (lab,Cstr_constant tag) (patl, action) al
6665466654
| Some pat ->
6665566655
add (make_variant_matching_nonconst p lab def ctx) variants
66656-
(=) (Cstr_block tag) (pat :: patl, action) al
66656+
(=) (lab,Cstr_block tag) (pat :: patl, action) al
6665766657
end
6665866658
| _ -> []
6665966659
in
@@ -67541,6 +67541,21 @@ let split_cases tag_lambda_list =
6754167541
let const, nonconst = split_rec tag_lambda_list in
6754267542
sort_int_lambda_list const,
6754367543
sort_int_lambda_list nonconst
67544+
67545+
(* refine [split_cases] and [split_variant_cases] *)
67546+
let split_variant_cases tag_lambda_list =
67547+
let rec split_rec = function
67548+
[] -> ([], [])
67549+
| ((name,cstr), act) :: rem ->
67550+
let (consts, nonconsts) = split_rec rem in
67551+
match cstr with
67552+
Cstr_constant n -> ((n, (name, act)) :: consts, nonconsts)
67553+
| Cstr_block n -> (consts, (n, (name, act)) :: nonconsts)
67554+
| Cstr_unboxed -> assert false
67555+
| Cstr_extension _ -> assert false in
67556+
let const, nonconst = split_rec tag_lambda_list in
67557+
sort_int_lambda_list const,
67558+
sort_int_lambda_list nonconst
6754467559

6754567560
let split_extension_cases tag_lambda_list =
6754667561
let rec split_rec = function
@@ -67668,33 +67683,33 @@ let combine_constructor sw_names loc arg ex_pat cstr partial ctx def
6766867683

6766967684
let make_test_sequence_variant_constant fail arg int_lambda_list =
6767067685
let _, (cases, actions) =
67671-
as_interval fail min_int max_int int_lambda_list in
67686+
as_interval fail min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) in
6767267687
Switcher.test_sequence arg cases actions
6767367688

6767467689
let call_switcher_variant_constant loc fail arg int_lambda_list names =
67675-
call_switcher loc fail arg min_int max_int int_lambda_list names
67690+
call_switcher loc fail arg min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) names
6767667691

6767767692

6767867693
let call_switcher_variant_constr loc fail arg int_lambda_list names =
6767967694
let v = Ident.create "variant" in
6768067695
Llet(Alias, Pgenval, v, Lprim(Pfield (0, Fld_poly_var_tag), [arg], loc),
6768167696
call_switcher loc
67682-
fail (Lvar v) min_int max_int int_lambda_list names)
67697+
fail (Lvar v) min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) names)
6768367698

6768467699
let call_switcher_variant_constant :
6768567700
(Location.t ->
6768667701
Lambda.lambda option ->
6768767702
Lambda.lambda ->
67688-
(int * Lambda.lambda) list ->
67703+
(int * (string * Lambda.lambda)) list ->
6768967704
Lambda.switch_names option ->
6769067705
Lambda.lambda)
6769167706
ref= ref call_switcher_variant_constant
67692-
67707+
6769367708
let call_switcher_variant_constr :
6769467709
(Location.t ->
6769567710
Lambda.lambda option ->
6769667711
Lambda.lambda ->
67697-
(int * Lambda.lambda) list ->
67712+
(int * (string * Lambda.lambda)) list ->
6769867713
Lambda.switch_names option ->
6769967714
Lambda.lambda)
6770067715
ref
@@ -67703,7 +67718,7 @@ let call_switcher_variant_constr :
6770367718
let make_test_sequence_variant_constant :
6770467719
(Lambda.lambda option ->
6770567720
Lambda.lambda ->
67706-
(int * Lambda.lambda) list ->
67721+
(int * (string * Lambda.lambda)) list ->
6770767722
Lambda.lambda)
6770867723
ref
6770967724
= ref make_test_sequence_variant_constant
@@ -67732,12 +67747,12 @@ let combine_variant names loc row arg partial ctx def
6773267747
None, jumps_empty
6773367748
else
6773467749
mk_failaction_neg partial ctx def in
67735-
let (consts, nonconsts) = split_cases tag_lambda_list in
67750+
let (consts, nonconsts) = split_variant_cases tag_lambda_list in
6773667751
let lambda1 = match fail, one_action with
6773767752
| None, Some act -> act
6773867753
| _,_ ->
6773967754
match (consts, nonconsts) with
67740-
| ([_, act1], [_, act2]) when fail=None ->
67755+
| ([_, (_,act1)], [_, (_,act2)]) when fail=None ->
6774167756
test_int_or_block arg act1 act2
6774267757
| (_, []) -> (* One can compare integers and pointers *)
6774367758
!make_test_sequence_variant_constant fail arg consts
@@ -68053,9 +68068,7 @@ and do_compile_matching repr partial ctx arg pmh = match pmh with
6805368068
(combine_constant names pat.pat_loc arg cst partial)
6805468069
ctx pm
6805568070
| Tpat_construct (_, cstr, _) ->
68056-
let sw_names = if !Config.bs_only
68057-
then !names_from_construct_pattern pat
68058-
else None in
68071+
let sw_names = !names_from_construct_pattern pat in
6805968072
compile_test
6806068073
(compile_match repr partial) partial
6806168074
divide_constructor
@@ -81133,6 +81146,7 @@ let setup_env () =
8113381146
Translcore.wrap_single_field_record := Transl_single_field_record.wrap_single_field_record;
8113481147
Translmod.eval_rec_bindings := Compile_rec_module.eval_rec_bindings;
8113581148
Typemod.should_hide := Typemod_hide.should_hide;
81149+
8113681150
Clflags.no_std_include := true;
8113781151
Warnings.parse_options false Bsc_warnings.defaults_w;
8113881152
Warnings.parse_options true Bsc_warnings.defaults_warn_error;

0 commit comments

Comments
 (0)