On Tuesday 23 September 2008 09:35:05 Moritz Lenz wrote:
> %hash.pairs.sort needs infix:<cmp> to work properly with Pair as input.
>
> It should be easy to add a multi that does this by first comparing the
> key, and if they are equal the value.
>
> When this is done most (or all) of the skip markers in
> t/spec/S29-hash/pairs.t can (hopefully) be removed.
Something like this?
-- c
=== src/builtins/cmp.pir
==================================================================
--- src/builtins/cmp.pir (revision 31423)
+++ src/builtins/cmp.pir (local)
@@ -140,7 +140,7 @@
.end
-.sub 'infix:cmp'
+.sub 'infix:cmp' :multi(_,_)
.param pmc a
.param pmc b
$I0 = cmp a, b
=== src/classes/Pair.pir
==================================================================
--- src/classes/Pair.pir (revision 31423)
+++ src/classes/Pair.pir (local)
@@ -93,7 +93,28 @@
.return $P0.'new'('key'=>key, 'value'=>value)
.end
+.sub 'infix:cmp' :multi(Pair, Pair)
+ .param pmc a
+ .param pmc b
+ .local pmc a_key
+ .local pmc b_key
+ a_key = a.'key'()
+ b_key = b.'key'()
+ $P0 = 'infix:<cmp>'(a_key, b_key)
+ unless $P0 goto compare_values
+ .return( $P0 )
+
+ compare_values:
+ .local pmc a_value
+ .local pmc b_value
+ a_value = a.'value'()
+ b_value = b.'value'()
+ $P0 = 'infix:<cmp>'(a_value, b_value)
+ .return ($P0)
+.end
+
+
=back
=cut