Acme-Perl-VM
view release on metacpan or search on metacpan
lib/Acme/Perl/VM/PP.pm view on Meta::CPAN
for(my $mark = $newsp + 1; $mark <= $#PL_stack; $mark++){
$PL_stack[$mark] = sv_mortalcopy($PL_stack[$mark]);
}
}
LEAVE;
return $PL_op->next;
}
sub pp_enterloop{
ENTER;
SAVETMPS;
ENTER;
PUSHBLOCK(LOOP =>
oldsp => $#PL_stack,
gimme => GIMME_V,
resetsp => $#PL_stack,
);
return $PL_op->next;
}
sub pp_leaveloop{
my $cx = POPBLOCK;
my $mark = $cx->oldsp;
my $gimme = $cx->gimme;
my $newsp = $cx->resetsp;
if($gimme == G_SCALAR){
if($mark < $#PL_stack){
$PL_stack[++$newsp] = sv_mortalcopy($PL_stack[-1]);
}
else{
$PL_stack[++$newsp] = sv_undef;
}
}
elsif($gimme == G_ARRAY){
while($mark < $#PL_stack){
$PL_stack[++$newsp] = sv_mortalcopy($PL_stack[++$mark]);
}
}
$#PL_stack = $newsp;
POPLOOP($cx);
LEAVE;
LEAVE;
return $PL_op->next;
}
sub _range_is_numeric{
my($min, $max) = @_;
return looks_like_number(${$min->object_2svref})
&& looks_like_number(${$max->object_2svref});
}
sub pp_enteriter{
my $mark = POPMARK;
my $sv;
my $iterdata;
my $padvar = FALSE;
my $for_def = FALSE;
ENTER;
SAVETMPS;
if($PL_op->targ){
if(USE_ITHREADS){
#SAVEPADSV($PL_op->targ);
$padvar = TRUE;
$iterdata = $PL_op->targ;
}
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));
}
( run in 2.100 seconds using v1.01-cache-2.11-cpan-524268b4103 )