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