| 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'; | 
|  | 10 export '../log.dart'; | 
|  | 11 | 
| 9 class NotImplemented { | 12 class NotImplemented { | 
| 10   String message; | 13   String message; | 
| 11 | 14 | 
| 12   NotImplemented(this.message); | 15   NotImplemented(this.message); | 
| 13 | 16 | 
| 14   String toString() => message; | 17   String toString() => message; | 
| 15 } | 18 } | 
| 16 | 19 | 
| 17 class Interpreter { | 20 class Interpreter { | 
| 18   Program program; | 21   Program program; | 
| 19   StatementExecuter visitor = new StatementExecuter(); | 22   StatementExecuter visitor = new StatementExecuter(); | 
| 20 | 23 | 
| 21   Interpreter(this.program); | 24   Interpreter(this.program); | 
| 22 | 25 | 
| 23   void run() { | 26   void run() { | 
| 24     assert(program.libraries.isEmpty); | 27     assert(program.libraries.isEmpty); | 
| 25     Procedure mainMethod = program.mainMethod; | 28     Procedure mainMethod = program.mainMethod; | 
|  | 29 | 
|  | 30     if (mainMethod == null) return; | 
|  | 31 | 
| 26     Statement statementBlock = mainMethod.function.body; | 32     Statement statementBlock = mainMethod.function.body; | 
| 27     StatementConfiguration configuration = | 33     StatementConfiguration configuration = | 
| 28         new StatementConfiguration(statementBlock, new State.initial()); | 34         new StatementConfiguration(statementBlock, new State.initial()); | 
| 29     visitor.trampolinedExecution(configuration); | 35     visitor.trampolinedExecution(configuration); | 
| 30   } | 36   } | 
| 31 } | 37 } | 
| 32 | 38 | 
| 33 class Binding { | 39 class Binding { | 
| 34   final VariableDeclaration variable; | 40   final VariableDeclaration variable; | 
| 35   Value value; | 41   Value value; | 
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 124           StaticSet node, ExpressionConfiguration config) => | 130           StaticSet node, ExpressionConfiguration config) => | 
| 125       defaultExpression(node, config); | 131       defaultExpression(node, config); | 
| 126 | 132 | 
| 127   Configuration visitStaticInvocation( | 133   Configuration visitStaticInvocation( | 
| 128       StaticInvocation node, ExpressionConfiguration config) { | 134       StaticInvocation node, ExpressionConfiguration config) { | 
| 129     if ('print' == node.name.toString()) { | 135     if ('print' == node.name.toString()) { | 
| 130       var cont = new PrintContinuation(config.continuation); | 136       var cont = new PrintContinuation(config.continuation); | 
| 131       return new ExpressionConfiguration( | 137       return new ExpressionConfiguration( | 
| 132           node.arguments.positional.first, config.environment, cont); | 138           node.arguments.positional.first, config.environment, cont); | 
| 133     } else { | 139     } else { | 
|  | 140       log.info('static-invocation-${node.target.name.toString()}\n'); | 
| 134       var cont = new ActualArgumentsContinuation(node.arguments, | 141       var cont = new ActualArgumentsContinuation(node.arguments, | 
| 135           node.target.function, config.environment, config.continuation); | 142           node.target.function, config.environment, config.continuation); | 
| 136       return cont.createCurrentConfiguration(); | 143       return cont.createCurrentConfiguration(); | 
| 137     } | 144     } | 
| 138   } | 145   } | 
| 139 | 146 | 
| 140   Configuration visitMethodInvocation( | 147   Configuration visitMethodInvocation( | 
| 141       MethodInvocation node, ExpressionConfiguration config) { | 148       MethodInvocation node, ExpressionConfiguration config) { | 
| 142     // Currently supports only method invocation with <2 arguments and is used | 149     // Currently supports only method invocation with <2 arguments and is used | 
| 143     // to evaluate implemented operators for int, double and String values. | 150     // to evaluate implemented operators for int, double and String values. | 
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 356     return configuration; | 363     return configuration; | 
| 357   } | 364   } | 
| 358 } | 365 } | 
| 359 | 366 | 
| 360 class PrintContinuation extends ExpressionContinuation { | 367 class PrintContinuation extends ExpressionContinuation { | 
| 361   final ExpressionContinuation continuation; | 368   final ExpressionContinuation continuation; | 
| 362 | 369 | 
| 363   PrintContinuation(this.continuation); | 370   PrintContinuation(this.continuation); | 
| 364 | 371 | 
| 365   Configuration call(Value v) { | 372   Configuration call(Value v) { | 
|  | 373     log.info('print(${v.value.runtimeType}: ${v.value})\n'); | 
| 366     print(v.value); | 374     print(v.value); | 
| 367     return new ContinuationConfiguration(continuation, Value.nullInstance); | 375     return new ContinuationConfiguration(continuation, Value.nullInstance); | 
| 368   } | 376   } | 
| 369 } | 377 } | 
| 370 | 378 | 
| 371 class PropertyGetContinuation extends ExpressionContinuation { | 379 class PropertyGetContinuation extends ExpressionContinuation { | 
| 372   final Name name; | 380   final Name name; | 
| 373   final ExpressionContinuation continuation; | 381   final ExpressionContinuation continuation; | 
| 374 | 382 | 
| 375   PropertyGetContinuation(this.name, this.continuation); | 383   PropertyGetContinuation(this.name, this.continuation); | 
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 725 /// Represents the continuation for the condition expression in [IfStatement]. | 733 /// Represents the continuation for the condition expression in [IfStatement]. | 
| 726 class IfConditionContinuation extends ExpressionContinuation { | 734 class IfConditionContinuation extends ExpressionContinuation { | 
| 727   final Statement then; | 735   final Statement then; | 
| 728   final Statement otherwise; | 736   final Statement otherwise; | 
| 729   final State state; | 737   final State state; | 
| 730 | 738 | 
| 731   IfConditionContinuation(this.then, this.otherwise, this.state); | 739   IfConditionContinuation(this.then, this.otherwise, this.state); | 
| 732 | 740 | 
| 733   StatementConfiguration call(Value v) { | 741   StatementConfiguration call(Value v) { | 
| 734     if (identical(v, Value.trueInstance)) { | 742     if (identical(v, Value.trueInstance)) { | 
|  | 743       log.info("if-then\n"); | 
| 735       return new StatementConfiguration(then, state); | 744       return new StatementConfiguration(then, state); | 
| 736     } else if (otherwise != null) { | 745     } else if (otherwise != null) { | 
|  | 746       log.info("if-otherwise\n"); | 
| 737       return new StatementConfiguration(otherwise, state); | 747       return new StatementConfiguration(otherwise, state); | 
| 738     } | 748     } | 
| 739     return state.statementConfiguration; | 749     return state.statementConfiguration; | 
| 740   } | 750   } | 
| 741 } | 751 } | 
| 742 | 752 | 
| 743 /// Represents the continuation for the initializer expression in | 753 /// Represents the continuation for the initializer expression in | 
| 744 /// [VariableDeclaration]. | 754 /// [VariableDeclaration]. | 
| 745 class VariableInitializerContinuation extends ExpressionContinuation { | 755 class VariableInitializerContinuation extends ExpressionContinuation { | 
| 746   final VariableDeclaration variable; | 756   final VariableDeclaration variable; | 
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 839         new WhileStatement(node.condition, node.body); | 849         new WhileStatement(node.condition, node.body); | 
| 840     StatementConfiguration configuration = | 850     StatementConfiguration configuration = | 
| 841         new StatementConfiguration(whileStatement, state); | 851         new StatementConfiguration(whileStatement, state); | 
| 842 | 852 | 
| 843     return new StatementConfiguration( | 853     return new StatementConfiguration( | 
| 844         node.body, state.withConfiguration(configuration)); | 854         node.body, state.withConfiguration(configuration)); | 
| 845   } | 855   } | 
| 846 | 856 | 
| 847   Configuration visitReturnStatement(ReturnStatement node, State state) { | 857   Configuration visitReturnStatement(ReturnStatement node, State state) { | 
| 848     assert(state.returnContinuation != null); | 858     assert(state.returnContinuation != null); | 
|  | 859     log.info('return\n'); | 
| 849     if (node.expression == null) { | 860     if (node.expression == null) { | 
| 850       return new ContinuationConfiguration( | 861       return new ContinuationConfiguration( | 
| 851           state.returnContinuation, Value.nullInstance); | 862           state.returnContinuation, Value.nullInstance); | 
| 852     } | 863     } | 
| 853 | 864 | 
| 854     return new ExpressionConfiguration( | 865     return new ExpressionConfiguration( | 
| 855         node.expression, state.environment, state.returnContinuation); | 866         node.expression, state.environment, state.returnContinuation); | 
| 856   } | 867   } | 
| 857 | 868 | 
| 858   Configuration visitVariableDeclaration( | 869   Configuration visitVariableDeclaration( | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 977 | 988 | 
| 978   const Value(); | 989   const Value(); | 
| 979 | 990 | 
| 980   BoolValue toBoolean() { | 991   BoolValue toBoolean() { | 
| 981     return identical(this, Value.trueInstance) | 992     return identical(this, Value.trueInstance) | 
| 982         ? Value.trueInstance | 993         ? Value.trueInstance | 
| 983         : Value.falseInstance; | 994         : Value.falseInstance; | 
| 984   } | 995   } | 
| 985 | 996 | 
| 986   BoolValue equals(Value other) => | 997   BoolValue equals(Value other) => | 
| 987       value == other.value ? Value.trueInstance : Value.falseInstance; | 998       value == other?.value ? Value.trueInstance : Value.falseInstance; | 
| 988 | 999 | 
| 989   Value invokeMethod(Name name, [Value arg]) { | 1000   Value invokeMethod(Name name, [Value arg]) { | 
|  | 1001     if (name.toString() == "==") return equals(arg); | 
| 990     throw notImplemented(obj: name); | 1002     throw notImplemented(obj: name); | 
| 991   } | 1003   } | 
| 992 } | 1004 } | 
| 993 | 1005 | 
| 994 class ObjectValue extends Value { | 1006 class ObjectValue extends Value { | 
| 995   Class class_; | 1007   Class class_; | 
| 996   List<Value> fields; | 1008   List<Value> fields; | 
| 997   Object get value => this; | 1009   Object get value => this; | 
| 998 | 1010 | 
| 999   ObjectValue(this.class_, this.fields); | 1011   ObjectValue(this.class_, this.fields); | 
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1091 | 1103 | 
| 1092 class NullValue extends LiteralValue { | 1104 class NullValue extends LiteralValue { | 
| 1093   Object get value => null; | 1105   Object get value => null; | 
| 1094 | 1106 | 
| 1095   const NullValue(); | 1107   const NullValue(); | 
| 1096 } | 1108 } | 
| 1097 | 1109 | 
| 1098 notImplemented({String m, Object obj}) { | 1110 notImplemented({String m, Object obj}) { | 
| 1099   throw new NotImplemented(m ?? 'Evaluation for $obj is not implemented'); | 1111   throw new NotImplemented(m ?? 'Evaluation for $obj is not implemented'); | 
| 1100 } | 1112 } | 
| OLD | NEW | 
|---|