develooper Front page | perl.perl5.porters | Postings from April 2010

@a = split: my @a vs our @a

From:
Eric Brine
Date:
April 8, 2010 10:51
Subject:
@a = split: my @a vs our @a
Message ID:
o2nf86994701004081051xd682eaf0ze13f5be3a09c1b68@mail.gmail.com
Hi,

Is there any reason this optimisation is limited to package variables?

$ perl -MO=Concise,-exec -e'our @a = split //, $buf;'
1  <0> enter
2  <;> nextstate(main 1 -e:1) v:{
3  </> pushre(/""/ => @a) s/64
4  <#> gvsv[*buf] s
5  <$> const[IV 0] s
6  <@> split[t5] vK
7  <@> leave[1 ref] vKP/REFC
-e syntax OK

$ perl -MO=Concise,-exec -e'my @a = split //, $buf;'
1  <0> enter
2  <;> nextstate(main 1 -e:1) v:{
3  <0> pushmark s
4  </> pushre(/""/) s/64
5  <#> gvsv[*buf] s
6  <$> const[IV 0] s
7  <@> split[t3] lK
8  <0> pushmark s
9  <0> padav[@a:1,2] lRM*/LVINTRO
a  <2> aassign[t4] vKS
b  <@> leave[1 ref] vKP/REFC
-e syntax OK

$ perl -MO=Concise,-exec -e'my @a; @a = split //, $buf;'
1  <0> enter
2  <;> nextstate(main 1 -e:1) v:{
3  <0> padav[@a:1,2] vM/LVINTRO
4  <;> nextstate(main 2 -e:1) v:{
5  <0> pushmark s
6  </> pushre(/""/) s/64
7  <#> gvsv[*buf] s
8  <$> const[IV 0] s
9  <@> split[t3] lK
a  <0> pushmark s
b  <0> padav[@a:1,2] lRM*
c  <2> aassign[t4] vKS
d  <@> leave[1 ref] vKP/REFC
-e syntax OK

The optimisation occurs in this "if" in op.c:

4373         if (right && right->op_type == OP_SPLIT && !PL_madskills) {
4374             OP* tmpop = ((LISTOP*)right)->op_first;
4375             if (tmpop && (tmpop->op_type == OP_PUSHRE)) {
4376                 PMOP * const pm = (PMOP*)tmpop;
4377                 if (left->op_type == OP_RV2AV &&
4378                     !(left->op_private & OPpLVAL_INTRO) &&
4379                     !(o->op_private & OPpASSIGN_COMMON) )
4380                 {



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About