aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog6
-rw-r--r--src/interp/compiler.boot14
2 files changed, 11 insertions, 9 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 2621e6cb..20b34695 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2010-12-07 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * interp/compiler.boot (compThrow): Remove niladic type restriction.
+ (compCatch): Tidy.
+ (compTry): Likewise.
+
2010-12-06 Gabriel Dos Reis <gdr@cs.tamu.edu>
Add support for exception handling.
diff --git a/src/interp/compiler.boot b/src/interp/compiler.boot
index 73d0e136..ef0250a6 100644
--- a/src/interp/compiler.boot
+++ b/src/interp/compiler.boot
@@ -1152,28 +1152,24 @@ compReturn(["return",x],m,e) ==
compThrow: (%Form,%Mode,%Env) -> %Maybe %Triple
compThrow(["%Throw",x],m,e) ==
- T := comp(x,$EmptyMode,e) or return nil
- -- FIXME: at the moment, throwable expressions must be of type
- -- FIXME: instantiated from niladic constructors.
- T.mode isnt [c] or not(niladicConstructorFromDB c) =>
- stackAndThrow('"throw-operand %1b must be of known niladic type",[x])
+ T := compOrCroak(x,$EmptyMode,e)
-- An exception does not use the normal exit/return route, so
-- we don't take into account neither $exitModeStack nor $returnMode.
[['%throw,T.mode,T.expr],$NoValueMode,T.env]
compCatch: (%Form,%Mode,%Env) -> %Maybe %Triple
compCatch([x,s],m,e) ==
- [x',m',e] := compMakeDeclaration(second x, third x,e)
+ [.,m',e] := compMakeDeclaration(second x, third x,e)
T := compOrCroak(s,m,e)
- [['%catch,second x,m',T.expr],T.mode,e]
+ [['%catch,second x,m',T.expr],T.mode,T.env]
compTry: (%Form,%Mode,%Env) -> %Maybe %Triple
compTry(['%Try,x,ys,z],m,e) ==
x' := compOrCroak(x,m,e).expr
ys' := [compCatch(y,m,e).expr for y in ys]
z' :=
- z ~= nil => ['%finally,compOrCroak(z,$NoValueMode,e).expr]
- nil
+ z = nil => nil
+ ['%finally,compOrCroak(z,$NoValueMode,e).expr]
[['%try,x',ys',z'],m,e]
--% ELT