Remove the tokeniser hack that prevents compile-time vivification of %stash::
Nicholas Clark [Sat, 24 Oct 2009 10:36:06 +0000 (11:36 +0100)]
This was put in to ensure that defined %stash:: continued to return false after
the implementation of hashes was changed, such that stashes were always defined.
defined %stash:: is deprecated.

This reverts the tokeniser changes of adc51b978ed1b2e9d4512c9bfa80386ac917d05a,
76138434928a968a390c791aec92e5f00017d01d,
d6069db2e52f58ef65bf59f2fd453604270d2205 and part of
9bde8eb087a2c05d4c8b0394a59d28a09fe5f529, and updates the tests added with those
commits to reflect the restored (but as yet unreleased) behaviour.

I don't think that this should be merged to blead until after 5.12.0 ships,
with the enabled deprecation warnings on defined %hash, as it changes subtle
behaviour that all current released stable perls accept without warning.

t/op/stash.t
toke.c

index 1296b8b..8eb5051 100644 (file)
@@ -27,8 +27,8 @@ fresh_perl_is(
 
 {
     no warnings 'deprecated';
-    ok( !defined %oedipa::maas::, q(stashes aren't defined if not used) );
-    ok( !defined %{"oedipa::maas::"}, q(- work with hard refs too) );
+    ok( defined %oedipa::maas::, q(stashes happen to be defined if not used) );
+    ok( defined %{"oedipa::maas::"}, q(- work with hard refs too) );
 
     ok( defined %tyrone::slothrop::, q(stashes are defined if seen at compile time) );
     ok( defined %{"tyrone::slothrop::"}, q(- work with hard refs too) );
@@ -56,15 +56,15 @@ package main;
 
 # now tests in eval
 
-ok( !eval  { no warnings 'deprecated'; defined %achtfaden:: },   'works in eval{}' );
-ok( !eval q{ no warnings 'deprecated'; defined %schoenmaker:: }, 'works in eval("")' );
+ok( eval  { no warnings 'deprecated'; defined %achtfaden:: },   'works in eval{}' );
+ok( eval q{ no warnings 'deprecated'; defined %schoenmaker:: }, 'works in eval("")' );
 
 # now tests with strictures
 
 {
     use strict;
     no warnings 'deprecated';
-    ok( !defined %pig::, q(referencing a non-existent stash doesn't produce stricture errors) );
+    ok( defined %pig::, q(referencing a non-existent stash doesn't produce stricture errors) );
     ok( !exists $pig::{bodine}, q(referencing a non-existent stash element doesn't produce stricture errors) );
 }
 
diff --git a/toke.c b/toke.c
index eac007e..dbac16f 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -8052,28 +8052,10 @@ S_pending_ident(pTHX)
     pl_yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpvn(PL_tokenbuf + 1,
                                                      tokenbuf_len - 1));
     pl_yylval.opval->op_private = OPpCONST_ENTERED;
-    gv_fetchpvn_flags(
-           PL_tokenbuf + 1, tokenbuf_len - 1,
-           /* If the identifier refers to a stash, don't autovivify it.
-            * Change 24660 had the side effect of causing symbol table
-            * hashes to always be defined, even if they were freshly
-            * created and the only reference in the entire program was
-            * the single statement with the defined %foo::bar:: test.
-            * It appears that all code in the wild doing this actually
-            * wants to know whether sub-packages have been loaded, so
-            * by avoiding auto-vivifying symbol tables, we ensure that
-            * defined %foo::bar:: continues to be false, and the existing
-            * tests still give the expected answers, even though what
-            * they're actually testing has now changed subtly.
-            */
-           (*PL_tokenbuf == '%'
-            && *(d = PL_tokenbuf + tokenbuf_len - 1) == ':'
-            && d[-1] == ':'
-            ? 0
-            : PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : GV_ADD),
-           ((PL_tokenbuf[0] == '$') ? SVt_PV
-            : (PL_tokenbuf[0] == '@') ? SVt_PVAV
-            : SVt_PVHV));
+    gv_fetchpv(PL_tokenbuf+1, PL_in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
+               ((PL_tokenbuf[0] == '$') ? SVt_PV
+                : (PL_tokenbuf[0] == '@') ? SVt_PVAV
+                : SVt_PVHV));
     return WORD;
 }