Counter-example:
perl -le"goto loop; $x=0; if( $x ){ for(;;){ loop: print 'hi' } }"
Update: Ah, you did say foreach
>perl -le"goto loop; $x=0; if( $x ){ for(1){ loop: print 'hi' } }" Can't "goto" into the middle of a foreach loop at -e line 1.
Mind you, it's not really related to stack frames. Any required frame is created by goto. Since it's an explicit check for OP_ENTERITER, it appears more of a question of there not being any sensible way of initialising the iterator of the iterated loop into which you are jumping.
/* push wanted frames */ if (*enterops && enterops[1]) { OP * const oldop = PL_op; ix = enterops[1]->op_type == OP_ENTER && in_block ? 2 : 1; for (; enterops[ix]; ix++) { PL_op = enterops[ix]; /* Eventually we may want to stack the needed arguments * for each op. For now, we punt on the hard ones. */ if (PL_op->op_type == OP_ENTERITER) DIE(aTHX_ "Can't \"goto\" into the middle of a foreach loo +p"); CALL_FPTR(PL_op->op_ppaddr)(aTHX); } PL_op = oldop; }
Update: Improved phrasing of last paragraph and added supporting code.
In reply to Re^5: cross scope gotos?
by ikegami
in thread cross scope gotos?
by LanX
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |