In perl.git, the branch zefram/dumb_match has been updated <https://perl5.git.perl.org/perl.git/commitdiff/b1a6328e96a123f6ca713df406f01c2f4a2f2b7b?hp=9e0909b2180c408354ce24b6c742f4b79e783d11>
- Log ----------------------------------------------------------------- commit b1a6328e96a123f6ca713df406f01c2f4a2f2b7b Author: Zefram <[email protected]> Date: Wed Nov 29 22:02:58 2017 +0000 perldelta for more switch changes commit e98c3eae7b9c9628400af33f6ac77a6feebb4f3f Author: Zefram <[email protected]> Date: Wed Nov 29 21:51:11 2017 +0000 remove unused CXp_FOR_DEF and OPpITER_DEF These were used to identify foreach loops that qualify as topicalizers. That's no longer a relevant classification. commit b4904f80ff3e727173a3d8a9856827695e1af0ad Author: Zefram <[email protected]> Date: Wed Nov 29 21:44:37 2017 +0000 make "when" do implicit "next" A "when" construct, upon reaching the end of its conditionally-executed block, used to perform an implicit jump to the end of the enclosing topicalizer, defined as either a "given" block or a "foreach" operating on $_. Change it to jump to the enclosing loop of any kind (which now includes "given" blocks). commit 97b4caa610942fa2caded4f8ec03ac72089cd30e Author: Zefram <[email protected]> Date: Wed Nov 29 20:19:20 2017 +0000 remove useless "break" mechanism commit 619bbb9ab0f3cffda05f980b2ebb5bf660ad6962 Author: Zefram <[email protected]> Date: Wed Nov 29 19:27:49 2017 +0000 make loop control apply to "given" A "given" construct is now officially a one-iteration loop. commit df16d5564aa82a94953a0bccfc9917bc140ead02 Author: Zefram <[email protected]> Date: Wed Nov 29 15:22:49 2017 +0000 revise block_givwhen for sole use by "when" This context frame type doesn't need to cater for "given" any more. commit df9e1bc13efe0941735d662db5683d62b3851535 Author: Zefram <[email protected]> Date: Wed Nov 29 14:12:51 2017 +0000 use blk_loop format for CXt_GIVEN commit af8bd34d16b94bde32535062ba4e88407be233a0 Author: Zefram <[email protected]> Date: Wed Nov 29 00:13:38 2017 +0000 use LOOP struct for entergiven op This will support the upcoming change to let loop control ops apply to "given" blocks. commit 5086635a9f7a492b5a0c6228ecf7a22abbabeef6 Author: Zefram <[email protected]> Date: Tue Nov 28 20:26:07 2017 +0000 avoid gratuitous given/when in test commit 869b8c119a7436d3373e1325925a8b753d0e7805 Author: Zefram <[email protected]> Date: Tue Nov 28 20:21:36 2017 +0000 remove useless "default" mechanism ----------------------------------------------------------------------- Summary of changes: cop.h | 22 +- cpan/experimental/t/basic.t | 4 +- dump.c | 2 +- embed.fnc | 8 +- embed.h | 5 +- ext/B/B.pm | 2 +- ext/B/t/f_map.t | 4 +- ext/B/t/optree_samples.t | 20 +- ext/Opcode/Opcode.pm | 4 +- ext/Pod-Functions/Functions_pm.PL | 2 +- ext/Pod-Functions/t/Functions.t | 2 +- ext/XS-APItest/t/grok.t | 25 +- gv.c | 2 +- inline.h | 37 +- keywords.c | 72 +- keywords.h | 466 ++++++----- lib/B/Deparse-core.t | 3 +- lib/B/Deparse.pm | 19 +- lib/B/Deparse.t | 24 +- lib/B/Op_private.pm | 5 - op.c | 111 +-- op.h | 2 - opcode.h | 239 +++--- opnames.h | 353 ++++---- perly.act | 712 ++++++++-------- perly.h | 91 +-- perly.tab | 1638 ++++++++++++++++++------------------- perly.y | 4 +- pod/perldelta.pod | 12 + pod/perldiag.pod | 36 +- pod/perlfunc.pod | 48 +- pod/perlsyn.pod | 54 +- pp_ctl.c | 94 +-- pp_proto.h | 1 - proto.h | 23 +- regen/keywords.pl | 4 - regen/op_private | 1 - regen/opcodes | 3 +- scope.c | 4 +- sv.c | 5 +- t/lib/croak/pp_ctl | 8 +- t/lib/feature/switch | 64 -- t/op/coreamp.t | 12 - t/op/cproto.t | 4 +- t/op/given.t | 106 ++- t/op/state.t | 2 +- t/op/switch.t | 120 +-- t/op/taint.t | 1 - t/op/when.t | 29 +- t/porting/customized.dat | 2 +- toke.c | 7 - 51 files changed, 2120 insertions(+), 2398 deletions(-) diff --git a/cop.h b/cop.h index 5c66752859..f9ba12304b 100644 --- a/cop.h +++ b/cop.h @@ -721,10 +721,9 @@ struct block_loop { -/* given/when context */ -struct block_givwhen { +/* when context */ +struct block_when { OP *leave_op; - SV *defsv_save; /* the original $_ */ }; @@ -748,7 +747,7 @@ struct block { struct block_format blku_format; struct block_eval blku_eval; struct block_loop blku_loop; - struct block_givwhen blku_givwhen; + struct block_when blku_when; } blk_u; }; #define blk_oldsp cx_u.cx_blk.blku_oldsp @@ -764,7 +763,7 @@ struct block { #define blk_format cx_u.cx_blk.blk_u.blku_format #define blk_eval cx_u.cx_blk.blk_u.blku_eval #define blk_loop cx_u.cx_blk.blk_u.blku_loop -#define blk_givwhen cx_u.cx_blk.blk_u.blku_givwhen +#define blk_when cx_u.cx_blk.blk_u.blku_when #define CX_DEBUG(cx, action) \ DEBUG_l( \ @@ -859,14 +858,9 @@ struct context { #define CXt_NULL 0 /* currently only used for sort BLOCK */ #define CXt_WHEN 1 #define CXt_BLOCK 2 -/* When micro-optimising :-) keep GIVEN next to the LOOPs, as these 5 share a - jump table in pp_ctl.c - The first 4 don't have a 'case' in at least one switch statement in pp_ctl.c -*/ -#define CXt_GIVEN 3 - -/* be careful of the ordering of these five. Macros like CxTYPE_is_LOOP, +/* be careful of the ordering of these six. Macros like CxTYPE_is_LOOP, * CxFOREACH compare ranges */ +#define CXt_LOOP_GIVEN 3 /* given (...) { ...; } */ #define CXt_LOOP_ARY 4 /* for (@ary) { ...; } */ #define CXt_LOOP_LAZYSV 5 /* for ('a'..'z') { ...; } */ #define CXt_LOOP_LAZYIV 6 /* for (1..9) { ...; } */ @@ -892,8 +886,6 @@ struct context { /* private flags for CXt_LOOP */ -/* this is only set in conjunction with CXp_FOR_GV */ -#define CXp_FOR_DEF 0x10 /* foreach using $_ */ /* these 3 are mutually exclusive */ #define CXp_FOR_LVREF 0x20 /* foreach using \$var */ #define CXp_FOR_GV 0x40 /* foreach using package var */ @@ -905,7 +897,7 @@ struct context { #define CXp_ONCE 0x10 /* What was sbu_once in struct subst */ #define CxTYPE(c) ((c)->cx_type & CXTYPEMASK) -#define CxTYPE_is_LOOP(c) ( CxTYPE(cx) >= CXt_LOOP_ARY \ +#define CxTYPE_is_LOOP(c) ( CxTYPE(cx) >= CXt_LOOP_GIVEN \ && CxTYPE(cx) <= CXt_LOOP_PLAIN) #define CxMULTICALL(c) ((c)->cx_type & CXp_MULTICALL) #define CxREALEVAL(c) (((c)->cx_type & (CXTYPEMASK|CXp_REAL)) \ diff --git a/cpan/experimental/t/basic.t b/cpan/experimental/t/basic.t index 95f60db347..e66b2b9c83 100644 --- a/cpan/experimental/t/basic.t +++ b/cpan/experimental/t/basic.t @@ -24,9 +24,7 @@ if ($] >= 5.010001) { when (\&bar) { pass("bar matches 1"); } - default { - fail("bar matches 1"); - } + fail("bar matches 1"); } 1; END diff --git a/dump.c b/dump.c index b2f0fc5ef2..009266c877 100644 --- a/dump.c +++ b/dump.c @@ -1200,6 +1200,7 @@ S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o) case OP_ENTERITER: case OP_ENTERLOOP: + case OP_ENTERGIVEN: S_opdump_indent(aTHX_ o, level, bar, file, "REDO"); S_opdump_link(aTHX_ cLOOPo->op_redoop, file); S_opdump_indent(aTHX_ o, level, bar, file, "NEXT"); @@ -1221,7 +1222,6 @@ S_do_op_dump_bar(pTHX_ I32 level, UV bar, PerlIO *file, const OP *o) case OP_DORASSIGN: case OP_ANDASSIGN: case OP_ARGDEFELEM: - case OP_ENTERGIVEN: case OP_ENTERWHEN: case OP_ENTERTRY: case OP_ONCE: diff --git a/embed.fnc b/embed.fnc index b39a5a7229..4f685e8ee8 100644 --- a/embed.fnc +++ b/embed.fnc @@ -1166,7 +1166,7 @@ ApdR |SV* |newSV_type |const svtype type ApdR |OP* |newUNOP |I32 type|I32 flags|NULLOK OP* first ApdR |OP* |newUNOP_AUX |I32 type|I32 flags|NULLOK OP* first \ |NULLOK UNOP_AUX_item *aux -ApdR |OP* |newWHENOP |NULLOK OP* cond|NN OP* block +ApdR |OP* |newWHENOP |NN OP* cond|NN OP* block ApdR |OP* |newWHILEOP |I32 flags|I32 debuggable|NULLOK LOOP* loop \ |NULLOK OP* expr|NULLOK OP* block|NULLOK OP* cont \ |I32 has_my @@ -2140,8 +2140,6 @@ s |void |no_bareword_allowed|NN OP *o sR |OP* |no_fh_allowed|NN OP *o sR |OP* |too_few_arguments_pv|NN OP *o|NN const char* name|U32 flags s |OP* |too_many_arguments_pv|NN OP *o|NN const char* name|U32 flags -s |OP* |newGIVWHENOP |NULLOK OP* cond|NN OP *block \ - |I32 enter_opcode|I32 leave_opcode s |bool |process_special_blocks |I32 floor \ |NN const char *const fullname\ |NN GV *const gv|NN CV *const cv @@ -2229,7 +2227,6 @@ sR |OP* |dofindlabel |NN OP *o|NN const char *label|STRLEN len \ s |MAGIC *|doparseform |NN SV *sv snR |bool |num_overflow |NV value|I32 fldsize|I32 frcsize sR |I32 |dopoptoeval |I32 startingblock -sR |I32 |dopoptogivenfor|I32 startingblock sR |I32 |dopoptolabel |NN const char *label|STRLEN len|U32 flags sR |I32 |dopoptoloop |I32 startingblock sR |I32 |dopoptosub_at |NN const PERL_CONTEXT* cxstk|I32 startingblock @@ -3157,11 +3154,10 @@ AiM |void |cx_popeval |NN PERL_CONTEXT *cx AiM |void |cx_pushloop_plain|NN PERL_CONTEXT *cx AiM |void |cx_pushloop_for |NN PERL_CONTEXT *cx \ |NN void *itervarp|NULLOK SV *itersave +AiM |void |cx_pushloop_given |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv AiM |void |cx_poploop |NN PERL_CONTEXT *cx AiM |void |cx_pushwhen |NN PERL_CONTEXT *cx AiM |void |cx_popwhen |NN PERL_CONTEXT *cx -AiM |void |cx_pushgiven |NN PERL_CONTEXT *cx|NULLOK SV *orig_defsv -AiM |void |cx_popgiven |NN PERL_CONTEXT *cx #endif #ifdef USE_DTRACE diff --git a/embed.h b/embed.h index f726f97980..603a0a26d5 100644 --- a/embed.h +++ b/embed.h @@ -788,7 +788,6 @@ #define cx_popblock(a) S_cx_popblock(aTHX_ a) #define cx_popeval(a) S_cx_popeval(aTHX_ a) #define cx_popformat(a) S_cx_popformat(aTHX_ a) -#define cx_popgiven(a) S_cx_popgiven(aTHX_ a) #define cx_poploop(a) S_cx_poploop(aTHX_ a) #define cx_popsub(a) S_cx_popsub(aTHX_ a) #define cx_popsub_args(a) S_cx_popsub_args(aTHX_ a) @@ -797,8 +796,8 @@ #define cx_pushblock(a,b,c,d) S_cx_pushblock(aTHX_ a,b,c,d) #define cx_pusheval(a,b,c) S_cx_pusheval(aTHX_ a,b,c) #define cx_pushformat(a,b,c,d) S_cx_pushformat(aTHX_ a,b,c,d) -#define cx_pushgiven(a,b) S_cx_pushgiven(aTHX_ a,b) #define cx_pushloop_for(a,b,c) S_cx_pushloop_for(aTHX_ a,b,c) +#define cx_pushloop_given(a,b) S_cx_pushloop_given(aTHX_ a,b) #define cx_pushloop_plain(a) S_cx_pushloop_plain(aTHX_ a) #define cx_pushsub(a,b,c,d) S_cx_pushsub(aTHX_ a,b,c,d) #define cx_pushwhen(a) S_cx_pushwhen(aTHX_ a) @@ -1654,7 +1653,6 @@ #define modkids(a,b) S_modkids(aTHX_ a,b) #define move_proto_attr(a,b,c,d) S_move_proto_attr(aTHX_ a,b,c,d) #define my_kid(a,b,c) S_my_kid(aTHX_ a,b,c) -#define newGIVWHENOP(a,b,c,d) S_newGIVWHENOP(aTHX_ a,b,c,d) #define newMETHOP_internal(a,b,c,d) S_newMETHOP_internal(aTHX_ a,b,c,d) #define new_logop(a,b,c,d) S_new_logop(aTHX_ a,b,c,d) #define no_bareword_allowed(a) S_no_bareword_allowed(aTHX_ a) @@ -1718,7 +1716,6 @@ #define dofindlabel(a,b,c,d,e,f) S_dofindlabel(aTHX_ a,b,c,d,e,f) #define doparseform(a) S_doparseform(aTHX_ a) #define dopoptoeval(a) S_dopoptoeval(aTHX_ a) -#define dopoptogivenfor(a) S_dopoptogivenfor(aTHX_ a) #define dopoptolabel(a,b,c) S_dopoptolabel(aTHX_ a,b,c) #define dopoptoloop(a) S_dopoptoloop(aTHX_ a) #define dopoptosub_at(a,b) S_dopoptosub_at(aTHX_ a,b) diff --git a/ext/B/B.pm b/ext/B/B.pm index 6adbb02930..86d24a5328 100644 --- a/ext/B/B.pm +++ b/ext/B/B.pm @@ -20,7 +20,7 @@ sub import { # walkoptree comes from B.xs BEGIN { - $B::VERSION = '1.72'; + $B::VERSION = '1.73'; @B::EXPORT_OK = (); # Our BOOT code needs $VERSION set, and will append to @EXPORT_OK. diff --git a/ext/B/t/f_map.t b/ext/B/t/f_map.t index 221f2926e2..893d010459 100644 --- a/ext/B/t/f_map.t +++ b/ext/B/t/f_map.t @@ -165,7 +165,7 @@ checkOptree(note => q{}, # c <1> rv2av[t6] sKRM/1 # d <#> gv[*_] s # e <1> rv2gv sKRM/1 -# f <{> enteriter(next->q last->t redo->g) KS/DEF +# f <{> enteriter(next->q last->t redo->g) KS # r <0> iter s # s <|> and(other->g) K/1 # g <;> nextstate(main 475 (eval 10):1) v:{ @@ -198,7 +198,7 @@ EOT_EOT # c <1> rv2av[t3] sKRM/1 # d <$> gv(*_) s # e <1> rv2gv sKRM/1 -# f <{> enteriter(next->q last->t redo->g) KS/DEF +# f <{> enteriter(next->q last->t redo->g) KS # r <0> iter s # s <|> and(other->g) K/1 # g <;> nextstate(main 559 (eval 15):1) v:{ diff --git a/ext/B/t/optree_samples.t b/ext/B/t/optree_samples.t index 15b5799ce0..a791889618 100644 --- a/ext/B/t/optree_samples.t +++ b/ext/B/t/optree_samples.t @@ -240,7 +240,7 @@ checkOptree ( name => '-exec sub { foreach (1..10) {print "foo $_"} }', # 3 <$> const[IV 1] s # 4 <$> const[IV 10] s # 5 <#> gv[*_] s -# 6 <{> enteriter(next->c last->f redo->7) KS/DEF +# 6 <{> enteriter(next->c last->f redo->7) KS # d <0> iter s # e <|> and(other->7) K/1 # 7 <;> nextstate(main 1659 optree_samples.t:234) v:>,<,% @@ -258,7 +258,7 @@ EOT_EOT # 3 <$> const(IV 1) s # 4 <$> const(IV 10) s # 5 <$> gv(*_) s -# 6 <{> enteriter(next->c last->f redo->7) KS/DEF +# 6 <{> enteriter(next->c last->f redo->7) KS # d <0> iter s # e <|> and(other->7) K/1 # 7 <;> nextstate(main 443 optree_samples.t:182) v:>,<,% @@ -281,7 +281,7 @@ checkOptree ( name => '-basic sub { print "foo $_" foreach (1..10) }', # - <@> lineseq KP ->f # 1 <;> nextstate(main 445 optree.t:167) v:>,<,% ->2 # e <2> leaveloop K/2 ->f -# 6 <{> enteriter(next->b last->e redo->7) KS/DEF ->c +# 6 <{> enteriter(next->b last->e redo->7) KS ->c # - <0> ex-pushmark s ->2 # - <1> ex-list lK ->5 # 2 <0> pushmark s ->3 @@ -305,7 +305,7 @@ EOT_EOT # - <@> lineseq KP ->f # 1 <;> nextstate(main 446 optree_samples.t:192) v:>,<,% ->2 # e <2> leaveloop K/2 ->f -# 6 <{> enteriter(next->b last->e redo->7) KS/DEF ->c +# 6 <{> enteriter(next->b last->e redo->7) KS ->c # - <0> ex-pushmark s ->2 # - <1> ex-list lK ->5 # 2 <0> pushmark s ->3 @@ -337,7 +337,7 @@ checkOptree ( name => '-exec -e foreach (1..10) {print qq{foo $_}}', # 4 <$> const[IV 1] s # 5 <$> const[IV 10] s # 6 <#> gv[*_] s -# 7 <{> enteriter(next->d last->g redo->8) vKS/DEF +# 7 <{> enteriter(next->d last->g redo->8) vKS # e <0> iter s # f <|> and(other->8) vK/1 # 8 <;> nextstate(main 1 -e:1) v:>,<,% @@ -356,7 +356,7 @@ EOT_EOT # 4 <$> const(IV 1) s # 5 <$> const(IV 10) s # 6 <$> gv(*_) s -# 7 <{> enteriter(next->d last->g redo->8) vKS/DEF +# 7 <{> enteriter(next->d last->g redo->8) vKS # e <0> iter s # f <|> and(other->8) vK/1 # 8 <;> nextstate(main 1 -e:1) v:>,<,% @@ -380,7 +380,7 @@ checkOptree ( name => '-exec sub { print "foo $_" foreach (1..10) }', # 3 <$> const[IV 1] s # 4 <$> const[IV 10] s # 5 <#> gv[*_] s -# 6 <{> enteriter(next->b last->e redo->7) KS/DEF +# 6 <{> enteriter(next->b last->e redo->7) KS # c <0> iter s # d <|> and(other->7) K/1 # 7 <0> pushmark s @@ -397,7 +397,7 @@ EOT_EOT # 3 <$> const(IV 1) s # 4 <$> const(IV 10) s # 5 <$> gv(*_) s -# 6 <{> enteriter(next->b last->e redo->7) KS/DEF +# 6 <{> enteriter(next->b last->e redo->7) KS # c <0> iter s # d <|> and(other->7) K/1 # 7 <0> pushmark s @@ -517,7 +517,7 @@ checkOptree ( name => '%h=(); for $_(@a){$h{getkey($_)} = $_}', # a <1> rv2av[t6] sKRM/1 # b <#> gv[*_] s # c <1> rv2gv sKRM/1 -# d <{> enteriter(next->o last->r redo->e) KS/DEF +# d <{> enteriter(next->o last->r redo->e) KS # p <0> iter s # q <|> and(other->e) K/1 # e <;> nextstate(main 505 (eval 24):1) v:{ @@ -547,7 +547,7 @@ EOT_EOT # a <1> rv2av[t3] sKRM/1 # b <$> gv(*_) s # c <1> rv2gv sKRM/1 -# d <{> enteriter(next->o last->r redo->e) KS/DEF +# d <{> enteriter(next->o last->r redo->e) KS # p <0> iter s # q <|> and(other->e) K/1 # e <;> nextstate(main 505 (eval 24):1) v:{ diff --git a/ext/Opcode/Opcode.pm b/ext/Opcode/Opcode.pm index 01c495d5d6..9ebaa56c91 100644 --- a/ext/Opcode/Opcode.pm +++ b/ext/Opcode/Opcode.pm @@ -6,7 +6,7 @@ use strict; our($VERSION, @ISA, @EXPORT_OK); -$VERSION = "1.41"; +$VERSION = "1.42"; use Carp; use Exporter (); @@ -428,7 +428,7 @@ These are a hotchpotch of opcodes still waiting to be considered entergiven leavegiven enterwhen leavewhen - break continue + continue smartmatch custom -- where should this go diff --git a/ext/Pod-Functions/Functions_pm.PL b/ext/Pod-Functions/Functions_pm.PL index eb8369a470..bd0e3dad80 100644 --- a/ext/Pod-Functions/Functions_pm.PL +++ b/ext/Pod-Functions/Functions_pm.PL @@ -207,7 +207,7 @@ L<perlfunc/"Perl Functions by Category"> section. =cut -our $VERSION = '1.11'; +our $VERSION = '1.12'; require Exporter; diff --git a/ext/Pod-Functions/t/Functions.t b/ext/Pod-Functions/t/Functions.t index 2beccc1ac6..23301142ba 100644 --- a/ext/Pod-Functions/t/Functions.t +++ b/ext/Pod-Functions/t/Functions.t @@ -113,7 +113,7 @@ Functions for filehandles, files, or directories: select, stat, symlink, sysopen, umask, unlink, utime Keywords related to the control flow of your Perl program: - __FILE__, __LINE__, __PACKAGE__, __SUB__, break, caller, + __FILE__, __LINE__, __PACKAGE__, __SUB__, caller, continue, die, do, dump, eval, evalbytes, exit, goto, last, next, redo, return, sub, wantarray diff --git a/ext/XS-APItest/t/grok.t b/ext/XS-APItest/t/grok.t index 4632752b4e..b6ad905b60 100644 --- a/ext/XS-APItest/t/grok.t +++ b/ext/XS-APItest/t/grok.t @@ -4,7 +4,6 @@ use strict; use Test::More; use Config; use XS::APItest; -use feature 'switch'; no warnings 'experimental::smartmatch'; use constant TRUTH => '0 but true'; @@ -31,21 +30,15 @@ foreach my $leader ('', ' ', ' ') { { my (@UV, @NV); - given ($Config{ivsize}) { - when ($_ == 4) { - @UV = qw(429496729 4294967290 4294967294 4294967295); - @NV = qw(4294967296 4294967297 4294967300 4294967304); - } - when ($_ == 8) { - @UV = qw(1844674407370955161 18446744073709551610 - 18446744073709551614 18446744073709551615); - @NV = qw(18446744073709551616 18446744073709551617 - 18446744073709551620 18446744073709551624); - } - default { - die "Unknown IV size $_"; - } - } + if ($Config{ivsize} == 4) { + @UV = qw(429496729 4294967290 4294967294 4294967295); + @NV = qw(4294967296 4294967297 4294967300 4294967304); + } elsif ($Config{ivsize} == 8) { + @UV = qw(1844674407370955161 18446744073709551610 + 18446744073709551614 18446744073709551615); + @NV = qw(18446744073709551616 18446744073709551617 + 18446744073709551620 18446744073709551624); + } else { die "Unknown IV size $Config{ivsize}" } foreach (@UV) { my $string = $leader . $_ . $trailer; my ($flags, $value) = grok_number($string); diff --git a/gv.c b/gv.c index bc5b388588..2c9f64c181 100644 --- a/gv.c +++ b/gv.c @@ -521,7 +521,7 @@ S_maybe_add_coresub(pTHX_ HV * const stash, GV *gv, no support for funcs that do not parse like funcs */ case KEY___DATA__: case KEY___END__: case KEY_and: case KEY_AUTOLOAD: case KEY_BEGIN : case KEY_CHECK : case KEY_cmp: - case KEY_default : case KEY_DESTROY: + case KEY_DESTROY: case KEY_do : case KEY_dump : case KEY_else : case KEY_elsif : case KEY_END : case KEY_eq : case KEY_eval : case KEY_for : case KEY_foreach: case KEY_format: case KEY_ge : diff --git a/inline.h b/inline.h index 2f67af8833..30d695543e 100644 --- a/inline.h +++ b/inline.h @@ -1596,6 +1596,17 @@ S_cx_pushloop_for(pTHX_ PERL_CONTEXT *cx, void *itervarp, SV* itersave) } +PERL_STATIC_INLINE void +S_cx_pushloop_given(pTHX_ PERL_CONTEXT *cx, SV *orig_defsv) +{ + PERL_ARGS_ASSERT_CX_PUSHLOOP_GIVEN; + + cx->blk_loop.my_op = cLOOP; + cx->blk_loop.itervar_u.gv = PL_defgv; + cx->blk_loop.itersave = orig_defsv; +} + + /* pop all loop types, including plain */ PERL_STATIC_INLINE void @@ -1636,7 +1647,7 @@ S_cx_pushwhen(pTHX_ PERL_CONTEXT *cx) { PERL_ARGS_ASSERT_CX_PUSHWHEN; - cx->blk_givwhen.leave_op = cLOGOP->op_other; + cx->blk_when.leave_op = cLOGOP->op_other; } @@ -1652,30 +1663,6 @@ S_cx_popwhen(pTHX_ PERL_CONTEXT *cx) } -PERL_STATIC_INLINE void -S_cx_pushgiven(pTHX_ PERL_CONTEXT *cx, SV *orig_defsv) -{ - PERL_ARGS_ASSERT_CX_PUSHGIVEN; - - cx->blk_givwhen.leave_op = cLOGOP->op_other; - cx->blk_givwhen.defsv_save = orig_defsv; -} - - -PERL_STATIC_INLINE void -S_cx_popgiven(pTHX_ PERL_CONTEXT *cx) -{ - SV *sv; - - PERL_ARGS_ASSERT_CX_POPGIVEN; - assert(CxTYPE(cx) == CXt_GIVEN); - - sv = GvSV(PL_defgv); - GvSV(PL_defgv) = cx->blk_givwhen.defsv_save; - cx->blk_givwhen.defsv_save = NULL; - SvREFCNT_dec(sv); -} - /* ------------------ util.h ------------------------------------------- */ /* diff --git a/keywords.c b/keywords.c index 9fa30e616a..1576d4addf 100644 --- a/keywords.c +++ b/keywords.c @@ -950,7 +950,7 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) goto unknown; } - case 5: /* 39 tokens of length 5 */ + case 5: /* 38 tokens of length 5 */ switch (name[0]) { case 'B': @@ -1003,32 +1003,16 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) } case 'b': - switch (name[1]) - { - case 'l': - if (name[2] == 'e' && - name[3] == 's' && - name[4] == 's') - { /* bless */ - return -KEY_bless; - } - - goto unknown; - - case 'r': - if (name[2] == 'e' && - name[3] == 'a' && - name[4] == 'k') - { /* break */ - return (all_keywords || FEATURE_SWITCH_IS_ENABLED ? -KEY_break : 0); - } - - goto unknown; - - default: - goto unknown; + if (name[1] == 'l' && + name[2] == 'e' && + name[3] == 's' && + name[4] == 's') + { /* bless */ + return -KEY_bless; } + goto unknown; + case 'c': switch (name[1]) { @@ -1903,7 +1887,7 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) goto unknown; } - case 7: /* 30 tokens of length 7 */ + case 7: /* 29 tokens of length 7 */ switch (name[0]) { case 'D': @@ -1995,33 +1979,13 @@ Perl_keyword (pTHX_ const char *name, I32 len, bool all_keywords) goto unknown; case 'e': - if (name[2] == 'f') - { - switch (name[3]) - { - case 'a': - if (name[4] == 'u' && - name[5] == 'l' && - name[6] == 't') - { /* default */ - return (all_keywords || FEATURE_SWITCH_IS_ENABLED ? KEY_default : 0); - } - - goto unknown; - - case 'i': - if (name[4] == 'n' && - name[5] == 'e' && - name[6] == 'd') - { /* defined */ - return KEY_defined; - } - - goto unknown; - - default: - goto unknown; - } + if (name[2] == 'f' && + name[3] == 'i' && + name[4] == 'n' && + name[5] == 'e' && + name[6] == 'd') + { /* defined */ + return KEY_defined; } goto unknown; @@ -3437,5 +3401,5 @@ unknown: } /* Generated from: - * db0472e0ad4f44bd0816cad799d63b60d1bbd7e11cef40ea15bf0d00f69669f6 regen/keywords.pl + * 50664fad65e719c51bf369702163eb7ade79f997461f928cc20f1e1bcf8369b8 regen/keywords.pl * ex: set ro: */ diff --git a/keywords.h b/keywords.h index 2b1d598a4e..cd4ecb3631 100644 --- a/keywords.h +++ b/keywords.h @@ -35,240 +35,238 @@ #define KEY_bind 19 #define KEY_binmode 20 #define KEY_bless 21 -#define KEY_break 22 -#define KEY_caller 23 -#define KEY_chdir 24 -#define KEY_chmod 25 -#define KEY_chomp 26 -#define KEY_chop 27 -#define KEY_chown 28 -#define KEY_chr 29 -#define KEY_chroot 30 -#define KEY_close 31 -#define KEY_closedir 32 -#define KEY_cmp 33 -#define KEY_connect 34 -#define KEY_continue 35 -#define KEY_cos 36 -#define KEY_crypt 37 -#define KEY_dbmclose 38 -#define KEY_dbmopen 39 -#define KEY_default 40 -#define KEY_defined 41 -#define KEY_delete 42 -#define KEY_die 43 -#define KEY_do 44 -#define KEY_dump 45 -#define KEY_each 46 -#define KEY_else 47 -#define KEY_elsif 48 -#define KEY_endgrent 49 -#define KEY_endhostent 50 -#define KEY_endnetent 51 -#define KEY_endprotoent 52 -#define KEY_endpwent 53 -#define KEY_endservent 54 -#define KEY_eof 55 -#define KEY_eq 56 -#define KEY_eval 57 -#define KEY_evalbytes 58 -#define KEY_exec 59 -#define KEY_exists 60 -#define KEY_exit 61 -#define KEY_exp 62 -#define KEY_fc 63 -#define KEY_fcntl 64 -#define KEY_fileno 65 -#define KEY_flock 66 -#define KEY_for 67 -#define KEY_foreach 68 -#define KEY_fork 69 -#define KEY_format 70 -#define KEY_formline 71 -#define KEY_ge 72 -#define KEY_getc 73 -#define KEY_getgrent 74 -#define KEY_getgrgid 75 -#define KEY_getgrnam 76 -#define KEY_gethostbyaddr 77 -#define KEY_gethostbyname 78 -#define KEY_gethostent 79 -#define KEY_getlogin 80 -#define KEY_getnetbyaddr 81 -#define KEY_getnetbyname 82 -#define KEY_getnetent 83 -#define KEY_getpeername 84 -#define KEY_getpgrp 85 -#define KEY_getppid 86 -#define KEY_getpriority 87 -#define KEY_getprotobyname 88 -#define KEY_getprotobynumber 89 -#define KEY_getprotoent 90 -#define KEY_getpwent 91 -#define KEY_getpwnam 92 -#define KEY_getpwuid 93 -#define KEY_getservbyname 94 -#define KEY_getservbyport 95 -#define KEY_getservent 96 -#define KEY_getsockname 97 -#define KEY_getsockopt 98 -#define KEY_given 99 -#define KEY_glob 100 -#define KEY_gmtime 101 -#define KEY_goto 102 -#define KEY_grep 103 -#define KEY_gt 104 -#define KEY_hex 105 -#define KEY_if 106 -#define KEY_index 107 -#define KEY_int 108 -#define KEY_ioctl 109 -#define KEY_join 110 -#define KEY_keys 111 -#define KEY_kill 112 -#define KEY_last 113 -#define KEY_lc 114 -#define KEY_lcfirst 115 -#define KEY_le 116 -#define KEY_length 117 -#define KEY_link 118 -#define KEY_listen 119 -#define KEY_local 120 -#define KEY_localtime 121 -#define KEY_lock 122 -#define KEY_log 123 -#define KEY_lstat 124 -#define KEY_lt 125 -#define KEY_m 126 -#define KEY_map 127 -#define KEY_mkdir 128 -#define KEY_msgctl 129 -#define KEY_msgget 130 -#define KEY_msgrcv 131 -#define KEY_msgsnd 132 -#define KEY_my 133 -#define KEY_ne 134 -#define KEY_next 135 -#define KEY_no 136 -#define KEY_not 137 -#define KEY_oct 138 -#define KEY_open 139 -#define KEY_opendir 140 -#define KEY_or 141 -#define KEY_ord 142 -#define KEY_our 143 -#define KEY_pack 144 -#define KEY_package 145 -#define KEY_pipe 146 -#define KEY_pop 147 -#define KEY_pos 148 -#define KEY_print 149 -#define KEY_printf 150 -#define KEY_prototype 151 -#define KEY_push 152 -#define KEY_q 153 -#define KEY_qq 154 -#define KEY_qr 155 -#define KEY_quotemeta 156 -#define KEY_qw 157 -#define KEY_qx 158 -#define KEY_rand 159 -#define KEY_read 160 -#define KEY_readdir 161 -#define KEY_readline 162 -#define KEY_readlink 163 -#define KEY_readpipe 164 -#define KEY_recv 165 -#define KEY_redo 166 -#define KEY_ref 167 -#define KEY_rename 168 -#define KEY_require 169 -#define KEY_reset 170 -#define KEY_return 171 -#define KEY_reverse 172 -#define KEY_rewinddir 173 -#define KEY_rindex 174 -#define KEY_rmdir 175 -#define KEY_s 176 -#define KEY_say 177 -#define KEY_scalar 178 -#define KEY_seek 179 -#define KEY_seekdir 180 -#define KEY_select 181 -#define KEY_semctl 182 -#define KEY_semget 183 -#define KEY_semop 184 -#define KEY_send 185 -#define KEY_setgrent 186 -#define KEY_sethostent 187 -#define KEY_setnetent 188 -#define KEY_setpgrp 189 -#define KEY_setpriority 190 -#define KEY_setprotoent 191 -#define KEY_setpwent 192 -#define KEY_setservent 193 -#define KEY_setsockopt 194 -#define KEY_shift 195 -#define KEY_shmctl 196 -#define KEY_shmget 197 -#define KEY_shmread 198 -#define KEY_shmwrite 199 -#define KEY_shutdown 200 -#define KEY_sin 201 -#define KEY_sleep 202 -#define KEY_socket 203 -#define KEY_socketpair 204 -#define KEY_sort 205 -#define KEY_splice 206 -#define KEY_split 207 -#define KEY_sprintf 208 -#define KEY_sqrt 209 -#define KEY_srand 210 -#define KEY_stat 211 -#define KEY_state 212 -#define KEY_study 213 -#define KEY_sub 214 -#define KEY_substr 215 -#define KEY_symlink 216 -#define KEY_syscall 217 -#define KEY_sysopen 218 -#define KEY_sysread 219 -#define KEY_sysseek 220 -#define KEY_system 221 -#define KEY_syswrite 222 -#define KEY_tell 223 -#define KEY_telldir 224 -#define KEY_tie 225 -#define KEY_tied 226 -#define KEY_time 227 -#define KEY_times 228 -#define KEY_tr 229 -#define KEY_truncate 230 -#define KEY_uc 231 -#define KEY_ucfirst 232 -#define KEY_umask 233 -#define KEY_undef 234 -#define KEY_unless 235 -#define KEY_unlink 236 -#define KEY_unpack 237 -#define KEY_unshift 238 -#define KEY_untie 239 -#define KEY_until 240 -#define KEY_use 241 -#define KEY_utime 242 -#define KEY_values 243 -#define KEY_vec 244 -#define KEY_wait 245 -#define KEY_waitpid 246 -#define KEY_wantarray 247 -#define KEY_warn 248 -#define KEY_when 249 -#define KEY_while 250 -#define KEY_write 251 -#define KEY_x 252 -#define KEY_xor 253 -#define KEY_y 254 +#define KEY_caller 22 +#define KEY_chdir 23 +#define KEY_chmod 24 +#define KEY_chomp 25 +#define KEY_chop 26 +#define KEY_chown 27 +#define KEY_chr 28 +#define KEY_chroot 29 +#define KEY_close 30 +#define KEY_closedir 31 +#define KEY_cmp 32 +#define KEY_connect 33 +#define KEY_continue 34 +#define KEY_cos 35 +#define KEY_crypt 36 +#define KEY_dbmclose 37 +#define KEY_dbmopen 38 +#define KEY_defined 39 +#define KEY_delete 40 +#define KEY_die 41 +#define KEY_do 42 +#define KEY_dump 43 +#define KEY_each 44 +#define KEY_else 45 +#define KEY_elsif 46 +#define KEY_endgrent 47 +#define KEY_endhostent 48 +#define KEY_endnetent 49 +#define KEY_endprotoent 50 +#define KEY_endpwent 51 +#define KEY_endservent 52 +#define KEY_eof 53 +#define KEY_eq 54 +#define KEY_eval 55 +#define KEY_evalbytes 56 +#define KEY_exec 57 +#define KEY_exists 58 +#define KEY_exit 59 +#define KEY_exp 60 +#define KEY_fc 61 +#define KEY_fcntl 62 +#define KEY_fileno 63 +#define KEY_flock 64 +#define KEY_for 65 +#define KEY_foreach 66 +#define KEY_fork 67 +#define KEY_format 68 +#define KEY_formline 69 +#define KEY_ge 70 +#define KEY_getc 71 +#define KEY_getgrent 72 +#define KEY_getgrgid 73 +#define KEY_getgrnam 74 +#define KEY_gethostbyaddr 75 +#define KEY_gethostbyname 76 +#define KEY_gethostent 77 +#define KEY_getlogin 78 +#define KEY_getnetbyaddr 79 +#define KEY_getnetbyname 80 +#define KEY_getnetent 81 +#define KEY_getpeername 82 +#define KEY_getpgrp 83 +#define KEY_getppid 84 +#define KEY_getpriority 85 +#define KEY_getprotobyname 86 +#define KEY_getprotobynumber 87 +#define KEY_getprotoent 88 +#define KEY_getpwent 89 +#define KEY_getpwnam 90 +#define KEY_getpwuid 91 +#define KEY_getservbyname 92 +#define KEY_getservbyport 93 +#define KEY_getservent 94 +#define KEY_getsockname 95 +#define KEY_getsockopt 96 +#define KEY_given 97 +#define KEY_glob 98 +#define KEY_gmtime 99 +#define KEY_goto 100 +#define KEY_grep 101 +#define KEY_gt 102 +#define KEY_hex 103 +#define KEY_if 104 +#define KEY_index 105 +#define KEY_int 106 +#define KEY_ioctl 107 +#define KEY_join 108 +#define KEY_keys 109 +#define KEY_kill 110 +#define KEY_last 111 +#define KEY_lc 112 +#define KEY_lcfirst 113 +#define KEY_le 114 +#define KEY_length 115 +#define KEY_link 116 +#define KEY_listen 117 +#define KEY_local 118 +#define KEY_localtime 119 +#define KEY_lock 120 +#define KEY_log 121 +#define KEY_lstat 122 +#define KEY_lt 123 +#define KEY_m 124 +#define KEY_map 125 +#define KEY_mkdir 126 +#define KEY_msgctl 127 +#define KEY_msgget 128 +#define KEY_msgrcv 129 +#define KEY_msgsnd 130 +#define KEY_my 131 +#define KEY_ne 132 +#define KEY_next 133 +#define KEY_no 134 +#define KEY_not 135 +#define KEY_oct 136 +#define KEY_open 137 +#define KEY_opendir 138 +#define KEY_or 139 +#define KEY_ord 140 +#define KEY_our 141 +#define KEY_pack 142 +#define KEY_package 143 +#define KEY_pipe 144 +#define KEY_pop 145 +#define KEY_pos 146 +#define KEY_print 147 +#define KEY_printf 148 +#define KEY_prototype 149 +#define KEY_push 150 +#define KEY_q 151 +#define KEY_qq 152 +#define KEY_qr 153 +#define KEY_quotemeta 154 +#define KEY_qw 155 +#define KEY_qx 156 +#define KEY_rand 157 +#define KEY_read 158 +#define KEY_readdir 159 +#define KEY_readline 160 +#define KEY_readlink 161 +#define KEY_readpipe 162 +#define KEY_recv 163 +#define KEY_redo 164 +#define KEY_ref 165 +#define KEY_rename 166 +#define KEY_require 167 +#define KEY_reset 168 +#define KEY_return 169 +#define KEY_reverse 170 +#define KEY_rewinddir 171 +#define KEY_rindex 172 +#define KEY_rmdir 173 +#define KEY_s 174 +#define KEY_say 175 +#define KEY_scalar 176 +#define KEY_seek 177 +#define KEY_seekdir 178 +#define KEY_select 179 +#define KEY_semctl 180 +#define KEY_semget 181 +#define KEY_semop 182 +#define KEY_send 183 +#define KEY_setgrent 184 +#define KEY_sethostent 185 +#define KEY_setnetent 186 +#define KEY_setpgrp 187 +#define KEY_setpriority 188 +#define KEY_setprotoent 189 +#define KEY_setpwent 190 +#define KEY_setservent 191 +#define KEY_setsockopt 192 +#define KEY_shift 193 +#define KEY_shmctl 194 +#define KEY_shmget 195 +#define KEY_shmread 196 +#define KEY_shmwrite 197 +#define KEY_shutdown 198 +#define KEY_sin 199 +#define KEY_sleep 200 +#define KEY_socket 201 +#define KEY_socketpair 202 +#define KEY_sort 203 +#define KEY_splice 204 +#define KEY_split 205 +#define KEY_sprintf 206 +#define KEY_sqrt 207 +#define KEY_srand 208 +#define KEY_stat 209 +#define KEY_state 210 +#define KEY_study 211 +#define KEY_sub 212 +#define KEY_substr 213 +#define KEY_symlink 214 +#define KEY_syscall 215 +#define KEY_sysopen 216 +#define KEY_sysread 217 +#define KEY_sysseek 218 +#define KEY_system 219 +#define KEY_syswrite 220 +#define KEY_tell 221 +#define KEY_telldir 222 +#define KEY_tie 223 +#define KEY_tied 224 +#define KEY_time 225 +#define KEY_times 226 +#define KEY_tr 227 +#define KEY_truncate 228 +#define KEY_uc 229 +#define KEY_ucfirst 230 +#define KEY_umask 231 +#define KEY_undef 232 +#define KEY_unless 233 +#define KEY_unlink 234 +#define KEY_unpack 235 +#define KEY_unshift 236 +#define KEY_untie 237 +#define KEY_until 238 +#define KEY_use 239 +#define KEY_utime 240 +#define KEY_values 241 +#define KEY_vec 242 +#define KEY_wait 243 +#define KEY_waitpid 244 +#define KEY_wantarray 245 +#define KEY_warn 246 +#define KEY_when 247 +#define KEY_while 248 +#define KEY_write 249 +#define KEY_x 250 +#define KEY_xor 251 +#define KEY_y 252 /* Generated from: - * db0472e0ad4f44bd0816cad799d63b60d1bbd7e11cef40ea15bf0d00f69669f6 regen/keywords.pl + * 50664fad65e719c51bf369702163eb7ade79f997461f928cc20f1e1bcf8369b8 regen/keywords.pl * ex: set ro: */ diff --git a/lib/B/Deparse-core.t b/lib/B/Deparse-core.t index 2ed797ac7e..01a9b18305 100644 --- a/lib/B/Deparse-core.t +++ b/lib/B/Deparse-core.t @@ -36,7 +36,7 @@ BEGIN { use strict; use Test::More; -plan tests => 3886; +plan tests => 3874; use feature (sprintf(":%vd", $^V)); # to avoid relying on the feature # logic to add CORE:: @@ -461,7 +461,6 @@ atan2 2 p bind 2 p binmode 12 p bless 1 p -break 0 - caller 0 - chdir 01 - chmod @ p1 diff --git a/lib/B/Deparse.pm b/lib/B/Deparse.pm index c2dc591f5d..02ea4bc5f0 100644 --- a/lib/B/Deparse.pm +++ b/lib/B/Deparse.pm @@ -2247,8 +2247,6 @@ my %feature_keywords = ( say => 'say', given => 'switch', when => 'switch', - default => 'switch', - break => 'switch', evalbytes=>'evalbytes', __SUB__ => '__SUB__', fc => 'fc', @@ -2540,26 +2538,17 @@ sub pp_ggrgid { unop(@_, "getgrgid") } sub pp_lock { unop(@_, "lock") } sub pp_continue { unop(@_, "continue"); } -sub pp_break { unop(@_, "break"); } sub givwhen { my $self = shift; my($op, $cx, $givwhen) = @_; my $enterop = $op->first; - my ($head, $block); - if ($enterop->flags & OPf_SPECIAL) { - $head = $self->keyword("default"); - $block = $self->deparse($enterop->first, 0); - } - else { - my $cond = $enterop->first; - my $cond_str = $self->deparse($cond, 1); - $head = "$givwhen ($cond_str)"; - $block = $self->deparse($cond->sibling, 0); - } + my $cond = $enterop->first; + my $cond_str = $self->deparse($cond, 1); + my $block = $self->deparse($cond->sibling, 0); - return "$head {\n". + return "$givwhen ($cond_str) {\n". "\t$block\n". "\b}\cK"; } diff --git a/lib/B/Deparse.t b/lib/B/Deparse.t index f8da6460e8..156898652c 100644 --- a/lib/B/Deparse.t +++ b/lib/B/Deparse.t @@ -1029,7 +1029,7 @@ my $d = \[]; given ('foo') { when ('bar') { continue; } when ($_ ~~ 'quux') { continue; } - default { 0; } + 0; } #### # conditions in elsifs (regression in change #33710 which fixed bug #37302) @@ -1514,9 +1514,7 @@ CORE::given ($x) { CORE::when (3) { continue; } - CORE::default { - CORE::break; - } + next; } CORE::evalbytes ''; () = CORE::__SUB__; @@ -1532,9 +1530,7 @@ CORE::given ($x) { CORE::when (3) { continue; } - CORE::default { - CORE::break; - } + next; } CORE::evalbytes ''; () = CORE::__SUB__; @@ -1545,9 +1541,7 @@ CORE::given ($x) { CORE::when (3) { continue; } - CORE::default { - CORE::break; - } + next; } CORE::evalbytes ''; () = CORE::__SUB__; @@ -1563,9 +1557,7 @@ CORE::given ($x) { CORE::when (3) { continue; } - CORE::default { - CORE::break; - } + next; } CORE::evalbytes ''; () = CORE::__SUB__; @@ -1578,9 +1570,7 @@ CORE::given ($x) { CORE::when (3) { continue; } - CORE::default { - CORE::break; - } + next; } CORE::evalbytes ''; () = CORE::__SUB__; @@ -1588,7 +1578,6 @@ CORE::evalbytes ''; # SKIP ?$] < 5.017004 && "lexical subs not implemented on this Perl version" # lexical subroutines and keywords of the same name # CONTEXT use feature 'lexical_subs', 'switch'; no warnings 'experimental'; -my sub default; my sub else; my sub elsif; my sub for; @@ -1611,7 +1600,6 @@ my sub until; my sub use; my sub when; my sub while; -CORE::default { die; } CORE::if ($1) { die; } CORE::if ($1) { die; } CORE::elsif ($1) { die; } diff --git a/lib/B/Op_private.pm b/lib/B/Op_private.pm index 37497af523..5df382a329 100644 --- a/lib/B/Op_private.pm +++ b/lib/B/Op_private.pm @@ -304,8 +304,6 @@ $bits{dorassign}{0} = $bf[0]; $bits{dump}{0} = $bf[0]; $bits{each}{0} = $bf[0]; @{$bits{entereval}}{5,4,3,2,1,0} = ('OPpEVAL_RE_REPARSING', 'OPpEVAL_COPHH', 'OPpEVAL_BYTES', 'OPpEVAL_UNICODE', 'OPpEVAL_HAS_HH', $bf[0]); -$bits{entergiven}{0} = $bf[0]; -$bits{enteriter}{3} = 'OPpITER_DEF'; @{$bits{entersub}}{5,4,0} = ($bf[8], $bf[8], 'OPpENTERSUB_INARGS'); $bits{entertry}{0} = $bf[0]; $bits{enterwhen}{0} = $bf[0]; @@ -634,7 +632,6 @@ our %defines = ( OPpHINT_STRICT_REFS => 2, OPpHUSH_VMSISH => 32, OPpINDEX_BOOLNEG => 64, - OPpITER_DEF => 8, OPpITER_REVERSED => 2, OPpKVSLICE => 32, OPpLIST_GUESSED => 64, @@ -739,7 +736,6 @@ our %labels = ( OPpHINT_STRICT_REFS => 'STRICT', OPpHUSH_VMSISH => 'HUSH', OPpINDEX_BOOLNEG => 'NEG', - OPpITER_DEF => 'DEF', OPpITER_REVERSED => 'REVERSED', OPpKVSLICE => 'KVSLICE', OPpLIST_GUESSED => 'GUESSED', @@ -816,7 +812,6 @@ our %ops_using = ( OPpHINT_STRICT_REFS => [qw(entersub multideref rv2av rv2cv rv2gv rv2hv rv2sv)], OPpHUSH_VMSISH => [qw(dbstate nextstate)], OPpINDEX_BOOLNEG => [qw(index rindex)], - OPpITER_DEF => [qw(enteriter)], OPpITER_REVERSED => [qw(enteriter iter)], OPpKVSLICE => [qw(delete)], OPpLIST_GUESSED => [qw(list)], diff --git a/op.c b/op.c index 6318f42e69..5879928cb1 100644 --- a/op.c +++ b/op.c @@ -8604,16 +8604,6 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont) if (sv->op_type == OP_RV2SV) { /* symbol table variable */ iterpflags = sv->op_private & OPpOUR_INTRO; /* for our $x () */ OpTYPE_set(sv, OP_RV2GV); - - /* The op_type check is needed to prevent a possible segfault - * if the loop variable is undeclared and 'strict vars' is in - * effect. This is illegal but is nonetheless parsed, so we - * may reach this point with an OP_CONST where we're expecting - * an OP_GV. - */ - if (cUNOPx(sv)->op_first->op_type == OP_GV - && cGVOPx_gv(cUNOPx(sv)->op_first) == PL_defgv) - iterpflags |= OPpITER_DEF; } else if (sv->op_type == OP_PADSV) { /* private variable */ iterpflags = sv->op_private & OPpLVAL_INTRO; /* for my $x () */ @@ -8627,17 +8617,9 @@ Perl_newFOROP(pTHX_ I32 flags, OP *sv, OP *expr, OP *block, OP *cont) NOOP; else Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]); - if (padoff) { - PADNAME * const pn = PAD_COMPNAME(padoff); - const char * const name = PadnamePV(pn); - - if (PadnameLEN(pn) == 2 && name[0] == '$' && name[1] == '_') - iterpflags |= OPpITER_DEF; - } } else { sv = newGVOP(OP_GV, 0, PL_defgv); - iterpflags |= OPpITER_DEF; } if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) { @@ -8766,56 +8748,6 @@ Perl_newLOOPEX(pTHX_ I32 type, OP *label) return o; } -/* These construct the optree fragments representing given() - and when() blocks. - - entergiven and enterwhen are LOGOPs; the op_other pointer - points up to the associated leave op. We need this so we - can put it in the context and make break/continue work. - (Also, of course, pp_enterwhen will jump straight to - op_other if the match fails.) - */ - -STATIC OP * -S_newGIVWHENOP(pTHX_ OP *cond, OP *block, I32 enter_opcode, I32 leave_opcode) -{ - dVAR; - LOGOP *enterop; - OP *o; - - PERL_ARGS_ASSERT_NEWGIVWHENOP; - - enterop = alloc_LOGOP(enter_opcode, block, NULL); - enterop->op_targ = 0; - enterop->op_private = 0; - - o = newUNOP(leave_opcode, 0, (OP *) enterop); - - if (cond) { - /* prepend cond if we have one */ - op_sibling_splice((OP*)enterop, NULL, 0, scalar(cond)); - - o->op_next = LINKLIST(cond); - cond->op_next = (OP *) enterop; - } - else { - /* This is a default {} block */ - enterop->op_flags |= OPf_SPECIAL; - o ->op_flags |= OPf_SPECIAL; - - o->op_next = (OP *) enterop; - } - - CHECKOP(enter_opcode, enterop); /* Currently does nothing, since - entergiven and enterwhen both - use ck_null() */ - - enterop->op_next = LINKLIST(block); - block->op_next = enterop->op_other = o; - - return o; -} - /* =for apidoc Am|OP *|newGIVENOP|OP *cond|OP *block|PADOFFSET defsv_off @@ -8831,11 +8763,28 @@ C<defsv_off> must be zero (it used to identity the pad slot of lexical $_). OP * Perl_newGIVENOP(pTHX_ OP *cond, OP *block, PADOFFSET defsv_off) { + OP *enterop, *leaveop; PERL_ARGS_ASSERT_NEWGIVENOP; PERL_UNUSED_ARG(defsv_off); - assert(!defsv_off); - return newGIVWHENOP(cond, block, OP_ENTERGIVEN, OP_LEAVEGIVEN); + + NewOpSz(1101, enterop, sizeof(LOOP)); + OpTYPE_set(enterop, OP_ENTERGIVEN); + cLOOPx(enterop)->op_first = scalar(cond); + cLOOPx(enterop)->op_last = block; + OpMORESIB_set(cond, block); + OpLASTSIB_set(block, enterop); + enterop->op_flags = OPf_KIDS; + + leaveop = newUNOP(OP_LEAVEGIVEN, 0, enterop); + leaveop->op_next = LINKLIST(cond); + cond->op_next = enterop; + enterop = CHECKOP(OP_ENTERGIVEN, enterop); + cLOOPx(enterop)->op_redoop = enterop->op_next = LINKLIST(block); + cLOOPx(enterop)->op_lastop = cLOOPx(enterop)->op_nextop = block->op_next = + leaveop; + + return leaveop; } /* @@ -8844,8 +8793,7 @@ Perl_newGIVENOP(pTHX_ OP *cond, OP *block, PADOFFSET defsv_off) Constructs, checks, and returns an op tree expressing a C<when> block. C<cond> supplies the test expression, and C<block> supplies the block that will be executed if the test evaluates to true; they are consumed -by this function and become part of the constructed op tree. C<cond> -may be null to generate a C<default> block. +by this function and become part of the constructed op tree. =cut */ @@ -8853,8 +8801,24 @@ may be null to generate a C<default> block. OP * Perl_newWHENOP(pTHX_ OP *cond, OP *block) { + OP *enterop, *leaveop; PERL_ARGS_ASSERT_NEWWHENOP; - return newGIVWHENOP(cond, block, OP_ENTERWHEN, OP_LEAVEWHEN); + + NewOpSz(1101, enterop, sizeof(LOGOP)); + OpTYPE_set(enterop, OP_ENTERWHEN); + cLOGOPx(enterop)->op_first = scalar(cond); + OpMORESIB_set(cond, block); + OpLASTSIB_set(block, enterop); + enterop->op_flags = OPf_KIDS; + + leaveop = newUNOP(OP_LEAVEWHEN, 0, enterop); + leaveop->op_next = LINKLIST(cond); + cond->op_next = enterop; + enterop = CHECKOP(OP_ENTERWHEN, enterop); + enterop->op_next = LINKLIST(block); + cLOGOPx(enterop)->op_other = block->op_next = leaveop; + + return leaveop; } /* must not conflict with SVf_UTF8 */ @@ -15539,6 +15503,7 @@ Perl_rpeep(pTHX_ OP *o) case OP_ENTERLOOP: case OP_ENTERITER: + case OP_ENTERGIVEN: while (cLOOP->op_redoop->op_type == OP_NULL) cLOOP->op_redoop = cLOOP->op_redoop->op_next; while (cLOOP->op_nextop->op_type == OP_NULL) diff --git a/op.h b/op.h index b954dcbd64..efafcf3057 100644 --- a/op.h +++ b/op.h @@ -129,8 +129,6 @@ Deprecated. Use C<GIMME_V> instead. /* On OP_DBSTATE, indicates breakpoint * (runtime property) */ /* On OP_REQUIRE, was seen as CORE::require */ - /* On OP_(ENTER|LEAVE)WHEN, there's - no condition */ /* On OP_ANONHASH and OP_ANONLIST, create a reference to the new anon hash or array */ /* On OP_HELEM, OP_MULTIDEREF and OP_HSLICE, diff --git a/opcode.h b/opcode.h index e1ba36bb52..08ce46fb35 100644 --- a/opcode.h +++ b/opcode.h @@ -367,7 +367,6 @@ EXTCONST char* const PL_op_name[] = { "leavegiven", "enterwhen", "leavewhen", - "break", "continue", "open", "close", @@ -772,7 +771,6 @@ EXTCONST char* const PL_op_desc[] = { "leave given block", "when()", "leave when block", - "break", "continue", "open", "close", @@ -1189,7 +1187,6 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */ Perl_pp_leavegiven, Perl_pp_enterwhen, Perl_pp_leavewhen, - Perl_pp_break, Perl_pp_continue, Perl_pp_open, Perl_pp_close, @@ -1602,7 +1599,6 @@ EXT Perl_check_t PL_check[] /* or perlvars.h */ Perl_ck_null, /* leavegiven */ Perl_ck_null, /* enterwhen */ Perl_ck_null, /* leavewhen */ - Perl_ck_null, /* break */ Perl_ck_null, /* continue */ Perl_ck_open, /* open */ Perl_ck_fun, /* close */ @@ -2007,11 +2003,10 @@ EXTCONST U32 PL_opargs[] = { 0x00000e40, /* method_super */ 0x00000e40, /* method_redir */ 0x00000e40, /* method_redir_super */ - 0x00000340, /* entergiven */ + 0x00000940, /* entergiven */ 0x00000100, /* leavegiven */ 0x00000340, /* enterwhen */ 0x00000100, /* leavewhen */ - 0x00000000, /* break */ 0x00000000, /* continue */ 0x0029640d, /* open */ 0x0000eb04, /* close */ @@ -2234,7 +2229,6 @@ END_EXTERN_C #define OPpENTERSUB_AMPER 0x08 #define OPpEVAL_BYTES 0x08 #define OPpFT_STACKING 0x08 -#define OPpITER_DEF 0x08 #define OPpLVREF_ITER 0x08 #define OPpMAYBE_LVSUB 0x08 #define OPpMULTICONCAT_STRINGIFY 0x08 @@ -2350,7 +2344,6 @@ EXTCONST char PL_op_private_labels[] = { 'C','V','\0', 'C','V','2','G','V','\0', 'D','B','G','\0', - 'D','E','F','\0', 'D','E','L','\0', 'D','E','L','E','T','E','\0', 'D','E','R','E','F','1','\0', @@ -2440,14 +2433,14 @@ EXTCONST char PL_op_private_labels[] = { EXTCONST I16 PL_op_private_bitfields[] = { 0, 8, -1, 0, 8, -1, - 0, 576, -1, + 0, 572, -1, 0, 8, -1, 0, 8, -1, - 0, 583, -1, - 0, 572, -1, - 1, -1, 0, 540, 1, 40, 2, 290, -1, - 4, -1, 1, 171, 2, 178, 3, 185, -1, - 4, -1, 0, 540, 1, 40, 2, 290, 3, 117, -1, + 0, 579, -1, + 0, 568, -1, + 1, -1, 0, 536, 1, 40, 2, 286, -1, + 4, -1, 1, 167, 2, 174, 3, 181, -1, + 4, -1, 0, 536, 1, 40, 2, 286, 3, 117, -1, }; @@ -2658,28 +2651,27 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 178, /* leave */ -1, /* scope */ 180, /* enteriter */ - 184, /* iter */ + 183, /* iter */ -1, /* enterloop */ - 185, /* leaveloop */ + 184, /* leaveloop */ -1, /* return */ - 187, /* last */ - 187, /* next */ - 187, /* redo */ - 187, /* dump */ - 187, /* goto */ + 186, /* last */ + 186, /* next */ + 186, /* redo */ + 186, /* dump */ + 186, /* goto */ 52, /* exit */ 0, /* method */ 0, /* method_named */ 0, /* method_super */ 0, /* method_redir */ 0, /* method_redir_super */ - 0, /* entergiven */ + -1, /* entergiven */ 0, /* leavegiven */ 0, /* enterwhen */ 0, /* leavewhen */ - -1, /* break */ -1, /* continue */ - 189, /* open */ + 188, /* open */ 52, /* close */ 52, /* pipe_op */ 52, /* fileno */ @@ -2725,33 +2717,33 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 0, /* getpeername */ 0, /* lstat */ 0, /* stat */ - 194, /* ftrread */ - 194, /* ftrwrite */ - 194, /* ftrexec */ - 194, /* fteread */ - 194, /* ftewrite */ - 194, /* fteexec */ - 199, /* ftis */ - 199, /* ftsize */ - 199, /* ftmtime */ - 199, /* ftatime */ - 199, /* ftctime */ - 199, /* ftrowned */ - 199, /* fteowned */ - 199, /* ftzero */ - 199, /* ftsock */ - 199, /* ftchr */ - 199, /* ftblk */ - 199, /* ftfile */ - 199, /* ftdir */ - 199, /* ftpipe */ - 199, /* ftsuid */ - 199, /* ftsgid */ - 199, /* ftsvtx */ - 199, /* ftlink */ - 199, /* fttty */ - 199, /* fttext */ - 199, /* ftbinary */ + 193, /* ftrread */ + 193, /* ftrwrite */ + 193, /* ftrexec */ + 193, /* fteread */ + 193, /* ftewrite */ + 193, /* fteexec */ + 198, /* ftis */ + 198, /* ftsize */ + 198, /* ftmtime */ + 198, /* ftatime */ + 198, /* ftctime */ + 198, /* ftrowned */ + 198, /* fteowned */ + 198, /* ftzero */ + 198, /* ftsock */ + 198, /* ftchr */ + 198, /* ftblk */ + 198, /* ftfile */ + 198, /* ftdir */ + 198, /* ftpipe */ + 198, /* ftsuid */ + 198, /* ftsgid */ + 198, /* ftsvtx */ + 198, /* ftlink */ + 198, /* fttty */ + 198, /* fttext */ + 198, /* ftbinary */ 90, /* chdir */ 90, /* chown */ 75, /* chroot */ @@ -2771,17 +2763,17 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 0, /* rewinddir */ 0, /* closedir */ -1, /* fork */ - 203, /* wait */ + 202, /* wait */ 90, /* waitpid */ 90, /* system */ 90, /* exec */ 90, /* kill */ - 203, /* getppid */ + 202, /* getppid */ 90, /* getpgrp */ 90, /* setpgrp */ 90, /* getpriority */ 90, /* setpriority */ - 203, /* time */ + 202, /* time */ -1, /* tms */ 0, /* localtime */ 52, /* gmtime */ @@ -2801,7 +2793,7 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 0, /* require */ 0, /* dofile */ -1, /* hintseval */ - 204, /* entereval */ + 203, /* entereval */ 171, /* leaveeval */ 0, /* entertry */ -1, /* leavetry */ @@ -2840,18 +2832,18 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { 0, /* lock */ 0, /* once */ -1, /* custom */ - 210, /* coreargs */ - 214, /* avhvswitch */ + 209, /* coreargs */ + 213, /* avhvswitch */ 3, /* runcv */ 0, /* fc */ -1, /* padcv */ -1, /* introcv */ -1, /* clonecv */ - 216, /* padrange */ - 218, /* refassign */ - 224, /* lvref */ - 230, /* lvrefslice */ - 231, /* lvavref */ + 215, /* padrange */ + 217, /* refassign */ + 223, /* lvref */ + 229, /* lvrefslice */ + 230, /* lvavref */ 0, /* anonconst */ }; @@ -2871,75 +2863,75 @@ EXTCONST I16 PL_op_private_bitdef_ix[] = { */ EXTCONST U16 PL_op_private_bitdefs[] = { - 0x0003, /* scalar, prototype, refgen, srefgen, readline, regcmaybe, regcreset, regcomp, substcont, chop, schop, defined, undef, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, complement, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, pop, shift, grepstart, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, argcheck, argdefelem, method, method_named, method_super, method_redir, method_redir_super, entergiven, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst */ - 0x2f3c, 0x4039, /* pushmark */ + 0x0003, /* scalar, prototype, refgen, srefgen, readline, regcmaybe, regcreset, regcomp, substcont, chop, schop, defined, undef, study, preinc, i_preinc, predec, i_predec, postinc, i_postinc, postdec, i_postdec, negate, i_negate, not, complement, ucfirst, lcfirst, uc, lc, quotemeta, aeach, avalues, each, pop, shift, grepstart, mapstart, mapwhile, range, and, or, dor, andassign, orassign, dorassign, argcheck, argdefelem, method, method_named, method_super, method_redir, method_redir_super, leavegiven, enterwhen, leavewhen, untie, tied, dbmclose, getsockname, getpeername, lstat, stat, readlink, readdir, telldir, rewinddir, closedir, localtime, alarm, require, dofile, entertry, ghbyname, gnbyname, gpbyname, shostent, snetent, sprotoent, sservent, gpwnam, gpwuid, ggrnam, ggrgid, lock, once, fc, anonconst */ + 0x2ebc, 0x3fb9, /* pushmark */ 0x00bd, /* wantarray, runcv */ - 0x0578, 0x19b0, 0x40ec, 0x3ba8, 0x3385, /* const */ - 0x2f3c, 0x34d9, /* gvsv */ - 0x1815, /* gv */ + 0x0578, 0x1930, 0x406c, 0x3b28, 0x3305, /* const */ + 0x2ebc, 0x3459, /* gvsv */ + 0x1795, /* gv */ 0x0067, /* gelem, lt, i_lt, gt, i_gt, le, i_le, ge, i_ge, eq, i_eq, ne, i_ne, ncmp, i_ncmp, slt, sgt, sle, sge, seq, sne, scmp, bit_and, bit_xor, bit_or, sbit_and, sbit_xor, sbit_or, smartmatch, lslice, xor */ - 0x2f3c, 0x4038, 0x03d7, /* padsv */ - 0x2f3c, 0x4038, 0x06f4, 0x302c, 0x3d29, /* padav */ - 0x2f3c, 0x4038, 0x06f4, 0x0790, 0x302c, 0x3d28, 0x2aa1, /* padhv */ - 0x2f3c, 0x1b98, 0x03d6, 0x302c, 0x32a8, 0x40e4, 0x0003, /* rv2gv */ - 0x2f3c, 0x34d8, 0x03d6, 0x40e4, 0x0003, /* rv2sv */ - 0x302c, 0x0003, /* av2arylen, akeys, values, keys */ - 0x321c, 0x0fd8, 0x0d34, 0x028c, 0x43e8, 0x40e4, 0x0003, /* rv2cv */ + 0x2ebc, 0x3fb8, 0x03d7, /* padsv */ + 0x2ebc, 0x3fb8, 0x06f4, 0x2fac, 0x3ca9, /* padav */ + 0x2ebc, 0x3fb8, 0x06f4, 0x0790, 0x2fac, 0x3ca8, 0x2a21, /* padhv */ + 0x2ebc, 0x1b18, 0x03d6, 0x2fac, 0x3228, 0x4064, 0x0003, /* rv2gv */ + 0x2ebc, 0x3458, 0x03d6, 0x4064, 0x0003, /* rv2sv */ + 0x2fac, 0x0003, /* av2arylen, akeys, values, keys */ + 0x319c, 0x0fd8, 0x0d34, 0x028c, 0x4368, 0x4064, 0x0003, /* rv2cv */ 0x06f4, 0x0790, 0x0003, /* ref */ 0x018f, /* bless, glob, sprintf, formline, unpack, pack, join, anonlist, anonhash, splice, warn, die, reset, exit, close, pipe_op, fileno, umask, binmode, tie, dbmopen, sselect, select, getc, read, enterwrite, sysopen, sysseek, sysread, syswrite, eof, tell, seek, truncate, fcntl, ioctl, send, recv, socket, sockpair, bind, connect, listen, accept, shutdown, gsockopt, ssockopt, open_dir, seekdir, gmtime, shmget, shmctl, shmread, shmwrite, msgget, msgctl, msgsnd, msgrcv, semop, semget, semctl, ghbyaddr, gnbyaddr, gpbynumber, gsbyname, gsbyport, syscall */ - 0x36bc, 0x35d8, 0x27f4, 0x2730, 0x0003, /* backtick */ + 0x363c, 0x3558, 0x2774, 0x26b0, 0x0003, /* backtick */ 0x06f5, /* subst */ - 0x10dc, 0x2118, 0x0914, 0x3e6c, 0x24a8, 0x01e4, 0x0141, /* trans, transr */ + 0x105c, 0x2098, 0x0914, 0x3dec, 0x2428, 0x01e4, 0x0141, /* trans, transr */ 0x0f1c, 0x0618, 0x0067, /* sassign */ - 0x0bd8, 0x0ad4, 0x09d0, 0x302c, 0x06e8, 0x0067, /* aassign */ - 0x4490, 0x0003, /* chomp, schomp, ncomplement, scomplement, sin, cos, exp, log, sqrt, int, hex, oct, abs, ord, chr, chroot, rmdir */ - 0x06f4, 0x302c, 0x0003, /* pos */ - 0x4490, 0x0067, /* pow, multiply, i_multiply, divide, i_divide, modulo, i_modulo, add, i_add, subtract, i_subtract, concat, left_shift, right_shift, nbit_and, nbit_xor, nbit_or */ - 0x1498, 0x0067, /* repeat */ - 0x2f3c, 0x0358, 0x1b94, 0x4490, 0x41cc, 0x0003, /* multiconcat */ - 0x4490, 0x018f, /* stringify, atan2, rand, srand, crypt, push, unshift, flock, chdir, chown, unlink, chmod, utime, rename, link, symlink, mkdir, waitpid, system, exec, kill, getpgrp, setpgrp, getpriority, setpriority, sleep */ - 0x06f4, 0x4490, 0x0003, /* length */ - 0x3910, 0x302c, 0x012b, /* substr */ - 0x302c, 0x0067, /* vec */ - 0x3198, 0x06f4, 0x4490, 0x018f, /* index, rindex */ - 0x2f3c, 0x34d8, 0x06f4, 0x302c, 0x3d28, 0x40e4, 0x0003, /* rv2av */ + 0x0bd8, 0x0ad4, 0x09d0, 0x2fac, 0x06e8, 0x0067, /* aassign */ + 0x4410, 0x0003, /* chomp, schomp, ncomplement, scomplement, sin, cos, exp, log, sqrt, int, hex, oct, abs, ord, chr, chroot, rmdir */ + 0x06f4, 0x2fac, 0x0003, /* pos */ + 0x4410, 0x0067, /* pow, multiply, i_multiply, divide, i_divide, modulo, i_modulo, add, i_add, subtract, i_subtract, concat, left_shift, right_shift, nbit_and, nbit_xor, nbit_or */ + 0x1418, 0x0067, /* repeat */ + 0x2ebc, 0x0358, 0x1b14, 0x4410, 0x414c, 0x0003, /* multiconcat */ + 0x4410, 0x018f, /* stringify, atan2, rand, srand, crypt, push, unshift, flock, chdir, chown, unlink, chmod, utime, rename, link, symlink, mkdir, waitpid, system, exec, kill, getpgrp, setpgrp, getpriority, setpriority, sleep */ + 0x06f4, 0x4410, 0x0003, /* length */ + 0x3890, 0x2fac, 0x012b, /* substr */ + 0x2fac, 0x0067, /* vec */ + 0x3118, 0x06f4, 0x4410, 0x018f, /* index, rindex */ + 0x2ebc, 0x3458, 0x06f4, 0x2fac, 0x3ca8, 0x4064, 0x0003, /* rv2av */ 0x025f, /* aelemfast, aelemfast_lex */ - 0x2f3c, 0x2e38, 0x03d6, 0x302c, 0x0067, /* aelem, helem */ - 0x2f3c, 0x302c, 0x3d29, /* aslice, hslice */ - 0x302d, /* kvaslice, kvhslice */ - 0x2f3c, 0x3c78, 0x2b54, 0x0003, /* delete */ - 0x4318, 0x0003, /* exists */ - 0x2f3c, 0x34d8, 0x06f4, 0x0790, 0x302c, 0x3d28, 0x40e4, 0x2aa1, /* rv2hv */ - 0x2f3c, 0x2e38, 0x1154, 0x1ab0, 0x302c, 0x40e4, 0x0003, /* multideref */ - 0x2f3c, 0x34d8, 0x0430, 0x2c4c, 0x2569, /* split */ - 0x2f3c, 0x21d9, /* list */ - 0x45fc, 0x3f58, 0x13f0, 0x288c, 0x3a08, 0x2984, 0x3441, /* sort */ - 0x288c, 0x0003, /* reverse */ + 0x2ebc, 0x2db8, 0x03d6, 0x2fac, 0x0067, /* aelem, helem */ + 0x2ebc, 0x2fac, 0x3ca9, /* aslice, hslice */ + 0x2fad, /* kvaslice, kvhslice */ + 0x2ebc, 0x3bf8, 0x2ad4, 0x0003, /* delete */ + 0x4298, 0x0003, /* exists */ + 0x2ebc, 0x3458, 0x06f4, 0x0790, 0x2fac, 0x3ca8, 0x4064, 0x2a21, /* rv2hv */ + 0x2ebc, 0x2db8, 0x10d4, 0x1a30, 0x2fac, 0x4064, 0x0003, /* multideref */ + 0x2ebc, 0x3458, 0x0430, 0x2bcc, 0x24e9, /* split */ + 0x2ebc, 0x2159, /* list */ + 0x457c, 0x3ed8, 0x1370, 0x280c, 0x3988, 0x2904, 0x33c1, /* sort */ + 0x280c, 0x0003, /* reverse */ 0x06f4, 0x0003, /* grepwhile */ - 0x2cd8, 0x0003, /* flip, flop */ - 0x2f3c, 0x0003, /* cond_expr */ - 0x2f3c, 0x0fd8, 0x03d6, 0x028c, 0x43e8, 0x40e4, 0x2641, /* entersub */ - 0x3778, 0x0003, /* leavesub, leavesublv, leavewrite, leaveeval */ + 0x2c58, 0x0003, /* flip, flop */ + 0x2ebc, 0x0003, /* cond_expr */ + 0x2ebc, 0x0fd8, 0x03d6, 0x028c, 0x4368, 0x4064, 0x25c1, /* entersub */ + 0x36f8, 0x0003, /* leavesub, leavesublv, leavewrite, leaveeval */ 0x02aa, 0x0003, /* argelem */ 0x00bc, 0x018f, /* caller */ - 0x23b5, /* nextstate, dbstate */ - 0x2ddc, 0x3779, /* leave */ - 0x2f3c, 0x34d8, 0x104c, 0x3a85, /* enteriter */ - 0x3a85, /* iter */ - 0x2ddc, 0x0067, /* leaveloop */ - 0x471c, 0x0003, /* last, next, redo, dump, goto */ - 0x36bc, 0x35d8, 0x27f4, 0x2730, 0x018f, /* open */ - 0x1d50, 0x1fac, 0x1e68, 0x1c24, 0x0003, /* ftrread, ftrwrite, ftrexec, fteread, ftewrite, fteexec */ - 0x1d50, 0x1fac, 0x1e68, 0x0003, /* ftis, ftsize, ftmtime, ftatime, ftctime, ftrowned, fteowned, ftzero, ftsock, ftchr, ftblk, ftfile, ftdir, ftpipe, ftsuid, ftsgid, ftsvtx, ftlink, fttty, fttext, ftbinary */ - 0x4491, /* wait, getppid, time */ - 0x3814, 0x0df0, 0x084c, 0x4568, 0x22c4, 0x0003, /* entereval */ - 0x30fc, 0x0018, 0x1304, 0x1221, /* coreargs */ - 0x302c, 0x00c7, /* avhvswitch */ - 0x2f3c, 0x01fb, /* padrange */ - 0x2f3c, 0x4038, 0x04f6, 0x2a0c, 0x1908, 0x0067, /* refassign */ - 0x2f3c, 0x4038, 0x04f6, 0x2a0c, 0x1908, 0x0003, /* lvref */ - 0x2f3d, /* lvrefslice */ - 0x2f3c, 0x4038, 0x0003, /* lvavref */ + 0x2335, /* nextstate, dbstate */ + 0x2d5c, 0x36f9, /* leave */ + 0x2ebc, 0x3458, 0x3a05, /* enteriter */ + 0x3a05, /* iter */ + 0x2d5c, 0x0067, /* leaveloop */ + 0x469c, 0x0003, /* last, next, redo, dump, goto */ + 0x363c, 0x3558, 0x2774, 0x26b0, 0x018f, /* open */ + 0x1cd0, 0x1f2c, 0x1de8, 0x1ba4, 0x0003, /* ftrread, ftrwrite, ftrexec, fteread, ftewrite, fteexec */ + 0x1cd0, 0x1f2c, 0x1de8, 0x0003, /* ftis, ftsize, ftmtime, ftatime, ftctime, ftrowned, fteowned, ftzero, ftsock, ftchr, ftblk, ftfile, ftdir, ftpipe, ftsuid, ftsgid, ftsvtx, ftlink, fttty, fttext, ftbinary */ + 0x4411, /* wait, getppid, time */ + 0x3794, 0x0df0, 0x084c, 0x44e8, 0x2244, 0x0003, /* entereval */ + 0x307c, 0x0018, 0x1284, 0x11a1, /* coreargs */ + 0x2fac, 0x00c7, /* avhvswitch */ + 0x2ebc, 0x01fb, /* padrange */ + 0x2ebc, 0x3fb8, 0x04f6, 0x298c, 0x1888, 0x0067, /* refassign */ + 0x2ebc, 0x3fb8, 0x04f6, 0x298c, 0x1888, 0x0003, /* lvref */ + 0x2ebd, /* lvrefslice */ + 0x2ebc, 0x3fb8, 0x0003, /* lvavref */ }; @@ -3149,7 +3141,7 @@ EXTCONST U8 PL_op_private_valid[] = { /* ENTER */ (0), /* LEAVE */ (OPpREFCOUNTED|OPpLVALUE), /* SCOPE */ (0), - /* ENTERITER */ (OPpITER_REVERSED|OPpITER_DEF|OPpOUR_INTRO|OPpLVAL_INTRO), + /* ENTERITER */ (OPpITER_REVERSED|OPpOUR_INTRO|OPpLVAL_INTRO), /* ITER */ (OPpITER_REVERSED), /* ENTERLOOP */ (0), /* LEAVELOOP */ (OPpARG2_MASK|OPpLVALUE), @@ -3165,11 +3157,10 @@ EXTCONST U8 PL_op_private_valid[] = { /* METHOD_SUPER */ (OPpARG1_MASK), /* METHOD_REDIR */ (OPpARG1_MASK), /* METHOD_REDIR_SUPER */ (OPpARG1_MASK), - /* ENTERGIVEN */ (OPpARG1_MASK), + /* ENTERGIVEN */ (0), /* LEAVEGIVEN */ (OPpARG1_MASK), /* ENTERWHEN */ (OPpARG1_MASK), /* LEAVEWHEN */ (OPpARG1_MASK), - /* BREAK */ (0), /* CONTINUE */ (0), /* OPEN */ (OPpARG4_MASK|OPpOPEN_IN_RAW|OPpOPEN_IN_CRLF|OPpOPEN_OUT_RAW|OPpOPEN_OUT_CRLF), /* CLOSE */ (OPpARG4_MASK), diff --git a/opnames.h b/opnames.h index d87ba88f01..ed4155eeeb 100644 --- a/opnames.h +++ b/opnames.h @@ -235,186 +235,185 @@ typedef enum opcode { OP_LEAVEGIVEN = 218, OP_ENTERWHEN = 219, OP_LEAVEWHEN = 220, - OP_BREAK = 221, - OP_CONTINUE = 222, - OP_OPEN = 223, - OP_CLOSE = 224, - OP_PIPE_OP = 225, - OP_FILENO = 226, - OP_UMASK = 227, - OP_BINMODE = 228, - OP_TIE = 229, - OP_UNTIE = 230, - OP_TIED = 231, - OP_DBMOPEN = 232, - OP_DBMCLOSE = 233, - OP_SSELECT = 234, - OP_SELECT = 235, - OP_GETC = 236, - OP_READ = 237, - OP_ENTERWRITE = 238, - OP_LEAVEWRITE = 239, - OP_PRTF = 240, - OP_PRINT = 241, - OP_SAY = 242, ... 5625 lines suppressed ... -- Perl5 Master Repository
