@@ -219,6 +219,20 @@ BEGIN { $build_subclass->('', # parent
219
219
' CODE_sets_ST0' , # Bool
220
220
' XSRETURN_count_basic' , # Int
221
221
' XSRETURN_count_extra' , # Int
222
+
223
+ # these maintain the alias parsing state across potentially multiple
224
+ # ALIAS keywords and or lines:
225
+
226
+ ' map_alias_name_to_value' , # Hash: maps seen alias names to their value
227
+
228
+ # Hash of hash of bools:
229
+ # indicates which alias names have been
230
+ # used for each value.
231
+ ' map_alias_value_to_name_seen_hash' ,
232
+
233
+ ' alias_clash_hinted' , # Bool: an ALIAS warn-hint has been emitted.
234
+
235
+
222
236
)};
223
237
224
238
@@ -503,18 +517,20 @@ sub boot_code {
503
517
my $pname = $pxs -> {cur_xsub }{decl }{full_perl_name };
504
518
my $cname = $pxs -> {cur_xsub }{decl }{full_C_name };
505
519
506
- if ( $pxs -> {xsub_map_alias_name_to_value }
507
- and keys %{ $pxs -> {xsub_map_alias_name_to_value } })
520
+ if ( $pxs -> {cur_xsub }{ map_alias_name_to_value }
521
+ and keys %{ $pxs -> {cur_xsub }{ map_alias_name_to_value } })
508
522
{
509
523
# For the main XSUB and for each alias name, generate a newXS() call
510
524
# and 'XSANY.any_i32 = ix' line.
511
525
512
526
# Make the main name one of the aliases if it isn't already
513
- $pxs -> {xsub_map_alias_name_to_value }-> {$pname } = 0
514
- unless defined $pxs -> {xsub_map_alias_name_to_value } -> {$pname };
527
+ $pxs -> {cur_xsub }{ map_alias_name_to_value }-> {$pname } = 0
528
+ unless defined $pxs -> {cur_xsub }{ map_alias_name_to_value } {$pname };
515
529
516
- foreach my $xname (sort keys %{ $pxs -> {xsub_map_alias_name_to_value } }) {
517
- my $value = $pxs -> {xsub_map_alias_name_to_value }{$xname };
530
+ foreach my $xname (sort keys
531
+ %{ $pxs -> {cur_xsub }{map_alias_name_to_value } })
532
+ {
533
+ my $value = $pxs -> {cur_xsub }{map_alias_name_to_value }{$xname };
518
534
push (@code , ExtUtils::ParseXS::Q(<<"EOF" ));
519
535
| cv = $newXS (\" $xname \" , XS_$cname$file_arg$proto_arg );
520
536
| XSANY.any_i32 = $value ;
@@ -3657,8 +3673,9 @@ BEGIN { $build_subclass->('keyline', # parent
3657
3673
#
3658
3674
# Updates:
3659
3675
# $parent->{aliases}{$alias} = $value;
3660
- # $pxs->{xsub_map_alias_name_to_value}->{$alias} = $value;
3661
- # $pxs->{xsub_map_alias_value_to_name_seen_hash}->{$value}{$alias}++;
3676
+ # $xsub->{map_alias_name_to_value}{$alias} = $value;
3677
+ # $xsub->{map_alias_value_to_name_seen_hash}{$value}{$alias}++;
3678
+
3662
3679
3663
3680
sub parse {
3664
3681
my __PACKAGE__ $self = shift ;
@@ -3695,8 +3712,8 @@ sub parse {
3695
3712
if ($is_symbolic ) {
3696
3713
my $orig_value = $value ;
3697
3714
$value = $pxs -> {PACKAGE_class } . $value if $value !~ / ::/ ;
3698
- if (defined $pxs -> {xsub_map_alias_name_to_value } -> {$value }) {
3699
- $value = $pxs -> {xsub_map_alias_name_to_value } -> {$value };
3715
+ if (defined $pxs -> {cur_xsub }{ map_alias_name_to_value } {$value }) {
3716
+ $value = $pxs -> {cur_xsub }{ map_alias_name_to_value } {$value };
3700
3717
} elsif ($value eq $fname ) {
3701
3718
$value = 0;
3702
3719
} else {
@@ -3705,14 +3722,16 @@ sub parse {
3705
3722
}
3706
3723
3707
3724
# check for duplicate alias name & duplicate value
3708
- my $prev_value = $pxs -> {xsub_map_alias_name_to_value } -> {$alias };
3725
+ my $prev_value = $pxs -> {cur_xsub }{ map_alias_name_to_value } {$alias };
3709
3726
if (defined $prev_value ) {
3710
3727
if ($prev_value eq $value ) {
3711
3728
$pxs -> Warn(" Warning: Ignoring duplicate alias '$orig_alias '" )
3712
3729
} else {
3713
3730
$pxs -> Warn(" Warning: Conflicting duplicate alias '$orig_alias '"
3714
3731
. " changes definition from '$prev_value ' to '$value '" );
3715
- delete $pxs -> {xsub_map_alias_value_to_name_seen_hash }-> {$prev_value }{$alias };
3732
+ delete $pxs -> {cur_xsub }->
3733
+ {map_alias_value_to_name_seen_hash }->
3734
+ {$prev_value }{$alias };
3716
3735
}
3717
3736
}
3718
3737
@@ -3721,11 +3740,13 @@ sub parse {
3721
3740
# symbolic definitions is to say we want to duplicate the value and
3722
3741
# it is NOT a mistake.
3723
3742
unless ($is_symbolic ) {
3724
- my @keys = sort keys %{$pxs -> {xsub_map_alias_value_to_name_seen_hash }-> {$value }||{}};
3743
+ my @keys = sort keys %{$pxs -> {cur_xsub }->
3744
+ {map_alias_value_to_name_seen_hash }-> {$value }||{}};
3725
3745
# deal with an alias of 0, which might not be in the aliases
3726
3746
# dataset yet as 0 is the default for the base function ($fname)
3727
3747
push @keys , $fname
3728
- if $value eq " 0" and !defined $pxs -> {xsub_map_alias_name_to_value }{$fname };
3748
+ if $value eq " 0" and
3749
+ !defined $pxs -> {cur_xsub }{map_alias_name_to_value }{$fname };
3729
3750
if (@keys and $pxs -> {config_author_warnings }) {
3730
3751
# We do not warn about value collisions unless author_warnings
3731
3752
# are enabled. They aren't helpful to a module consumer, only
@@ -3742,16 +3763,17 @@ sub parse {
3742
3763
. ( $value eq " 0"
3743
3764
? " - the base function"
3744
3765
: " " ),
3745
- !$pxs -> {xsub_alias_clash_hinted }++
3766
+ !$pxs -> {cur_xsub }{ alias_clash_hinted }++
3746
3767
? " If this is deliberate use a symbolic alias instead."
3747
3768
: undef
3748
3769
);
3749
3770
}
3750
3771
}
3751
3772
3752
3773
$parent -> {aliases }{$alias } = $value ;
3753
- $pxs -> {xsub_map_alias_name_to_value }-> {$alias } = $value ;
3754
- $pxs -> {xsub_map_alias_value_to_name_seen_hash }-> {$value }{$alias }++;
3774
+ $pxs -> {cur_xsub }{map_alias_name_to_value }-> {$alias } = $value ;
3775
+ $pxs -> {cur_xsub }{map_alias_value_to_name_seen_hash }->
3776
+ {$value }{$alias }++;
3755
3777
}
3756
3778
3757
3779
$pxs -> blurt(" Error: Cannot parse ALIAS definitions from '$orig '" )
0 commit comments