Skip to content

Commit

Permalink
Implement multi-outered classes
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefan O'Rear committed Jul 14, 2010
1 parent 528927c commit 8afac05
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 11 deletions.
12 changes: 8 additions & 4 deletions Body.pm
Expand Up @@ -58,8 +58,9 @@ use CodeGen ();
use Moose;
extends 'Body';

has 'var' => (is => 'rw', isa => 'Str');
has 'super' => (is => 'ro', isa => 'ArrayRef', default => sub { [] });
has 'var' => (is => 'rw', isa => 'Str');
has 'super' => (is => 'ro', isa => 'ArrayRef', default => sub { [] });
has 'augmenting' => (is => 'ro', isa => 'Bool', default => 0);

sub makeproto {
my ($self, $cg) = @_;
Expand Down Expand Up @@ -87,11 +88,14 @@ use CodeGen ();

before do_enter => sub {
my ($self, $cg) = @_;
$cg->share_lex('!scopenum');
$self->makeproto($cg);
};

after do_preinit => sub {
my ($self, $cg) = @_;
around do_preinit => sub {
my ($o, $self, $cg) = @_;
$self->lexical->{'!scopenum'} = 1;
$o->($self, $cg);
$self->makeproto($cg);
};

Expand Down
3 changes: 2 additions & 1 deletion CodeGen.pm
Expand Up @@ -25,7 +25,8 @@ use 5.010;
name => 'String' },

'List<Frame>' =>
{ Add => 'Void' },
{ Add => 'Void',
Count => 'System.Int32' },
'List<DynMetaObject>' =>
{ Add => 'Void' },
'List<DynProtoMetaObject>' =>
Expand Down
9 changes: 6 additions & 3 deletions Decl.pm
Expand Up @@ -189,7 +189,8 @@ use 5.010;
$cg->dup_fetch;
$cg->callframe;
$cg->clr_wrap;
$cg->call_method(0, "push-scope", 1);
$cg->call_method(1, "push-scope", 1);
$cg->proto_var('!scopenum');

$self->body->do_preinit($cg);
$cg->close_sub($self->body->code);
Expand Down Expand Up @@ -236,8 +237,7 @@ use 5.010;
$cg->dup_fetch;
$cg->clr_string($self->name);
$cg->clr_wrap;
$cg->clr_int(0);
$cg->clr_wrap;
$cg->scopelexget('!scopenum');
$cg->scopelexget($self->var);
$cg->call_method(0, "add-scoped-method", 3);
}
Expand All @@ -259,6 +259,9 @@ use 5.010;
#TODO: Make this a sorry.
die "Tried to set a superclass outside a class!";
}
if ($body->augmenting) {
die "Cannot add superclasses in an augment";
}
push @{ $body->super }, $self->name;

$cg->peek_aux('how');
Expand Down
7 changes: 4 additions & 3 deletions setting
Expand Up @@ -62,9 +62,10 @@ PRE-INIT {

# $how.push-scope($outer)
sub push-scope { Q:NIL {
=[0] @ @!meta-object unwrap:DynProtoMetaObject @.def_outers
=[1] @ unwrap:Frame .virtcall/1:Add
null:Variable
LEXICALS: $df : List<Frame>
=[0] @ @!meta-object unwrap:DynProtoMetaObject @.def_outers L!$df
L@$df =[1] @ unwrap:Frame .virtcall/1:Add
L@$df @.Count 1 - wrap
} }

# $how.add-super($how)
Expand Down

0 comments on commit 8afac05

Please sign in to comment.