Acme-Perl-VM
view release on metacpan or search on metacpan
lib/Acme/Perl/VM/PP.pm view on Meta::CPAN
}
else{
SAVE($PL_curpad[$PL_op->targ]);
$sv = $PL_curpad[$PL_op->targ];
$iterdata = $sv;
}
}
else{
my $gv = POP;
$sv = save_scalar($gv);
if(USE_ITHREADS){
$iterdata = $gv;
}
else{
$iterdata = $sv;
}
}
# if($PL_op->private & OPpITER_DEF){
# $for_def = TRUE;
# }
ENTER;
my $cx = PUSHBLOCK(FOREACH =>
oldsp => $#PL_stack,
gimme => GIMME_V,
resetsp => $mark,
iterdata => $iterdata,
padvar => $padvar,
for_def => $for_def,
);
if($PL_op->flags & OPf_STACKED){
my $iterary = POP;
if($iterary->class ne 'AV'){
my $sv = POP;
my $right = $iterary;
if(_range_is_numeric($sv, $right)){
$cx->iterix(SvIV($sv));
$cx->itermax(SvIV($right));
}
else{
$cx->iterlval(SvPV($sv));
$cx->iterary(SvPV($sv));
}
}
else{
$cx->iterary([$iterary->ARRAY]);
if($PL_op->private & OPpITER_REVERSED){
$cx->itermax(0);
$cx->iterix($iterary->FILL + 1);
}
else{
$cx->iterix(-1);
}
}
# XXX: original code does not have this adjustment.
# is it OK?
$cx->oldsp($#PL_stack);
}
else{
$cx->iterary(\@PL_stack);
if($PL_op->private & OPpITER_REVERSED){
$cx->itermax($mark + 1);
$cx->iterix($cx->oldsp + 1);
}
else{
$cx->iterix($mark);
}
}
return $PL_op->next;
}
sub pp_iter{
my $cx = $PL_cxstack[-1];
my $itersv = $cx->ITERVAR;
my $iterary = $cx->iterary;
if(ref($iterary) ne 'ARRAY'){ # iterate range
if(my $cur = $cx->iterlval){
not_implemented 'string range in foreach';
}
# integer increment
if($cx->iterix > $cx->itermax){
PUSH(sv_no);
return $PL_op->next;
}
$itersv->setval($cx->iterix);
$cx->iterix($cx->iterix+1);
PUSH(sv_yes);
return $PL_op->next;
}
# iteratte array
if($PL_op->private & OPpITER_REVERSED){
if($cx->iterix <= $cx->itermax){
PUSH(sv_no);
return $PL_op->next;
}
$cx->iterix($cx->iterix-1);
}
else{
my $max = $iterary == \@PL_stack ? $cx->oldsp : $#{$iterary};
if($cx->iterix >= $max){
PUSH(sv_no);
return $PL_op->next;
}
$cx->iterix($cx->iterix+1);
}
my $sv = $iterary->[$cx->iterix] || sv_no;
$itersv->setsv($sv);
PUSH(sv_yes);
( run in 0.846 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )