[svn:parrot] r37968 - trunk/compilers/pct/src/POST

pmichaud at svn.parrot.org pmichaud at svn.parrot.org
Tue Apr 7 22:33:51 UTC 2009


Author: pmichaud
Date: Tue Apr  7 22:33:51 2009
New Revision: 37968
URL: https://trac.parrot.org/parrot/changeset/37968

Log:
[pct]: Refactor POST code generation in preparation for bytecode annotations.

Modified:
   trunk/compilers/pct/src/POST/Compiler.pir

Modified: trunk/compilers/pct/src/POST/Compiler.pir
==============================================================================
--- trunk/compilers/pct/src/POST/Compiler.pir	Tue Apr  7 22:17:15 2009	(r37967)
+++ trunk/compilers/pct/src/POST/Compiler.pir	Tue Apr  7 22:33:51 2009	(r37968)
@@ -41,11 +41,9 @@
     .local pmc newself
     newself = new ['POST';'Compiler']
 
-    ##  start with empty code
-    .local pmc subcode, code
-    subcode = get_global '@!subcode'
-    code = new 'CodeString'
-    push subcode, code
+    .local pmc innerpir
+    innerpir = new 'CodeString'
+    .lex '$CODE', innerpir
 
     ##  if the root node isn't a Sub, wrap it
     $I0 = isa post, ['POST';'Sub']
@@ -58,8 +56,7 @@
     newself.'pir'(post)
 
     ##  and return whatever code was generated
-    $P0 = pop subcode
-    .return ($P0)
+    .return (innerpir)
 .end
 
 
@@ -71,18 +68,15 @@
 
 .sub 'pir_children' :method
     .param pmc node
-    .local pmc code, iter
-    code = new 'CodeString'
+    .local pmc iter
     iter = node.'iterator'()
   iter_loop:
     unless iter goto iter_end
     .local pmc cpost
     cpost = shift iter
     $P0 = self.'pir'(cpost)
-    code .= $P0
     goto iter_loop
   iter_end:
-    .return (code)
 .end
 
 
@@ -162,10 +156,9 @@
     goto pirop_emit
 
   pirop_emit:
-    .local pmc code
-    code = new 'CodeString'
-    code.'emit'(fmt, arglist :flat, 'r'=>result, 'n'=>name, 'i'=>invocant, 't'=>result)
-    .return (code)
+    .local pmc subpir
+    subpir = find_caller_lex '$SUBPIR'
+    subpir.'emit'(fmt, arglist :flat, 'r'=>result, 'n'=>name, 'i'=>invocant, 't'=>result)
 .end
 
 
@@ -177,12 +170,10 @@
 
 .sub 'pir' :method :multi(_, ['POST';'Label'])
     .param pmc node
-    .local string code, value
+    .local pmc subpir, value
     value = node.'result'()
-    code = '  '
-    code .= value
-    code .= ":\n"
-    .return (code)
+    subpir = find_caller_lex '$SUBPIR'
+    subpir.'emit'('  %0:', value)
 .end
 
 
@@ -197,13 +188,11 @@
 .sub 'pir' :method :multi(_, ['POST';'Sub'])
     .param pmc node
 
-    .local pmc subcode
-    subcode = get_global '@!subcode'
-    $P0 = new 'CodeString'
-    push subcode, $P0
-
-    .local pmc code
-    code = new 'CodeString'
+    .local pmc innerpir, subpir
+    subpir = new 'CodeString'
+    .lex '$SUBPIR', subpir
+    innerpir = new 'CodeString'
+    .lex '$CODE', innerpir
 
     .local string name, pirflags
     name = node.'name'()
@@ -233,7 +222,7 @@
     if null outerpost goto pirflags_done
     unless outerpost goto pirflags_done
     outername = outerpost.'subid'()
-    $S0 = code.'escape'(outername)
+    $S0 = subpir.'escape'(outername)
     pirflags = concat pirflags, ' :outer('
     concat pirflags, $S0
     concat pirflags, ')'
@@ -255,7 +244,7 @@
     ns = $P0
   have_ns:
     set_global '$?NAMESPACE', ns
-    nskey = code.'key'(ns)
+    nskey = subpir.'key'(ns)
 
   subpir_start:
     $P0 = node.'compiler'()
@@ -266,17 +255,17 @@
     $P0 = new 'Hash'
   have_compiler_args:
     $P0 = self.'hll_pir'(node, 'name'=>name, 'namespace'=>ns, 'pirflags'=>pirflags, $P0 :named :flat)
-    code .= $P0
+    subpir .= $P0
     goto subpir_done
 
   subpir_post:
     unless hll goto subpir_ns
-    $P0 = code.'escape'(hll)
-    code.'emit'("\n.HLL %0", $P0)
+    $P0 = subpir.'escape'(hll)
+    subpir.'emit'("\n.HLL %0", $P0)
   subpir_ns:
-    code.'emit'("\n.namespace %0", nskey)
-    $S0 = code.'escape'(name)
-    code.'emit'(".sub %0 %1", $S0, pirflags)
+    subpir.'emit'("\n.namespace %0", nskey)
+    $S0 = subpir.'escape'(name)
+    subpir.'emit'(".sub %0 %1", $S0, pirflags)
     .local pmc paramlist
     paramlist = node['paramlist']
     if null paramlist goto paramlist_done
@@ -286,25 +275,21 @@
     unless iter goto paramlist_done
     $P0 = shift iter
     if null $P0 goto param_loop
-    code .= $P0
+    subpir .= $P0
     goto param_loop
   paramlist_done:
 
-    $P0 = self.'pir_children'(node)
-    code .= $P0
-    code.'emit'(".end\n\n")
+    self.'pir_children'(node)
+    subpir.'emit'(".end\n\n")
 
   subpir_done:
-    $P0 = pop subcode
-    code .= $P0
-    $P0 = subcode[-1]
-    $P0 .= code
-
+    .local pmc outerpir
+    outerpir = find_caller_lex '$CODE'
+    outerpir .= subpir
+    outerpir .= innerpir
+    
     set_global '$?NAMESPACE', outerns
     set_global '$?HLL', outerhll
-
-    code = new 'CodeString'
-    .return (code)
 .end
 
 


More information about the parrot-commits mailing list