|
|
Author: jonathan
Date: Mon Dec 31 11:39:08 2007
New Revision: 24354
Modified:
trunk/languages/perl6/src/builtins/cmp.pir
trunk/languages/perl6/src/builtins/junction.pir
trunk/languages/perl6/src/builtins/op.pir
trunk/languages/perl6/src/classes/Junction.pir
trunk/languages/perl6/src/parser/grammar-oper.pg
Log:
[perl6] Junction support for most comparrison operators and many infix
operators too.
Modified: trunk/languages/perl6/src/builtins/cmp.pir
==============================================================================
--- trunk/languages/perl6/src/builtins/cmp.pir (original)
+++ trunk/languages/perl6/src/builtins/cmp.pir Mon Dec 31 11:39:08 2007
@@ -12,7 +12,7 @@
.namespace
-.sub 'infix:=='
+.sub 'infix:==' :multi(_,_)
.param num a
.param num b
$I0 = iseq a, b
@@ -20,7 +20,7 @@
.end
-.sub 'infix:!='
+.sub 'infix:!=' :multi(_,_)
.param num a
.param num b
$I0 = isne a, b
@@ -28,7 +28,7 @@
.end
-.sub 'infix:<'
+.sub 'infix:<' :multi(_,_)
.param num a
.param num b
$I0 = islt a, b
@@ -36,7 +36,7 @@
.end
-.sub 'infix:<='
+.sub 'infix:<=' :multi(_,_)
.param num a
.param num b
$I0 = isle a, b
@@ -44,7 +44,7 @@
.end
-.sub 'infix:>'
+.sub 'infix:>' :multi(_,_)
.param num a
.param num b
$I0 = isgt a, b
@@ -52,7 +52,7 @@
.end
-.sub 'infix:>='
+.sub 'infix:>=' :multi(_,_)
.param num a
.param num b
$I0 = isge a, b
@@ -68,7 +68,7 @@
.end
-.sub 'infix:eq'
+.sub 'infix:eq' :multi(_,_)
.param string a
.param string b
$I0 = iseq a, b
@@ -76,7 +76,7 @@
.end
-.sub 'infix:ne'
+.sub 'infix:ne' :multi(_,_)
.param string a
.param string b
$I0 = isne a, b
@@ -84,7 +84,7 @@
.end
-.sub 'infix:lt'
+.sub 'infix:lt' :multi(_,_)
.param string a
.param string b
$I0 = islt a, b
@@ -92,7 +92,7 @@
.end
-.sub 'infix:le'
+.sub 'infix:le' :multi(_,_)
.param string a
.param string b
$I0 = isle a, b
@@ -100,7 +100,7 @@
.end
-.sub 'infix:gt'
+.sub 'infix:gt' :multi(_,_)
.param string a
.param string b
$I0 = isgt a, b
@@ -108,7 +108,7 @@
.end
-.sub 'infix:ge'
+.sub 'infix:ge' :multi(_,_)
.param string a
.param string b
$I0 = isge a, b
Modified: trunk/languages/perl6/src/builtins/junction.pir
==============================================================================
--- trunk/languages/perl6/src/builtins/junction.pir (original)
+++ trunk/languages/perl6/src/builtins/junction.pir Mon Dec 31 11:39:08 2007
@@ -55,7 +55,7 @@
junc."!values"(args)
junc."!type"(JUNCTION_TYPE_ANY)
-
+
.return (junc)
.end
@@ -115,11 +115,711 @@
junc."!values"(args)
junc."!type"(JUNCTION_TYPE_NONE)
-
.return (junc)
.end
+=item C<infix:**(...)>
+
+Override exponentiation for junctions.
+
+=cut
+
+.sub 'infix:**' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global 'infix:**'
+ $P1 = infix_junction_helper($P0, j1, j2)
+ .return ($P1)
+.end
+
+.sub 'infix:**' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global 'infix:**'
+ $P1 = infix_junction_helper($P0, j, x)
+ .return ($P1)
+.end
+
+.sub 'infix:**' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global 'infix:**'
+ $P1 = infix_junction_helper($P0, j, x, 1)
+ .return ($P1)
+.end
+
+
+=item C<infix:%(...)>
+
+Override modulo for junctions.
+
+=cut
+
+.sub 'infix:%' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global 'infix:%'
+ $P1 = infix_junction_helper($P0, j1, j2)
+ .return ($P1)
+.end
+
+.sub 'infix:%' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global 'infix:%'
+ $P1 = infix_junction_helper($P0, j, x)
+ .return ($P1)
+.end
+
+.sub 'infix:%' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global 'infix:%'
+ $P1 = infix_junction_helper($P0, j, x, 1)
+ .return ($P1)
+.end
+
+
+=item C<infix:/(...)>
+
+Override division for junctions.
+
+=cut
+
+.sub 'infix:/' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global 'infix:/'
+ $P1 = infix_junction_helper($P0, j1, j2)
+ .return ($P1)
+.end
+
+.sub 'infix:/' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global 'infix:/'
+ $P1 = infix_junction_helper($P0, j, x)
+ .return ($P1)
+.end
+
+.sub 'infix:/' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global 'infix:/'
+ $P1 = infix_junction_helper($P0, j, x, 1)
+ .return ($P1)
+.end
+
+
+=item C<infix:*(...)>
+
+Override multiply for junctions.
+
+=cut
+
+.sub 'infix:*' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global 'infix:*'
+ $P1 = infix_junction_helper($P0, j1, j2)
+ .return ($P1)
+.end
+
+.sub 'infix:*' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global 'infix:*'
+ $P1 = infix_junction_helper($P0, j, x)
+ .return ($P1)
+.end
+
+.sub 'infix:*' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global 'infix:*'
+ $P1 = infix_junction_helper($P0, j, x, 1)
+ .return ($P1)
+.end
+
+
+=item C<infix:x(...)>
+
+Override repeat for junctions.
+
+=cut
+
+.sub 'infix:x' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global 'infix:x'
+ $P1 = infix_junction_helper($P0, j1, j2)
+ .return ($P1)
+.end
+
+.sub 'infix:x' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global 'infix:x'
+ $P1 = infix_junction_helper($P0, j, x)
+ .return ($P1)
+.end
+
+.sub 'infix:x' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global 'infix:x'
+ $P1 = infix_junction_helper($P0, j, x, 1)
+ .return ($P1)
+.end
+
+
+=item C<infix:xx(...)>
+
+Override array repeat for junctions.
+
+=cut
+
+.sub 'infix:xx' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global 'infix:xx'
+ $P1 = infix_junction_helper($P0, j1, j2)
+ .return ($P1)
+.end
+
+.sub 'infix:xx' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global 'infix:xx'
+ $P1 = infix_junction_helper($P0, j, x)
+ .return ($P1)
+.end
+
+.sub 'infix:xx' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global 'infix:xx'
+ $P1 = infix_junction_helper($P0, j, x, 1)
+ .return ($P1)
+.end
+
+
+=item C<infix:+(...)>
+
+Override addition for junctions.
+
+=cut
+
+.sub 'infix:+' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global 'infix:+'
+ $P1 = infix_junction_helper($P0, j1, j2)
+ .return ($P1)
+.end
+
+.sub 'infix:+' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global 'infix:+'
+ $P1 = infix_junction_helper($P0, j, x)
+ .return ($P1)
+.end
+
+.sub 'infix:+' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global 'infix:+'
+ $P1 = infix_junction_helper($P0, j, x, 1)
+ .return ($P1)
+.end
+
+
+=item C<infix:-(...)>
+
+Override subtraction for junctions.
+
+=cut
+
+.sub 'infix:-' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global 'infix:-'
+ $P1 = infix_junction_helper($P0, j1, j2)
+ .return ($P1)
+.end
+
+.sub 'infix:-' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global 'infix:-'
+ $P1 = infix_junction_helper($P0, j, x)
+ .return ($P1)
+.end
+
+.sub 'infix:-' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global 'infix:-'
+ $P1 = infix_junction_helper($P0, j, x, 1)
+ .return ($P1)
+.end
+
+
+=item C<infix:==(...)>
+
+Override numerical equality for junctions.
+
+=cut
+
+.sub 'infix:==' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:=="
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:==' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:=="
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:==' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:=="
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:!=(...)>
+
+Override numerical inequality for junctions.
+
+=cut
+
+.sub 'infix:!=' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:!="
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:!=' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:!="
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:!=' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:!="
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:>(...)>
+
+Override numerical greater than for junctions.
+
+=cut
+
+.sub 'infix:>' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:>"
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:>' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:>"
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:>' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:>"
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:<(...)>
+
+Override numerical less than for junctions.
+
+=cut
+
+.sub 'infix:<' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:<"
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:<' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:<"
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:<' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:<"
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:>=(...)>
+
+Override numerical greater than or equal to for junctions.
+
+=cut
+
+.sub 'infix:>=' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:>="
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:>=' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:>="
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:>=' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:>="
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:<=(...)>
+
+Override numerical less than or equal to for junctions.
+
+=cut
+
+.sub 'infix:<=' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:<="
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:<=' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:<="
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:<=' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:<="
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:eq(...)>
+
+Override string equality for junctions.
+
+=cut
+
+.sub 'infix:eq' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:eq"
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:eq' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:eq"
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:eq' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:eq"
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:ne(...)>
+
+Override string inequality for junctions.
+
+=cut
+
+.sub 'infix:ne' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:ne"
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:ne' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:ne"
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:ne' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:ne"
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:lt(...)>
+
+Override string less than for junctions.
+
+=cut
+
+.sub 'infix:lt' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:lt"
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:lt' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:lt"
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:lt' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:lt"
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:gt(...)>
+
+Override string greater than for junctions.
+
+=cut
+
+.sub 'infix:gt' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:gt"
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:gt' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:gt"
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:gt' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:gt"
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:le(...)>
+
+Override string less than or equal for junctions.
+
+=cut
+
+.sub 'infix:le' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:le"
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:le' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:le"
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:le' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:le"
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+=item C<infix:ge(...)>
+
+Override string greater than or equal for junctions.
+
+=cut
+
+.sub 'infix:ge' :multi('Junction','Junction')
+ .param pmc j1
+ .param pmc j2
+ $P0 = find_global "infix:ge"
+ .return junction_comparrison_helper($P0, j1, j2, 0)
+.end
+
+.sub 'infix:ge' :multi('Junction',_)
+ .param pmc j
+ .param pmc x
+ $P0 = find_global "infix:ge"
+ .return junction_comparrison_helper($P0, j, x, 0)
+.end
+
+.sub 'infix:ge' :multi(_,'Junction')
+ .param pmc x
+ .param pmc j
+ $P0 = find_global "infix:ge"
+ .return junction_comparrison_helper($P0, j, x, 1)
+.end
+
+
+# Helper sub for applying non-comparative infixes to junctions.
+.sub infix_junction_helper :anon
+ .param pmc op_sub
+ .param pmc j
+ .param pmc x
+ .param int second_arg :optional
+
+ # Build hash of results, to ensure we are unique.
+ .local pmc ResultHash
+ ResultHash = new 'Hash'
+
+ # Loop over and call multiply on each value.
+ # Get values array.
+ .local pmc values
+ values = j.'values'()
+
+ # Loop over it and call inc on each element.
+ .local int count
+ .local int i
+ .local pmc cur_elem
+ count = elements values
+ i = 0
+loop:
+ if i >= count goto loop_end
+ cur_elem = values[i]
+ if second_arg goto sa
+ $P0 = op_sub(cur_elem, x)
+ goto nsa
+sa:
+ $P0 = op_sub(x, cur_elem)
+nsa:
+ ResultHash[$P0] = 1
+ inc i
+ goto loop
+loop_end:
+
+ # Build junction of results.
+ .local pmc new_junc
+ .local pmc new_values
+ .local pmc iterator
+ .local pmc type
+
+ new_junc = new 'Junction'
+ type = j.'!type'()
+ new_junc.'!type'(type)
+
+ new_values = new 'List'
+ iterator = iter ResultHash
+nv_loop:
+ unless iterator goto nv_loop_end
+ $P0 = shift iterator
+ push new_values, $P0
+ goto nv_loop
+nv_loop_end:
+ new_junc.'!values'(new_values)
+
+ .return(new_junc)
+.end
+
+# Helper sub for junction comparrisons.
+.sub junction_comparrison_helper :anon
+ .param pmc op_func
+ .param pmc j
+ .param pmc x
+ .param int second_arg
+
+ # We need to find how many values are equal.
+ .local pmc values
+ .local int num_equal
+ .local int count
+ .local int i
+ values = j.'values'()
+ count = elements values
+ i = 0
+ num_equal = 0
+loop:
+ if i >= count goto end_loop
+ $P0 = values[i]
+ if second_arg goto sa
+ $I0 = op_func($P0, x)
+ goto not_sa
+sa:
+ $I0 = op_func(x, $P0)
+not_sa:
+ num_equal += $I0
+ inc i
+ goto loop
+end_loop:
+
+ # Now go by juction type.
+ .local int type
+ type = j.'!type'()
+ if type == JUNCTION_TYPE_ALL goto all
+ if type == JUNCTION_TYPE_ANY goto any
+ if type == JUNCTION_TYPE_ONE goto one
+ if type == JUNCTION_TYPE_NONE goto none
+
+all:
+ if num_equal == count goto ret_true
+ goto ret_false
+any:
+ if num_equal > 0 goto ret_true
+ goto ret_false
+one:
+ if num_equal == 1 goto ret_true
+ goto ret_false
+none:
+ if num_equal == 0 goto ret_true
+ goto ret_false
+
+ret_true:
+ .return(1)
+ret_false:
+ .return(0)
+.end
+
+
=back
=cut
Modified: trunk/languages/perl6/src/builtins/op.pir
==============================================================================
--- trunk/languages/perl6/src/builtins/op.pir (original)
+++ trunk/languages/perl6/src/builtins/op.pir Mon Dec 31 11:39:08 2007
@@ -43,7 +43,7 @@
## exponentiation
-.sub 'infix:**'
+.sub 'infix:**' :multi(_,_)
.param num base
.param num exp
$N0 = pow base, exp
@@ -115,23 +115,23 @@
## multiplicative
-.sub 'infix:*'
+.sub 'infix:*' :multi(_,_)
.param pmc a
.param pmc b
- $P0 = mul a, b
+ $P0 = n_mul a, b
.return ($P0)
.end
-.sub 'infix:/'
+.sub 'infix:/' :multi(_,_)
.param pmc a
.param pmc b
- $P0 = div a, b
+ $P0 = n_div a, b
.return ($P0)
.end
-.sub 'infix:%'
+.sub 'infix:%' :multi(_,_)
.param num a
.param num b
$N0 = mod a, b
@@ -139,7 +139,7 @@
.end
-.sub 'infix:x'
+.sub 'infix:x' :multi(_,_)
.param string a
.param int b
$S0 = repeat a, b
@@ -147,7 +147,7 @@
.end
-.sub 'infix:xx'
+.sub 'infix:xx' :multi(_,_)
.param string a
.param int b
$P0 = new 'ResizablePMCArray'
@@ -197,18 +197,18 @@
## additive
-.sub 'infix:+'
+.sub 'infix:+' :multi(_,_)
.param pmc a
.param pmc b
- $P0 = add a, b
+ $P0 = n_add a, b
.return ($P0)
.end
-.sub 'infix:-'
+.sub 'infix:-' :multi(_,_)
.param pmc a
.param pmc b
- $P0 = sub a, b
+ $P0 = n_sub a, b
.return ($P0)
.end
Modified: trunk/languages/perl6/src/classes/Junction.pir
==============================================================================
--- trunk/languages/perl6/src/classes/Junction.pir (original)
+++ trunk/languages/perl6/src/classes/Junction.pir Mon Dec 31 11:39:08 2007
@@ -60,8 +60,8 @@
.sub '!type' :method
.param pmc type :optional
- .param int got_type :optional
- if got_type goto ret_type
+ .param int got_type :opt_flag
+ unless got_type goto ret_type
setattribute self, "$type", type
.return()
ret_type:
@@ -114,64 +114,6 @@
.end
-=item inc
-
-Increment v-table method.
-
-=cut
-
-.sub 'increment' :method :vtable
- .local pmc values
- .local pmc elem
- .local int count
- .local int i
-
- # Get values array.
- values = getattribute self, "@values"
-
- # Loop over it and call inc on each element.
- count = elements values
- i = 0
-loop:
- if i >= count goto loop_end
- elem = values[i]
- inc elem
- values[i] = elem
- inc i
- goto loop
-loop_end:
-.end
-
-
-=item dec
-
-Decrement v-table method.
-
-=cut
-
-.sub 'decrement' :method :vtable
- .local pmc values
- .local pmc elem
- .local int count
- .local int i
-
- # Get values array.
- values = getattribute self, "@values"
-
- # Loop over it and call dec on each element.
- count = elements values
- i = 0
-loop:
- if i >= count goto loop_end
- elem = values[i]
- dec elem
- values[i] = elem
- inc i
- goto loop
-loop_end:
-.end
-
-
=back
=cut
Modified: trunk/languages/perl6/src/parser/grammar-oper.pg
==============================================================================
--- trunk/languages/perl6/src/parser/grammar-oper.pg (original)
+++ trunk/languages/perl6/src/parser/grammar-oper.pg Mon Dec 31 11:39:08 2007
@@ -21,15 +21,9 @@
{ ... }
## multiplicative operators
-proto infix:<*> is precedence('u=')
- is pirop('n_mul')
- { ... }
-proto infix:</> is equiv(infix:<*>)
- is pirop('n_div')
- { ... }
-proto infix:<%> is equiv(infix:<*>)
- is pirop('n_mod')
- { ... }
+proto infix:<*> is precedence('u=') { ... }
+proto infix:</> is equiv(infix:<*>) { ... }
+proto infix:<%> is equiv(infix:<*>) { ... }
proto infix:<+&> is equiv(infix:<*>) { ... }
proto infix:<+^> is equiv(infix:<*>) { ... }
proto infix:Â+<Â is equiv(infix:<*>) { ... }
@@ -42,12 +36,8 @@
proto infix:<mod> is equiv(infix:<*>) { ... }
## additive operators
-proto infix:<+> is precedence('t=')
- is pirop('n_add')
- { ... }
-proto infix:<-> is equiv(infix:<+>)
- is pirop('n_sub')
- { ... }
+proto infix:<+> is precedence('t=') { ... }
+proto infix:<-> is equiv(infix:<+>) { ... }
proto infix:<+|> is equiv(infix:<+>) { ... }
proto infix:<+^> is equiv(infix:<+>) { ... }
proto infix:<~|> is equiv(infix:<+>) { ... }
|
|