[svn:parrot] r38438 - in branches/pmc_pct/compilers/pmc: . src src/emitter

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


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

Log:
Start moving stuff from emitter/pmc.pir into emitter/pmc.pm

Added:
   branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm
Modified:
   branches/pmc_pct/compilers/pmc/pmc.pir
   branches/pmc_pct/compilers/pmc/src/emitter.pm
   branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir

Modified: branches/pmc_pct/compilers/pmc/pmc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/pmc.pir	Sat May  2 05:17:38 2009	(r38437)
+++ branches/pmc_pct/compilers/pmc/pmc.pir	Sat May  2 05:18:00 2009	(r38438)
@@ -34,6 +34,7 @@
 .include 'src/emitter/c.pir'
 
 .include 'src/gen_emitter.pir'
+.include 'src/emitter/gen_pmc.pir'
 .include 'src/gen_vtable_info.pir'
 .include 'src/parser/gen_grammar.pir'
 .include 'src/parser/gen_actions.pir'

Modified: branches/pmc_pct/compilers/pmc/src/emitter.pm
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter.pm	Sat May  2 05:17:38 2009	(r38437)
+++ branches/pmc_pct/compilers/pmc/src/emitter.pm	Sat May  2 05:18:00 2009	(r38438)
@@ -13,13 +13,13 @@
     my $filename := self.filename();
     
     # Get emitter for (specific) PMC.
-    my $pmc_emitter := get_pmc_emitter($name);
+    my $pmc_emitter := get_pmc_emitter($name, $past);
 
     $res :=  
             # Generate header.
               dont_edit($filename)
             # PMC functions
-            ~ $pmc_emitter.generate_h_file($past)
+            ~ $pmc_emitter.generate_h_file()
             # C code
             ~ c_code_coda();
 
@@ -34,7 +34,7 @@
     my $filename := self.filename();
     
     # Get emitter for (specific) PMC.
-    my $pmc_emitter := get_pmc_emitter($name);
+    my $pmc_emitter := get_pmc_emitter($name, $past);
 
     $res :=  
             # Generate header.
@@ -59,24 +59,21 @@
 
 # Get (specific) PMC emitter
 # Try to create specific emitter. In case of failure create generic one.
-sub get_pmc_emitter($name) {
+sub get_pmc_emitter($name, $past) {
 PIR q< 
     find_lex $P0, '$name'
     $S0 = $P0
-    $P1 = new 'ResizableStringArray'
-    push $P1, 'PMC'
-    push $P1, 'Emitter'
-    push $P1, $S0
-    push_eh not_found
-    %r = new $P1
-    pop_eh
-    goto done
+
+    .local pmc ctor
+    ctor = get_hll_global ['PMC';'Emitter';'PMC'], $S0
+    $I0 = defined ctor
+    if $I0 goto done
 
   not_found:
-    pop_eh
-    $P1 = split '::', 'PMC::Emitter::PMC'
-    %r = new $P1
+    ctor = get_hll_global ['PMC';'Emitter'], 'PMC'
   done:
+    find_lex $P1, '$past'
+    %r = ctor.'new'($P1)
 >;
 }
 

Modified: branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir
==============================================================================
--- branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir	Sat May  2 05:17:38 2009	(r38437)
+++ branches/pmc_pct/compilers/pmc/src/emitter/pmc.pir	Sat May  2 05:18:00 2009	(r38438)
@@ -3,6 +3,10 @@
 
 =head1 Generic PMC emitter
 
+This is PIR part of PMC emitter.
+
+TODO figure out how to implement it in NQP.
+
 =cut
 
 .namespace ['PMC';'Emitter';'PMC']
@@ -12,50 +16,44 @@
 
     p6meta = new 'P6metaclass'
 
-    p6meta.'new_class'('PMC::Emitter::PMC')
+    p6meta.'new_class'('PMC::Emitter::PMC', 'parent'=>'Capture')
 
 .end
 
-=item C<generate_h_file>
-
-Generate part of header file.
-
-=cut
-
-# "Template Method". Just override generate_h_file_functions in derived
-# classes.
-
-.sub 'generate_h_file' :method
+.sub 'new' :method
     .param pmc past
-    .local string res
 
-    .local string guard
-    .local string name
+    .local pmc res
+    $P0 = self.'HOW'()
+    $P0 = getattribute $P0, 'parrotclass'
+    res = new $P0
+
+    res['past'] = past
+    $S0 = past.'name'()
+    res['name'] = $S0
+    $S0 = 'uc'($S0)
+    res['ucname'] = $S0
 
-    name = past.'name'()
-    $S0 = 'uc'(name)
+    .return (res)
+.end
 
-    guard = 'PARROT_PMC_'
-    concat guard, $S0
-    concat guard, '_H_GUARD'
-
-    res = '#ifndef '
-    concat res, guard
-    concat res, "\n"
-    concat res, '#define '
-    concat res, guard
-    concat res, "\n"
+.sub 'past' :method
+    $P0 = self['past']
+    .return ($P0)
+.end
 
-    $S0 = self.'generate_h_file_functions'(past)
-    concat res, $S0
-    
-    concat res, '#endif /* '
-    concat res, guard
-    concat res, " */ \n"
+.sub 'name' :method
+    $S0 = self['name']
+    .return ($S0)
+.end
 
-    .return (res)
+.sub 'ucname' :method
+    $S0 = self['ucname']
+    .return ($S0)
 .end
 
+
+
 =item C<generate_h_file_functions>
 
 Generate C declarations for vtable functions
@@ -63,7 +61,7 @@
 =cut
 
 .sub 'generate_h_file_functions' :method
-    .param pmc past
+    .local pmc past
     .local string res
     .local pmc vtable_info, vtable_hash
     .local pmc vtables, it, entry, class_init
@@ -71,6 +69,7 @@
 
     .local pmc res_builder
 
+    past = self.'past'()
     pmc_name = past.'name'()
 
     $P0 = get_hll_global ['PMC'; 'VTableInfo'], 'vtable_hash'

Added: branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ branches/pmc_pct/compilers/pmc/src/emitter/pmc.pm	Sat May  2 05:18:00 2009	(r38438)
@@ -0,0 +1,40 @@
+# Copyright (C) 2009, Parrot Foundation.
+# $Id$
+
+class PMC::Emitter::PMC;
+
+# =item C<generate_h_file>
+# 
+# Generate part of header file.
+# 
+# =cut
+
+# "Template Method". Just override generate_h_file_functions in derived
+# classes.
+
+method generate_h_file() {
+    my $past := self.past;
+    my $name := self.name;
+
+    my $guard := 'PARROT_PMC_' ~ self.ucname ~ '_H_GUARD';
+    
+    # "join" is way too simple...
+    my $res := join('', (
+        '#ifndef ' ~ $guard ~ "\n",
+        '#define ' ~ $guard ~ "\n\n",
+
+        self.generate_h_file_functions(),
+
+        "\n",
+        '#endif /* ', $guard, " */ \n"
+    )
+    );
+
+    $res
+}
+
+# Local Variables:
+#   mode: pir
+#   fill-column: 100
+# End:
+# vim: expandtab shiftwidth=4:


More information about the parrot-commits mailing list