@@ -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
23222337let 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
24462461let 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
24512466let 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
24552470let 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
24612476let 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+
24702485let 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 :
24802495let 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
0 commit comments