| # -*- buffer-read-only: t -*- |
| # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! |
| # This file is built by regen/feature.pl. |
| # Any changes made here will be lost! |
| |
| package feature; |
| |
| our $VERSION = '1.47'; |
| |
| our %feature = ( |
| fc => 'feature_fc', |
| say => 'feature_say', |
| state => 'feature_state', |
| switch => 'feature_switch', |
| bitwise => 'feature_bitwise', |
| evalbytes => 'feature_evalbytes', |
| array_base => 'feature_arybase', |
| signatures => 'feature_signatures', |
| current_sub => 'feature___SUB__', |
| refaliasing => 'feature_refaliasing', |
| postderef_qq => 'feature_postderef_qq', |
| unicode_eval => 'feature_unieval', |
| declared_refs => 'feature_myref', |
| unicode_strings => 'feature_unicode', |
| ); |
| |
| our %feature_bundle = ( |
| "5.10" => [qw(array_base say state switch)], |
| "5.11" => [qw(array_base say state switch unicode_strings)], |
| "5.15" => [qw(current_sub evalbytes fc say state switch unicode_eval unicode_strings)], |
| "5.23" => [qw(current_sub evalbytes fc postderef_qq say state switch unicode_eval unicode_strings)], |
| "all" => [qw(array_base bitwise current_sub declared_refs evalbytes fc postderef_qq refaliasing say signatures state switch unicode_eval unicode_strings)], |
| "default" => [qw(array_base)], |
| ); |
| |
| $feature_bundle{"5.12"} = $feature_bundle{"5.11"}; |
| $feature_bundle{"5.13"} = $feature_bundle{"5.11"}; |
| $feature_bundle{"5.14"} = $feature_bundle{"5.11"}; |
| $feature_bundle{"5.16"} = $feature_bundle{"5.15"}; |
| $feature_bundle{"5.17"} = $feature_bundle{"5.15"}; |
| $feature_bundle{"5.18"} = $feature_bundle{"5.15"}; |
| $feature_bundle{"5.19"} = $feature_bundle{"5.15"}; |
| $feature_bundle{"5.20"} = $feature_bundle{"5.15"}; |
| $feature_bundle{"5.21"} = $feature_bundle{"5.15"}; |
| $feature_bundle{"5.22"} = $feature_bundle{"5.15"}; |
| $feature_bundle{"5.24"} = $feature_bundle{"5.23"}; |
| $feature_bundle{"5.25"} = $feature_bundle{"5.23"}; |
| $feature_bundle{"5.26"} = $feature_bundle{"5.23"}; |
| $feature_bundle{"5.9.5"} = $feature_bundle{"5.10"}; |
| my %noops = ( |
| postderef => 1, |
| lexical_subs => 1, |
| ); |
| |
| our $hint_shift = 26; |
| our $hint_mask = 0x1c000000; |
| our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 ); |
| |
| # This gets set (for now) in $^H as well as in %^H, |
| # for runtime speed of the uc/lc/ucfirst/lcfirst functions. |
| # See HINT_UNI_8_BIT in perl.h. |
| our $hint_uni8bit = 0x00000800; |
| |
| # TODO: |
| # - think about versioned features (use feature switch => 2) |
| |
| sub import { |
| shift; |
| |
| if (!@_) { |
| croak("No features specified"); |
| } |
| |
| __common(1, @_); |
| } |
| |
| sub unimport { |
| shift; |
| |
| # A bare C<no feature> should reset to the default bundle |
| if (!@_) { |
| $^H &= ~($hint_uni8bit|$hint_mask); |
| return; |
| } |
| |
| __common(0, @_); |
| } |
| |
| sub __common { |
| my $import = shift; |
| my $bundle_number = $^H & $hint_mask; |
| my $features = $bundle_number != $hint_mask |
| && $feature_bundle{$hint_bundles[$bundle_number >> $hint_shift]}; |
| if ($features) { |
| # Features are enabled implicitly via bundle hints. |
| # Delete any keys that may be left over from last time. |
| delete @^H{ values(%feature) }; |
| $^H |= $hint_mask; |
| for (@$features) { |
| $^H{$feature{$_}} = 1; |
| $^H |= $hint_uni8bit if $_ eq 'unicode_strings'; |
| } |
| } |
| while (@_) { |
| my $name = shift; |
| if (substr($name, 0, 1) eq ":") { |
| my $v = substr($name, 1); |
| if (!exists $feature_bundle{$v}) { |
| $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/; |
| if (!exists $feature_bundle{$v}) { |
| unknown_feature_bundle(substr($name, 1)); |
| } |
| } |
| unshift @_, @{$feature_bundle{$v}}; |
| next; |
| } |
| if (!exists $feature{$name}) { |
| if (exists $noops{$name}) { |
| next; |
| } |
| unknown_feature($name); |
| } |
| if ($import) { |
| $^H{$feature{$name}} = 1; |
| $^H |= $hint_uni8bit if $name eq 'unicode_strings'; |
| } else { |
| delete $^H{$feature{$name}}; |
| $^H &= ~ $hint_uni8bit if $name eq 'unicode_strings'; |
| } |
| } |
| } |
| |
| sub unknown_feature { |
| my $feature = shift; |
| croak(sprintf('Feature "%s" is not supported by Perl %vd', |
| $feature, $^V)); |
| } |
| |
| sub unknown_feature_bundle { |
| my $feature = shift; |
| croak(sprintf('Feature bundle "%s" is not supported by Perl %vd', |
| $feature, $^V)); |
| } |
| |
| sub croak { |
| require Carp; |
| Carp::croak(@_); |
| } |
| |
| 1; |
| |
| # ex: set ro: |