diff --git a/MANIFEST b/MANIFEST
index 20548634b26c..e3452928dc88 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -5633,6 +5633,7 @@ t/lib/feature/multidimensional Tests for enabling/disabling $foo{$x, $y} => $foo
t/lib/feature/nonesuch Tests for enabling/disabling nonexistent feature
t/lib/feature/removed Tests for enabling/disabling removed feature
t/lib/feature/say Tests for enabling/disabling say feature
+t/lib/feature/stringification Tests for enabling/disabling stringification feature
t/lib/feature/switch Tests for enabling/disabling switch feature
t/lib/h2ph.h Test header file for h2ph
t/lib/h2ph.pht Generated output from h2ph.h by h2ph, for comparison
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..e7a0c0f97747 100644
--- a/feature.h
+++ b/feature.h
@@ -26,10 +26,11 @@
#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_STRINGIFICATION_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
@@ -159,6 +160,13 @@
FEATURE_IS_ENABLED_MASK(FEATURE_MYREF_BIT) \
)
+#define FEATURE_STRINGIFICATION_IS_ENABLED \
+ ( \
+ CURRENT_FEATURE_BUNDLE <= FEATURE_BUNDLE_527 \
+ || (CURRENT_FEATURE_BUNDLE == FEATURE_BUNDLE_CUSTOM && \
+ FEATURE_IS_ENABLED_MASK(FEATURE_STRINGIFICATION_BIT)) \
+ )
+
#define FEATURE_UNICODE_IS_ENABLED \
( \
(CURRENT_FEATURE_BUNDLE >= FEATURE_BUNDLE_511 && \
@@ -337,6 +345,11 @@ S_magic_sethint_feature(pTHX_ SV *keysv, const char *keypv, STRLEN keylen,
mask = FEATURE_STATE_BIT;
break;
}
+ else if (keylen == sizeof("feature_stringification")-1
+ && memcmp(subf+1, "tringification", keylen - sizeof("feature_")) == 0) {
+ mask = FEATURE_STRINGIFICATION_BIT;
+ break;
+ }
else if (keylen == sizeof("feature_switch")-1
&& memcmp(subf+1, "witch", keylen - sizeof("feature_")) == 0) {
mask = FEATURE_SWITCH_BIT;
diff --git a/lib/feature.pm b/lib/feature.pm
index 5ebb4a3f789c..9f9b2ee8a766 100644
--- a/lib/feature.pm
+++ b/lib/feature.pm
@@ -23,19 +23,20 @@ our %feature = (
postderef_qq => 'feature_postderef_qq',
unicode_eval => 'feature_unieval',
declared_refs => 'feature_myref',
+ stringification => 'feature_stringification',
unicode_strings => 'feature_unicode',
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(bareword_filehandles indirect multidimensional say state stringification switch)],
+ "5.11" => [qw(bareword_filehandles indirect multidimensional say state stringification switch unicode_strings)],
+ "5.15" => [qw(bareword_filehandles current_sub evalbytes fc indirect multidimensional say state stringification switch unicode_eval unicode_strings)],
+ "5.23" => [qw(bareword_filehandles current_sub evalbytes fc indirect multidimensional postderef_qq say state stringification switch unicode_eval unicode_strings)],
+ "5.27" => [qw(bareword_filehandles bitwise current_sub evalbytes fc indirect multidimensional postderef_qq say state stringification 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 stringification switch try unicode_eval unicode_strings)],
+ "default" => [qw(bareword_filehandles indirect multidimensional stringification)],
);
$feature_bundle{"5.12"} = $feature_bundle{"5.11"};
@@ -429,6 +430,17 @@ C are caught by executing the body of the C block.
For more information, see L.
+=head2 The 'stringification' feature
+
+This feature enables converting references that have no string
+overloading into strings as described in L. It is enabled by
+default, but can be turned off to disable such conversions.
+
+Disabling this feature does not prevent numeric conversions.
+
+This feature is enabled under this name from Perl 5.34 onwards. In
+previous versions it was simply on all the time.
+
=head1 FEATURE BUNDLES
It's possible to load multiple features together, using
@@ -442,64 +454,69 @@ The following feature bundles are available:
bundle features included
--------- -----------------
:default indirect multidimensional
- bareword_filehandles
+ bareword_filehandles stringification
:5.10 bareword_filehandles indirect
- multidimensional say state switch
+ multidimensional say state stringification
+ switch
:5.12 bareword_filehandles indirect
- multidimensional say state switch
- unicode_strings
+ multidimensional say state stringification
+ switch unicode_strings
:5.14 bareword_filehandles indirect
- multidimensional say state switch
- unicode_strings
+ multidimensional say state stringification
+ switch unicode_strings
:5.16 bareword_filehandles current_sub evalbytes
fc indirect multidimensional say state
- switch unicode_eval unicode_strings
+ stringification switch unicode_eval
+ unicode_strings
:5.18 bareword_filehandles current_sub evalbytes
fc indirect multidimensional say state
- switch unicode_eval unicode_strings
+ stringification switch unicode_eval
+ unicode_strings
:5.20 bareword_filehandles current_sub evalbytes
fc indirect multidimensional say state
- switch unicode_eval unicode_strings
+ stringification switch unicode_eval
+ unicode_strings
:5.22 bareword_filehandles current_sub evalbytes
fc indirect multidimensional say state
- switch unicode_eval unicode_strings
+ stringification switch unicode_eval
+ unicode_strings
:5.24 bareword_filehandles current_sub evalbytes
fc indirect multidimensional postderef_qq
- say state switch unicode_eval
- unicode_strings
+ say state stringification switch
+ unicode_eval unicode_strings
:5.26 bareword_filehandles current_sub evalbytes
fc indirect multidimensional postderef_qq
- say state switch unicode_eval
- unicode_strings
+ say state stringification 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
+ postderef_qq say state stringification
+ 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
+ postderef_qq say state stringification
+ 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
+ postderef_qq say state stringification
+ 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
+ postderef_qq say state stringification
+ switch unicode_eval unicode_strings
The C<:default> bundle represents the feature set that is enabled before
any C