Acme-Perl-VM
view release on metacpan or search on metacpan
lib/Acme/Perl/VM/PP.pm view on Meta::CPAN
package Acme::Perl::VM::PP;
use strict;
use warnings;
use Acme::Perl::VM qw(:perl_h);
use Acme::Perl::VM::B;
#NOTE:
# perl APVM
#
# dSP (nothing)
# SP $#PL_stack
# *SP $PL_stack[-1]
# dMARK my $mark = POPMARK
# MARK $mark
# *MARK $PL_stack[$mark]
# dORIGMARK my $origmark = $mark
# ORIGMARK $origmark
# SPAGAIN (nothing)
# PUTBACK (nothing)
sub pp_nextstate{
$PL_curcop = $PL_op;
$#PL_stack = $PL_cxstack[-1]->oldsp;
FREETMPS;
return $PL_op->next;
}
sub pp_pushmark{
PUSHMARK;
return $PL_op->next;
}
sub pp_const{
my $sv = is_not_null($PL_op->sv) ? $PL_op->sv : PAD_SV($PL_op->targ);
PUSH($sv);
return $PL_op->next;
}
sub pp_gv{
PUSH( GVOP_gv($PL_op) );
return $PL_op->next;
}
sub pp_gvsv{
if($PL_op->private & OPpLVAL_INTRO){
PUSH(save_scalar(GVOP_gv($PL_op)));
}
else{
PUSH(GVOP_gv($PL_op)->SV);
}
return $PL_op->next;
}
sub _do_kv{
my $hv = POP;
if($hv->class ne 'HV'){
apvm_die 'panic: do_kv';
}
my $gimme = GIMME_V;
if($gimme == G_VOID){
return $PL_op->next;
}
elsif($gimme == G_SCALAR){
if($PL_op->flags & OPf_MOD || LVRET){
not_implemented $PL_op->name . ' for lvalue';
}
my $num = keys %{ $hv->object_2svref };
mPUSH( svref_2object(\$num) );
return $PL_op->next;
}
( run in 0.580 second using v1.01-cache-2.11-cpan-13bb782fe5a )