X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/b7569deb825abe0814411c06d6990b49bb917a6d..12578451ab3883e1692ecd2814459f3e9f083028:/lib/feature.pm diff --git a/lib/feature.pm b/lib/feature.pm index 1517c1f..37e571f 100644 --- a/lib/feature.pm +++ b/lib/feature.pm @@ -1,31 +1,49 @@ +# -*- 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.16'; +our $VERSION = '1.28'; -# (feature name) => (internal name, used in %^H) -my %feature = ( +our %feature = ( + fc => 'feature_fc', + say => 'feature_say', + state => 'feature_state', switch => 'feature_switch', - say => "feature_say", - state => "feature_state", - unicode_strings => "feature_unicode", + evalbytes => 'feature_evalbytes', + array_base => 'feature_arybase', + current_sub => 'feature___SUB__', + unicode_eval => 'feature_unieval', + 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)], + "all" => [qw(array_base current_sub evalbytes fc say 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.9.5"} = $feature_bundle{"5.10"}; + +our $hint_shift = 26; +our $hint_mask = 0x1c000000; +our @hint_bundles = qw( default 5.10 5.11 5.15 ); + # 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; -# NB. the latest bundle must be loaded by the -E switch (see toke.c) - -my %feature_bundle = ( - "5.10" => [qw(switch say state)], - "5.11" => [qw(switch say state unicode_strings)], - "5.12" => [qw(switch say state unicode_strings)], -); - -# special case -$feature_bundle{"5.9.5"} = $feature_bundle{"5.10"}; - # TODO: # - think about versioned features (use feature switch => 2) @@ -35,24 +53,28 @@ feature - Perl pragma to enable new features =head1 SYNOPSIS - use feature qw(switch say); + use feature qw(say switch); given ($foo) { - when (1) { say "\$foo == 1" } - when ([2,3]) { say "\$foo == 2 || \$foo == 3" } - when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" } - when ($_ > 100) { say "\$foo > 100" } - default { say "None of the above" } + when (1) { say "\$foo == 1" } + when ([2,3]) { say "\$foo == 2 || \$foo == 3" } + when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" } + when ($_ > 100) { say "\$foo > 100" } + default { say "None of the above" } } use feature ':5.10'; # loads all features available in perl 5.10 + use v5.10; # implicitly loads :5.10 feature bundle + =head1 DESCRIPTION It is usually impossible to add new syntax to Perl without breaking -some existing programs. This pragma provides a way to minimize that +some existing programs. This pragma provides a way to minimize that risk. New syntactic constructs, or new semantic meanings to older constructs, can be enabled by C, and will be parsed -only when the appropriate feature pragma is in scope. +only when the appropriate feature pragma is in scope. (Nevertheless, the +C prefix provides access to all Perl keywords, regardless of this +pragma.) =head2 Lexical effect @@ -68,7 +90,7 @@ from that point to the end of the enclosing block. =head2 C -Features can also be turned off by using C. This too +Features can also be turned off by using C. This too has lexical effect. use feature 'say'; @@ -79,72 +101,194 @@ has lexical effect. } say "Yet it is here."; -C with no features specified will turn off all features. - -=head2 The 'switch' feature - -C tells the compiler to enable the Perl 6 -given/when construct. +C with no features specified will reset to the default group. To +disable I features (an unusual request!) use C. -See L for details. +=head1 AVAILABLE FEATURES =head2 The 'say' feature -C tells the compiler to enable the Perl 6 +C tells the compiler to enable the Perl 6 style C function. See L for details. -=head2 the 'state' feature +This feature is available starting with Perl 5.10. + +=head2 The 'state' feature C tells the compiler to enable C variables. See L for details. -=head2 the 'unicode_strings' feature +This feature is available starting with Perl 5.10. + +=head2 The 'switch' feature + +C tells the compiler to enable the Perl 6 +given/when construct. + +See L for details. + +This feature is available starting with Perl 5.10. + +=head2 The 'unicode_strings' feature + +C tells the compiler to use Unicode semantics +in all string operations executed within its scope (unless they are also +within the scope of either C or C). The same applies +to all regular expressions compiled within the scope, even if executed outside +it. + +C tells the compiler to use the traditional +Perl semantics wherein the native character set semantics is used unless it is +clear to Perl that Unicode is desired. This can lead to some surprises +when the behavior suddenly changes. (See +L for details.) For this reason, if you are +potentially using Unicode in your program, the +C subpragma is B recommended. + +This feature is available starting with Perl 5.12; was almost fully +implemented in Perl 5.14; and extended in Perl 5.16 to cover C. + +=head2 The 'unicode_eval' and 'evalbytes' features + +Under the C feature, Perl's C function, when passed a +string, will evaluate it as a string of characters, ignoring any +C declarations. C exists to declare the encoding of +the script, which only makes sense for a stream of bytes, not a string of +characters. Source filters are forbidden, as they also really only make +sense on strings of bytes. Any attempt to activate a source filter will +result in an error. + +The C feature enables the C keyword, which evaluates +the argument passed to it as a string of bytes. It dies if the string +contains any characters outside the 8-bit range. Source filters work +within C: they apply to the contents of the string being +evaluated. + +Together, these two features are intended to replace the historical C +function, which has (at least) two bugs in it, that cannot easily be fixed +without breaking existing programs: + +=over + +=item * + +C behaves differently depending on the internal encoding of the +string, sometimes treating its argument as a string of bytes, and sometimes +as a string of characters. + +=item * + +Source filters activated within C leak out into whichever I +scope is currently being compiled. To give an example with the CPAN module +L: + + BEGIN { eval "use Semi::Semicolons; # not filtered here " } + # filtered here! + +C fixes that to work the way one would expect: -C tells the compiler to treat -all strings outside of C and C as Unicode. It is -available starting with Perl 5.11.3. + use feature "evalbytes"; + BEGIN { evalbytes "use Semi::Semicolons; # filtered " } + # not filtered -See L for details. +=back + +These two features are available starting with Perl 5.16. + +=head2 The 'current_sub' feature + +This provides the C<__SUB__> token that returns a reference to the current +subroutine or C outside of a subroutine. + +This feature is available starting with Perl 5.16. + +=head2 The 'array_base' feature + +This feature supports the legacy C<$[> variable. See L and +L. It is on by default but disabled under C (see +L, below). + +This feature is available under this name starting with Perl 5.16. In +previous versions, it was simply on all the time, and this pragma knew +nothing about it. + +=head2 The 'fc' feature + +C tells the compiler to enable the C function, +which implements Unicode casefolding. + +See L for details. + +This feature is available from Perl 5.16 onwards. =head1 FEATURE BUNDLES -It's possible to load a whole slew of features in one go, using -a I. The name of a feature bundle is prefixed with -a colon, to distinguish it from an actual feature. At present, the -only feature bundle is C which is equivalent -to C. +It's possible to load multiple features together, using +a I. The name of a feature bundle is prefixed with +a colon, to distinguish it from an actual feature. + + use feature ":5.10"; + +The following feature bundles are available: + + bundle features included + --------- ----------------- + :default array_base + + :5.10 say state switch array_base + + :5.12 say state switch unicode_strings array_base + + :5.14 say state switch unicode_strings array_base + + :5.16 say state switch unicode_strings + unicode_eval evalbytes current_sub fc + + :5.18 say state switch unicode_strings + unicode_eval evalbytes current_sub fc + +The C<:default> bundle represents the feature set that is enabled before +any C or C declaration. -Specifying sub-versions such as the C<0> in C<5.10.0> in feature bundles has -no effect: feature bundles are guaranteed to be the same for all sub-versions. +Specifying sub-versions such as the C<0> in C<5.14.0> in feature bundles has +no effect. Feature bundles are guaranteed to be the same for all sub-versions. + + use feature ":5.14.0"; # same as ":5.14" + use feature ":5.14.1"; # same as ":5.14" =head1 IMPLICIT LOADING -There are two ways to load the C pragma implicitly : +Instead of loading feature bundles by name, it is easier to let Perl do +implicit loading of a feature bundle for you. + +There are two ways to load the C pragma implicitly: =over 4 =item * -By using the C<-E> switch on the command-line instead of C<-e>. It enables -all available features in the main compilation unit (that is, the one-liner.) +By using the C<-E> switch on the Perl command-line instead of C<-e>. +That will enable the feature bundle for that version of Perl in the +main compilation unit (that is, the one-liner that follows C<-E>). =item * -By requiring explicitly a minimal Perl version number for your program, with -the C construct, and when the version is higher than or equal to -5.10.0. That is, +By explicitly requiring a minimum Perl version number for your program, with +the C construct. That is, - use 5.10.0; + use v5.10.0; will do an implicit + no feature ':all'; use feature ':5.10'; -and so on. Note how the trailing sub-version is automatically stripped from the +and so on. Note how the trailing sub-version +is automatically stripped from the version. But to avoid portability warnings (see L), you may prefer: @@ -153,79 +297,87 @@ But to avoid portability warnings (see L), you may prefer: with the same effect. +If the required version is older than Perl 5.10, the ":default" feature +bundle is automatically loaded instead. + =back =cut sub import { my $class = shift; - if (@_ == 0) { - croak("No features specified"); - } - 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}) { - unknown_feature($name); - } - $^H{$feature{$name}} = 1; - $^H |= $hint_uni8bit if $name eq 'unicode_strings'; + + if (!@_) { + croak("No features specified"); } + + __common(1, @_); } sub unimport { my $class = shift; - # A bare C should disable *all* features + # A bare C should reset to the default bundle if (!@_) { - delete @^H{ values(%feature) }; - $^H &= ~ $hint_uni8bit; + $^H &= ~($hint_uni8bit|$hint_mask); return; } - 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})) { - unknown_feature($name); + __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'; } - else { - delete $^H{$feature{$name}}; + } + 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}) { + 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)); + $feature, $^V)); } sub unknown_feature_bundle { my $feature = shift; croak(sprintf('Feature bundle "%s" is not supported by Perl %vd', - $feature, $^V)); + $feature, $^V)); } sub croak { @@ -234,3 +386,5 @@ sub croak { } 1; + +# ex: set ro: