This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Bump version to 5.33.5
[perl5.git] / lib / feature.pm
index 607ec11..7c60f1d 100644 (file)
@@ -5,49 +5,35 @@
 
 package feature;
 
-our $VERSION = '1.56';
+our $VERSION = '1.61';
 
 our %feature = (
-    fc              => 'feature_fc',
-    say             => 'feature_say',
-    state           => 'feature_state',
-    switch          => 'feature_switch',
-    bitwise         => 'feature_bitwise',
-    evalbytes       => 'feature_evalbytes',
-    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',
-);
-
-
-my %feature_bits = (
-    bitwise         => 0x0001,
-    current_sub     => 0x0002,
-    declared_refs   => 0x0004,
-    evalbytes       => 0x0008,
-    fc              => 0x0010,
-    postderef_qq    => 0x0020,
-    refaliasing     => 0x0040,
-    say             => 0x0080,
-    signatures      => 0x0100,
-    state           => 0x0200,
-    switch          => 0x0400,
-    unicode_eval    => 0x0800,
-    unicode_strings => 0x1000,
+    fc               => 'feature_fc',
+    isa              => 'feature_isa',
+    say              => 'feature_say',
+    state            => 'feature_state',
+    switch           => 'feature_switch',
+    bitwise          => 'feature_bitwise',
+    indirect         => 'feature_indirect',
+    evalbytes        => 'feature_evalbytes',
+    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',
+    multidimensional => 'feature_multidimensional',
 );
 
 our %feature_bundle = (
-    "5.10"    => [qw(say state switch)],
-    "5.11"    => [qw(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)],
-    "5.27"    => [qw(bitwise current_sub evalbytes fc postderef_qq say state switch unicode_eval unicode_strings)],
-    "all"     => [qw(bitwise current_sub declared_refs evalbytes fc postderef_qq refaliasing say signatures state switch unicode_eval unicode_strings)],
-    "default" => [qw()],
+    "5.10"    => [qw(indirect multidimensional say state switch)],
+    "5.11"    => [qw(indirect multidimensional say state switch unicode_strings)],
+    "5.15"    => [qw(current_sub evalbytes fc indirect multidimensional say state switch unicode_eval unicode_strings)],
+    "5.23"    => [qw(current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
+    "5.27"    => [qw(bitwise current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
+    "all"     => [qw(bitwise current_sub declared_refs evalbytes fc indirect isa multidimensional postderef_qq refaliasing say signatures state switch unicode_eval unicode_strings)],
+    "default" => [qw(indirect multidimensional)],
 );
 
 $feature_bundle{"5.12"} = $feature_bundle{"5.11"};
@@ -68,6 +54,8 @@ $feature_bundle{"5.29"} = $feature_bundle{"5.27"};
 $feature_bundle{"5.30"} = $feature_bundle{"5.27"};
 $feature_bundle{"5.31"} = $feature_bundle{"5.27"};
 $feature_bundle{"5.32"} = $feature_bundle{"5.27"};
+$feature_bundle{"5.33"} = $feature_bundle{"5.27"};
+$feature_bundle{"5.34"} = $feature_bundle{"5.27"};
 $feature_bundle{"5.9.5"} = $feature_bundle{"5.10"};
 my %noops = (
     postderef => 1,
@@ -78,7 +66,7 @@ my %removed = (
 );
 
 our $hint_shift   = 26;
-our $hint_mask    = 0x1c000000;
+our $hint_mask    = 0x3c000000;
 our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 5.27 );
 
 # This gets set (for now) in $^H as well as in %^H,
@@ -150,7 +138,7 @@ disable I<all> features (an unusual request!) use C<no feature ':all'>.
 
 =head2 The 'say' feature
 
-C<use feature 'say'> tells the compiler to enable the Perl 6 style
+C<use feature 'say'> tells the compiler to enable the Raku-inspired
 C<say> function.
 
 See L<perlfunc/say> for details.
@@ -174,7 +162,7 @@ explicitly disabled the warning:
 
     no warnings "experimental::smartmatch";
 
-C<use feature 'switch'> tells the compiler to enable the Perl 6
+C<use feature 'switch'> tells the compiler to enable the Raku
 given/when construct.
 
 See L<perlsyn/"Switch Statements"> for details.
@@ -367,6 +355,43 @@ Reference to a Variable> for examples.
 
 This feature is available from Perl 5.26 onwards.
 
+=head2 The 'isa' feature
+
+This allows the use of the C<isa> infix operator, which tests whether the
+scalar given by the left operand is an object of the class given by the
+right operand. See L<perlop/Class Instance Operator> for more details.
+
+This feature is available from Perl 5.32 onwards.
+
+=head2 The 'indirect' feature
+
+This feature allows the use of L<indirect object
+syntax|perlobj/Indirect Object Syntax> for method calls, e.g.  C<new
+Foo 1, 2;>. It is enabled by default, but can be turned off to
+disallow indirect object syntax.
+
+This feature is available under this name from Perl 5.32 onwards. In
+previous versions, it was simply on all the time.  To disallow (or
+warn on) indirect object syntax on older Perls, see the L<indirect>
+CPAN module.
+
+=head2 The 'multidimensional' feature
+
+This feature enables multidimensional array emulation, a perl 4 (or
+earlier) feature that was used to emulate multidimensional arrays with
+hashes.  This works by converting code like C<< $foo{$x, y} >> into
+C<< $foo{join($;, $x, $y} >>.  It is enabled by default, but can be
+turned off to disable multidimensional array emulation.
+
+When this feature is disabled the syntax that is normally replaced
+will report a compilation error.
+
+This feature is available under this name from Perl 5.34 onwards. In
+previous versions, it was simply on all the time.
+
+You can use the L<multidimensional> module on CPAN to disable
+multidimensional array emulation for older versions of Perl.
+
 =head1 FEATURE BUNDLES
 
 It's possible to load multiple features together, using
@@ -379,45 +404,55 @@ The following feature bundles are available:
 
   bundle    features included
   --------- -----------------
-  :default
+  :default  indirect multidimensional
+
+  :5.10     indirect multidimensional say state switch
 
-  :5.10     say state switch
+  :5.12     indirect multidimensional say state switch
+            unicode_strings
 
-  :5.12     say state switch unicode_strings
+  :5.14     indirect multidimensional say state switch
+            unicode_strings
 
-  :5.14     say state switch unicode_strings
+  :5.16     current_sub evalbytes fc indirect
+            multidimensional say state switch
+            unicode_eval unicode_strings
 
-  :5.16     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
+  :5.18     current_sub evalbytes fc indirect
+            multidimensional say state switch
+            unicode_eval unicode_strings
 
-  :5.18     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
+  :5.20     current_sub evalbytes fc indirect
+            multidimensional say state switch
+            unicode_eval unicode_strings
 
-  :5.20     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
+  :5.22     current_sub evalbytes fc indirect
+            multidimensional say state switch
+            unicode_eval unicode_strings
 
-  :5.22     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
+  :5.24     current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
-  :5.24     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
-            postderef_qq
+  :5.26     current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
-  :5.26     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
-            postderef_qq
+  :5.28     bitwise current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
-  :5.28     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
-            postderef_qq bitwise
+  :5.30     bitwise current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
-  :5.30     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
-            postderef_qq bitwise
+  :5.32     bitwise current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
-  :5.32     say state switch unicode_strings
-            unicode_eval evalbytes current_sub fc
-            postderef_qq bitwise
+  :5.34     bitwise current_sub evalbytes fc indirect
+            multidimensional postderef_qq say state
+            switch unicode_eval unicode_strings
 
 The C<:default> bundle represents the feature set that is enabled before
 any C<use feature> or C<no feature> declaration.
@@ -503,16 +538,13 @@ sub __common {
     my $bundle_number = $^H & $hint_mask;
     my $features = $bundle_number != $hint_mask
       && $feature_bundle{$hint_bundles[$bundle_number >> $hint_shift]};
-    my $bits = ${^FEATURE_BITS};
     if ($features) {
        # Features are enabled implicitly via bundle hints.
        # Delete any keys that may be left over from last time.
        delete @^H{ values(%feature) };
-        $bits = 0;
        $^H |= $hint_mask;
        for (@$features) {
            $^H{$feature{$_}} = 1;
-            $bits |= $feature_bits{$_};
            $^H |= $hint_uni8bit if $_ eq 'unicode_strings';
        }
     }
@@ -540,15 +572,12 @@ sub __common {
         }
        if ($import) {
            $^H{$feature{$name}} = 1;
-            $bits |= $feature_bits{$name};
            $^H |= $hint_uni8bit if $name eq 'unicode_strings';
        } else {
             delete $^H{$feature{$name}};
-            $bits &= ~$feature_bits{$name};
             $^H &= ~ $hint_uni8bit if $name eq 'unicode_strings';
         }
     }
-    ${^FEATURE_BITS} = $bits;
 }
 
 sub unknown_feature {