Index: pkg/kernel/lib/transformations/closure/context.dart |
diff --git a/pkg/kernel/lib/transformations/closure/context.dart b/pkg/kernel/lib/transformations/closure/context.dart |
index 358ff730b4e65b4f9c974c1627ca77e8b6bd97ea..6425bb680eae54647dafc85d07e89989cb3d4580 100644 |
--- a/pkg/kernel/lib/transformations/closure/context.dart |
+++ b/pkg/kernel/lib/transformations/closure/context.dart |
@@ -6,23 +6,21 @@ library kernel.transformations.closure.context; |
import '../../ast.dart' |
show |
- Arguments, |
Class, |
Expression, |
- IntLiteral, |
- MethodInvocation, |
- Name, |
NullLiteral, |
- PropertyGet, |
StringLiteral, |
Throw, |
TreeNode, |
VariableDeclaration, |
VariableGet, |
- VariableSet; |
+ VariableSet, |
+ VectorCreation, |
+ VectorGet, |
+ VectorSet, |
+ VectorCopy; |
-import '../../frontend/accessors.dart' |
- show Accessor, IndexAccessor, VariableAccessor; |
+import '../../frontend/accessors.dart' show Accessor, VariableAccessor; |
import 'converter.dart' show ClosureConverter; |
@@ -109,21 +107,24 @@ class LocalContext extends Context { |
final ClosureConverter converter; |
final Context parent; |
final VariableDeclaration self; |
- final IntLiteral size; |
+ final VectorCreation vectorCreation; |
final List<VariableDeclaration> variables = <VariableDeclaration>[]; |
- final Map<VariableDeclaration, Arguments> initializers = |
- <VariableDeclaration, Arguments>{}; |
+ final Map<VariableDeclaration, VectorSet> initializers = |
+ <VariableDeclaration, VectorSet>{}; |
- LocalContext._internal(this.converter, this.parent, this.self, this.size); |
+ LocalContext._internal( |
+ this.converter, this.parent, this.self, this.vectorCreation); |
factory LocalContext(ClosureConverter converter, Context parent) { |
Class contextClass = converter.contextClass; |
assert(contextClass.constructors.length == 1); |
- converter.rewriter |
- .insertContextDeclaration(contextClass, parent.expression); |
+ converter.rewriter.insertContextDeclaration(parent.expression); |
- return new LocalContext._internal(converter, parent, |
- converter.rewriter.contextDeclaration, converter.rewriter.contextSize); |
+ return new LocalContext._internal( |
+ converter, |
+ parent, |
+ converter.rewriter.contextDeclaration, |
+ converter.rewriter.vectorCreation); |
} |
Expression get expression => accessor.buildSimpleRead(); |
@@ -131,36 +132,42 @@ class LocalContext extends Context { |
Accessor get accessor => new VariableAccessor(self, null, TreeNode.noOffset); |
void extend(VariableDeclaration variable, Expression value) { |
- Arguments arguments = |
- new Arguments(<Expression>[new IntLiteral(variables.length), value]); |
- converter.rewriter.insertExtendContext(expression, arguments); |
- ++size.value; |
+ // Increase index by 1, because the parent occupies item 0, and all other |
+ // variables are therefore shifted by 1. |
+ VectorSet initializer = |
+ new VectorSet(expression, variables.length + 1, value); |
+ value.parent = initializer; |
+ |
+ converter.rewriter.insertExtendContext(initializer); |
+ |
+ ++vectorCreation.length; |
variables.add(variable); |
- initializers[variable] = arguments; |
+ initializers[variable] = initializer; |
} |
void update(VariableDeclaration variable, Expression value) { |
- Arguments arguments = initializers[variable]; |
- arguments.positional[1] = value; |
- value.parent = arguments; |
+ VectorSet initializer = initializers[variable]; |
+ initializer.value = value; |
+ value.parent = initializer; |
} |
Expression lookup(VariableDeclaration variable) { |
var index = variables.indexOf(variable); |
+ // Increase index by 1 in case of success, because the parent occupies |
+ // item 0, and all other variables are therefore shifted by 1. |
return index == -1 |
? parent.lookup(variable) |
- : new MethodInvocation(expression, new Name('[]'), |
- new Arguments(<Expression>[new IntLiteral(index)])); |
+ : new VectorGet(expression, index + 1); |
} |
Expression assign(VariableDeclaration variable, Expression value, |
{bool voidContext: false}) { |
var index = variables.indexOf(variable); |
+ // Increase index by 1 in case of success, because the parent occupies |
+ // item 0, and all other variables are therefore shifted by 1. |
return index == -1 |
? parent.assign(variable, value, voidContext: voidContext) |
- : IndexAccessor |
- .make(expression, new IntLiteral(index), null, null) |
- .buildAssignment(value, voidContext: voidContext); |
+ : new VectorSet(expression, index + 1, value); |
} |
Context toNestedContext([Accessor accessor]) { |
@@ -181,10 +188,7 @@ class LocalContext extends Context { |
Expression clone() { |
self.isFinal = false; |
- return new VariableSet( |
- self, |
- new MethodInvocation( |
- new VariableGet(self), new Name("copy"), new Arguments.empty())); |
+ return new VariableSet(self, new VectorCopy(new VariableGet(self))); |
} |
} |
@@ -209,10 +213,12 @@ class NestedContext extends Context { |
for (var variables in variabless) { |
var index = variables.indexOf(variable); |
if (index != -1) { |
- return new MethodInvocation(context, new Name('[]'), |
- new Arguments(<Expression>[new IntLiteral(index)])); |
+ // Increase index by 1, because the parent occupies item 0, and all |
+ // other variables are therefore shifted by 1. |
+ return new VectorGet(context, index + 1); |
} |
- context = new PropertyGet(context, new Name('parent')); |
+ // Item 0 of a context always points to its parent. |
+ context = new VectorGet(context, 0); |
} |
throw 'Unbound NestedContext.lookup($variable)'; |
} |
@@ -223,11 +229,12 @@ class NestedContext extends Context { |
for (List<VariableDeclaration> variables in variabless) { |
var index = variables.indexOf(variable); |
if (index != -1) { |
- return IndexAccessor |
- .make(context, new IntLiteral(index), null, null) |
- .buildAssignment(value, voidContext: voidContext); |
+ // Increase index by 1, because the parent occupies item 0, and all |
+ // other variables are therefore shifted by 1. |
+ return new VectorSet(context, index + 1, value); |
} |
- context = new PropertyGet(context, new Name('parent')); |
+ // Item 0 of a context always points to its parent. |
+ context = new VectorGet(context, 0); |
} |
throw 'Unbound NestedContext.lookup($variable)'; |
} |