Author: pmichaud
Date: Thu May  4 14:49:41 2006
New Revision: 12505

Modified:
   trunk/languages/perl6/lib/PAST.pir
   trunk/languages/perl6/lib/POST.pir
   trunk/languages/perl6/lib/grammar_optok.pg
   trunk/languages/perl6/lib/past2post.tg
   trunk/languages/perl6/lib/pge2past.tg

Log:
[perl6]:  Added initial package-scoped variable support.


Modified: trunk/languages/perl6/lib/PAST.pir
==============================================================================
--- trunk/languages/perl6/lib/PAST.pir  (original)
+++ trunk/languages/perl6/lib/PAST.pir  Thu May  4 14:49:41 2006
@@ -34,11 +34,14 @@
     addattribute $P0, '$.valtype'
     addattribute $P0, '$.val'
 
+    $P0 = subclass base, 'Perl6::PAST::Var'
+    addattribute $P0, '$.name'
+    addattribute $P0, '$.vartype'
+
     $P0 = subclass base, 'Perl6::PAST::Exp'
     $P0 = subclass base, 'Perl6::PAST::Stmt'
     $P0 = subclass base, 'Perl6::PAST::Stmts'
     $P0 = subclass base, 'Perl6::PAST::Sub'
-    $P0 = subclass base, 'Perl6::PAST::Var'
 
     $P0 = new .Integer
     $P0 = 10
@@ -288,3 +291,18 @@
 .sub '__dumplist' :method
     .return ('$.valtype $.val')
 .end
+
+
+.namespace [ 'Perl6::PAST::Var' ]
+
+.sub 'name' :method
+    .param string name         :optional
+    .param int has_name        :opt_flag
+    .return self.'attr'('$.name', name, has_name)
+.end
+
+.sub 'vartype' :method
+    .param string vartype      :optional
+    .param int has_vartype     :opt_flag
+    .return self.'attr'('$.vartype', vartype, has_vartype)
+.end

Modified: trunk/languages/perl6/lib/POST.pir
==============================================================================
--- trunk/languages/perl6/lib/POST.pir  (original)
+++ trunk/languages/perl6/lib/POST.pir  Thu May  4 14:49:41 2006
@@ -32,10 +32,15 @@
     $P0 = subclass base, 'Perl6::POST::Val'
     addattribute $P0, '$.valtype'
 
+    $P0 = subclass base, 'Perl6::POST::Var'
+    addattribute $P0, '$.vartype'
+    addattribute $P0, '$.isgen'
+
     $P0 = subclass base, 'Perl6::POST::Op'
     $P0 = subclass base, 'Perl6::POST::Ops'
     $P0 = subclass base, 'Perl6::POST::Label'
     $P0 = subclass base, 'Perl6::POST::Sub'
+    $P0 = subclass base, 'Perl6::POST::Assign'
 
 .end
 
@@ -173,6 +178,9 @@
 .namespace [ 'Perl6::POST::Sub' ]
 
 .sub 'pir' :method
+    .local pmc varhash
+    varhash = new .Hash
+    store_global 'Perl6::POST', '%!varhash', varhash
     .local pmc code, iter
     code = new 'PGE::CodeString'
     code.'emit'(".sub 'anon' :anon")
@@ -194,7 +202,6 @@
 .sub 'value' :method
     .param string value        :optional
     .param int has_value       :opt_flag
-    .local pmc v, valtype
     .return self.'attr'('$.value', value, has_value)
 .end
 
@@ -207,3 +214,71 @@
 .sub '__dumplist' :method
     .return ('$.name $.value $.valtype')
 .end
+
+
+.namespace [ 'Perl6::POST::Var' ]
+
+.sub 'vartype' :method
+    .param string vartype      :optional
+    .param int has_vartype     :opt_flag
+    .return self.'attr'('$.vartype', vartype, has_vartype)
+.end
+
+.sub 'isgen' :method
+    .param string isgen        :optional
+    .param int has_isgen       :opt_flag
+    .return self.'attr'('$.isgen', isgen, has_isgen)
+.end
+
+.sub 'pir' :method
+    ##   If we've already generated the pir for this variable, don't
+    ##   do it a second time.
+    $I0 = self.'isgen'()
+    if $I0 == 0 goto gen_pir
+    .return ('')
+
+  gen_pir:
+    .local pmc name, value, code
+    name = self.'name'()
+    value = self.'value'()
+    code = new 'PGE::CodeString'
+    code.'emit'("    %0 = find_global '%1'", value, name)
+    self.'isgen'(1)
+    .return (code)
+.end
+
+
+.sub 'assignpir' :method
+    .param pmc x
+    .local pmc name, value, xvalue, code
+    name = self.'name'()
+    value = self.'value'()
+    xvalue = x.'value'()
+    code = new 'PGE::CodeString'
+    code.'emit'("    store_global '%0', %1", name, xvalue)
+    code.'emit'("    %0 = %1", value, xvalue)
+    self.'isgen'(1)
+    .return (code)
+.end
+
+
+.namespace [ 'Perl6::POST::Assign' ]
+
+.sub 'value' :method
+    ##   return the value of our left hand side as our value
+    $P0 = self[0]
+    $P0 = $P0.'value'()
+    .return ($P0)
+.end
+
+
+.sub 'pir' :method
+    .local pmc rnode, rvalue
+    rnode = self[1]
+    rvalue = rnode.'value'()
+    .local pmc lnode
+    lnode = self[0]
+    $P0 = lnode.'assignpir'(rnode)
+    .return ($P0)
+.end
+

Modified: trunk/languages/perl6/lib/grammar_optok.pg
==============================================================================
--- trunk/languages/perl6/lib/grammar_optok.pg  (original)
+++ trunk/languages/perl6/lib/grammar_optok.pg  Thu May  4 14:49:41 2006
@@ -380,7 +380,7 @@
 
 ## assignment
 proto 'infix:=' is precedence('07=') is assoc('right')
-    is pir("    assign %0, %1") { ... }
+    is pasttype('assign') { ... }
 
 proto 'infix::=' is equiv('infix:=') { ... }
 

Modified: trunk/languages/perl6/lib/past2post.tg
==============================================================================
--- trunk/languages/perl6/lib/past2post.tg      (original)
+++ trunk/languages/perl6/lib/past2post.tg      Thu May  4 14:49:41 2006
@@ -1,4 +1,7 @@
 Perl6::PAST::Sub: post(.) = {
+    .local pmc varhash
+    varhash = new .Hash
+    store_global 'Perl6::PAST', '%varhash', varhash
     $P0 = node[0]
     $P0 = tree.'get'('post', $P0)
     .local pmc post
@@ -96,6 +99,24 @@
 }
 
 
+Perl6::PAST::Op: assign(.) = {
+    .local pmc ops
+    ops = new 'Perl6::POST::Ops'
+    ops.'init'('node'=>node)
+
+    .local pmc iter, lpast, rpast
+    iter = node.'child_iter'()
+    lpast = shift iter
+    rpast = shift iter
+    .local pmc lpost, rpost
+    lpost = tree.'get'('post', lpast)
+    rpost = tree.'get'('post', rpast)
+    ops.'add_child'(rpost)
+    ops.'add_child_new'('Perl6::POST::Assign', lpost, rpost, 'name'=>'assign')
+    .return (ops)
+}
+
+
 Perl6::PAST::Op: cond(.) = {
     .local pmc ops
     ops = new 'Perl6::POST::Ops'
@@ -244,3 +265,23 @@
     .return (ops)
 }
     
+
+Perl6::PAST::Var: post(.) = {
+    .local string name, vartype
+    .local pmc post
+    name = node.'name'()
+    vartype = node.'vartype'()
+
+    .local pmc varhash
+    varhash = find_global 'Perl6::PAST', '%varhash'
+    $I0 = exists varhash[name]
+    if $I0 == 0 goto new_post
+    post = varhash[name]
+    .return (post)
+
+  new_post:
+    post = new 'Perl6::POST::Var'
+    post.'init'('node'=>node, 'vartype'=>vartype, 'name'=>name, 'isgen'=>0)
+    varhash[name] = post
+    .return (post)
+}

Modified: trunk/languages/perl6/lib/pge2past.tg
==============================================================================
--- trunk/languages/perl6/lib/pge2past.tg       (original)
+++ trunk/languages/perl6/lib/pge2past.tg       Thu May  4 14:49:41 2006
@@ -209,13 +209,10 @@
 
 Perl6::Grammar::variable: past(.) = {
     .local pmc past
-    .local string scope
 
-    past = new 'Perl6::PAST::Var'
-    past.set_node(node)
-    past['returns'] = 'var'
     $S0 = node
-    past['variable'] = $S0
+    past = new 'Perl6::PAST::Var'
+    past.'init'('node'=>node, 'name'=>$S0, 'vartype'=>'')
     .return (past)
 }
 

Reply via email to