Index: pkg/kernel/lib/interpreter/interpreter.dart |
diff --git a/pkg/kernel/lib/interpreter/interpreter.dart b/pkg/kernel/lib/interpreter/interpreter.dart |
index 1e35f21c01145f06d989e57fb819514af26bada4..d31d5d154aaa6d99a45aa92e7b6804a1fd64a2bb 100644 |
--- a/pkg/kernel/lib/interpreter/interpreter.dart |
+++ b/pkg/kernel/lib/interpreter/interpreter.dart |
@@ -256,6 +256,13 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> { |
config.continuation, config.environment.thisInstance); |
} |
+ Configuration visitThrow(Throw node, EvalConfiguration config) { |
+ var cont = new ThrowEK(config.exceptionComponents); |
+ |
+ return new EvalConfiguration( |
+ node.expression, config.environment, config.exceptionComponents, cont); |
+ } |
+ |
// Evaluation of BasicLiterals. |
Configuration visitStringLiteral( |
StringLiteral node, EvalConfiguration config) { |
@@ -1222,6 +1229,17 @@ class InitializerListEK extends ExpressionContinuation { |
} |
} |
+class ThrowEK extends ExpressionContinuation { |
+ final ExceptionComponents exceptionComponents; |
+ |
+ ThrowEK(this.exceptionComponents); |
+ |
+ Configuration call(Value value) { |
+ return new ThrowConfiguration( |
+ exceptionComponents.handler, value, exceptionComponents.stackTrace); |
+ } |
+} |
+ |
// ------------------------------------------------------------------------ |
// Exceptions Handlers |
// ------------------------------------------------------------------------ |
@@ -1232,6 +1250,22 @@ abstract class ExceptionHandler extends Continuation { |
Configuration call(Value exception, StackTrace stacktrace); |
} |
+/// Handler for showing an exception to the user and returning a halting the |
+/// execution of the program when an exception is not handled. |
+class MainHandler extends ExceptionHandler { |
+ ExceptionHandler get nextHandler => |
+ throw 'The current handler is the main exception handler'; |
+ |
+ Configuration call(Value exception, StackTrace stacktrace) { |
+ var errorMessage = 'Uncaught exception ' |
+ '"${exception.value.runtimeType} : ${exception.value}"\n' |
+ '${stacktrace.toString()}'; |
+ log.info(errorMessage); |
+ print(errorMessage); |
+ return null; |
+ } |
+} |
+ |
// ------------------------------------------------------------------------ |
// Exceptions |
// ------------------------------------------------------------------------ |
@@ -1253,10 +1287,9 @@ class ExceptionComponents { |
ExceptionComponents(this.handler, this.stackTrace, this.currentStackTrace, |
this.currentException); |
- // TODO(zhivkag): Add a top level handler for initial exception state. |
ExceptionComponents.initial() |
- : handler = null, |
- stackTrace = null, |
+ : handler = new MainHandler(), |
+ stackTrace = new StackTrace(null, null), |
currentStackTrace = null, |
currentException = null; |
} |
@@ -1266,6 +1299,16 @@ class StackTrace { |
final StackTrace stackTrace; |
StackTrace(this.expression, this.stackTrace); |
+ |
+ String toString() { |
+ var buffer = new StringBuffer('in main()'); |
+ var current = this; |
+ while (current.expression != null) { |
+ buffer.write('at ${current.expression.toString()}\n'); |
+ current = current.stackTrace; |
+ } |
+ return buffer.toString(); |
+ } |
} |
/// Executes statements. |