[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