[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