Index: pkg/compiler/lib/src/ssa/builder.dart |
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart |
index b2dcb8aac502618526bb1720db597f8b23d3871b..2b30331ddc41831734e52edc0d783110a895089a 100644 |
--- a/pkg/compiler/lib/src/ssa/builder.dart |
+++ b/pkg/compiler/lib/src/ssa/builder.dart |
@@ -1322,9 +1322,12 @@ class SsaBuilder extends NewResolvedVisitor { |
bool meetsHardConstraints() { |
if (compiler.disableInlining) return false; |
- assert(selector != null |
- || Elements.isStaticOrTopLevel(element) |
- || element.isGenerativeConstructorBody); |
+ assert(invariant( |
+ currentNode != null ? currentNode : element, |
+ selector != null || |
+ Elements.isStaticOrTopLevel(element) || |
+ element.isGenerativeConstructorBody, |
+ message: "Missing selector for inlining of $element.")); |
if (selector != null && !selector.applies(function, compiler.world)) { |
return false; |
} |
@@ -3246,8 +3249,7 @@ class SsaBuilder extends NewResolvedVisitor { |
return pop(); |
} |
- String noSuchMethodTargetSymbolString(ErroneousElement error, |
- [String prefix]) { |
+ String noSuchMethodTargetSymbolString(Element error, [String prefix]) { |
String result = error.name; |
if (prefix == "set") return "$result="; |
return result; |
@@ -3288,14 +3290,18 @@ class SsaBuilder extends NewResolvedVisitor { |
node); |
} |
+ void handleInvalidStaticGet(ast.Send node, Element element) { |
+ generateThrowNoSuchMethod( |
+ node, |
+ noSuchMethodTargetSymbolString(element, 'get'), |
+ argumentNodes: const Link<ast.Node>()); |
+ } |
+ |
/// Generate read access of an unresolved static or top level entity. |
void generateStaticUnresolvedGet(ast.Send node, Element element) { |
if (element is ErroneousElement) { |
// An erroneous element indicates an unresolved static getter. |
- generateThrowNoSuchMethod( |
- node, |
- noSuchMethodTargetSymbolString(element, 'get'), |
- argumentNodes: const Link<ast.Node>()); |
+ handleInvalidStaticGet(node, element); |
} else { |
// This happens when [element] has parse errors. |
assert(invariant(node, element == null || element.isErroneous)); |
@@ -3907,6 +3913,16 @@ class SsaBuilder extends NewResolvedVisitor { |
generateCallInvoke(node, localsHandler.readLocal(function)); |
} |
+ @override |
+ visitLocalFunctionIncompatibleInvoke( |
+ ast.Send node, |
+ LocalFunctionElement function, |
+ ast.NodeList arguments, |
+ CallStructure callStructure, |
+ _) { |
+ generateCallInvoke(node, localsHandler.readLocal(function)); |
+ } |
+ |
void handleForeignJs(ast.Send node) { |
Link<ast.Node> link = node.arguments; |
// Don't visit the first argument, which is the type, and the second |
@@ -5147,6 +5163,22 @@ class SsaBuilder extends NewResolvedVisitor { |
} |
@override |
+ void visitTopLevelSetterGet( |
+ ast.Send node, |
+ MethodElement setter, |
+ _) { |
+ handleInvalidStaticGet(node, setter); |
+ } |
+ |
+ @override |
+ void visitStaticSetterGet( |
+ ast.Send node, |
+ MethodElement setter, |
+ _) { |
+ handleInvalidStaticGet(node, setter); |
+ } |
+ |
+ @override |
void visitUnresolvedGet( |
ast.Send node, |
Element element, |
@@ -5154,6 +5186,32 @@ class SsaBuilder extends NewResolvedVisitor { |
generateStaticUnresolvedGet(node, element); |
} |
+ void handleInvalidStaticInvoke(ast.Send node, Element element) { |
+ generateThrowNoSuchMethod(node, |
+ noSuchMethodTargetSymbolString(element), |
+ argumentNodes: node.arguments); |
+ } |
+ |
+ @override |
+ void visitStaticSetterInvoke( |
+ ast.Send node, |
+ MethodElement setter, |
+ ast.NodeList arguments, |
+ CallStructure callStructure, |
+ _) { |
+ handleInvalidStaticInvoke(node, setter); |
+ } |
+ |
+ @override |
+ void visitTopLevelSetterInvoke( |
+ ast.Send node, |
+ MethodElement setter, |
+ ast.NodeList arguments, |
+ CallStructure callStructure, |
+ _) { |
+ handleInvalidStaticInvoke(node, setter); |
+ } |
+ |
@override |
void visitUnresolvedInvoke( |
ast.Send node, |
@@ -5164,9 +5222,7 @@ class SsaBuilder extends NewResolvedVisitor { |
if (element is ErroneousElement) { |
// An erroneous element indicates that the funciton could not be |
// resolved (a warning has been issued). |
- generateThrowNoSuchMethod(node, |
- noSuchMethodTargetSymbolString(element), |
- argumentNodes: node.arguments); |
+ handleInvalidStaticInvoke(node, element); |
} else { |
// TODO(ahe): Do something like [generateWrongArgumentCountError]. |
stack.add(graph.addConstantNull(compiler)); |