Mercurial > hg > Members > anatofuz > MoarVM
view cbctools/translate_cbc_interp.pl @ 35:29dd3807070e
new translate cbc_interp.pl
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Nov 2018 14:09:08 +0900 |
parents | |
children |
line wrap: on
line source
#!/usr/bin/env perl use strict; use warnings; my $interpfile = shift or die; open my $fh, '<',$interpfile; my @interp_lines = <$fh>; close $fh; my @translated = (); my $none_left_blanket = 0; my $index = 0; while ( $interp_lines[$index] !~ /\/\* This is the interpreter run loop. We have one of these per thread. \*\//){ if ($interp_lines[$index] =~ /GET_(REG|LEX)/){ $interp_lines[$index] = insert_i_4_GET_R_L($interp_lines[$index]); } if ($interp_lines[$index] =~ /NEXT_OP/){ $interp_lines[$index] = change_i($interp_lines[$index]); } # マクロ部分の置き換え if ( $interp_lines[$index] =~ /#if MVM_CGOTO/){ while ($interp_lines[$index] !~ /#endif/){ $index++; } $index++; print insert_CbC_macro(); } print "$interp_lines[$index]"; $index++; } sub change_i { my $str = shift; $str =~ s/^op/i->op/g; $str =~ s/cur_op/i->cur_op/g; $str =~ s/([,(])cu/$1i->tc/g; $str =~ s/tc/i->tc/g; $str =~ s/cur_callsite/i->cur_callsite/g; $str =~ s/NEXT;/cbc_next(i);/; $str =~ s/ / /g; return $str; } sub insert_i_4_GET_R_L { my $str = shift; $str =~ s/tc/i->tc/g; $str =~ s/reg_base/i->reg_base/g; $str =~ s/GET_(REG|LEX)\((.*?)\)/GET_$1($2,i)/g; return $str; } sub insert_CbC_macro { my $msg = << 'EOF'; #define DISPATCH(op) {goto (CODES[op])(i);} #define OP(name) OP_ ## name #define NEXT(i) CODES[NEXT_OP(i)](i) EOF return $msg; }