@@ -31,6 +31,7 @@ use ExtUtils::ParseXS::Utilities qw(
31
31
analyze_preprocessor_statements
32
32
set_cond
33
33
Warn
34
+ WarnHint
34
35
current_line_number
35
36
blurt
36
37
death
@@ -1312,24 +1313,71 @@ sub get_aliases {
1312
1313
1313
1314
# Parse alias definitions
1314
1315
# format is
1315
- # alias = value alias = value ...
1316
-
1317
- while ($line =~ s / ^\s *([\w :]+)\s *=\s *(\w +)\s *// ) {
1318
- my ($alias , $value ) = ($1 , $2 );
1316
+ # alias = value Pack::alias = value ...
1317
+ # or
1318
+ # alias => other
1319
+ # or
1320
+ # alias => Pack::other
1321
+ # or
1322
+ # Pack::alias => Other::alias
1323
+
1324
+ while ($line =~ s / ^\s *([\w :]+)\s *=(>?)\s *([\w :]+)\s *// ) {
1325
+ my ($alias , $is_symbolic , $value ) = ($1 , $2 , $3 );
1319
1326
my $orig_alias = $alias ;
1320
1327
1328
+ blurt( $self , " Error: In alias definition for '$alias ' the value may not"
1329
+ . " contain ':' unless it is symbolic." )
1330
+ if !$is_symbolic and $value =~/ :/ ;
1331
+
1321
1332
# check for optional package definition in the alias
1322
1333
$alias = $self -> {Packprefix } . $alias if $alias !~ / ::/ ;
1323
1334
1335
+ if ($is_symbolic ) {
1336
+ my $orig_value = $value ;
1337
+ $value = $self -> {Packprefix } . $value if $value !~ / ::/ ;
1338
+ if (!defined $self -> {XsubAliases }-> {$value }) {
1339
+ blurt( $self , " Error: Unknown alias '$value ' in symbolic definition for '$orig_alias '" );
1340
+ }
1341
+ $value = $self -> {XsubAliases }-> {$value };
1342
+ }
1343
+
1324
1344
# check for duplicate alias name & duplicate value
1325
- Warn( $self , " Warning: Ignoring duplicate alias '$orig_alias '" )
1326
- if defined $self -> {XsubAliases }-> {$alias };
1345
+ my $prev_value = $self -> {XsubAliases }-> {$alias };
1346
+ if (defined $prev_value ) {
1347
+ if ($prev_value eq $value ) {
1348
+ Warn( $self , " Warning: Ignoring duplicate alias '$orig_alias '" )
1349
+ } else {
1350
+ Warn( $self , " Warning: Conflicting duplicate alias '$orig_alias '"
1351
+ . " changes definition from '$prev_value ' to '$value '" );
1352
+ delete $self -> {XsubAliasValues }-> {$prev_value }{$alias };
1353
+ }
1354
+ }
1327
1355
1328
- Warn( $self , " Warning: Aliases '$orig_alias ' and '$self ->{XsubAliasValues}->{$value }' have identical values" )
1329
- if $self -> {XsubAliasValues }-> {$value };
1356
+ # Check and see if this alias results in two aliases having the same
1357
+ # value, we only check non-symbolic definitions as the whole point of
1358
+ # symbolic definitions is to say we want to duplicate the value and
1359
+ # it is NOT a mistake.
1360
+ unless ($is_symbolic ) {
1361
+ my @keys = sort keys %{$self -> {XsubAliasValues }-> {$value }||{}};
1362
+ if (@keys ) {
1363
+ @keys = map { " '$_ '" }
1364
+ map { my $copy = $_ ;
1365
+ $copy =~s / ^$self->{Packprefix}// ;
1366
+ $copy
1367
+ } @keys ;
1368
+ WarnHint( $self ,
1369
+ " Warning: Aliases '$orig_alias ' and "
1370
+ . join (" , " , @keys )
1371
+ . " have identical values" ,
1372
+ !$self -> {XsubAliasValueClashHinted }++
1373
+ ? " If this is deliberate use a symbolic alias instead."
1374
+ : undef
1375
+ );
1376
+ }
1377
+ }
1330
1378
1331
1379
$self -> {XsubAliases }-> {$alias } = $value ;
1332
- $self -> {XsubAliasValues }-> {$value } = $orig_alias ;
1380
+ $self -> {XsubAliasValues }-> {$value }{ $alias }++ ;
1333
1381
}
1334
1382
1335
1383
blurt( $self , " Error: Cannot parse ALIAS definitions from '$orig '" )
0 commit comments