summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2007-09-06 09:18:41 +0000
committerNicholas Clark <nick@ccl4.org>2007-09-06 09:18:41 +0000
commitc5917253cfa0ec36b4c868a1582baaaab99eb0d0 (patch)
tree617731b471122ffb901814d1a2cec921fd95e1a9 /pp.c
parent5f0a87760bb9130fbd7579236f81db0729b54496 (diff)
downloadperl-c5917253cfa0ec36b4c868a1582baaaab99eb0d0.tar.gz
Make state $zok = slosh(); behave as the Perl 6 design with an implicit
START block. First time through, call slosh() and assign to $zok. Subsequently neither call slosh() nor assign to $zok. Adds a new op ONCE to control the conditonal call and assign. No change to list context, so state ($zok) = slosh() and (state $zok) = ... etc will still repeatedly evaluate and assign. [Can't fix that before 5.10] Use as an RVALUE is as Larry's design - my $boff = state $zok = ...; will evaluate, assign and return first time, and subsequently act as if it were written my $boff = $zok; FIXME - state $zok = ...; won't deparse - I believe op->op_last isn't being correctly set on the sassign, but I don't know how to fix this. This change may be backed out before 5.10. p4raw-id: //depot/perl@31798
Diffstat (limited to 'pp.c')
-rw-r--r--pp.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/pp.c b/pp.c
index dbfc95c567..bc84f6086d 100644
--- a/pp.c
+++ b/pp.c
@@ -4932,6 +4932,19 @@ PP(pp_split)
RETURN;
}
+PP(pp_once)
+{
+ dSP;
+ SV *const sv = PAD_SVl(PL_op->op_targ);
+
+ if (SvPADSTALE(sv)) {
+ /* First time. */
+ SvPADSTALE_off(sv);
+ RETURNOP(cLOGOP->op_other);
+ }
+ RETURNOP(cLOGOP->op_next);
+}
+
PP(pp_lock)
{
dVAR;