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

Unified Diff: sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart

Issue 652403005: Support assignment of locals in analyzer2dart. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comments. Created 6 years, 2 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 | « sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
diff --git a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
index d19d7d15de5b909ade1254a7f25bc42140d40243..25058e065f91e8a982044c93f6c9740ce966a3ba 100644
--- a/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder_visitor.dart
@@ -162,9 +162,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
() {
FunctionSignature signature = element.functionSignature;
signature.orderedForEachParameter((ParameterElement parameterElement) {
- irBuilder.createParameter(
- parameterElement,
- isClosureVariable: isClosureVariable(parameterElement));
+ irBuilder.createParameter(parameterElement);
});
List<ConstantExpression> defaults = new List<ConstantExpression>();
@@ -239,7 +237,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
ast.VariableDefinitions definitions = node.initializer;
for (ast.Node definition in definitions.definitions.nodes) {
Element element = elements[definition];
- if (isClosureVariable(element)) {
+ if (irBuilder.isClosureVariable(element)) {
return giveup(definition, 'Closure variable in for loop initializer');
}
}
@@ -521,7 +519,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
new ir.InvokeMethod(iterator, new Selector.getter("current", null),
currentInvoked, emptyArguments)));
if (Elements.isLocal(variableElement)) {
- withBuilder(bodyBuilder, () => setLocal(variableElement, currentValue));
+ bodyBuilder.buildLocalSet(variableElement, currentValue);
} else if (Elements.isStaticOrTopLevel(variableElement)) {
withBuilder(bodyBuilder,
() => setStatic(variableElement, selector, currentValue));
@@ -605,9 +603,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
} else {
assert(definition is ast.Identifier);
}
- irBuilder.declareLocalVariable(element,
- initialValue: initialValue,
- isClosureVariable: isClosureVariable(element));
+ irBuilder.declareLocalVariable(element, initialValue: initialValue);
}
}
return null;
@@ -778,7 +774,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
ir.Primitive closureTarget;
if (element == null) {
closureTarget = visit(node.selector);
- } else if (isClosureVariable(element)) {
+ } else if (irBuilder.isClosureVariable(element)) {
LocalElement local = element;
closureTarget = new ir.GetClosureVariable(local);
irBuilder.add(new ir.LetPrim(closureTarget));
@@ -832,10 +828,6 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
if (element != null && element.isConst) {
// Reference to constant local, top-level or static field
result = translateConstant(node);
- } else if (isClosureVariable(element)) {
- LocalElement local = element;
- result = new ir.GetClosureVariable(local);
- irBuilder.add(new ir.LetPrim(result));
} else if (Elements.isLocal(element)) {
// Reference to local variable
result = irBuilder.buildLocalGet(element);
@@ -988,25 +980,6 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
}
}
- /// True if [element] is a local variable, local function, or parameter that
- /// is accessed from an inner function. Recursive self-references in a local
- /// function count as closure accesses.
- ///
- /// If `true`, [element] is a [LocalElement].
- bool isClosureVariable(Element element) {
- return irBuilder.state.closureLocals.contains(element);
- }
-
- void setLocal(Element element, ir.Primitive valueToStore) {
- if (isClosureVariable(element)) {
- LocalElement local = element;
- irBuilder.add(new ir.SetClosureVariable(local, valueToStore));
- } else {
- valueToStore.useElementAsHint(element);
- irBuilder.environment.update(element, valueToStore);
- }
- }
-
void setStatic(Element element,
Selector selector,
ir.Primitive valueToStore) {
@@ -1097,7 +1070,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
}
if (Elements.isLocal(element)) {
- setLocal(element, valueToStore);
+ irBuilder.buildLocalSet(element, valueToStore);
} else if ((!node.isSuperCall && Elements.isErroneousElement(element)) ||
Elements.isStaticOrTopLevel(element)) {
setStatic(element, elements.getSelector(node), valueToStore);
@@ -1183,7 +1156,7 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
ir.Primitive visitFunctionDeclaration(ast.FunctionDeclaration node) {
LocalFunctionElement element = elements[node.function];
ir.FunctionDefinition inner = makeSubFunction(node.function);
- if (isClosureVariable(element)) {
+ if (irBuilder.isClosureVariable(element)) {
irBuilder.add(new ir.DeclareFunction(element, inner));
} else {
ir.CreateFunction prim = new ir.CreateFunction(inner);
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/cps_ir/cps_ir_builder.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698