Skip to content

Commit 4ff3edc

Browse files
committed
add more data
1 parent 0855869 commit 4ff3edc

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

bytecomp/matching.ml

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,10 +1427,10 @@ let divide_variant row ctx {cases = cl; args = al; default=def} =
14271427
match pato with
14281428
None ->
14291429
add (make_variant_matching_constant p lab def ctx) variants
1430-
(=) (Cstr_constant tag) (patl, action) al
1430+
(=) (lab,Cstr_constant tag) (patl, action) al
14311431
| Some pat ->
14321432
add (make_variant_matching_nonconst p lab def ctx) variants
1433-
(=) (Cstr_block tag) (pat :: patl, action) al
1433+
(=) (lab,Cstr_block tag) (pat :: patl, action) al
14341434
end
14351435
| _ -> []
14361436
in
@@ -2318,6 +2318,21 @@ let split_cases tag_lambda_list =
23182318
let const, nonconst = split_rec tag_lambda_list in
23192319
sort_int_lambda_list const,
23202320
sort_int_lambda_list nonconst
2321+
2322+
(* refine [split_cases] and [split_variant_cases] *)
2323+
let split_variant_cases tag_lambda_list =
2324+
let rec split_rec = function
2325+
[] -> ([], [])
2326+
| ((name,cstr), act) :: rem ->
2327+
let (consts, nonconsts) = split_rec rem in
2328+
match cstr with
2329+
Cstr_constant n -> ((n, (name, act)) :: consts, nonconsts)
2330+
| Cstr_block n -> (consts, (n, (name, act)) :: nonconsts)
2331+
| Cstr_unboxed -> assert false
2332+
| Cstr_extension _ -> assert false in
2333+
let const, nonconst = split_rec tag_lambda_list in
2334+
sort_int_lambda_list const,
2335+
sort_int_lambda_list nonconst
23212336

23222337
let split_extension_cases tag_lambda_list =
23232338
let rec split_rec = function
@@ -2445,33 +2460,33 @@ let combine_constructor sw_names loc arg ex_pat cstr partial ctx def
24452460

24462461
let make_test_sequence_variant_constant fail arg int_lambda_list =
24472462
let _, (cases, actions) =
2448-
as_interval fail min_int max_int int_lambda_list in
2463+
as_interval fail min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) in
24492464
Switcher.test_sequence arg cases actions
24502465

24512466
let call_switcher_variant_constant loc fail arg int_lambda_list names =
2452-
call_switcher loc fail arg min_int max_int int_lambda_list names
2467+
call_switcher loc fail arg min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) names
24532468

24542469

24552470
let call_switcher_variant_constr loc fail arg int_lambda_list names =
24562471
let v = Ident.create "variant" in
24572472
Llet(Alias, Pgenval, v, Lprim(Pfield (0, Fld_poly_var_tag), [arg], loc),
24582473
call_switcher loc
2459-
fail (Lvar v) min_int max_int int_lambda_list names)
2474+
fail (Lvar v) min_int max_int (List.map (fun (a,(_,c)) -> (a,c)) int_lambda_list) names)
24602475

24612476
let call_switcher_variant_constant :
24622477
(Location.t ->
24632478
Lambda.lambda option ->
24642479
Lambda.lambda ->
2465-
(int * Lambda.lambda) list ->
2480+
(int * (string * Lambda.lambda)) list ->
24662481
Lambda.switch_names option ->
24672482
Lambda.lambda)
24682483
ref= ref call_switcher_variant_constant
2469-
2484+
24702485
let call_switcher_variant_constr :
24712486
(Location.t ->
24722487
Lambda.lambda option ->
24732488
Lambda.lambda ->
2474-
(int * Lambda.lambda) list ->
2489+
(int * (string * Lambda.lambda)) list ->
24752490
Lambda.switch_names option ->
24762491
Lambda.lambda)
24772492
ref
@@ -2480,7 +2495,7 @@ let call_switcher_variant_constr :
24802495
let make_test_sequence_variant_constant :
24812496
(Lambda.lambda option ->
24822497
Lambda.lambda ->
2483-
(int * Lambda.lambda) list ->
2498+
(int * (string * Lambda.lambda)) list ->
24842499
Lambda.lambda)
24852500
ref
24862501
= ref make_test_sequence_variant_constant
@@ -2509,12 +2524,12 @@ let combine_variant names loc row arg partial ctx def
25092524
None, jumps_empty
25102525
else
25112526
mk_failaction_neg partial ctx def in
2512-
let (consts, nonconsts) = split_cases tag_lambda_list in
2527+
let (consts, nonconsts) = split_variant_cases tag_lambda_list in
25132528
let lambda1 = match fail, one_action with
25142529
| None, Some act -> act
25152530
| _,_ ->
25162531
match (consts, nonconsts) with
2517-
| ([_, act1], [_, act2]) when fail=None ->
2532+
| ([_, (_,act1)], [_, (_,act2)]) when fail=None ->
25182533
test_int_or_block arg act1 act2
25192534
| (_, []) -> (* One can compare integers and pointers *)
25202535
!make_test_sequence_variant_constant fail arg consts
@@ -2830,9 +2845,7 @@ and do_compile_matching repr partial ctx arg pmh = match pmh with
28302845
(combine_constant names pat.pat_loc arg cst partial)
28312846
ctx pm
28322847
| Tpat_construct (_, cstr, _) ->
2833-
let sw_names = if !Config.bs_only
2834-
then !names_from_construct_pattern pat
2835-
else None in
2848+
let sw_names = !names_from_construct_pattern pat in
28362849
compile_test
28372850
(compile_match repr partial) partial
28382851
divide_constructor

bytecomp/matching.mli

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ val call_switcher_variant_constant :
2222
(Location.t ->
2323
Lambda.lambda option ->
2424
Lambda.lambda ->
25-
(int * Lambda.lambda) list ->
25+
(int * (string * Lambda.lambda)) list ->
2626
Lambda.switch_names option ->
2727
Lambda.lambda)
2828
ref
@@ -31,15 +31,15 @@ val call_switcher_variant_constr :
3131
(Location.t ->
3232
Lambda.lambda option ->
3333
Lambda.lambda ->
34-
(int * Lambda.lambda) list ->
34+
(int * (string * Lambda.lambda)) list ->
3535
Lambda.switch_names option ->
3636
Lambda.lambda)
3737
ref
3838

3939
val make_test_sequence_variant_constant :
4040
(Lambda.lambda option ->
4141
Lambda.lambda ->
42-
(int * Lambda.lambda) list ->
42+
(int * (string * Lambda.lambda)) list ->
4343
Lambda.lambda)
4444
ref
4545

0 commit comments

Comments
 (0)