OLD | NEW |
---|---|
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 library kernel.interpreter; | 4 library kernel.interpreter; |
5 | 5 |
6 import '../ast.dart'; | 6 import '../ast.dart'; |
7 import '../ast.dart' as ast show Class; | 7 import '../ast.dart' as ast show Class; |
8 | 8 |
9 import '../log.dart'; | 9 import '../log.dart'; |
10 export '../log.dart'; | 10 export '../log.dart'; |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
245 return new EvalListConfiguration( | 245 return new EvalListConfiguration( |
246 expressions, config.environment, config.handlers, cont); | 246 expressions, config.environment, config.handlers, cont); |
247 } | 247 } |
248 | 248 |
249 Configuration visitThisExpression( | 249 Configuration visitThisExpression( |
250 ThisExpression node, EvalConfiguration config) { | 250 ThisExpression node, EvalConfiguration config) { |
251 return new ValuePassingConfiguration( | 251 return new ValuePassingConfiguration( |
252 config.continuation, config.environment.thisInstance); | 252 config.continuation, config.environment.thisInstance); |
253 } | 253 } |
254 | 254 |
255 Configuration visitThrow(Throw node, EvalConfiguration config) { | |
256 var cont = new ThrowEK(config.handlers); | |
257 | |
258 return new EvalConfiguration( | |
259 node.expression, config.environment, config.handlers, cont); | |
260 } | |
261 | |
255 // Evaluation of BasicLiterals. | 262 // Evaluation of BasicLiterals. |
256 Configuration visitStringLiteral( | 263 Configuration visitStringLiteral( |
257 StringLiteral node, EvalConfiguration config) { | 264 StringLiteral node, EvalConfiguration config) { |
258 return new ValuePassingConfiguration( | 265 return new ValuePassingConfiguration( |
259 config.continuation, new StringValue(node.value)); | 266 config.continuation, new StringValue(node.value)); |
260 } | 267 } |
261 | 268 |
262 Configuration visitIntLiteral(IntLiteral node, EvalConfiguration config) { | 269 Configuration visitIntLiteral(IntLiteral node, EvalConfiguration config) { |
263 return new ValuePassingConfiguration( | 270 return new ValuePassingConfiguration( |
264 config.continuation, new IntValue(node.value)); | 271 config.continuation, new IntValue(node.value)); |
(...skipping 929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1194 Configuration _createEvalListConfig( | 1201 Configuration _createEvalListConfig( |
1195 Arguments args, Constructor ctr, Environment env) { | 1202 Arguments args, Constructor ctr, Environment env) { |
1196 List<InterpreterExpression> exprs = | 1203 List<InterpreterExpression> exprs = |
1197 _getArgumentExpressions(args, ctr.function); | 1204 _getArgumentExpressions(args, ctr.function); |
1198 var cont = | 1205 var cont = |
1199 new ConstructorInitializerA(ctr, location, handlers, continuation); | 1206 new ConstructorInitializerA(ctr, location, handlers, continuation); |
1200 return new EvalListConfiguration(exprs, env, handlers, cont); | 1207 return new EvalListConfiguration(exprs, env, handlers, cont); |
1201 } | 1208 } |
1202 } | 1209 } |
1203 | 1210 |
1211 class ThrowEK extends ExpressionContinuation { | |
1212 final Handlers handlers; | |
1213 | |
1214 ThrowEK(this.handlers); | |
1215 | |
1216 Configuration call(Value value) { | |
1217 return new ThrowConfiguration(handlers.handler, value, handlers.stackTrace); | |
1218 } | |
1219 } | |
1220 | |
1204 // ------------------------------------------------------------------------ | 1221 // ------------------------------------------------------------------------ |
1205 // Exceptions Handlers | 1222 // Exceptions Handlers |
1206 // ------------------------------------------------------------------------ | 1223 // ------------------------------------------------------------------------ |
1207 | 1224 |
1208 abstract class ExceptionHandler extends Continuation { | 1225 abstract class ExceptionHandler extends Continuation { |
1209 ExceptionHandler get nextHandler; | 1226 ExceptionHandler get nextHandler; |
1210 | 1227 |
1211 Configuration call(Value exception, StackTrace stacktrace); | 1228 Configuration call(Value exception, StackTrace stacktrace); |
1212 } | 1229 } |
1213 | 1230 |
1231 /// Handler for showing an exception to the user and returning a halting the | |
1232 /// execution of the program when an exception is not handled. | |
1233 class MainHandler extends ExceptionHandler { | |
1234 ExceptionHandler get nextHandler => | |
1235 throw 'The current handler is the main exception handler'; | |
1236 | |
1237 Configuration call(Value exception, StackTrace stacktrace) { | |
1238 var errorMessage = 'Uncaught exception ' | |
1239 '"${exception.value.runtimeType} : ${exception.value}"\n' | |
1240 '${stacktrace.toString()}'; | |
1241 log.info(errorMessage); | |
1242 print(errorMessage); | |
1243 return null; | |
1244 } | |
1245 } | |
1246 | |
1214 // ------------------------------------------------------------------------ | 1247 // ------------------------------------------------------------------------ |
1215 // Exceptions | 1248 // Exceptions |
1216 // ------------------------------------------------------------------------ | 1249 // ------------------------------------------------------------------------ |
1217 /// Represents the components for Exception handling. | 1250 /// Represents the components for Exception handling. |
1218 /// | 1251 /// |
1219 /// It contains the list of exception handlers, a stack trace and optional | 1252 /// It contains the list of exception handlers, a stack trace and optional |
1220 /// components, current stacktrace and exception. | 1253 /// components, current stacktrace and exception. |
1221 class Handlers { | 1254 class Handlers { |
1222 final ExceptionHandler handler; | 1255 final ExceptionHandler handler; |
1223 final StackTrace stackTrace; | 1256 final StackTrace stackTrace; |
1224 | 1257 |
1225 /// Current exception and stack trace. | 1258 /// Current exception and stack trace. |
1226 /// | 1259 /// |
1227 /// Components enabling support for `rethrow` expressions and set only in | 1260 /// Components enabling support for `rethrow` expressions and set only in |
1228 /// catch clauses. | 1261 /// catch clauses. |
1229 final StackTrace currentStackTrace; | 1262 final StackTrace currentStackTrace; |
1230 final Value currentException; | 1263 final Value currentException; |
1231 | 1264 |
1232 Handlers(this.handler, this.stackTrace, this.currentStackTrace, | 1265 Handlers(this.handler, this.stackTrace, this.currentStackTrace, |
1233 this.currentException); | 1266 this.currentException); |
1234 | 1267 |
1235 // TODO(zhivkag): Add a top level handler for initial exception state. | |
1236 Handlers.initial() | 1268 Handlers.initial() |
1237 : handler = null, | 1269 : handler = new MainHandler(), |
1238 stackTrace = null, | 1270 stackTrace = new StackTrace(null, null), |
1239 currentStackTrace = null, | 1271 currentStackTrace = null, |
1240 currentException = null; | 1272 currentException = null; |
1241 } | 1273 } |
1242 | 1274 |
1243 class StackTrace { | 1275 class StackTrace { |
1244 final Expression expression; | 1276 final Expression expression; |
1245 final StackTrace stackTrace; | 1277 final StackTrace stackTrace; |
1246 | 1278 |
1247 StackTrace(this.expression, this.stackTrace); | 1279 StackTrace(this.expression, this.stackTrace); |
1280 | |
1281 String toString() { | |
1282 var buffer = new StringBuffer('in main()'); | |
1283 var current = this; | |
1284 while (current.expression != null) { | |
1285 buffer.write('at ${current.expression.toString()}'); | |
Dmitry Stefantsov
2017/08/03 09:01:36
I think we need a newline at the end of this strin
zhivkag
2017/08/03 10:35:50
Done.
| |
1286 current = current.stackTrace; | |
1287 } | |
1288 return buffer.toString(); | |
1289 } | |
1248 } | 1290 } |
1249 | 1291 |
1250 /// Executes statements. | 1292 /// Executes statements. |
1251 /// | 1293 /// |
1252 /// Execution of a statement completes in one of the following ways: | 1294 /// Execution of a statement completes in one of the following ways: |
1253 /// - It completes normally, in which case the execution proceeds to applying | 1295 /// - It completes normally, in which case the execution proceeds to applying |
1254 /// the next continuation. | 1296 /// the next continuation. |
1255 /// - It breaks with a label, in which case the corresponding continuation is | 1297 /// - It breaks with a label, in which case the corresponding continuation is |
1256 /// returned and applied. | 1298 /// returned and applied. |
1257 /// - It returns with or without value, in which case the return continuation is | 1299 /// - It returns with or without value, in which case the return continuation is |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1663 /// Initializes all non initialized fields from the provided class to | 1705 /// Initializes all non initialized fields from the provided class to |
1664 /// `Value.nullInstance` in the provided value. | 1706 /// `Value.nullInstance` in the provided value. |
1665 void _initializeNullFields(Class class_, Value value) { | 1707 void _initializeNullFields(Class class_, Value value) { |
1666 int startIndex = class_.superclass?.instanceSize ?? 0; | 1708 int startIndex = class_.superclass?.instanceSize ?? 0; |
1667 for (int i = startIndex; i < class_.instanceSize; i++) { | 1709 for (int i = startIndex; i < class_.instanceSize; i++) { |
1668 if (value.fields[i].value == null) { | 1710 if (value.fields[i].value == null) { |
1669 value.fields[i].value = Value.nullInstance; | 1711 value.fields[i].value = Value.nullInstance; |
1670 } | 1712 } |
1671 } | 1713 } |
1672 } | 1714 } |
OLD | NEW |