[svn:parrot] r38440 - in branches/pmc_pct/compilers/pmc/src: . emitter
bacek at svn.parrot.org
bacek at svn.parrot.org
Sat May 2 05:58:24 UTC 2009
Author: bacek
Date: Sat May 2 05:58:23 2009
New Revision: 38440
URL: https://trac.parrot.org/parrot/changeset/38440
Log:
Move emitting C code to pmc.pm
Modified:
branches/pmc_pct/compilers/pmc/src/emitter.pm
branches/pmc_pct/compilers/pmc/src/emitter/c.pir
branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir
branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm
Modified: branches/pmc_pct/compilers/pmc/src/emitter.pm
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter.pm Sat May 2 05:39:00 2009 (r38439)
+++ branches/pmc_pct/compilers/pmc/src/emitter.pm Sat May 2 05:58:23 2009 (r38440)
@@ -40,7 +40,7 @@
# Generate header.
dont_edit($filename)
# PMC functions
- ~ $pmc_emitter.generate_c_file($past)
+ ~ $pmc_emitter.generate_c_file()
# C code
~ c_code_coda();
Modified: branches/pmc_pct/compilers/pmc/src/emitter/c.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter/c.pir Sat May 2 05:39:00 2009 (r38439)
+++ branches/pmc_pct/compilers/pmc/src/emitter/c.pir Sat May 2 05:58:23 2009 (r38440)
@@ -21,7 +21,7 @@
=cut
-.sub 'emit' :method
+.sub 'emit'
.param pmc entry
.local pmc res
@@ -32,7 +32,7 @@
$P1 = shift $P0
#print 'P1 '
#say $P1
- $S0 = self.'!generate_body_part'($P1)
+ $S0 = '!generate_body_part'($P1)
push res, $S0
goto loop
done:
@@ -49,7 +49,7 @@
=cut
-.sub '!generate_body_part' :method :multi(_, ['PAST';'Op'])
+.sub '!generate_body_part' :multi(['PAST';'Op'])
.param pmc past
$S0 = past['inline']
.return ($S0)
Modified: branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir Sat May 2 05:39:00 2009 (r38439)
+++ branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir Sat May 2 05:58:23 2009 (r38440)
@@ -53,178 +53,6 @@
.end
-
-
-=item C<generate_c_file>
-
-Generate C file for PMC.
-
-=cut
-
-.sub 'generate_c_file' :method
- .param pmc past
- .local string res
-
- .local string guard
- .local string name
-
- $S0 = self.'generate_c_file_functions'(past)
- concat res, $S0
-
- $S0 = self.'!generate_class_init'(past)
- concat res, $S0
-
- .return (res)
-.end
-
-=item C<generate_c_file_functions>
-
-Generate C declarations for vtable functions
-
-=cut
-
-.sub 'generate_c_file_functions' :method
- .param pmc past
- .local string res
- .local pmc vtable_info, vtable_hash
- .local pmc vtables, it, entry, class_init
- .local string pmc_name, vtable_name
-
- .local pmc res_builder
-
- pmc_name = past.'name'()
-
- $P0 = get_hll_global ['PMC'; 'VTableInfo'], 'vtable_hash'
- vtable_hash = $P0()
-
- vtables = self.'!vtables'(past)
-
- it = iter vtables
- loop:
- unless it goto done
- res_builder = new 'ResizableStringArray'
- vtable_name = shift it
- entry = vtables[vtable_name]
- vtable_info = vtable_hash[vtable_name]
-
- # Generate 2 methods. One for read, one for write.
- $S0 = self.'!generate_signature'(pmc_name, entry, 0 :named('ro'))
- push res_builder, $S0
- $P0 = new ['PMC';'Emitter';'C']
- $S0 = $P0.'emit'(entry)
- push res_builder, $S0
-
- $S0 = join '', res_builder
- concat res, $S0
-
- goto loop
-
- done:
- .return (res)
-.end
-
-
-=item C<!generate_signature>
-
-Generate full signature of vtable.
-
-=cut
-
-.sub '!generate_signature' :method
- .param string pmc_name
- .param pmc entry
- .param int ro :named('ro')
-
- .local pmc res
- .local string vtable_name
- vtable_name = entry.'name'()
-
- res = new 'ResizableStringArray'
- push res, 'PARROT_EXPORT '
- $S0 = entry.'returns'()
- push res, $S0
- push res, ' Parrot_'
- push res, pmc_name
- push res, '_'
- push res, vtable_name
- push res, '(PARROT_INTERP'
-
- .local pmc it
- $P1 = entry['parameters']
- it = $P1.'iterator'()
- param_loop:
- unless it goto param_done
- $P2 = shift it
-
- push res, ', '
- $S0 = $P2.'returns'()
- push res, $S0
- $S0 = $P2.'name'()
- push res, $S0
-
- goto param_loop
- param_done:
-
- push res, ")"
- $S0 = join '', res
- .return ($S0)
-.end
-
-
-=item C<!generate_class_init>
-
-Generating class_init function
-
-=cut
-
-.sub '!generate_class_init' :method
- .param pmc past
-
- .local string pmc_name
- pmc_name = past.'name'()
-
- .local pmc res
-
- res = new 'ResizableStringArray'
- push res, 'PARROT_EXPORT void '
- push res, ' Parrot_'
- push res, pmc_name
- push res, '_class_init'
- push res, '(PARROT_INTERP, int entry, int pass) '
-
- push res, "\n{\n"
-
- # Put generating of vtables here.
-
- $P0 = past['class_init']
- $I0 = defined $P0
- unless $I0 goto no_init
-
- push res, "/* class_init */\n"
- $P1 = new ['PMC';'Emitter';'C']
- $S0 = $P1.'emit'($P0)
- push res, $S0
- no_init:
-
- push res, "\n}\n"
-
-
- $S0 = join '', res
- .return ($S0)
-.end
-
-
-.sub '!class_init' :method
- .param pmc past
- .tailcall past.'class_init'()
-.end
-
-.sub '!vtables' :method
- .param pmc past
- .tailcall past.'vtables'()
-.end
-
-
# Local Variables:
# mode: pir
# fill-column: 100
Modified: branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm Sat May 2 05:39:00 2009 (r38439)
+++ branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm Sat May 2 05:58:23 2009 (r38440)
@@ -57,6 +57,64 @@
join('', @res_builder);
}
+#=item C<generate_c_file>
+#
+#Generate C file for PMC.
+#
+#=cut
+method generate_c_file() {
+ my $res :=
+ self.generate_c_file_functions()
+ ~ self.generate_class_init();
+}
+
+
+#=item C<generate_c_file_functions>
+#
+#Generate C declarations for vtable functions
+#
+#=cut
+
+method generate_c_file_functions() {
+ my $past := self.past;
+ my %vtables := self.vtables;
+
+ my @res;
+ for %vtables {
+ my $entry := %vtables{$_};
+ @res.push(self.generate_signature($entry, ""));
+ @res.push(PMC::Emitter::C::emit($entry));
+ }
+
+ join('', @res);
+}
+
+
+#=item C<!generate_class_init>
+#
+#Generating class_init function
+#
+#=cut
+
+method generate_class_init() {
+ my @res;
+ @res.push(
+ "PARROT_EXPORT void Parrot_"
+ ~ self.name
+ ~ "_class_init(PARROT_INTERP, int entry, int pass) {\n");
+
+ my $past := self.past;
+ if ($past<class_init>) {
+ @res.push("/* class_init */\n");
+ @res.push(PMC::Emitter::C::emit($past<class_init>));
+ }
+
+ @res.push("\n}\n");
+ join('', @res);
+}
+
+
+
method vtables() {
self.past.vtables;
}
More information about the parrot-commits
mailing list