Acme-Perl-VM

 view release on metacpan or  search on metacpan

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

    if(!defined ${$ref}){
        apvm_warn 'Use of uninitialized value';
        return 0;
    }

    return ${$ref} + 0;
}

sub SvIV{
    my($sv) = @_;
    my $ref = $sv->object_2svref;

    if(!defined ${$ref}){
        apvm_warn 'Use of uninitialized value';
        return 0;
    }

    return int(${$ref});
}

sub av_assign{
    my $av   = shift;
    my $ref  = $av->object_2svref;
    $#{$ref} = $#_;
    for(my $i = 0; $i < @_; $i++){
        tie $ref->[$i], 'Acme::Perl::VM::Alias', $_[$i]->object_2svref;
    }
    return;
}

sub av_store{
    my($av, $ix, $sv) = @_;
    tie $av->object_2svref->[$ix],
        'Acme::Perl::VM::Alias', $sv->object_2svref;
    return;
}

sub hv_store{
    my($hv, $key, $sv) = @_;
    tie $hv->object_2svref->{$key},
        'Acme::Perl::VM::Alias', $sv->object_2svref;
    return;
}

sub hv_store_ent{
    my($hv, $key, $sv) = @_;
    tie $hv->object_2svref->{ ${$key->object_2svref} },
        'Acme::Perl::VM::Alias', $sv->object_2svref;
    return;
}

sub hv_scalar{
    my($hv) = @_;
    my $sv = sv_newmortal();
    $sv->setval(scalar %{ $hv->object_2svref });
    return $sv;
}

sub defoutgv{
    no strict 'refs';
    return \*{ select() };
}

sub gv_fullname{
    my($gv, $prefix) = @_;
    $prefix = '' unless defined $prefix;

    my $stashname = $gv->STASH->NAME;
    if($stashname eq 'main'){
        $prefix .= $gv->SAFENAME;
    }
    else{
        $prefix .= join q{::}, $stashname, $gv->SAFENAME;
    }
    return $prefix;
}

# Utilities

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

    return $sv && ${$sv} && defined(${ $sv->object_2svref });
}

sub is_not_null{
    my($sv) = @_;
    return ${$sv};
}
sub is_null{
    my($sv) = @_;
    return !${$sv};
}

my %not_a_scalar;
@not_a_scalar{qw(AV HV CV IO)} = ();
sub is_scalar{
    my($sv) = @_;
    return !exists $not_a_scalar{ $sv->class };
}

sub mark_list{
    my($mark) = @_;
    return map{ ${ $_->object_2svref } } splice @PL_stack, $mark+1;
}


our %external;

sub apvm_extern{
    foreach my $arg(@_){
        if(ref $arg){
            if(ref($arg) ne 'CODE'){
                Carp::croak('Not a CODE reference for apvm_extern()');
            }
            $external{refaddr $arg} = 1;
        }
        else{
            my $stash = do{ no strict 'refs'; \%{$arg .'::'} };
            while(my $name = each %{$stash}){
                my $code_ref = do{ no strict 'refs'; *{$arg . '::' . $name}{CODE} };



( run in 1.149 second using v1.01-cache-2.11-cpan-9581c071862 )