Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Unified Diff: pkg/kernel/lib/interpreter/interpreter.dart

Issue 2888913002: New instance allocation (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/kernel/lib/interpreter/interpreter.dart
diff --git a/pkg/kernel/lib/interpreter/interpreter.dart b/pkg/kernel/lib/interpreter/interpreter.dart
index 0aba06c489ea377341c17c165742bf2bff0481f1..28ec77ac289dbea03df028274ce35cea1b7c5bb7 100644
--- a/pkg/kernel/lib/interpreter/interpreter.dart
+++ b/pkg/kernel/lib/interpreter/interpreter.dart
@@ -176,12 +176,8 @@ class Evaluator
throw 'Execution for body of constructor is not implemented.';
}
- var class_ = new Class(node.target.enclosingClass.reference);
- var newObject =
- new ObjectValue(class_, new List<Value>(class_.instanceSize));
-
- ApplicationContinuation cont = new ConstructorInvocationApplication(
- newObject, node.target, config.continuation);
+ ApplicationContinuation cont =
+ new ConstructorInvocationApplication(node.target, config.continuation);
var args =
_createArgumentExpressionList(node.arguments, node.target.function);
@@ -525,46 +521,106 @@ class StaticInvocationApplication extends ApplicationContinuation {
/// Represents the application continuation for constructor invocation applied
/// on the list of evaluated arguments.
class ConstructorInvocationApplication extends ApplicationContinuation {
+ final Constructor constructor;
+ final ExpressionContinuation continuation;
+
+ ConstructorInvocationApplication(this.constructor, this.continuation);
+
+ Configuration call(List<InterpreterValue> argValues) {
+ Environment ctrEnv = ApplicationContinuation.createEnvironment(
+ constructor.function, argValues);
+
+ var class_ = new Class(constructor.enclosingClass.reference);
+ var newObject =
+ new ObjectValue(class_, new List<Value>(class_.instanceSize));
+
+ var cont =
+ new ObjectInitializationContinuation(constructor, ctrEnv, continuation);
+
+ return new ContinuationConfiguration(cont, newObject);
+ }
+}
+
+/// Represents the application continuation for redirecting constructor
+/// invocation applied on the list of evaluated arguments.
+class RedirectingConstructorApplication extends ApplicationContinuation {
final ObjectValue newObject;
final Constructor constructor;
- final ExpressionContinuation expressionContinuation;
+ final ExpressionContinuation continuation;
+
+ RedirectingConstructorApplication(
+ this.newObject, this.constructor, this.continuation);
- ConstructorInvocationApplication(
- this.newObject, this.constructor, this.expressionContinuation);
+ Configuration call(List<InterpreterValue> argValues) {
+ Environment ctrEnv = ApplicationContinuation.createEnvironment(
+ constructor.function, argValues);
+ var cont =
+ new ObjectInitializationContinuation(constructor, ctrEnv, continuation);
+ return new ContinuationConfiguration(cont, newObject);
+ }
+}
+
+/// Represents the application continuation for super constructor
+/// invocation applied on the list of evaluated arguments.
+class SuperConstructorApplication extends ApplicationContinuation {
+ final ObjectValue newObject;
+ final Constructor constructor;
+ // TODO: remember to execute body of previous ctr.
+ final ExpressionContinuation continuation;
+
+ SuperConstructorApplication(
+ this.newObject, this.constructor, this.continuation);
Configuration call(List<InterpreterValue> argValues) {
Environment ctrEnv = ApplicationContinuation.createEnvironment(
constructor.function, argValues);
+ var cont =
+ new ObjectInitializationContinuation(constructor, ctrEnv, continuation);
+ return new ContinuationConfiguration(cont, newObject);
+ }
+}
+class ObjectInitializationContinuation extends ExpressionContinuation {
+ final Constructor constructor;
+ final Environment environment;
+ final ExpressionContinuation continuation;
+
+ ObjectInitializationContinuation(
+ this.constructor, this.environment, this.continuation);
+
+ Configuration call(Value v) {
if (constructor.initializers.isNotEmpty &&
constructor.initializers.last is RedirectingInitializer) {
// Constructor is redirecting.
Initializer initializer = constructor.initializers.first;
if (initializer is RedirectingInitializer) {
- var app = new ConstructorInvocationApplication(
- newObject, initializer.target, expressionContinuation);
+ var app = new RedirectingConstructorApplication(
+ v, initializer.target, continuation);
var args = _createArgumentExpressionList(
initializer.arguments, initializer.target.function);
- return new ExpressionListConfiguration(args, ctrEnv, app);
+ return new ExpressionListConfiguration(args, environment, app);
}
// Redirecting initializer is not the only initializer.
for (Initializer i in constructor.initializers.reversed.skip(1)) {
assert(i is LocalInitializer);
}
var class_ = new Class(constructor.enclosingClass.reference);
- var cont = new InitializerContinuation(newObject, class_, ctrEnv,
- constructor.initializers, expressionContinuation);
+ var cont = new InitializerContinuation(
+ v, class_, environment, constructor.initializers, continuation);
return new ExpressionConfiguration(
- (initializer as LocalInitializer).variable.initializer, ctrEnv, cont);
+ (initializer as LocalInitializer).variable.initializer,
+ environment,
+ cont);
}
// Initialize fields in immediately enclosing class.
var cont = new InstanceFieldsApplication(
- newObject, constructor, ctrEnv, expressionContinuation);
+ v, constructor, environment, continuation);
var fieldExpressions = _createInstanceInitializers(constructor);
- return new ExpressionListConfiguration(fieldExpressions, ctrEnv, cont);
+ return new ExpressionListConfiguration(
+ fieldExpressions, new Environment.empty(), cont);
}
/// Creates a list of expressions for instance field initializers in
@@ -617,7 +673,7 @@ class InstanceFieldsApplication extends ApplicationContinuation {
SuperInitializer current = constructor.initializers.first;
var args = _createArgumentExpressionList(
current.arguments, current.target.function);
- var superApp = new ConstructorInvocationApplication(
+ var superApp = new SuperConstructorApplication(
newObject, current.target, expressionContinuation);
_initializeNullFields(_currentClass, newObject);
return new ExpressionListConfiguration(args, environment, superApp);
@@ -666,7 +722,7 @@ class InitializerContinuation extends ExpressionContinuation {
if (next is RedirectingInitializer) {
// RedirectingInitializer appears last in the initializer list.
assert(initializers.length == 2);
- var cont = new ConstructorInvocationApplication(
+ var cont = new RedirectingConstructorApplication(
newObject, next.target, continuation);
var args =
_createArgumentExpressionList(next.arguments, next.target.function);
@@ -679,8 +735,8 @@ class InitializerContinuation extends ExpressionContinuation {
assert(initializers.length == 2);
var args =
_createArgumentExpressionList(next.arguments, next.target.function);
- var superApp = new ConstructorInvocationApplication(
- newObject, next.target, continuation);
+ var superApp =
+ new SuperConstructorApplication(newObject, next.target, continuation);
_initializeNullFields(currentClass, newObject);
return new ExpressionListConfiguration(
args, initializerEnvironment, superApp);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698