[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