Skip to content

Commit

Permalink
Fix remaining crashes in NAM emitter
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Dec 14, 2010
1 parent ee2c1df commit 4baa098
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 7 deletions.
3 changes: 1 addition & 2 deletions src/CompilerDriver.pm
Expand Up @@ -10,7 +10,6 @@ use Sub::Exporter -setup => {
use Time::HiRes 'time';
use File::Basename;
use autodie ':all';
use JSON;

use Body ();
use Unit ();
Expand Down Expand Up @@ -226,7 +225,7 @@ sub compile {
} ],
[ 'beta', sub { Optimizer::Beta::run($ast) } ],
[ 'simpl', sub { Optimizer::Simplifier::run($ast) } ],
[ 'nam', sub { $ast = [$ast, encode_json(NAMBackend::run($ast))] } ],
[ 'nam', sub { $ast = [$ast, NAMBackend::run($ast)] } ],
[ 'writenam', sub {
open my $fh, ">", $namfile;
print $fh $ast->[1];
Expand Down
15 changes: 12 additions & 3 deletions src/NAMBackend.pm
Expand Up @@ -6,13 +6,22 @@ use warnings;
package NAMBackend;

our $unit;
use JSON;

sub run {
local $unit = shift;

$unit->visit_local_subs_postorder(\&nam_sub);

$unit->to_nam;
my $nam = $unit->to_nam;

eval {
$nam = encode_json $nam;
};
if ($@) {
say ($@);
say (YAML::XS::Dump $nam);
}
return $nam;
}

sub nam_sub {
Expand All @@ -21,7 +30,7 @@ sub nam_sub {
if ($s->parametric_role_hack) {
for (@{ $unit->deref($s->parametric_role_hack)->methods }) {
if (ref $_->[0]) {
$_->[0] = $_->[0]->cgop($s);
$_->[0] = $_->[0]->cgop($s)->to_nam;
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/Op.pm
Expand Up @@ -923,7 +923,7 @@ use CgOp;
sub code_bvalue {
my ($self, $body, $ro, $rhscg) = @_;
CgOp::prog(
CgOp::scopedlex($self->name, CgOp::newboundvar($ro, $self->list || $self->hash, $rhscg)),
CgOp::scopedlex($self->name, CgOp::newboundvar($ro, (($self->list || $self->hash) ? 1 : 0), $rhscg)),
CgOp::scopedlex($self->name));
}

Expand Down Expand Up @@ -1143,7 +1143,7 @@ use CgOp;
@pre,
CgOp::rxinit(CgOp::str($self->name),
CgOp::cast('cursor', CgOp::fetch(CgOp::scopedlex('self'))),
$self->passcap, $self->passcut),
($self->passcap?1:0), ($self->passcut?1:0)),
($self->passcap ? () :
CgOp::rxpushcapture(CgOp::null('cursor'), @mcaps)),
$self->rxop->code($body),
Expand Down

0 comments on commit 4baa098

Please sign in to comment.