Acme-Perl-VM

 view release on metacpan or  search on metacpan

lib/Acme/Perl/VM.pm  view on Meta::CPAN

    # not yet implemented completely
    # cf.
    # die_where() in pp_ctl.c
    # vdie()      in util.c
    die  APVM_DEBUG ? longmess(@_) : mess(@_);
}
sub croak{
    die  APVM_DEBUG ? longmess(@_) : mess(@_);
}

sub PUSHMARK(){
    push @PL_markstack, $#PL_stack;
    return;
}
sub POPMARK(){
    return pop @PL_markstack;
}
sub TOPMARK(){
    return $PL_markstack[-1];
}

sub PUSH{
    push @PL_stack, @_;
    return;
}
sub mPUSH{
    PUSH(map{ sv_2mortal($_) } @_);
    return;
}
sub POP(){
    return pop @PL_stack;
}
sub TOP(){
    return $PL_stack[-1];
}
sub SET{
    my($sv) = @_;
    $PL_stack[-1] = $sv;
    return;
}
sub SETval{
    my($val) = @_;
    $PL_stack[-1] = PAD_SV( $PL_op->targ )->setval($val);

lib/Acme/Perl/VM.pm  view on Meta::CPAN

sub block_gimme{
    my $cxix = dopoptosub($#PL_cxstack);

    if($cxix < 0){
        return G_VOID;
    }

    return $PL_cxstack[$cxix]->gimme;
}

sub GIMME_V(){ # op.h
    my $gimme = OP_GIMME($PL_op, -1);
    return $gimme != -1 ? $gimme : block_gimme();
}

sub LVRET(){ # cf. is_lvalue_sub() in pp_ctl.h
    if($PL_op->flags & OPpMAYBE_LVSUB){
        my $cxix = dopoptosub($#PL_cxstack);

        if($PL_cxstack[$cxix]->lval && $PL_cxstack[$cxix]->cv->CvFLAGS & CVf_LVALUE){
            not_implemented 'lvalue';
            return TRUE;
        }
    }
    return FALSE;
}

lib/Acme/Perl/VM.pm  view on Meta::CPAN

        FREETMPS;
        LEAVE;
    }

    $PL_op     = $old_op;
    $PL_curcop = $old_cop;

    return $retval;
}

sub run_block(&@){
    my($code, @args) = @_;

    if(APVM_DUMMY){
        return $code->(@args);
    }
    local $SIG{__DIE__}  = \&Carp::confess if APVM_DEBUG;
    local $SIG{__WARN__} = \&Carp::cluck   if APVM_DEBUG;

    ENTER;
    SAVETMPS;

lib/Acme/Perl/VM/B.pm  view on Meta::CPAN

        Carp::confess($obj->special_name, ' is not a normal SV object');
    };
}

sub setval{
    my($obj) = @_;

    Acme::Perl::VM::apvm_die('Modification of read-only value (%s) attempted', $obj->special_name);
}

sub STASH(){ undef }

sub POK(){ 0 }
sub ROK(){ 0 }

sub special_name{
    my($obj) = @_;
    return $B::specialsv_name[$$obj] || sprintf 'SPECIAL(0x%x)', $$obj;
}

package
    B::SV;

# for sv_setsv()

lib/Acme/Perl/VM/B.pm  view on Meta::CPAN


    ${$sv->object_2svref} = undef;
    return;
}

sub toCV{
    my($sv) = @_;
    Carp::croak(sprintf 'Cannot convert %s to a CV', B::class($sv));
}

sub STASH(){ undef }

package
    B::PVMG;

sub ROK{
    my($obj) = @_;
    my $dummy = ${ $obj->object_2svref }; # invoke mg_get()
    return $obj->SUPER::ROK;
}

package
    B::CV;

sub toCV{ $_[0] }

sub clear{
    Carp::croak('Cannot clear a CV');
}

sub ROK(){ 0 }

package
    B::GV;


sub toCV{ $_[0]->CV }

sub clear{
    Carp::croak('Cannot clear a CV');
}

sub ROK(){ 0 }

package
    B::AV;

sub setsv{
    my($sv) = @_;
    Carp::croak('Cannot call setsv() for ' . B::class($sv));
}

sub clear{

lib/Acme/Perl/VM/B.pm  view on Meta::CPAN


    @{$sv->object_2svref} = ();
    return;
}

unless(__PACKAGE__->can('OFF')){
    # some versions of B::Debug requires this
    constant->import(OFF => 0);
}

sub ROK(){ 0 }

package
    B::HV;

sub ROK(){ 0 }

*setsv = \&B::AV::setsv;

sub clear{
    my($sv) = @_;

    %{$sv->object_2svref} = ();
    return;
}

lib/Acme/Perl/VM/Context.pm  view on Meta::CPAN

sub BUILD{
    my($cx) = @_;

    $cx->label($PL_curcop->label);
    $cx->myop($PL_op);
    $cx->nextop($PL_op->nextop);

    return;
}

sub ITERVAR(){ undef }

no Mouse;
__PACKAGE__->meta->make_immutable();

package Acme::Perl::VM::Context::FOREACH;
use Mouse;
use Acme::Perl::VM::B qw(USE_ITHREADS);
extends 'Acme::Perl::VM::Context::LOOP';

has padvar => (

lib/Acme/Perl/VM/Context.pm  view on Meta::CPAN

);
has iterix => (
    is  => 'rw',
    isa => 'Int',
);
has itermax => (
    is  => 'rw',
    isa => 'Int',
);

sub type(){ 'LOOP' } # this is a LOOP

sub BUILD{
    my($cx) = @_;
    $cx->ITERDATA_SET($cx->iterdata);
    return;
}


sub ITERVAR{
    my($cx) = @_;

lib/Acme/Perl/VM/Scope.pm  view on Meta::CPAN


package Acme::Perl::VM::Scope::Scalar;
use Mouse;
extends 'Acme::Perl::VM::Scope::Localizer';

sub _save{
    my($self) = @_;
    return Acme::Perl::VM::gv_fullname($self->gv, '$');
}

sub save_type(){ 'SCALAR' }
sub create_ref{
    my($self) = @_;

    if($self->gv->SV->MAGICAL){
        bless $self, 'Acme::Perl::VM::Scope::Scalar::Magical';
        $self->old_value(${$self->old_ref});
        return \local(${*{ $self->gv->object_2svref }}); # to copy MAGIC
    }
    else{
        return \my $scalar;

lib/Acme/Perl/VM/Scope.pm  view on Meta::CPAN


package Acme::Perl::VM::Scope::Array;
use Mouse;
extends 'Acme::Perl::VM::Scope::Localizer';

sub _save{
    my($self) = @_;
    return Acme::Perl::VM::gv_fullname($self->gv, '@');
}

sub save_type(){ 'ARRAY' }
sub create_ref{
    my($self) = @_;
    return \local @{*{ $self->gv->object_2svref }};
}
sub sv{
    my($self) = @_;
    return $self->gv->AV;
}

no Mouse;

lib/Acme/Perl/VM/Scope.pm  view on Meta::CPAN


package Acme::Perl::VM::Scope::Hash;
use Mouse;
extends 'Acme::Perl::VM::Scope::Localizer';

sub _save{
    my($self) = @_;
    return Acme::Perl::VM::gv_fullname($self->gv, '%');
}

sub save_type(){ 'HASH' }
sub create_ref{
    my($self) = @_;
    return \local %{*{ $self->gv->object_2svref }};
}
sub sv{
    my($self) = @_;
    return $self->gv->HV;
}

no Mouse;



( run in 0.801 second using v1.01-cache-2.11-cpan-65fba6d93b7 )