diff --git a/MANIFEST b/MANIFEST
index fc6052425dfc..c4d2fac61f4d 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -5631,6 +5631,7 @@ t/lib/Devel/nodb.pm Module for t/run/switchd.t
t/lib/Devel/switchd.pm Module for t/run/switchd.t
t/lib/Devel/switchd_empty.pm Module for t/run/switchd.t
t/lib/Devel/switchd_goto.pm Module for t/run/switchd.t
+t/lib/feature/autovivification Tests for the autovivification feature
t/lib/feature/bareword_filehandles Tests for enabling/disabling bareword_filehandles feature
t/lib/feature/bits Tests for feature bit handling
t/lib/feature/bundle Tests for feature bundles
diff --git a/cop.h b/cop.h
index b5f30bd0415f..777fb3bf7f5b 100644
--- a/cop.h
+++ b/cop.h
@@ -576,6 +576,8 @@ string C
, creating the package if necessary.
#define CopHINTHASH_get(c) ((COPHH*)((c)->cop_hints_hash))
#define CopHINTHASH_set(c,h) ((c)->cop_hints_hash = (h))
+#define CopFEATURES_setfrom(c, o) ((c)->cop_features = (o)->cop_features)
+
/*
=for apidoc Am|SV *|cop_hints_fetch_pvn|const COP *cop|const char *keypv|STRLEN keylen|U32 hash|U32 flags
diff --git a/feature.h b/feature.h
index 501bc3a3b180..540d8ff12b1b 100644
--- a/feature.h
+++ b/feature.h
@@ -12,24 +12,25 @@
#define HINT_FEATURE_SHIFT 26
-#define FEATURE_BAREWORD_FILEHANDLES_BIT 0x0001
-#define FEATURE_BITWISE_BIT 0x0002
-#define FEATURE___SUB___BIT 0x0004
-#define FEATURE_MYREF_BIT 0x0008
-#define FEATURE_EVALBYTES_BIT 0x0010
-#define FEATURE_FC_BIT 0x0020
-#define FEATURE_INDIRECT_BIT 0x0040
-#define FEATURE_ISA_BIT 0x0080
-#define FEATURE_MULTIDIMENSIONAL_BIT 0x0100
-#define FEATURE_POSTDEREF_QQ_BIT 0x0200
-#define FEATURE_REFALIASING_BIT 0x0400
-#define FEATURE_SAY_BIT 0x0800
-#define FEATURE_SIGNATURES_BIT 0x1000
-#define FEATURE_STATE_BIT 0x2000
-#define FEATURE_SWITCH_BIT 0x4000
-#define FEATURE_TRY_BIT 0x8000
-#define FEATURE_UNIEVAL_BIT 0x10000
-#define FEATURE_UNICODE_BIT 0x20000
+#define FEATURE_AUTOVIVIFICATION_BIT 0x0001
+#define FEATURE_BAREWORD_FILEHANDLES_BIT 0x0002
+#define FEATURE_BITWISE_BIT 0x0004
+#define FEATURE___SUB___BIT 0x0008
+#define FEATURE_MYREF_BIT 0x0010
+#define FEATURE_EVALBYTES_BIT 0x0020
+#define FEATURE_FC_BIT 0x0040
+#define FEATURE_INDIRECT_BIT 0x0080
+#define FEATURE_ISA_BIT 0x0100
+#define FEATURE_MULTIDIMENSIONAL_BIT 0x0200
+#define FEATURE_POSTDEREF_QQ_BIT 0x0400
+#define FEATURE_REFALIASING_BIT 0x0800
+#define FEATURE_SAY_BIT 0x1000
+#define FEATURE_SIGNATURES_BIT 0x2000
+#define FEATURE_STATE_BIT 0x4000
+#define FEATURE_SWITCH_BIT 0x8000
+#define FEATURE_TRY_BIT 0x10000
+#define FEATURE_UNIEVAL_BIT 0x20000
+#define FEATURE_UNICODE_BIT 0x40000
#define FEATURE_BUNDLE_DEFAULT 0
#define FEATURE_BUNDLE_510 1
@@ -167,6 +168,13 @@
FEATURE_IS_ENABLED_MASK(FEATURE_UNICODE_BIT)) \
)
+#define FEATURE_AUTOVIVIFICATION_IS_ENABLED \
+ ( \
+ CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527 \
+ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+ FEATURE_IS_ENABLED_MASK(FEATURE_AUTOVIVIFICATION_BIT)) \
+ )
+
#define FEATURE_MULTIDIMENSIONAL_IS_ENABLED \
( \
CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527 \
@@ -250,6 +258,14 @@ S_magic_sethint_feature(pTHX_ SV *keysv, const char *keypv, STRLEN keylen,
}
return;
+ case 'a':
+ if (keylen == sizeof("feature_autovivification")-1
+ && memcmp(subf+1, "utovivification", keylen - sizeof("feature_")) == 0) {
+ mask = FEATURE_AUTOVIVIFICATION_BIT;
+ break;
+ }
+ return;
+
case 'b':
if (keylen == sizeof("feature_bareword_filehandles")-1
&& memcmp(subf+1, "areword_filehandles", keylen - sizeof("feature_")) == 0) {
diff --git a/lib/feature.pm b/lib/feature.pm
index c57c75da8c95..7bfd2b42cf5a 100644
--- a/lib/feature.pm
+++ b/lib/feature.pm
@@ -24,18 +24,19 @@ our %feature = (
unicode_eval => 'feature_unieval',
declared_refs => 'feature_myref',
unicode_strings => 'feature_unicode',
+ autovivification => 'feature_autovivification',
multidimensional => 'feature_multidimensional',
bareword_filehandles => 'feature_bareword_filehandles',
);
our %feature_bundle = (
- "5.10" => [qw(bareword_filehandles indirect multidimensional say state switch)],
- "5.11" => [qw(bareword_filehandles indirect multidimensional say state switch unicode_strings)],
- "5.15" => [qw(bareword_filehandles current_sub evalbytes fc indirect multidimensional say state switch unicode_eval unicode_strings)],
- "5.23" => [qw(bareword_filehandles current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
- "5.27" => [qw(bareword_filehandles bitwise current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
- "all" => [qw(bareword_filehandles bitwise current_sub declared_refs evalbytes fc indirect isa multidimensional postderef_qq refaliasing say signatures state switch try unicode_eval unicode_strings)],
- "default" => [qw(bareword_filehandles indirect multidimensional)],
+ "5.10" => [qw(autovivification bareword_filehandles indirect multidimensional say state switch)],
+ "5.11" => [qw(autovivification bareword_filehandles indirect multidimensional say state switch unicode_strings)],
+ "5.15" => [qw(autovivification bareword_filehandles current_sub evalbytes fc indirect multidimensional say state switch unicode_eval unicode_strings)],
+ "5.23" => [qw(autovivification bareword_filehandles current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
+ "5.27" => [qw(autovivification bareword_filehandles bitwise current_sub evalbytes fc indirect multidimensional postderef_qq say state switch unicode_eval unicode_strings)],
+ "all" => [qw(autovivification bareword_filehandles bitwise current_sub declared_refs evalbytes fc indirect isa multidimensional postderef_qq refaliasing say signatures state switch try unicode_eval unicode_strings)],
+ "default" => [qw(autovivification bareword_filehandles indirect multidimensional)],
);
$feature_bundle{"5.12"} = $feature_bundle{"5.11"};
@@ -418,6 +419,14 @@ C are caught by executing the body of the C block.
For more information, see L.
+=head2 The 'autovivification' feature.
+
+This feature enables autovivification of references. It is enabled by
+default, but can be turned off to disable it.
+
+This feature is available under this name from Perl 5.34 onwards, in
+previous versions it was simple on all the time.
+
=head1 FEATURE BUNDLES
It's possible to load multiple features together, using
@@ -431,64 +440,68 @@ The following feature bundles are available:
bundle features included
--------- -----------------
:default indirect multidimensional
- bareword_filehandles
+ bareword_filehandles autovivification
+
+ :5.10 autovivification bareword_filehandles
+ indirect multidimensional say state switch
+
+ :5.12 autovivification bareword_filehandles
+ indirect multidimensional say state switch
+ unicode_strings
- :5.10 bareword_filehandles indirect
+ :5.14 autovivification bareword_filehandles
+ indirect multidimensional say state switch
+ unicode_strings
+
+ :5.16 autovivification bareword_filehandles
+ current_sub evalbytes fc indirect
multidimensional say state switch
+ unicode_eval unicode_strings
- :5.12 bareword_filehandles indirect
+ :5.18 autovivification bareword_filehandles
+ current_sub evalbytes fc indirect
multidimensional say state switch
- unicode_strings
+ unicode_eval unicode_strings
- :5.14 bareword_filehandles indirect
+ :5.20 autovivification bareword_filehandles
+ current_sub evalbytes fc indirect
multidimensional say state switch
- unicode_strings
+ unicode_eval unicode_strings
- :5.16 bareword_filehandles current_sub evalbytes
- fc indirect multidimensional say state
- switch unicode_eval unicode_strings
+ :5.22 autovivification bareword_filehandles
+ current_sub evalbytes fc indirect
+ multidimensional say state switch
+ unicode_eval unicode_strings
- :5.18 bareword_filehandles current_sub evalbytes
- fc indirect multidimensional say state
+ :5.24 autovivification bareword_filehandles
+ current_sub evalbytes fc indirect
+ multidimensional postderef_qq say state
switch unicode_eval unicode_strings
- :5.20 bareword_filehandles current_sub evalbytes
- fc indirect multidimensional say state
+ :5.26 autovivification bareword_filehandles
+ current_sub evalbytes fc indirect
+ multidimensional postderef_qq say state
switch unicode_eval unicode_strings
- :5.22 bareword_filehandles current_sub evalbytes
- fc indirect multidimensional say state
+ :5.28 autovivification bareword_filehandles
+ bitwise current_sub evalbytes fc indirect
+ multidimensional postderef_qq say state
switch unicode_eval unicode_strings
- :5.24 bareword_filehandles current_sub evalbytes
- fc indirect multidimensional postderef_qq
- say state switch unicode_eval
- unicode_strings
-
- :5.26 bareword_filehandles current_sub evalbytes
- fc indirect multidimensional postderef_qq
- say state switch unicode_eval
- unicode_strings
-
- :5.28 bareword_filehandles bitwise current_sub
- evalbytes fc indirect multidimensional
- postderef_qq say state switch unicode_eval
- unicode_strings
-
- :5.30 bareword_filehandles bitwise current_sub
- evalbytes fc indirect multidimensional
- postderef_qq say state switch unicode_eval
- unicode_strings
+ :5.30 autovivification bareword_filehandles
+ bitwise current_sub evalbytes fc indirect
+ multidimensional postderef_qq say state
+ switch unicode_eval unicode_strings
- :5.32 bareword_filehandles bitwise current_sub
- evalbytes fc indirect multidimensional
- postderef_qq say state switch unicode_eval
- unicode_strings
+ :5.32 autovivification bareword_filehandles
+ bitwise current_sub evalbytes fc indirect
+ multidimensional postderef_qq say state
+ switch unicode_eval unicode_strings
- :5.34 bareword_filehandles bitwise current_sub
- evalbytes fc indirect multidimensional
- postderef_qq say state switch unicode_eval
- unicode_strings
+ :5.34 autovivification bareword_filehandles
+ 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