The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

use strict;
use Test::More tests => 24;

use Acme::Perl::VM;
use Acme::Perl::VM qw(:perl_h);

my $x = run_block{
    my @a;
};
is $x, 0;

$x = run_block{
    my @a = (10);
};
is $x, 1;

$x = run_block{
    my @a = (10, 20);
};
is $x, 2;

my @ary = run_block{
    my @a;
};
is_deeply \@ary, [];

@ary = run_block{
    my @a = (10, 20);
};
is_deeply \@ary, [10, 20];

$x = run_block{
    my @a = (10, 20, 30);
    return $a[1];
};
is $x, 20;

$x = run_block{
    my @a = (10);
    $a[0] += 10;
    return $a[0];
};
is $x, 20;

$x = run_block{
    my @a = (10);
    my $i = 0;
    return $a[$i];
};
is $x, 10;

$x = run_block{
    my @a = (10);
    my $i = 0;
    $a[$i] += 10;
    return $a[$i];
};
is $x, 20;

our @gary = qw(foo bar);

$x = run_block{
    @gary;
};
is $x, 2;

@ary = run_block{
    @gary;
};
is_deeply \@ary, \@gary;

$x = run_block{
    $gary[0] .= 'x';
    return $gary[0];
};
is $x,       'foox';
is $gary[0], 'foox';

$x = run_block{
    my $i = 1;
    $gary[$i] .= 'x';
    return $gary[$i];
};
is $x,       'barx';
is $gary[1], 'barx';

@ary = run_block{
    my @a = ();
    $a[1] = 10;
    return @a;
};
is_deeply \@ary, [undef, 10];

sub f{
    my @a;
    $a[0]++;
    return $a[0];
}

is run_block(\&f), 1;
is run_block(\&f), 1;

is_deeply \@PL_stack,      [], '@PL_stack is empty';
is_deeply \@PL_markstack,  [], '@PL_markstack is empty';
is_deeply \@PL_scopestack, [], '@PL_scopestack is empty';
is_deeply \@PL_cxstack,    [], '@PL_cxstack is empty';
is_deeply \@PL_savestack,  [], '@PL_savestack is empty';
is_deeply \@PL_tmps,       [], '@PL_tmps is empty';