[svn:parrot] r38402 - in branches/pmc_pct: compilers/pmc compilers/pmc/src compilers/pmc/t config/gen/makefiles
bacek at svn.parrot.org
bacek at svn.parrot.org
Wed Apr 29 10:43:28 UTC 2009
Author: bacek
Date: Wed Apr 29 10:43:27 2009
New Revision: 38402
URL: https://trac.parrot.org/parrot/changeset/38402
Log:
First cut for implementing PMC::Emitter
Modified:
branches/pmc_pct/compilers/pmc/pmc.pir
branches/pmc_pct/compilers/pmc/src/emitter.pm
branches/pmc_pct/compilers/pmc/t/04-header.t
branches/pmc_pct/config/gen/makefiles/pmc.in
Modified: branches/pmc_pct/compilers/pmc/pmc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/pmc.pir Wed Apr 29 10:43:00 2009 (r38401)
+++ branches/pmc_pct/compilers/pmc/pmc.pir Wed Apr 29 10:43:27 2009 (r38402)
@@ -30,7 +30,9 @@
.include 'src/nodes.pir'
.include 'src/vtable_info.pir'
-.include 'src/gen_compiler.pir'
+.include 'src/pmc_emitter.pir'
+
+.include 'src/gen_emitter.pir'
.include 'src/gen_vtable_info.pir'
.include 'src/parser/gen_grammar.pir'
.include 'src/parser/gen_actions.pir'
Modified: branches/pmc_pct/compilers/pmc/src/emitter.pm
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter.pm Wed Apr 29 10:43:00 2009 (r38401)
+++ branches/pmc_pct/compilers/pmc/src/emitter.pm Wed Apr 29 10:43:27 2009 (r38402)
@@ -5,15 +5,18 @@
class PMC::Emitter;
-
# Generate .h file for pmc.
-method generate_h_file() {
+method generate_h_file($past) {
my $res;
- #my $self; PIR q< store_lex "$self", self >;
my $filename := self.filename();
$res := dont_edit($filename);
+ # Get emitter for (specific) PMC.
+ my $pmc_emitter := get_pmc_emitter($past.name());
+ # And generate header.
+ $res := $res ~ $pmc_emitter.generate_h_file($past);
+
$res := $res ~ c_code_coda();
$res;
@@ -28,6 +31,30 @@
our $?filename := $name;
}
+
+# Get (specific) PMC emitter
+# Try to create specific emitter. In case of failure create generic one.
+sub get_pmc_emitter($name) {
+PIR q<
+ find_lex $P0, '$name'
+ $S0 = $P0
+ $P1 = new 'ResizableStringArray'
+ push $P1, 'PMC'
+ push $P1, 'Emitter'
+ push $P1, $S0
+ push_eh not_found
+ %r = new $P1
+ pop_eh
+ goto done
+
+ not_found:
+ pop_eh
+ $P1 = split '::', 'PMC::Emitter::PMC'
+ %r = new $P1
+ done:
+>;
+}
+
# Generate don't edit warning
sub dont_edit($filename) {
"/* ex: set ro ft=c:\n"
Modified: branches/pmc_pct/compilers/pmc/t/04-header.t
==============================================================================
--- branches/pmc_pct/compilers/pmc/t/04-header.t Wed Apr 29 10:43:00 2009 (r38401)
+++ branches/pmc_pct/compilers/pmc/t/04-header.t Wed Apr 29 10:43:27 2009 (r38402)
@@ -8,16 +8,23 @@
load_bytecode 'compilers/pmc/pmc.pbc'
.local int total
- plan(0)
- .return()
+ plan(1)
- $S0 = _slurp('compilers/pmc/t/data/class00.pmc')
+ .local string filename
+ filename = 'compilers/pmc/t/data/class00.pmc'
+ $S0 = _slurp(filename)
.local pmc compiler
compiler = compreg 'PMC'
- compiler.'parse'($S0, 'target'=>'past')
+ $P0 = compiler.'compile'($S0, 'target'=>'past')
- $S0 = compiler.'generate_h_file'()
+ .local pmc emitter
+ $P1 = split '::', 'PMC::Emitter'
+ emitter = new $P1
+ emitter.'set_filename'(filename)
+ $S0 = emitter.'generate_h_file'($P0)
+ say $S0
like($S0, "'DO NOT EDIT THIS FILE'", "Warning generated")
+
.end
Modified: branches/pmc_pct/config/gen/makefiles/pmc.in
==============================================================================
--- branches/pmc_pct/config/gen/makefiles/pmc.in Wed Apr 29 10:43:00 2009 (r38401)
+++ branches/pmc_pct/config/gen/makefiles/pmc.in Wed Apr 29 10:43:27 2009 (r38402)
@@ -18,6 +18,7 @@
pmc.pir \
src/nodes.pir \
src/vtable_info.pir \
+ src/pmc_emitter.pir \
src/parser/gen_grammar.pir \
src/parser/gen_actions.pir \
src/gen_emitter.pir \
More information about the parrot-commits
mailing list