[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