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

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

Issue 10920089: Generate a warning and a runtime error for calls to nonexistent static calls, getters and setters. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 3 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: lib/compiler/implementation/ssa/builder.dart
diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart
index b5d0b128082b5e8944a8cda3db67fb12e656ea36..87843c20d9e8c30b74e26076c180864c79407d53 100644
--- a/lib/compiler/implementation/ssa/builder.dart
+++ b/lib/compiler/implementation/ssa/builder.dart
@@ -2008,6 +2008,12 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
push(new HStatic(element));
// TODO(ahe): This should be registered in codegen.
compiler.enqueuer.codegen.registerGetOfStaticFunction(element);
+ } else if (element != null && Element.isInvalid(element)) {
+ // An erroneous element indicates an unresolved static getter.
kasperl 2012/09/05 09:29:45 Introduce new helper for this? Moar code sharing f
karlklose 2012/09/05 11:10:47 Done.
+ ErroneousElement error = element;
+ Message message = error.errorMessage;
+ String name = 'get ${message.arguments[0]}';
+ generateThrowNoSuchMethod(send, name, const EmptyLink<Node>());
} else {
stack.add(localsHandler.readLocal(element));
}
@@ -2048,6 +2054,12 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
} else if (element === null || Elements.isInstanceField(element)) {
HInstruction receiver = generateInstanceSendReceiver(send);
generateInstanceSetterWithCompiledReceiver(send, receiver, value);
+ } else if (element != null && Element.isInvalid(element)) {
+ // An erroneous element indicates an unresolved static getter.
+ ErroneousElement error = element;
+ Message message = error.errorMessage;
+ String name = 'set ${message.arguments[0]}';
+ generateThrowNoSuchMethod(send, name, send.arguments);
} else {
stack.add(value);
// If the value does not already have a name, give it here.
@@ -2608,6 +2620,12 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
visitStaticSend(Send node) {
Selector selector = elements.getSelector(node);
Element element = elements[node];
+ if (element.isErroneous()) {
+ ErroneousElement error = element;
+ String name = error.errorMessage.arguments[0].toString();
+ generateThrowNoSuchMethod(node, name, node.arguments);
+ return;
+ }
if (element === compiler.assertMethod && !compiler.enableUserAssertions) {
stack.add(graph.addConstantNull());
return;
@@ -2663,28 +2681,38 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
pushInvokeHelper1(helper, errorMessage);
}
+ void generateThrowNoSuchMethod(Node diagnosticNode,
+ String methodName,
+ [Link<Node> argumentNodes,
+ List<HInstruction> argumentValues]) {
+ Element helper =
+ compiler.findHelper(const SourceString('throwNoSuchMethod'));
+ HInstruction receiver =
+ graph.addConstantString(new DartString.empty(), diagnosticNode);
+ DartString dartString = new DartString.literal(methodName);
+ HInstruction name = graph.addConstantString(dartString, diagnosticNode);
+ if (argumentValues == null) {
+ argumentValues = <HInstruction>[];
+ argumentNodes.forEach((argumentNode) {
+ visit(argumentNode);
+ HInstruction value = pop();
+ argumentValues.add(value);
+ });
+ }
+ HInstruction arguments = new HLiteralList(argumentValues);
+ add(arguments);
+ pushInvokeHelper3(helper, receiver, name, arguments);
+ }
+
visitNewExpression(NewExpression node) {
Element element = elements[node.send];
if (element != null && element.isErroneous()) {
ErroneousElement error = element;
Message message = error.errorMessage;
if (message.kind === MessageKind.CANNOT_FIND_CONSTRUCTOR) {
- Element helper =
- compiler.findHelper(const SourceString('throwNoSuchMethod'));
- DartString receiverLiteral = new DartString.literal('');
- HInstruction receiver = graph.addConstantString(receiverLiteral, node);
String constructorName = 'constructor ${message.arguments[0]}';
- DartString nameLiteral = new DartString.literal(constructorName);
- HInstruction name = graph.addConstantString(nameLiteral, node.send);
- List<HInstruction> inputs = <HInstruction>[];
- node.send.arguments.forEach((argumentNode) {
- visit(argumentNode);
- HInstruction value = pop();
- inputs.add(value);
- });
- HInstruction arguments = new HLiteralList(inputs);
- add(arguments);
- pushInvokeHelper3(helper, receiver, name, arguments);
+ generateThrowNoSuchMethod(node.send, constructorName,
+ node.send.arguments);
} else if (message.kind === MessageKind.CANNOT_RESOLVE) {
generateRuntimeError(node.send, message.message);
} else {
@@ -3054,7 +3082,17 @@ class SsaBuilder extends ResolvedVisitor implements Visitor {
VariableDefinitions variableDefinitions = node.declaredIdentifier;
variable = elements[variableDefinitions.definitions.nodes.head];
}
- localsHandler.updateLocal(variable, pop());
+ HInstruction oldVariable = pop();
+ if (variable == null) {
+ } else if (variable.isErroneous()) {
kasperl 2012/09/05 09:29:45 Add a comment in the empty braces to make it clear
karlklose 2012/09/05 11:10:47 Done.
+ ErroneousElement error = variable;
+ String name = 'setter ${error.errorMessage.arguments[0]}';
+ generateThrowNoSuchMethod(node, name,
+ argumentValues: <HInstruction>[oldVariable]);
+ pop();
+ } else {
+ localsHandler.updateLocal(variable, oldVariable);
+ }
visit(node.body);
}

Powered by Google App Engine
This is Rietveld 408576698