Skip to content

Commit

Permalink
Fix abstraction in private method codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Oct 4, 2010
1 parent 2fe5011 commit 94c51c8
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 1 deletion.
5 changes: 5 additions & 0 deletions src/CSharpBackend.pm
Expand Up @@ -316,6 +316,11 @@ sub resolve_lex {
bless $op, ref($nn);

resolve_lex($body, $_) for @{ $op->zyg };
} elsif ($opc eq 'class_ref') {
my $cl = $unit->deref([ @rest ]);
my $nn = CgOp::rawsget($cl->{peer}{$arg});
%$op = %$nn;
bless $op, ref($nn);
} elsif ($opc eq 'let') {
local $haslet{$arg} = 1;

Expand Down
2 changes: 2 additions & 0 deletions src/CgOp.pm
Expand Up @@ -190,6 +190,8 @@ use warnings;
CgOp->new(op => [ scopelex => $n ], zyg => [ @_ ]);
}

sub class_ref { CgOp->new(op => [ class_ref => @_ ]); }

sub _process_arglist {
my $ar = shift;
my @sig;
Expand Down
5 changes: 4 additions & 1 deletion src/Op.pm
Expand Up @@ -194,7 +194,10 @@ use CgOp;
my ($self, $body) = @_;
if ($self->private) {
# XXX encapsulation break
CgOp::subcall(CgOp::rawcall(CgOp::rawsget($body->unit->deref($self->pclass)->{peer}{mo}), "GetPrivateMethod", CgOp::clr_string($self->name)), $self->receiver->cgop($body), $self->argblock($body));
CgOp::subcall(CgOp::rawcall(
CgOp::class_ref('mo', @{ $self->pclass }),
"GetPrivateMethod", CgOp::clr_string($self->name)),
$self->receiver->cgop($body), $self->argblock($body));
} else {
CgOp::methodcall($self->receiver->cgop($body),
$self->name, $self->argblock($body));
Expand Down

0 comments on commit 94c51c8

Please sign in to comment.