Here's a patch to re-fix comparisions in the Scheme compiler.  The
patch:

   - Makes (<),(>),(<=),(>=) and (=) behave correctly on more than two
     args.

   - Adds tests to affirm this and fixes tests that were incorrect.

Sidenote: I don't think it's going to be possible to do static type
inference with Scheme...  At least not once we have (set) and (let)
anyway!  As a result, I think we need move everything into PMCs ASAP.
After that we won't need a more complicated _save() and _restore()
system since we'll only be ever be generating Px register references.
Does that make sense to you?

-sam
PS: CVS! CVS! CVS CVS CVS!
diff -ru scheme.orig/Scheme/Generator.pm scheme/Scheme/Generator.pm
--- scheme.orig/Scheme/Generator.pm     Sat Oct 20 11:10:01 2001
+++ scheme/Scheme/Generator.pm  Tue Oct 23 11:29:46 2001
@@ -250,8 +250,9 @@
   $self->_add_inst('','set',["I$return",0]);

   $self->_generate($node->{children}[0],$temp[0]);

   for(1..$#{$node->{children}}) {

-    $self->_generate($node->{children}[1],$temp[1]);

+    $self->_generate($node->{children}[$_],$temp[1]);

     $self->_add_inst('','ne',["I$temp[0]","I$temp[1]","DONE_$label"]);

+    ($temp[0], $temp[1]) = ($temp[1], $temp[0]);

   }

   $self->_add_inst('','set',["I$return",1]);

   $self->_add_inst("DONE_$label");

@@ -266,8 +267,9 @@
   $self->_add_inst('','set',["I$return",0]);

   $self->_generate($node->{children}[0],$temp[0]);

   for(1..$#{$node->{children}}) {

-    $self->_generate($node->{children}[1],$temp[1]);

+    $self->_generate($node->{children}[$_],$temp[1]);

     $self->_add_inst('','ge',["I$temp[0]","I$temp[1]","DONE_$label"]);

+    ($temp[0], $temp[1]) = ($temp[1], $temp[0]);

   }

   $self->_add_inst('','set',["I$return",1]);

   $self->_add_inst("DONE_$label");

@@ -282,8 +284,9 @@
   $self->_add_inst('','set',["I$return",0]);

   $self->_generate($node->{children}[0],$temp[0]);

   for(1..$#{$node->{children}}) {

-    $self->_generate($node->{children}[1],$temp[1]);

+    $self->_generate($node->{children}[$_],$temp[1]);

     $self->_add_inst('','le',["I$temp[0]","I$temp[1]","DONE_$label"]);

+    ($temp[0], $temp[1]) = ($temp[1], $temp[0]);

   }

   $self->_add_inst('','set',["I$return",1]);

   $self->_add_inst("DONE_$label");

@@ -298,8 +301,9 @@
   $self->_add_inst('','set',["I$return",0]);

   $self->_generate($node->{children}[0],$temp[0]);

   for(1..$#{$node->{children}}) {

-    $self->_generate($node->{children}[1],$temp[1]);

+    $self->_generate($node->{children}[$_],$temp[1]);

     $self->_add_inst('','gt',["I$temp[0]","I$temp[1]","DONE_$label"]);

+    ($temp[0], $temp[1]) = ($temp[1], $temp[0]);

   }

   $self->_add_inst('','set',["I$return",1]);

   $self->_add_inst("DONE_$label");

@@ -314,8 +318,9 @@
   $self->_add_inst('','set',["I$return",0]);

   $self->_generate($node->{children}[0],$temp[0]);

   for(1..$#{$node->{children}}) {

-    $self->_generate($node->{children}[1],$temp[1]);

+    $self->_generate($node->{children}[$_],$temp[1]);

     $self->_add_inst('','lt',["I$temp[0]","I$temp[1]","DONE_$label"]);

+    ($temp[0], $temp[1]) = ($temp[1], $temp[0]);

   }

   $self->_add_inst('','set',["I$return",1]);

   $self->_add_inst("DONE_$label");

Only in scheme/t/arith: #logic44.pasm#
Only in scheme/t/arith: .#logic44.pasm
diff -ru scheme.orig/t/arith/logic.t scheme/t/arith/logic.t
--- scheme.orig/t/arith/logic.t Sat Oct 20 18:53:20 2001
+++ scheme/t/arith/logic.t      Tue Oct 23 11:32:23 2001
@@ -1,6 +1,6 @@
 #! perl -w
 
-use Scheme::Test tests => 49;
+use Scheme::Test tests => 51;
 
 ###
 ### Zero?
@@ -194,9 +194,9 @@
 (write (> 2 1 0))
 CODE
 
-#output_is(<<'CODE', 0, 'write (> 2 1 1))');
-#(write (> 2 1 1))
-#CODE
+output_is(<<'CODE', 0, 'write (> 2 1 1))');
+(write (> 2 1 1))
+CODE
 
 ###
 ### LEQ (<=)
@@ -218,8 +218,8 @@
 (write (<= 2 1 0))
 CODE
 
-output_is(<<'CODE', 0, 'write (<= 2 1 1))');
-(write (<= 2 1 1))
+output_is(<<'CODE', 1, 'write (<= 1 2 2))');
+(write (<= 1 2 2))
 CODE
 
 ###
@@ -246,7 +246,10 @@
 (write (>= 2 1 1))
 CODE
 
-output_is(<<'CODE', 1, 'write (>= 2 1 2))');
+output_is(<<'CODE', 0, 'write (>= 2 1 2))');
 (write (>= 2 1 2))
 CODE
 
+output_is(<<'CODE', 0, 'write (>= 2 3 2))');
+(write (>= 2 3 2))
+CODE

Reply via email to