Anarres-Mud-Driver
view release on metacpan or search on metacpan
lib/Driver/Program/Method.pm view on Meta::CPAN
package Anarres::Mud::Driver::Program::Method;
use strict;
use vars qw(@ISA @EXPORT);
use Data::Dumper;
use Carp qw(cluck);
use Anarres::Mud::Driver::Program::Variable;
use Anarres::Mud::Driver::Compiler::Type qw(:all);
@ISA = qw(Anarres::Mud::Driver::Program::Variable);
*EXPORT = \@Anarres::Mud::Driver::Program::Variable::EXPORT;
sub args { return $_[0]->{Args}; }
# Code is added later in the parser (was?)
sub code {
my ($self, $code) = @_;
# cluck "Add code $code to method $self->{Name}\n" if $code;
if (defined $code) {
$self->{Code} = $code;
# print Dumper($code);
}
return $self->{Code};
}
sub check {
my ($self, $program, @rest) = @_;
# print "Typechecking method " . $self->name . " (top level)\n";
# print $self->dump, "\n";
# Start adding locals, etc, etc.
$program->reset_labels;
$program->save_locals;
foreach (@{ $self->args }) {
$program->local($_->name, $_);
}
my $code = $self->code;
if ($code) {
$code->check($program, @rest);
}
else {
$program->error("No code in method " . $self->name);
}
$program->restore_locals;
# print $self->dump, "\n";
}
sub dump {
my $self = shift;
my $indent = shift;
$indent++;
my $sep = "\n" . ("\t" x $indent);
# XXX No types
my $out = "([" . $self->type->dump(@_) . "] method " . $self->name;
# my $out = "(method " . $self->name;
my $args = join("", map { " " . $_->dump($indent, @_) } @{$self->args});
my $code = ! $self->code ? "(nocode)"
: ref($self->code) !~ /::/ ? ref($self->code)
: $self->code->dump($indent, @_)
;
$out = $out .
( run in 0.701 second using v1.01-cache-2.11-cpan-39bf76dae61 )