summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-08-08 08:37:51 +0000
committerpaltherr <paltherr@epfl.ch>2003-08-08 08:37:51 +0000
commit69e9c38b4ff1d47ea22a3d60070bc4a95df49f01 (patch)
treed4e4fd9c411533eb17973851e663ce74aea3c698
parent044392dffe58d196aae1acfafccafb4f6231dbe1 (diff)
downloadscala-69e9c38b4ff1d47ea22a3d60070bc4a95df49f01.tar.gz
scala-69e9c38b4ff1d47ea22a3d60070bc4a95df49f01.tar.bz2
scala-69e9c38b4ff1d47ea22a3d60070bc4a95df49f01.zip
- Enhanced exception trace computation
-rw-r--r--sources/scala/tools/scalai/Evaluator.java30
1 files changed, 14 insertions, 16 deletions
diff --git a/sources/scala/tools/scalai/Evaluator.java b/sources/scala/tools/scalai/Evaluator.java
index 1444eec8ac..da3bf90ea1 100644
--- a/sources/scala/tools/scalai/Evaluator.java
+++ b/sources/scala/tools/scalai/Evaluator.java
@@ -50,6 +50,8 @@ public class Evaluator {
public final Object[] args;
public final Object[] vars;
+ public int pos;
+
public EvaluationStack(EvaluationStack stack, CodeContainer code,
Object self, Object[] args)
{
@@ -113,12 +115,17 @@ public class Evaluator {
private Object trace(CodeContainer code, Object object, Object[] args) {
try {
- stack = new EvaluationStack(stack, code, object, args);
- return evaluate(code.code);
+ try {
+ stack = new EvaluationStack(stack, code, object, args);
+ return evaluate(code.code);
+ } catch (EvaluatorException exception) {
+ throw exception;
+ } catch (Throwable exception) {
+ return throw_(exception, "trace");
+ }
} catch (EvaluatorException exception) {
+ exception.addScalaCall(stack.symbol, stack.source, stack.pos);
throw exception;
- } catch (Throwable exception) {
- return throw_(exception, "trace");
} finally {
stack = stack.stack;
}
@@ -166,17 +173,8 @@ public class Evaluator {
Object[] args = new Object[arguments.length];
for (int i = 0; i < args.length; i++)
args[i] = evaluate(arguments[i]);
- try {
- return invoke(object, function, args);
- } catch (StackOverflowError exception) {
- return throw_(exception);
- } catch (EvaluatorException exception) {
- if (stack != null)
- exception.addScalaCall(stack.symbol, stack.source, pos);
- throw exception;
-// } catch (Throwable exception) {
-// return abort(exception);
- }
+ stack.pos = pos;
+ return invoke(object, function, args);
case Create(ScalaTemplate template):
return invoke(null, template.getConstructor(),
@@ -412,7 +410,7 @@ public class Evaluator {
case Module(CodePromise body, Object value):
if (value != null) return value;
((Variable.Module)variable).body = null;
- evaluate(body.force().code);
+ evaluate(body, null, new Object[0]);
return load(object, variable);
case Member(int index):