Skip to content

Commit

Permalink
Refactor metamodel cross-references a bit
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Oct 9, 2010
1 parent e4c7a4c commit e151b74
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 35 deletions.
12 changes: 7 additions & 5 deletions src/CompilerDriver.pm
Expand Up @@ -106,11 +106,12 @@ sub find_module {

REUSE: {
last REUSE unless -f $symlfile;
my $meta = Storable::retrieve($symlfile);
my $meta = CompilerDriver::metadata_for($module);

for my $dmod ($meta->name, keys %{ $meta->tdeps }) {
my $dpath = $meta->get_unit($dmod)->filename;
my $dtime = $meta->get_unit($dmod)->modtime;
for my $dmod ($module, keys %{ $meta->tdeps }) {
my $u = CompilerDriver::metadata_for($dmod);
my ($dpath, $dtime) = @{ $meta->tdeps->{$dmod} //
[ $meta->filename, $meta->modtime ] };

my ($npath) = CompilerDriver::find_module($dmod, undef) or do {
$self->sorry("Dependancy $dmod of $module cannot be located");
Expand Down Expand Up @@ -181,6 +182,7 @@ sub compile {
}
}

local %Metamodel::units;
local $::stagetime = $args{stagetime};
local $::SETTING_UNIT;
local $::niecza_mod_symbols;
Expand All @@ -192,7 +194,7 @@ sub compile {
my ($filename, $modtime);

if ($lang ne 'NULL') {
$::SETTING_UNIT = metadata_for($lang);
$::SETTING_UNIT = $lang;
}

if (defined($name)) {
Expand Down
65 changes: 35 additions & 30 deletions src/Metamodel.pm
Expand Up @@ -33,6 +33,7 @@ use Scalar::Util 'blessed';
# these should only be used during the Op walk
our @opensubs;
our $unit;
our %units;

# A stash is an object like Foo::. Foo and Foo:: are closely related, but
# generally must be accessed separately due to constants (which have Foo but
Expand Down Expand Up @@ -82,11 +83,26 @@ our $unit;
__PACKAGE__->meta->make_immutable;
}

{
package Metamodel::RefTarget;
use Moose;

has xref => (isa => 'ArrayRef', is => 'rw');

sub BUILD {
$_[0]->xref([ $unit->name, scalar(@{ $unit->xref }) ]);
push @{ $unit->xref }, $_[0];
}

no Moose;
__PACKAGE__->meta->make_immutable;
}

{
package Metamodel::Package;
use Moose;
extends 'Metamodel::RefTarget';

has xid => (isa => 'Int', is => 'rw');
# an intrinsic name, even if anonymous
has name => (isa => 'Str', is => 'ro', default => 'ANON');
has unit_closed => (isa => 'Bool', is => 'rw');
Expand Down Expand Up @@ -170,7 +186,7 @@ our $unit;
}

my @merge;
push @merge, [ $unit->make_ref($self), @{ $self->superclasses } ];
push @merge, [ $self->xref, @{ $self->superclasses } ];
for (@{ $self->superclasses }) {
push @merge, [ @{ $unit->deref($_)->linearized_mro } ];
}
Expand Down Expand Up @@ -415,9 +431,9 @@ our $unit;
{
package Metamodel::StaticSub;
use Moose;
extends 'Metamodel::RefTarget';

has unit => (isa => 'Metamodel::Unit', is => 'ro', weak_ref => 1);
has xid => (isa => 'Int', is => 'rw');
has outer => (is => 'bare');
has run_once => (isa => 'Bool', is => 'ro', default => 0);
has spad_exists => (isa => 'Bool', is => 'rw', default => 0);
Expand Down Expand Up @@ -584,8 +600,7 @@ our $unit;

sub get_unit {
my ($self, $name) = @_;
if ($name eq $self->name) { return $self }
$self->tdeps->{$name};
$units{$name};
}

sub anon_stash {
Expand Down Expand Up @@ -628,17 +643,6 @@ our $unit;
$ptr;
}

sub make_ref {
my ($self, $thing) = @_;
my $xid;
Carp::confess "trying to make_ref null" unless $thing;
if (!defined ($xid = $thing->xid)) {
$thing->xid($xid = scalar @{ $self->xref });
push @{ $self->xref }, $thing;
}
return [ $self->name, $xid ];
}

sub deref {
my ($self, $thing) = @_;
Carp::confess "trying to dereference null" unless $thing;
Expand Down Expand Up @@ -706,9 +710,11 @@ our $unit;
}

sub need_unit {
my ($self, $u2) = @_;
$self->tdeps->{$u2->name} = $u2;
my ($self, $u2name) = @_;
my $u2 = $units{$u2name} //= CompilerDriver::metadata_for($u2name);
$self->tdeps->{$u2name} = [ $u2->filename, $u2->modtime ];
for (keys %{ $u2->tdeps }) {
$units{$_} //= CompilerDriver::metadata_for($_);
$self->tdeps->{$_} //= $u2->tdeps->{$_};
}
our $rec; local $rec = sub {
Expand All @@ -734,6 +740,7 @@ our $unit;
}
};
$rec->();
$u2;
}

no Moose;
Expand All @@ -748,7 +755,8 @@ our $unit;
sub Unit::begin {
my $self = shift;
local $unit = Metamodel::Unit->new(name => $self->name,
$::SETTING_UNIT ? (setting => $::SETTING_UNIT->name) : ());
$::SETTING_UNIT ? (setting => $::SETTING_UNIT) : ());
$units{$self->name} = $unit;

$unit->need_unit($::SETTING_UNIT) if $::SETTING_UNIT;

Expand All @@ -757,7 +765,7 @@ sub Unit::begin {

local @opensubs;
$unit->mainline($self->mainline->begin(once => 1,
top => ($::SETTING_UNIT ? $::SETTING_UNIT->bottom_ref : undef)));
top => ($::SETTING_UNIT ? $unit->get_unit($::SETTING_UNIT)->bottom_ref : undef)));

$unit;
}
Expand Down Expand Up @@ -833,16 +841,15 @@ sub Op::begin {

sub Op::YouAreHere::begin {
my $self = shift;
$unit->bottom_ref($unit->make_ref($opensubs[-1]));
$unit->bottom_ref($opensubs[-1]->xref);
$opensubs[-1]->strong_used(1);
$opensubs[-1]->create_static_pad;
}

sub Op::Use::begin {
my $self = shift;
my $name = $self->unit;
my $u2 = CompilerDriver::metadata_for($self->unit);
$unit->need_unit($u2);
my $u2 = $unit->need_unit($self->unit);

my @can = @{ $u2->mainline->find_pkg(split /::/, $name) };
my $exp = $unit->get_stash(@can, 'EXPORT', 'DEFAULT');
Expand Down Expand Up @@ -932,10 +939,9 @@ sub Op::Attribute::begin {
$opensubs[-1]->create_static_pad; # for protosub instance
$nb->strong_used(1);
$opensubs[-1]->add_my_sub($self->name . '!a', $nb);
my $r = $unit->make_ref($nb);
$ns->add_method('!', $self->name, $self->name . '!a', $r);
$ns->add_method('!', $self->name, $self->name . '!a', $nb->xref);
if ($self->accessor) {
$ns->add_method('', $self->name, $self->name . '!a', $r);
$ns->add_method('', $self->name, $self->name . '!a', $nb->xref);
}
}

Expand All @@ -953,10 +959,9 @@ sub Op::SubDef::begin {
my $self = shift;
my $body = $self->body->begin(once => $self->once);
$opensubs[-1]->add_my_sub($self->var, $body);
my $r;
my $r = $body->xref;
if (@{ $self->exports } || defined($self->method_too) ||
defined ($self->proto_too)) {
$r = $unit->make_ref($body);
$body->strong_used(1);
}
$opensubs[-1]->create_static_pad if $body->strong_used;
Expand Down Expand Up @@ -1022,15 +1027,15 @@ sub Op::PackageDef::begin {
$opensubs[-1]->add_my_stash($self->var, [ @ns, $n ]);
$opensubs[-1]->add_pkg_exports($unit, $self->var, [ @ns, $n ], $self->exports);
if (!$self->stub) {
my $obj = $unit->make_ref($pclass->new(name => $self->name));
my $obj = $pclass->new(name => $self->name)->xref;
my $body = $self->body->begin(body_of => $obj, cur_pkg => [ @ns, $n ],
once => ($pclass ne 'Metamodel::ParametricRole'));
$unit->deref($obj)->close;
$unit->get_stash(@ns)->bind_name($n, $obj);
$opensubs[-1]->add_exports($unit, $self->var, $obj, $self->exports);

if ($pclass eq 'Metamodel::ParametricRole') {
$unit->deref($obj)->builder($unit->make_ref($body));
$unit->deref($obj)->builder($body->xref);
$body->parametric_role_hack($obj);
$body->create_static_pad;
}
Expand Down

0 comments on commit e151b74

Please sign in to comment.