[svn:parrot] r38752 - in branches/pmc_pct/compilers/pmcc: . src src/emitter t

cotto at svn.parrot.org cotto at svn.parrot.org
Wed May 13 18:16:24 UTC 2009


Author: cotto
Date: Wed May 13 18:16:22 2009
New Revision: 38752
URL: https://trac.parrot.org/parrot/changeset/38752

Log:
[pmcc] make pmcc emit files when involed from the command line, give some functions more accurate names

Modified:
   branches/pmc_pct/compilers/pmcc/pmcc.pir
   branches/pmc_pct/compilers/pmcc/src/emitter.pm
   branches/pmc_pct/compilers/pmcc/src/emitter/pmc.pm
   branches/pmc_pct/compilers/pmcc/t/05-header.t
   branches/pmc_pct/compilers/pmcc/t/06-body.t
   branches/pmc_pct/compilers/pmcc/t/07-default.t

Modified: branches/pmc_pct/compilers/pmcc/pmcc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmcc/pmcc.pir	Wed May 13 15:02:50 2009	(r38751)
+++ branches/pmc_pct/compilers/pmcc/pmcc.pir	Wed May 13 18:16:22 2009	(r38752)
@@ -17,7 +17,8 @@
     $P0.'parsegrammar'('PMC::Grammar')
     $P0.'parseactions'('PMC::Grammar::Actions')
 
-    #these stages aren't currently used
+    #these stages aren't currently used, although generate_files exits before
+    #they can be called anyway
     $P0.'removestage'('post')
     $P0.'removestage'('pir')
     $P0.'removestage'('evalpmc')
@@ -31,46 +32,93 @@
 .end
 
 
-.sub 'generate_files' :method
-    .param pmc past
-    .param pmc adverbs :slurpy :named
+# override HLLCompiler's default evalfiles in order to store the name of the file being compiled
+.sub 'evalfiles' :method
+    .param pmc files
+    .param pmc args      :slurpy
+    .param pmc adverbs   :slurpy :named
 
-    .local pmc pmc_filename
-    pmc_filename = get_hll_global ['PMC';'Emitter'], '$?filename'
+    .local pmc it, files_clone, pmc_paths, file_path
 
-    .local string base_filename, dump_filename, c_filename, h_filename
-    .local string dump_contents, c_contents, h_contents
-    base_filename = pmc_filename.'replace'('.pmc', '')
+    #TODO: DTRT if files is an array of filenames, although this isn't an expected use case
+    files_clone = clone files
+    set_hll_global ['PMC';'Emitter'], '$?filename', files_clone
 
-    dump_filename = concat base_filename, '.dump'
-    c_filename    = concat base_filename, '.c'
-    h_filename    = concat base_filename, '.h'
+    $S0 = adverbs['pmc_path']
+    pmc_paths = split ',', $S0
 
-    #XXX: do something interesting here
+    # 'foo/bar/baz/buz.pmc' -> 'foo/bar/baz'
+    $S0 = files
+    $P1 = split '/', $S0
+    $I0 = $P1
+    delete $P1[$I0]
+    $S0 = join '/', $P1
+    say $S0
+    unshift pmc_paths, $S0
 
+    set_hll_global ['PMC';'Emitter'], '@?pmc_path', pmc_paths
 
-    .return (past)
+    .local pmc super_evalfiles
+    super_evalfiles = get_hll_global ['PCT';'HLLCompiler'], 'evalfiles'
+    .tailcall self.super_evalfiles(files, args :flat, adverbs :flat :named)
 .end
 
 
-.sub 'evalfiles' :method
-    .param pmc files
-    .param pmc args      :slurpy
-    .param pmc adverbs   :slurpy :named
+.sub 'generate_files' :method
+    .param pmc past
+    .param pmc adverbs :slurpy :named
 
-    .local string filename
+    .local pmc pmc_filename, emitter
+    pmc_filename = get_hll_global ['PMC';'Emitter'], '$?filename'
 
-    $S0 = adverbs['pmc_path']
-    $P0 = split ',', $S0
-    set_hll_global ['PMC';'Emitter'], '@?pmc_path', $P0
+    .local string base_filename, dump_filename, c_filename, header_filename
+    .local string dump_contents, c_contents, header_contents
+    pmc_filename.'replace'('.pmc', '')
+    base_filename = pmc_filename 
+
+    emitter  = new ['PMC';'Emitter']
+
+    c_filename = concat base_filename, '.c'
+    c_contents = emitter.'generate_c_code'(past)
+    write_file(c_filename, c_contents)
+
+    header_filename = concat base_filename, '.h'
+    header_contents = emitter.'generate_header'(past)
+    write_file(header_filename, header_contents)
 
-    #TODO: DTRT if files is an array of filenames, although this isn't an expected use case
-    $P0 = clone files
-    set_hll_global ['PMC';'Emitter'], '$?filename', $P0
+    dump_filename = concat base_filename, '.dump'
+    dump_contents = emitter.'generate_dump'(past)
+    write_file(dump_filename, dump_contents)
+
+    #there's nothing left to do, so exit and avoid any extra output
+    exit 0
+.end
+
+
+.sub 'write_file'
+    .param string name
+    .param string contents
+
+    .local pmc fh
+    fh = new ['FileHandle']
+    fh.'open'(name, 'w')
+    print fh, contents
+    fh.'close'()
+    print "wrote output to "
+    say name
+    .return ()
+
+  cant_write:
+    .local pmc ex
+    .local string msg
+    .get_results (ex)
+    msg = ex
+    print "ERROR: couldn't open "
+    print name
+    print " for reading: "
+    say ex
+    .return ()
 
-    .local pmc super_evalfiles
-    super_evalfiles = get_hll_global ['PCT';'HLLCompiler'], 'evalfiles'
-    .tailcall self.super_evalfiles(files, args, adverbs)
 .end
 
 

Modified: branches/pmc_pct/compilers/pmcc/src/emitter.pm
==============================================================================
--- branches/pmc_pct/compilers/pmcc/src/emitter.pm	Wed May 13 15:02:50 2009	(r38751)
+++ branches/pmc_pct/compilers/pmcc/src/emitter.pm	Wed May 13 18:16:22 2009	(r38752)
@@ -5,8 +5,8 @@
 
 class PMC::Emitter;
 
-# Generate .h file for pmc.
-method generate_h_file($past) {
+# Generate the .h file's contents for this pmc.
+method generate_header($past) {
     my $res;
 
     my $name     := $past.name();
@@ -19,15 +19,15 @@
             # Generate header.
               dont_edit($filename)
             # PMC functions
-            ~ $pmc_emitter.generate_h_file()
+            ~ $pmc_emitter.generate_header()
             # C code
             ~ c_code_coda();
 
     $res;
 }
 
-# Generate .c file for pmc.
-method generate_c_file($past) {
+# Generate the .c file's contents for this pmc.
+method generate_c_code($past) {
     my $res;
 
     my $name     := $past.name();
@@ -40,14 +40,14 @@
             # Generate header.
               dont_edit($filename)
             # PMC functions
-            ~ $pmc_emitter.generate_c_file()
+            ~ $pmc_emitter.generate_c_code()
             # C code
             ~ c_code_coda();
 
     $res;
 }
 
-# Generate the ontents of a .dump file for self.
+# Generate the contents of a .dump file for this pmc.
 method generate_dump($past) {
     my $res;
 

Modified: branches/pmc_pct/compilers/pmcc/src/emitter/pmc.pm
==============================================================================
--- branches/pmc_pct/compilers/pmcc/src/emitter/pmc.pm	Wed May 13 15:02:50 2009	(r38751)
+++ branches/pmc_pct/compilers/pmcc/src/emitter/pmc.pm	Wed May 13 18:16:22 2009	(r38752)
@@ -3,16 +3,16 @@
 
 class PMC::Emitter::PMC;
 
-# =item C<generate_h_file>
+# =item C<generate_header>
 #
 # Generate part of header file.
 #
 # =cut
 
-# "Template Method". Just override generate_h_file_functions in derived
+# "Template Method". Just override generate_header_functions in derived
 # classes.
 
-method generate_h_file() {
+method generate_header() {
     my $past := self.past;
     my $name := self.name;
 
@@ -23,7 +23,7 @@
         '#ifndef ' ~ $guard ~ "\n",
         '#define ' ~ $guard ~ "\n\n",
 
-        self.generate_h_file_functions(), "\n",
+        self.generate_header_functions(), "\n",
 
         self.generate_attr_struct(), "\n",
 
@@ -38,13 +38,13 @@
     $res
 }
 
-# =item C<generate_h_file_functions>
+# =item C<generate_header_functions>
 #
 # Generate C declarations for vtable functions
 #
 # =cut
 
-method generate_h_file_functions() {
+method generate_header_functions() {
     my $past := self.past;
     my %vtables := PMC::VTableInfo::vtable_hash();
 
@@ -318,27 +318,27 @@
 }
 
 
-#=item C<generate_c_file>
+#=item C<generate_c_code>
 #
-#Generate C file for PMC.
+#Generate C file's contents for this PMC.
 #
 #=cut
 
-method generate_c_file() {
+method generate_c_code() {
     self.pre_method_gen();
     my $res :=
-          self.generate_c_file_functions()
+          self.generate_c_functions()
         ~ self.generate_class_init();
 }
 
 
-#=item C<generate_c_file_functions>
+#=item C<generate_c_functions>
 #
 #Generate C declarations for vtable functions
 #
 #=cut
 
-method generate_c_file_functions() {
+method generate_c_functions() {
     my $past    := self.past;
     my %vtables := self.vtables;
     my $emitter := PMC::Emitter::C.new;

Modified: branches/pmc_pct/compilers/pmcc/t/05-header.t
==============================================================================
--- branches/pmc_pct/compilers/pmcc/t/05-header.t	Wed May 13 15:02:50 2009	(r38751)
+++ branches/pmc_pct/compilers/pmcc/t/05-header.t	Wed May 13 18:16:22 2009	(r38752)
@@ -81,7 +81,7 @@
 
     .local pmc emitter, capture
     (emitter, capture) = get_emitter_and_capture(name, source, 'past')
-    $S0 = emitter.'generate_h_file'(capture)
+    $S0 = emitter.'generate_header'(capture)
     #say $S0
     like($S0, pattern, message)
 .end

Modified: branches/pmc_pct/compilers/pmcc/t/06-body.t
==============================================================================
--- branches/pmc_pct/compilers/pmcc/t/06-body.t	Wed May 13 15:02:50 2009	(r38751)
+++ branches/pmc_pct/compilers/pmcc/t/06-body.t	Wed May 13 18:16:22 2009	(r38752)
@@ -44,7 +44,7 @@
 
     .local pmc emitter, capture
     (emitter, capture) = get_emitter_and_capture(name, source, 'past')
-    $S0 = emitter.'generate_c_file'(capture)
+    $S0 = emitter.'generate_c_code'(capture)
     #say $S0
     like($S0, pattern, message)
 .end

Modified: branches/pmc_pct/compilers/pmcc/t/07-default.t
==============================================================================
--- branches/pmc_pct/compilers/pmcc/t/07-default.t	Wed May 13 15:02:50 2009	(r38751)
+++ branches/pmc_pct/compilers/pmcc/t/07-default.t	Wed May 13 18:16:22 2009	(r38752)
@@ -14,7 +14,7 @@
     .local string generated
     $S0 = _slurp('t/data/default.pmc')
     (emitter, capture) = get_emitter_and_capture('t/data/default.pmc', $S0, 'past')
-    generated = emitter.'generate_c_file'(capture)
+    generated = emitter.'generate_c_code'(capture)
 
     say generated
 


More information about the parrot-commits mailing list