[svn:parrot] r38439 - branches/pmc_pct/compilers/pmc/src/emitter

bacek at svn.parrot.org bacek at svn.parrot.org
Sat May 2 05:39:01 UTC 2009


Author: bacek
Date: Sat May  2 05:39:00 2009
New Revision: 38439
URL: https://trac.parrot.org/parrot/changeset/38439

Log:
Reimplement generate_h_file in NQP

Modified:
   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/pmc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir	Sat May  2 05:18:00 2009	(r38438)
+++ branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir	Sat May  2 05:39:00 2009	(r38439)
@@ -54,54 +54,6 @@
 
 
 
-=item C<generate_h_file_functions>
-
-Generate C declarations for vtable functions
-
-=cut
-
-.sub 'generate_h_file_functions' :method
-    .local 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
-
-    past = self.'past'()
-    pmc_name = past.'name'()
-
-    $P0 = get_hll_global ['PMC'; 'VTableInfo'], 'vtable_hash'
-    vtable_hash = $P0()
-    
-    concat res, "void Parrot_"
-    concat res, pmc_name
-    concat res, "_class_init(PARROT_INTERP, int, int);\n" 
-
-    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
-    push res_builder, ";\n"
-
-    $S0 = join '', res_builder
-    concat res, $S0
-
-    goto loop
-
-  done:
-    .return (res)
-.end
 
 =item C<generate_c_file>
 
@@ -272,6 +224,7 @@
     .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:18:00 2009	(r38438)
+++ branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm	Sat May  2 05:39:00 2009	(r38439)
@@ -33,6 +33,48 @@
     $res
 }
 
+# =item C<generate_h_file_functions>
+# 
+# Generate C declarations for vtable functions
+# 
+# =cut
+
+method generate_h_file_functions() {
+    my $past := self.past;
+    my %vtables := PMC::VTableInfo::vtable_hash();
+    
+    my @res_builder;
+
+    @res_builder.push("void Parrot_" ~ self.name ~ "_class_init(PARROT_INTERP, int, int);\n");
+
+    my %vtables := self.vtables;
+
+    for %vtables {
+        my $entry := %vtables{$_};
+        @res_builder.push(self.generate_signature($entry, "") ~ ";\n");
+    };
+
+    join('', @res_builder);
+}
+
+method vtables() {
+    self.past.vtables;
+}
+
+method generate_signature($entry, $prefix) {
+    my @res;
+
+    @res.push('PARROT_EXPORT ' ~ $entry.returns() ~ ' Parrot_' ~ self.name ~ '_' ~ $entry.name);
+
+    @res.push('(PARROT_INTERP');
+    for @($entry<parameters>) {
+        @res.push(', ' ~ $_.returns() ~ $_.name);
+    }
+    @res.push(')');
+
+    join('', @res);
+}
+
 # Local Variables:
 #   mode: pir
 #   fill-column: 100


More information about the parrot-commits mailing list