From: Stephen McCamant Date: Tue, 21 Jul 1998 16:12:25 +0000 (-0500) Subject: applied patch, add new message to perldeta X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0ebe003824736fdbe73467ef153a40f1d6fc4b92;p=p5sagit%2Fp5-mst-13.2.git applied patch, add new message to perldeta Message-Id: <13749.910.83378.949909@alias-2.pr.mcs.net> Subject: [PATCH] Band-aid patch for local($avhv->{a}) p4raw-id: //depot/perl@1619 --- diff --git a/pod/perldelta.pod b/pod/perldelta.pod index d3fbae5..6213685 100644 --- a/pod/perldelta.pod +++ b/pod/perldelta.pod @@ -492,6 +492,13 @@ only with arrays that have a hash reference at index 0. (F) The "goto subroutine" call can't be used to jump out of an eval "string". (You can use it to jump out of an eval {BLOCK}, but you probably don't want to.) +=item Can't localize pseudo-hash element + +(F) You said something like C{'key'}>, where $ar is +a reference to a pseudo-hash. That hasn't been implemented yet, but +you can get a similar effect by localizing the corresponding array +element directly -- C[$ar-E[0]{'key'}]>. + =item Can't use %%! because Errno.pm is not available (F) The first time the %! hash is used, perl automatically loads the diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 43226e0..5fdeb70 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -697,6 +697,13 @@ lexical variable using "my". This is not allowed. If you want to localize a package variable of the same name, qualify it with the package name. +=item Can't localize pseudo-hash element + +(F) You said something like C{'key'}>, where $ar is +a reference to a pseudo-hash. That hasn't been implemented yet, but +you can get a similar effect by localizing the corresponding array +element directly -- C[$ar-E[0]{'key'}]>. + =item Can't locate auto/%s.al in @INC (F) A function (or method) was called in a package which allows autoload, diff --git a/pp.c b/pp.c index 702806d..5e32613 100644 --- a/pp.c +++ b/pp.c @@ -2414,6 +2414,9 @@ PP(pp_hslice) register I32 lval = PL_op->op_flags & OPf_MOD; I32 realhv = (SvTYPE(hv) == SVt_PVHV); + if (!realhv && PL_op->op_private & OPpLVAL_INTRO) + DIE("Can't localize pseudo-hash element"); + if (realhv || SvTYPE(hv) == SVt_PVAV) { while (++MARK <= SP) { SV *keysv = *MARK; diff --git a/pp_hot.c b/pp_hot.c index 823da44..dd4f82b 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -1337,6 +1337,8 @@ PP(pp_helem) svp = he ? &HeVAL(he) : 0; } else if (SvTYPE(hv) == SVt_PVAV) { + if (PL_op->op_private & OPpLVAL_INTRO) + DIE("Can't localize pseudo-hash element"); svp = avhv_fetch_ent((AV*)hv, keysv, lval && !defer, 0); } else {