Changeset 22887 for v6

Show
Ignore:
Timestamp:
11/05/08 19:13:11 (2 months ago)
Author:
ruoso
Message:

[mildew] avoid using globals during ->m0ld().

Location:
v6/mildew
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • v6/mildew/mildew

    r22860 r22887  
    362362print $mold->pretty,"\n" if $desugar; 
    363363exit if $desugar; 
    364 my $m0ld = <<'BOILERPLATE'.$mold->emit_('$main').<<'CALL_MAIN'; 
     364my $m0ld = <<'BOILERPLATE'.$mold->m0ld('$main').<<'CALL_MAIN'; 
    365365my $void; 
    366366BOILERPLATE 
  • v6/mildew/src/AST.pm

    r22860 r22887  
    2222    my $self = shift; 
    2323    my $id = AST::unique_id; 
    24     $AST::CODE .= do {local $AST::CODE='';$AST::CODE . $self->m0ld($id)}; 
    25     return $id; 
    26  
    27 } 
    28 sub emit_ { 
    29     local $AST::CODE = ''; 
    30     my ($self,$ret) = @_; 
    31     my $mold = $self->m0ld($ret); 
    32     $AST::CODE . $mold; 
     24    return $self->m0ld($id); 
     25 
    3326} 
    3427sub pretty { 
     
    5245    my $then = $self->then->m0ld($id_then); 
    5346 
    54     $cond.$/. 
     47    $cond. 
    5548    'my '.$id_cond.'_val = '.$id_cond.'."FETCH"();'.$/. 
    5649    'my '.$id_cond.'_bool = '.$id_cond.'_val."bool"();'.$/. 
     
    7063    "my $ret = mold {\n" 
    7164        . join('',map {'my $'.$_.";\n"} @{$self->regs}) 
    72         . join("",map { $_->emit_('$void') } @{$self->stmts}) 
     65        . join("",map { $_->m0ld('$void') } @{$self->stmts}) 
    7366    . "};\n"; 
    7467} 
     
    138131    my ($self,$ret) = @_; 
    139132    if ($self->capture->isa("AST::Capture")) { 
    140         "my $ret = " 
    141         . $self->capture->invocant->emit 
    142         . "." . $self->identifier->emit 
    143         . "(" . join(',', map {$_->emit} $self->arguments) . ")" . ";\n"; 
     133        my @args; 
     134        my $code = ''; 
     135        for ($self->arguments) { 
     136            my $id = AST::unique_id(); 
     137            $code .= $_->m0ld($id); 
     138            push @args, $id; 
     139        } 
     140        my $invocant = AST::unique_id(); 
     141        $code .= $self->capture->invocant->m0ld($invocant); 
     142        my $identifier = AST::unique_id(); 
     143        $code .= $self->identifier->m0ld($identifier); 
     144        $code .= "my $ret = " 
     145          . $invocant 
     146          . "." . $identifier 
     147          . "(" . join(',', @args) . ")" . ";\n"; 
    144148    } else { 
    145149        die 'unimplemented'; 
     
    206210} 
    207211sub m0ld { 
    208     die "method m0ld is not supported on AST::Reg, m0ld doesn't support register aliasing\n" 
     212    my ($self,$ret) = @_; 
     213    "my $ret = ".$self->name."\n"; 
    209214} 
    210215sub pretty {