aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog9
-rw-r--r--src/interp/buildom.boot6
-rw-r--r--src/interp/compiler.boot6
-rw-r--r--src/interp/g-opt.boot2
4 files changed, 15 insertions, 8 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index b7e63e94..2cfe0d36 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,14 @@
2011-02-13 Gabriel Dos Reis <gdr@cs.tamu.edu>
+ * interp/buildom.boot (mkNewUnionFunList): Align arity of
+ 'case' implementation to declared signature.
+ (mkUnionFunList): Likewise.
+ * interp/compiler.boot (compCase1): 'case' is now unconditionally
+ binary.
+ * interp/g-opt.boot (optCond): Fix thinko.
+
+2011-02-13 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
* interp/g-opt.boot (optCond): Get rid of double negatives when
possible.
* interp/g-util.boot (assumeProperty): Remove.
diff --git a/src/interp/buildom.boot b/src/interp/buildom.boot
index ce70aa08..b2b5c8c3 100644
--- a/src/interp/buildom.boot
+++ b/src/interp/buildom.boot
@@ -351,7 +351,7 @@ mkNewUnionFunList(name,form is ["Union",:listOfEntries],e) ==
[[["construct",[name,type],["XLAM",["#1"],["%makepair",i,"#1"]]],
["elt",[type,name,tag],cdownFun],
["case",[$Boolean,name,tag],
- ["XLAM",["#1"],['%ieq,['%head,"#1"],i]]]]
+ ["XLAM",["#1","#2"],['%ieq,['%head,"#1"],i]]]]
for [.,tag,type] in listOfEntries for i in 0..])] where
cdownFun() ==
gg:=gensym()
@@ -413,8 +413,8 @@ mkUnionFunList(op,form is ["Union",:listOfEntries],e) ==
["XLAM",["#1"],"#1"]
typeFun() ==
p is ['%ieq,['%head,x],n] =>
- ["XLAM",["#1"],['%ieq,['%head,x],n]]
- ["XLAM",["#1"],p]
+ ["XLAM",["#1","#2"],['%ieq,['%head,x],n]]
+ ["XLAM",["#1","#2"],p]
cList:= substitute(dollarIfRepHack op,g,cList)
[cList,e]
diff --git a/src/interp/compiler.boot b/src/interp/compiler.boot
index 597e07cb..9f7976cb 100644
--- a/src/interp/compiler.boot
+++ b/src/interp/compiler.boot
@@ -1529,10 +1529,8 @@ compCase1(x,m,e) ==
and modeEqual(s,m')] or return nil
fn:= (or/[mm for (mm := [.,[cond,selfn]]) in u | cond=true]) or return nil
fn := genDeltaEntry(["case",:fn],e)
- -- user-defined `case' functions really are binary, as opposed to
- -- the compiler-synthetized versions for Union instances.
- not isUnionMode(m',e') => [['%call,fn,x',MKQ m],$Boolean,e']
- [['%call,fn,x'],$Boolean,e']
+ [['%call,fn,x',MKQ m],$Boolean,e']
+
++ For `case' operation implemented in library, the second operand
diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot
index 08683f80..d18899dc 100644
--- a/src/interp/g-opt.boot
+++ b/src/interp/g-opt.boot
@@ -312,7 +312,7 @@ optCond (x is ['%when,:l]) ==
optCond ['%when,[['%or,p1,p2],:c1],['%otherwise,:c3]]
x
for y in tails l repeat
- c := first c
+ c := first y
if c is [['%not,['%not,p]],:.] then
c.first := p
while y is [[a1,c1],[a2,c2],:y'] and EqualBarGensym(c1,c2) repeat