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

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart

Issue 13866010: Correctly compile unresolved for-in loops. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Additional problems found during testing. Created 7 years, 8 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
Index: dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 48dd75987ec7b1cb9ee4089227b4d814277a7a11..fc1a0a9b6cea1bfda1adb2ae7979a38fa4c9141c 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -2450,31 +2450,38 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
void generateInstanceSetterWithCompiledReceiver(Send send,
HInstruction receiver,
- HInstruction value) {
- assert(Elements.isInstanceSend(send, elements));
- Selector selector = elements.getSelector(send);
+ HInstruction value,
+ {Selector selector,
+ Node location}) {
+ assert(send == null || Elements.isInstanceSend(send, elements));
+ if (selector == null) {
+ assert(send != null);
+ selector = elements.getSelector(send);
+ }
+ if (location == null) {
+ assert(send != null);
+ location = send;
+ }
assert(selector.isSetter());
- SourceString setterName = selector.name;
bool hasSetter = compiler.world.hasAnyUserDefinedSetter(selector);
Set<ClassElement> interceptedClasses =
- backend.getInterceptedClassesOn(setterName);
+ backend.getInterceptedClassesOn(selector.name);
+ HInstruction instruction;
if (interceptedClasses != null) {
// If we're using an interceptor class, emit a call to the
// getInterceptor method and then the actual dynamic call on the
// interceptor object.
- HInstruction instruction =
- invokeInterceptor(interceptedClasses, receiver, send);
+ instruction = invokeInterceptor(interceptedClasses, receiver, send);
instruction = new HInvokeDynamicSetter(
selector, null, instruction, receiver, !hasSetter);
// Add the value as an argument to the setter call on the
// interceptor.
instruction.inputs.add(value);
- addWithPosition(instruction, send);
} else {
- addWithPosition(
- new HInvokeDynamicSetter(selector, null, receiver, value, !hasSetter),
- send);
+ instruction = new HInvokeDynamicSetter(
+ selector, null, receiver, value, !hasSetter);
}
+ addWithPosition(instruction, location);
stack.add(value);
}
@@ -4027,7 +4034,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
// The iterator is shared between initializer, condition and body.
HInstruction iterator;
void buildInitializer() {
- Selector selector = elements.getIteratorSelector(node);
+ Selector selector = compiler.iteratorSelector;
Set<ClassElement> interceptedClasses =
backend.getInterceptedClassesOn(selector.name);
visit(node.expression);
@@ -4048,28 +4055,33 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
add(iterator);
}
HInstruction buildCondition() {
- Selector selector = elements.getMoveNextSelector(node);
+ Selector selector = compiler.moveNextSelector;
push(new HInvokeDynamicMethod(selector, <HInstruction>[iterator]));
return popBoolified();
}
void buildBody() {
- Selector call = elements.getCurrentSelector(node);
+ Selector call = compiler.currentSelector;
bool hasGetter = compiler.world.hasAnyUserDefinedGetter(call);
push(new HInvokeDynamicGetter(call, null, iterator, !hasGetter));
- Element variable;
- if (node.declaredIdentifier.asSend() != null) {
- variable = elements[node.declaredIdentifier];
- } else {
- assert(node.declaredIdentifier.asVariableDefinitions() != null);
- VariableDefinitions variableDefinitions = node.declaredIdentifier;
- variable = elements[variableDefinitions.definitions.nodes.head];
- }
+ Element variable = elements[node.declaredIdentifier];
+ Selector selector = elements.getSelector(node.declaredIdentifier);
+
HInstruction oldVariable = pop();
- if (variable.isErroneous()) {
- generateThrowNoSuchMethod(node,
- getTargetName(variable, 'set'),
- argumentValues: <HInstruction>[oldVariable]);
+ if (Elements.isUnresolved(variable)) {
+ if (Elements.isInStaticContext(currentElement)) {
+ generateThrowNoSuchMethod(node.declaredIdentifier,
+ 'set ${selector.name.slowToString()}',
+ argumentValues: <HInstruction>[oldVariable]);
kasperl 2013/04/12 07:33:48 Long line.
+ } else {
+ // The setter may have been defined in a subclass.
+ generateInstanceSetterWithCompiledReceiver(
+ null,
+ localsHandler.readThis(),
+ oldVariable,
+ selector: selector,
+ location: node.declaredIdentifier);
+ }
pop();
} else {
localsHandler.updateLocal(variable, oldVariable);

Powered by Google App Engine
This is Rietveld 408576698