| Index: pkg/kernel/lib/interpreter/interpreter.dart
|
| diff --git a/pkg/kernel/lib/interpreter/interpreter.dart b/pkg/kernel/lib/interpreter/interpreter.dart
|
| index a232e75363f8a0475e3376401452a88448a6651a..3012b86d29b06eb7bef0e5a93284610cb27fda59 100644
|
| --- a/pkg/kernel/lib/interpreter/interpreter.dart
|
| +++ b/pkg/kernel/lib/interpreter/interpreter.dart
|
| @@ -106,7 +106,7 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> {
|
| ApplicationContinuation cont) {
|
| if (list.isNotEmpty) {
|
| return new EvalConfiguration(list.first.expression, env,
|
| - new ExpressionListContinuation(list.first, list.skip(1), env, cont));
|
| + new ExpressionListEK(list.first, list.skip(1), env, cont));
|
| }
|
| return new ApplicationConfiguration(cont, <InterpreterValue>[]);
|
| }
|
| @@ -127,18 +127,18 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> {
|
| }
|
|
|
| Configuration visitVariableSet(VariableSet node, EvalConfiguration config) {
|
| - var cont = new VariableSetContinuation(
|
| + var cont = new VariableSetEK(
|
| node.variable, config.environment, config.continuation);
|
| return new EvalConfiguration(node.value, config.environment, cont);
|
| }
|
|
|
| Configuration visitPropertyGet(PropertyGet node, EvalConfiguration config) {
|
| - var cont = new PropertyGetContinuation(node.name, config.continuation);
|
| + var cont = new PropertyGetEK(node.name, config.continuation);
|
| return new EvalConfiguration(node.receiver, config.environment, cont);
|
| }
|
|
|
| Configuration visitPropertySet(PropertySet node, EvalConfiguration config) {
|
| - var cont = new PropertySetContinuation(
|
| + var cont = new PropertySetEK(
|
| node.value, node.name, config.environment, config.continuation);
|
| return new EvalConfiguration(node.receiver, config.environment, cont);
|
| }
|
| @@ -151,7 +151,7 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> {
|
| Configuration visitStaticInvocation(
|
| StaticInvocation node, EvalConfiguration config) {
|
| if ('print' == node.name.toString()) {
|
| - var cont = new PrintContinuation(config.continuation);
|
| + var cont = new PrintEK(config.continuation);
|
| return new EvalConfiguration(
|
| node.arguments.positional.first, config.environment, cont);
|
| } else {
|
| @@ -159,8 +159,8 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> {
|
|
|
| List<InterpreterExpression> args =
|
| _createArgumentExpressionList(node.arguments, node.target.function);
|
| - ApplicationContinuation cont = new StaticInvocationApplication(
|
| - node.target.function, config.continuation);
|
| + ApplicationContinuation cont =
|
| + new StaticInvocationA(node.target.function, config.continuation);
|
| return new EvalListConfiguration(args, config.environment, cont);
|
| }
|
| }
|
| @@ -169,7 +169,7 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> {
|
| MethodInvocation node, EvalConfiguration config) {
|
| // Currently supports only method invocation with <2 arguments and is used
|
| // to evaluate implemented operators for int, double and String values.
|
| - var cont = new MethodInvocationContinuation(
|
| + var cont = new MethodInvocationEK(
|
| node.arguments, node.name, config.environment, config.continuation);
|
|
|
| return new EvalConfiguration(node.receiver, config.environment, cont);
|
| @@ -178,7 +178,7 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> {
|
| Configuration visitConstructorInvocation(
|
| ConstructorInvocation node, EvalConfiguration config) {
|
| ApplicationContinuation cont =
|
| - new ConstructorInvocationApplication(node.target, config.continuation);
|
| + new ConstructorInvocationA(node.target, config.continuation);
|
| var args =
|
| _createArgumentExpressionList(node.arguments, node.target.function);
|
|
|
| @@ -186,34 +186,32 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> {
|
| }
|
|
|
| Configuration visitNot(Not node, EvalConfiguration config) {
|
| - return new EvalConfiguration(node.operand, config.environment,
|
| - new NotContinuation(config.continuation));
|
| + return new EvalConfiguration(
|
| + node.operand, config.environment, new NotEK(config.continuation));
|
| }
|
|
|
| Configuration visitLogicalExpression(
|
| LogicalExpression node, EvalConfiguration config) {
|
| if ('||' == node.operator) {
|
| - var cont = new OrContinuation(
|
| - node.right, config.environment, config.continuation);
|
| + var cont = new OrEK(node.right, config.environment, config.continuation);
|
| return new EvalConfiguration(node.left, config.environment, cont);
|
| } else {
|
| assert('&&' == node.operator);
|
| - var cont = new AndContinuation(
|
| - node.right, config.environment, config.continuation);
|
| + var cont = new AndEK(node.right, config.environment, config.continuation);
|
| return new EvalConfiguration(node.left, config.environment, cont);
|
| }
|
| }
|
|
|
| Configuration visitConditionalExpression(
|
| ConditionalExpression node, EvalConfiguration config) {
|
| - var cont = new ConditionalContinuation(
|
| + var cont = new ConditionalEK(
|
| node.then, node.otherwise, config.environment, config.continuation);
|
| return new EvalConfiguration(node.condition, config.environment, cont);
|
| }
|
|
|
| Configuration visitStringConcatenation(
|
| StringConcatenation node, EvalConfiguration config) {
|
| - var cont = new StringConcatenationContinuation(config.continuation);
|
| + var cont = new StringConcatenationA(config.continuation);
|
| var expressions = node.expressions
|
| .map((Expression e) => new PositionalExpression(e))
|
| .toList();
|
| @@ -255,7 +253,7 @@ class Evaluator extends ExpressionVisitor1<Configuration, EvalConfiguration> {
|
| }
|
|
|
| Configuration visitLet(Let node, EvalConfiguration config) {
|
| - var letCont = new LetContinuation(
|
| + var letCont = new LetEK(
|
| node.variable, node.body, config.environment, config.continuation);
|
| return new EvalConfiguration(
|
| node.variable.initializer, config.environment, letCont);
|
| @@ -315,11 +313,43 @@ class Label {
|
| }
|
| }
|
|
|
| +// ------------------------------------------------------------------------
|
| +// Configurations
|
| +// ------------------------------------------------------------------------
|
| +
|
| abstract class Configuration {
|
| /// Executes the current and returns the next configuration.
|
| Configuration step(StatementExecuter executer);
|
| }
|
|
|
| +/// Represents the configuration for evaluating an [Expression].
|
| +class EvalConfiguration extends Configuration {
|
| + final Expression expression;
|
| +
|
| + /// Environment in which the expression is evaluated.
|
| + final Environment environment;
|
| +
|
| + /// Next continuation to be applied.
|
| + final Continuation continuation;
|
| +
|
| + EvalConfiguration(this.expression, this.environment, this.continuation);
|
| +
|
| + Configuration step(StatementExecuter executer) =>
|
| + executer.eval(expression, this);
|
| +}
|
| +
|
| +/// Represents the configuration for evaluating a list of expressions.
|
| +class EvalListConfiguration extends Configuration {
|
| + final List<InterpreterExpression> expressions;
|
| + final Environment environment;
|
| + final Continuation continuation;
|
| +
|
| + EvalListConfiguration(this.expressions, this.environment, this.continuation);
|
| +
|
| + Configuration step(StatementExecuter executer) =>
|
| + executer.evalList(expressions, environment, continuation);
|
| +}
|
| +
|
| /// Represents the configuration for execution of statement.
|
| class ExecConfiguration extends Configuration {
|
| final Statement statement;
|
| @@ -373,34 +403,9 @@ class ApplicationConfiguration extends Configuration {
|
| Configuration step(StatementExecuter _) => continuation(values);
|
| }
|
|
|
| -/// Represents the configuration for evaluating an [Expression].
|
| -class EvalConfiguration extends Configuration {
|
| - final Expression expression;
|
| -
|
| - /// Environment in which the expression is evaluated.
|
| - final Environment environment;
|
| -
|
| - /// Next continuation to be applied.
|
| - final Continuation continuation;
|
| -
|
| - EvalConfiguration(this.expression, this.environment, this.continuation);
|
| -
|
| - Configuration step(StatementExecuter executer) =>
|
| - executer.eval(expression, this);
|
| -}
|
| -
|
| -/// Represents the configuration for evaluating a list of expressions.
|
| -class EvalListConfiguration extends Configuration {
|
| - final List<InterpreterExpression> expressions;
|
| - final Environment environment;
|
| - final Continuation continuation;
|
| -
|
| - EvalListConfiguration(this.expressions, this.environment, this.continuation);
|
| -
|
| - Configuration step(StatementExecuter executer) =>
|
| - executer.evalList(expressions, environment, continuation);
|
| -}
|
| -
|
| +// ------------------------------------------------------------------------
|
| +// Interpreter Expressions and Values
|
| +// ------------------------------------------------------------------------
|
| abstract class InterpreterExpression {
|
| Expression get expression;
|
|
|
| @@ -478,6 +483,9 @@ abstract class Continuation {}
|
|
|
| /// Represents the continuation called after the evaluation of argument
|
| /// expressions.
|
| +///
|
| +/// There are various kinds of [ApplicationContinuation] and their names are
|
| +/// suffixed with "A".
|
| abstract class ApplicationContinuation extends Continuation {
|
| Configuration call(List<InterpreterValue> values);
|
|
|
| @@ -511,12 +519,27 @@ abstract class ApplicationContinuation extends Continuation {
|
| }
|
| }
|
|
|
| +class StringConcatenationA extends ApplicationContinuation {
|
| + final ExpressionContinuation continuation;
|
| +
|
| + StringConcatenationA(this.continuation);
|
| +
|
| + Configuration call(List<InterpreterValue> values) {
|
| + StringBuffer result = new StringBuffer();
|
| + for (InterpreterValue v in values.reversed) {
|
| + result.write(v.value.value);
|
| + }
|
| + return new ValuePassingConfiguration(
|
| + continuation, new StringValue(result.toString()));
|
| + }
|
| +}
|
| +
|
| /// Represents the application continuation for static invocation.
|
| -class StaticInvocationApplication extends ApplicationContinuation {
|
| +class StaticInvocationA extends ApplicationContinuation {
|
| final FunctionNode function;
|
| final ExpressionContinuation continuation;
|
|
|
| - StaticInvocationApplication(this.function, this.continuation);
|
| + StaticInvocationA(this.function, this.continuation);
|
|
|
| Configuration call(List<InterpreterValue> argValues) {
|
| Environment functionEnv =
|
| @@ -532,11 +555,11 @@ class StaticInvocationApplication extends ApplicationContinuation {
|
|
|
| /// Represents the application continuation for constructor invocation applied
|
| /// on the list of evaluated arguments.
|
| -class ConstructorInvocationApplication extends ApplicationContinuation {
|
| +class ConstructorInvocationA extends ApplicationContinuation {
|
| final Constructor constructor;
|
| final ExpressionContinuation continuation;
|
|
|
| - ConstructorInvocationApplication(this.constructor, this.continuation);
|
| + ConstructorInvocationA(this.constructor, this.continuation);
|
|
|
| Configuration call(List<InterpreterValue> argValues) {
|
| Environment ctrEnv = ApplicationContinuation.createEnvironment(
|
| @@ -555,12 +578,12 @@ class ConstructorInvocationApplication extends ApplicationContinuation {
|
|
|
| /// Represents the application continuation for redirecting constructor
|
| /// invocation applied on the list of evaluated arguments.
|
| -class RedirectingConstructorApplication extends ApplicationContinuation {
|
| +class RedirectingConstructorA extends ApplicationContinuation {
|
| final Constructor constructor;
|
| final Environment environment;
|
| final ExecConfiguration configuration;
|
|
|
| - RedirectingConstructorApplication(
|
| + RedirectingConstructorA(
|
| this.constructor, this.environment, this.configuration);
|
|
|
| Configuration call(List<InterpreterValue> argValues) {
|
| @@ -577,13 +600,12 @@ class RedirectingConstructorApplication extends ApplicationContinuation {
|
|
|
| /// Represents the application continuation for super constructor
|
| /// invocation applied on the list of evaluated arguments.
|
| -class SuperConstructorApplication extends ApplicationContinuation {
|
| +class SuperConstructorA extends ApplicationContinuation {
|
| final Constructor constructor;
|
| final Environment environment;
|
| final ExecConfiguration configuration;
|
|
|
| - SuperConstructorApplication(
|
| - this.constructor, this.environment, this.configuration);
|
| + SuperConstructorA(this.constructor, this.environment, this.configuration);
|
|
|
| Configuration call(List<InterpreterValue> argValues) {
|
| Value object = environment.thisInstance;
|
| @@ -614,7 +636,7 @@ class ObjectInitializationConfiguration extends Configuration {
|
| // Constructor is redirecting.
|
| Initializer initializer = constructor.initializers.first;
|
| if (initializer is RedirectingInitializer) {
|
| - var app = new RedirectingConstructorApplication(
|
| + var app = new RedirectingConstructorA(
|
| initializer.target, environment, configuration);
|
| var args = _createArgumentExpressionList(
|
| initializer.arguments, initializer.target.function);
|
| @@ -627,7 +649,7 @@ class ObjectInitializationConfiguration extends Configuration {
|
| }
|
| var class_ = new Class(constructor.enclosingClass.reference);
|
| var initEnv = new Environment(environment);
|
| - var cont = new InitializerContinuation(
|
| + var cont = new InitializerEK(
|
| class_, initEnv, constructor.initializers, configuration);
|
| return new EvalConfiguration(
|
| (initializer as LocalInitializer).variable.initializer,
|
| @@ -643,8 +665,7 @@ class ObjectInitializationConfiguration extends Configuration {
|
| var bodyConfig = new ExecConfiguration(constructor.function.body, state);
|
|
|
| // Initialize fields in immediately enclosing class.
|
| - var cont =
|
| - new InstanceFieldsApplication(constructor, environment, bodyConfig);
|
| + var cont = new InstanceFieldsA(constructor, environment, bodyConfig);
|
| var fieldExpressions = _createInstanceInitializers(constructor);
|
|
|
| return new EvalListConfiguration(
|
| @@ -673,7 +694,7 @@ class ObjectInitializationConfiguration extends Configuration {
|
|
|
| /// Represents the application continuation applied on the list of evaluated
|
| /// field initializer expressions.
|
| -class InstanceFieldsApplication extends ApplicationContinuation {
|
| +class InstanceFieldsA extends ApplicationContinuation {
|
| final Constructor constructor;
|
| final Environment environment;
|
| final ExecConfiguration configuration;
|
| @@ -681,8 +702,7 @@ class InstanceFieldsApplication extends ApplicationContinuation {
|
| final Class _currentClass;
|
| final ObjectValue _newObject;
|
|
|
| - InstanceFieldsApplication(
|
| - this.constructor, this.environment, this.configuration)
|
| + InstanceFieldsA(this.constructor, this.environment, this.configuration)
|
| : _currentClass = new Class(constructor.enclosingClass.reference),
|
| _newObject = environment.thisInstance;
|
|
|
| @@ -704,8 +724,8 @@ class InstanceFieldsApplication extends ApplicationContinuation {
|
| var args = _createArgumentExpressionList(
|
| current.arguments, current.target.function);
|
|
|
| - var superApp = new SuperConstructorApplication(
|
| - current.target, environment, configuration);
|
| + var superApp =
|
| + new SuperConstructorA(current.target, environment, configuration);
|
| _initializeNullFields(_currentClass, _newObject);
|
| return new EvalListConfiguration(args, environment, superApp);
|
| }
|
| @@ -713,7 +733,7 @@ class InstanceFieldsApplication extends ApplicationContinuation {
|
| Class class_ = new Class(constructor.enclosingClass.reference);
|
| Environment initEnv = new Environment(environment);
|
|
|
| - var cont = new InitializerContinuation(
|
| + var cont = new InitializerEK(
|
| class_, initEnv, constructor.initializers, configuration);
|
| return new EvalConfiguration(
|
| _getExpression(constructor.initializers.first), initEnv, cont);
|
| @@ -722,13 +742,13 @@ class InstanceFieldsApplication extends ApplicationContinuation {
|
|
|
| /// Represents the expression continuation applied on the list of evaluated
|
| /// initializer expressions preceding a super call in the list.
|
| -class InitializerContinuation extends ExpressionContinuation {
|
| +class InitializerEK extends ExpressionContinuation {
|
| final Class currentClass;
|
| final Environment initializerEnvironment;
|
| final List<Initializer> initializers;
|
| final ExecConfiguration configuration;
|
|
|
| - InitializerContinuation(this.currentClass, this.initializerEnvironment,
|
| + InitializerEK(this.currentClass, this.initializerEnvironment,
|
| this.initializers, this.configuration);
|
|
|
| Configuration call(Value v) {
|
| @@ -752,7 +772,7 @@ class InitializerContinuation extends ExpressionContinuation {
|
| if (next is RedirectingInitializer) {
|
| // RedirectingInitializer appears last in the initializer list.
|
| assert(initializers.length == 2);
|
| - var app = new RedirectingConstructorApplication(
|
| + var app = new RedirectingConstructorA(
|
| next.target, initializerEnvironment, configuration);
|
| var args =
|
| _createArgumentExpressionList(next.arguments, next.target.function);
|
| @@ -764,13 +784,13 @@ class InitializerContinuation extends ExpressionContinuation {
|
| assert(initializers.length == 2);
|
| var args =
|
| _createArgumentExpressionList(next.arguments, next.target.function);
|
| - var superApp = new SuperConstructorApplication(
|
| + var superApp = new SuperConstructorA(
|
| next.target, initializerEnvironment, configuration);
|
| _initializeNullFields(currentClass, newObject);
|
| return new EvalListConfiguration(args, initializerEnvironment, superApp);
|
| }
|
|
|
| - var cont = new InitializerContinuation(currentClass, initializerEnvironment,
|
| + var cont = new InitializerEK(currentClass, initializerEnvironment,
|
| initializers.skip(1).toList(), configuration);
|
| return new EvalConfiguration(
|
| _getExpression(next), initializerEnvironment, cont);
|
| @@ -779,11 +799,11 @@ class InitializerContinuation extends ExpressionContinuation {
|
|
|
| /// Represents the application continuation called after the evaluation of all
|
| /// argument expressions for an invocation.
|
| -class ValueApplication extends ApplicationContinuation {
|
| +class ValueA extends ApplicationContinuation {
|
| final InterpreterValue value;
|
| final ApplicationContinuation applicationContinuation;
|
|
|
| - ValueApplication(this.value, this.applicationContinuation);
|
| + ValueA(this.value, this.applicationContinuation);
|
|
|
| Configuration call(List<InterpreterValue> args) {
|
| args.add(value);
|
| @@ -791,27 +811,33 @@ class ValueApplication extends ApplicationContinuation {
|
| }
|
| }
|
|
|
| +// ------------------------------------------------------------------------
|
| +// Expression Continuations
|
| +// ------------------------------------------------------------------------
|
| /// Represents an expression continuation.
|
| +///
|
| +/// There are various kinds of [ExpressionContinuation]s and their names are
|
| +/// suffixed with "EK".
|
| abstract class ExpressionContinuation extends Continuation {
|
| Configuration call(Value v);
|
| }
|
|
|
| /// Represents a continuation that returns the next [ExecConfiguration]
|
| /// to be executed.
|
| -class ExpressionStatementContinuation extends ExpressionContinuation {
|
| +class ExpressionEK extends ExpressionContinuation {
|
| final ExecConfiguration configuration;
|
|
|
| - ExpressionStatementContinuation(this.configuration);
|
| + ExpressionEK(this.configuration);
|
|
|
| Configuration call(Value _) {
|
| return configuration;
|
| }
|
| }
|
|
|
| -class PrintContinuation extends ExpressionContinuation {
|
| +class PrintEK extends ExpressionContinuation {
|
| final ExpressionContinuation continuation;
|
|
|
| - PrintContinuation(this.continuation);
|
| + PrintEK(this.continuation);
|
|
|
| Configuration call(Value v) {
|
| log.info('print(${v.value.runtimeType}: ${v.value})\n');
|
| @@ -820,11 +846,11 @@ class PrintContinuation extends ExpressionContinuation {
|
| }
|
| }
|
|
|
| -class PropertyGetContinuation extends ExpressionContinuation {
|
| +class PropertyGetEK extends ExpressionContinuation {
|
| final Name name;
|
| final ExpressionContinuation continuation;
|
|
|
| - PropertyGetContinuation(this.name, this.continuation);
|
| + PropertyGetEK(this.name, this.continuation);
|
|
|
| Configuration call(Value receiver) {
|
| // TODO: CPS the invocation of the getter.
|
| @@ -833,27 +859,27 @@ class PropertyGetContinuation extends ExpressionContinuation {
|
| }
|
| }
|
|
|
| -class PropertySetContinuation extends ExpressionContinuation {
|
| +class PropertySetEK extends ExpressionContinuation {
|
| final Expression value;
|
| final Name setterName;
|
| final Environment environment;
|
| final ExpressionContinuation continuation;
|
|
|
| - PropertySetContinuation(
|
| + PropertySetEK(
|
| this.value, this.setterName, this.environment, this.continuation);
|
|
|
| Configuration call(Value receiver) {
|
| - var cont = new SetterContinuation(receiver, setterName, continuation);
|
| + var cont = new SetterEK(receiver, setterName, continuation);
|
| return new EvalConfiguration(value, environment, cont);
|
| }
|
| }
|
|
|
| -class SetterContinuation extends ExpressionContinuation {
|
| +class SetterEK extends ExpressionContinuation {
|
| final Value receiver;
|
| final Name name;
|
| final ExpressionContinuation continuation;
|
|
|
| - SetterContinuation(this.receiver, this.name, this.continuation);
|
| + SetterEK(this.receiver, this.name, this.continuation);
|
|
|
| Configuration call(Value v) {
|
| Setter setter = receiver.class_.lookupSetter(name);
|
| @@ -864,29 +890,29 @@ class SetterContinuation extends ExpressionContinuation {
|
|
|
| /// Represents a continuation to be called after the evaluation of an actual
|
| /// argument for function invocation.
|
| -class ExpressionListContinuation extends ExpressionContinuation {
|
| +class ExpressionListEK extends ExpressionContinuation {
|
| final InterpreterExpression currentExpression;
|
| final List<InterpreterExpression> expressions;
|
| final Environment environment;
|
| final ApplicationContinuation applicationContinuation;
|
|
|
| - ExpressionListContinuation(this.currentExpression, this.expressions,
|
| - this.environment, this.applicationContinuation);
|
| + ExpressionListEK(this.currentExpression, this.expressions, this.environment,
|
| + this.applicationContinuation);
|
|
|
| Configuration call(Value v) {
|
| - ValueApplication app = new ValueApplication(
|
| - currentExpression.assignValue(v), applicationContinuation);
|
| + ValueA app =
|
| + new ValueA(currentExpression.assignValue(v), applicationContinuation);
|
| return new EvalListConfiguration(expressions, environment, app);
|
| }
|
| }
|
|
|
| -class MethodInvocationContinuation extends ExpressionContinuation {
|
| +class MethodInvocationEK extends ExpressionContinuation {
|
| final Arguments arguments;
|
| final Name methodName;
|
| final Environment environment;
|
| final ExpressionContinuation continuation;
|
|
|
| - MethodInvocationContinuation(
|
| + MethodInvocationEK(
|
| this.arguments, this.methodName, this.environment, this.continuation);
|
|
|
| Configuration call(Value receiver) {
|
| @@ -894,22 +920,22 @@ class MethodInvocationContinuation extends ExpressionContinuation {
|
| Value returnValue = receiver.invokeMethod(methodName);
|
| return new ValuePassingConfiguration(continuation, returnValue);
|
| }
|
| - var cont = new ArgumentsContinuation(
|
| + var cont = new ArgumentsEK(
|
| receiver, methodName, arguments, environment, continuation);
|
|
|
| return new EvalConfiguration(arguments.positional.first, environment, cont);
|
| }
|
| }
|
|
|
| -class ArgumentsContinuation extends ExpressionContinuation {
|
| +class ArgumentsEK extends ExpressionContinuation {
|
| final Value receiver;
|
| final Name methodName;
|
| final Arguments arguments;
|
| final Environment environment;
|
| final ExpressionContinuation continuation;
|
|
|
| - ArgumentsContinuation(this.receiver, this.methodName, this.arguments,
|
| - this.environment, this.continuation);
|
| + ArgumentsEK(this.receiver, this.methodName, this.arguments, this.environment,
|
| + this.continuation);
|
|
|
| Configuration call(Value value) {
|
| // Currently evaluates only one argument, for simple method invocations
|
| @@ -919,12 +945,12 @@ class ArgumentsContinuation extends ExpressionContinuation {
|
| }
|
| }
|
|
|
| -class VariableSetContinuation extends ExpressionContinuation {
|
| +class VariableSetEK extends ExpressionContinuation {
|
| final VariableDeclaration variable;
|
| final Environment environment;
|
| final ExpressionContinuation continuation;
|
|
|
| - VariableSetContinuation(this.variable, this.environment, this.continuation);
|
| + VariableSetEK(this.variable, this.environment, this.continuation);
|
|
|
| Configuration call(Value value) {
|
| environment.assign(variable, value);
|
| @@ -932,10 +958,10 @@ class VariableSetContinuation extends ExpressionContinuation {
|
| }
|
| }
|
|
|
| -class NotContinuation extends ExpressionContinuation {
|
| +class NotEK extends ExpressionContinuation {
|
| final ExpressionContinuation continuation;
|
|
|
| - NotContinuation(this.continuation);
|
| + NotEK(this.continuation);
|
|
|
| Configuration call(Value value) {
|
| Value notValue = identical(Value.trueInstance, value)
|
| @@ -945,12 +971,12 @@ class NotContinuation extends ExpressionContinuation {
|
| }
|
| }
|
|
|
| -class OrContinuation extends ExpressionContinuation {
|
| +class OrEK extends ExpressionContinuation {
|
| final Expression right;
|
| final Environment environment;
|
| final ExpressionContinuation continuation;
|
|
|
| - OrContinuation(this.right, this.environment, this.continuation);
|
| + OrEK(this.right, this.environment, this.continuation);
|
|
|
| Configuration call(Value left) {
|
| return identical(Value.trueInstance, left)
|
| @@ -959,12 +985,12 @@ class OrContinuation extends ExpressionContinuation {
|
| }
|
| }
|
|
|
| -class AndContinuation extends ExpressionContinuation {
|
| +class AndEK extends ExpressionContinuation {
|
| final Expression right;
|
| final Environment environment;
|
| final ExpressionContinuation continuation;
|
|
|
| - AndContinuation(this.right, this.environment, this.continuation);
|
| + AndEK(this.right, this.environment, this.continuation);
|
|
|
| Configuration call(Value left) {
|
| return identical(Value.falseInstance, left)
|
| @@ -973,14 +999,13 @@ class AndContinuation extends ExpressionContinuation {
|
| }
|
| }
|
|
|
| -class ConditionalContinuation extends ExpressionContinuation {
|
| +class ConditionalEK extends ExpressionContinuation {
|
| final Expression then;
|
| final Expression otherwise;
|
| final Environment environment;
|
| final ExpressionContinuation continuation;
|
|
|
| - ConditionalContinuation(
|
| - this.then, this.otherwise, this.environment, this.continuation);
|
| + ConditionalEK(this.then, this.otherwise, this.environment, this.continuation);
|
|
|
| Configuration call(Value value) {
|
| return identical(Value.trueInstance, value)
|
| @@ -989,29 +1014,13 @@ class ConditionalContinuation extends ExpressionContinuation {
|
| }
|
| }
|
|
|
| -class StringConcatenationContinuation extends ApplicationContinuation {
|
| - final ExpressionContinuation continuation;
|
| -
|
| - StringConcatenationContinuation(this.continuation);
|
| -
|
| - Configuration call(List<InterpreterValue> values) {
|
| - StringBuffer result = new StringBuffer();
|
| - for (InterpreterValue v in values.reversed) {
|
| - result.write(v.value.value);
|
| - }
|
| - return new ValuePassingConfiguration(
|
| - continuation, new StringValue(result.toString()));
|
| - }
|
| -}
|
| -
|
| -class LetContinuation extends ExpressionContinuation {
|
| +class LetEK extends ExpressionContinuation {
|
| final VariableDeclaration variable;
|
| final Expression letBody;
|
| final Environment environment;
|
| final ExpressionContinuation continuation;
|
|
|
| - LetContinuation(
|
| - this.variable, this.letBody, this.environment, this.continuation);
|
| + LetEK(this.variable, this.letBody, this.environment, this.continuation);
|
|
|
| Configuration call(Value value) {
|
| var letEnv = new Environment(environment);
|
| @@ -1021,11 +1030,11 @@ class LetContinuation extends ExpressionContinuation {
|
| }
|
|
|
| /// Represents the continuation for the condition expression in [WhileStatement].
|
| -class WhileConditionContinuation extends ExpressionContinuation {
|
| +class WhileConditionEK extends ExpressionContinuation {
|
| final WhileStatement node;
|
| final State state;
|
|
|
| - WhileConditionContinuation(this.node, this.state);
|
| + WhileConditionEK(this.node, this.state);
|
|
|
| ExecConfiguration call(Value v) {
|
| if (identical(v, Value.trueInstance)) {
|
| @@ -1040,12 +1049,12 @@ class WhileConditionContinuation extends ExpressionContinuation {
|
| }
|
|
|
| /// Represents the continuation for the condition expression in [IfStatement].
|
| -class IfConditionContinuation extends ExpressionContinuation {
|
| +class IfConditionEK extends ExpressionContinuation {
|
| final Statement then;
|
| final Statement otherwise;
|
| final State state;
|
|
|
| - IfConditionContinuation(this.then, this.otherwise, this.state);
|
| + IfConditionEK(this.then, this.otherwise, this.state);
|
|
|
| ExecConfiguration call(Value v) {
|
| if (identical(v, Value.trueInstance)) {
|
| @@ -1061,12 +1070,12 @@ class IfConditionContinuation extends ExpressionContinuation {
|
|
|
| /// Represents the continuation for the initializer expression in
|
| /// [VariableDeclaration].
|
| -class VariableInitializerContinuation extends ExpressionContinuation {
|
| +class VariableInitializerEK extends ExpressionContinuation {
|
| final VariableDeclaration variable;
|
| final Environment environment;
|
| final ExecConfiguration nextConfiguration;
|
|
|
| - VariableInitializerContinuation(
|
| + VariableInitializerEK(
|
| this.variable, this.environment, this.nextConfiguration);
|
|
|
| ExecConfiguration call(Value v) {
|
| @@ -1112,8 +1121,7 @@ class StatementExecuter extends StatementVisitor1<Configuration, State> {
|
|
|
| Configuration visitExpressionStatement(
|
| ExpressionStatement node, State state) {
|
| - var cont =
|
| - new ExpressionStatementContinuation(state.statementConfiguration);
|
| + var cont = new ExpressionEK(state.statementConfiguration);
|
| return new EvalConfiguration(node.expression, state.environment, cont);
|
| }
|
|
|
| @@ -1136,7 +1144,7 @@ class StatementExecuter extends StatementVisitor1<Configuration, State> {
|
| }
|
|
|
| Configuration visitIfStatement(IfStatement node, State state) {
|
| - var cont = new IfConditionContinuation(node.then, node.otherwise, state);
|
| + var cont = new IfConditionEK(node.then, node.otherwise, state);
|
|
|
| return new EvalConfiguration(node.condition, state.environment, cont);
|
| }
|
| @@ -1150,7 +1158,7 @@ class StatementExecuter extends StatementVisitor1<Configuration, State> {
|
| }
|
|
|
| Configuration visitWhileStatement(WhileStatement node, State state) {
|
| - var cont = new WhileConditionContinuation(node, state);
|
| + var cont = new WhileConditionEK(node, state);
|
|
|
| return new EvalConfiguration(node.condition, state.environment, cont);
|
| }
|
| @@ -1180,7 +1188,7 @@ class StatementExecuter extends StatementVisitor1<Configuration, State> {
|
| Configuration visitVariableDeclaration(
|
| VariableDeclaration node, State state) {
|
| if (node.initializer != null) {
|
| - var cont = new VariableInitializerContinuation(
|
| + var cont = new VariableInitializerEK(
|
| node, state.environment, state.statementConfiguration);
|
| return new EvalConfiguration(node.initializer, state.environment, cont);
|
| }
|
|
|