Index: sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart |
index b9f33613bac553f2eddd0fa523d6a63932859d21..8feaa8111a616d26a12efa07eaa01e1df91032d2 100644 |
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart |
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart |
@@ -1034,11 +1034,6 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
ir.Primitive receiver; |
ir.Primitive index; |
- if (Elements.isErroneousElement(element)) { |
- giveup(node, 'Erroneous element on GetterSend'); |
- return null; |
- } |
- |
if (element != null && element.isConst) { |
// Reference to constant local, top-level or static field |
@@ -1072,11 +1067,10 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
createDynamicInvoke(node, selector, receiver, k, arguments); |
add(new ir.LetCont(k, invoke)); |
result = v; |
- } else if (element.isField || element.isGetter || |
+ } else if (element.isField || element.isGetter || element.isErroneous || |
// Access to a static field or getter (non-static case handled above). |
// Even if there is only a setter, we compile as if it was a getter, |
// so the vm can fail at runtime. |
- |
element.isSetter) { |
ir.Parameter v = new ir.Parameter(null); |
ir.Continuation k = new ir.Continuation([v]); |
@@ -1244,7 +1238,6 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
} |
if (op.source == "is") { |
DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast); |
- if (type.isMalformed) return giveup(node, "Malformed type for is"); |
ir.Primitive receiver = visit(node.receiver); |
ir.IsCheck isCheck = new ir.IsCheck(receiver, type); |
add(new ir.LetPrim(isCheck)); |
@@ -1252,7 +1245,6 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
} |
if (op.source == "as") { |
DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast); |
- if (type.isMalformed) return giveup(node, "Malformed type for as"); |
ir.Primitive receiver = visit(node.receiver); |
ir.Parameter v = new ir.Parameter(null); |
ir.Continuation k = new ir.Continuation([v]); |
@@ -1260,7 +1252,7 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
add(new ir.LetCont(k, asCast)); |
return v; |
} |
- return giveup(node); |
+ compiler.internalError(node, "Unknown operator '${op.source}'"); |
} |
// Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]] |
@@ -1268,17 +1260,9 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
ir.Primitive visitStaticSend(ast.Send node) { |
assert(isOpen); |
Element element = elements[node]; |
- // TODO(lry): support constructors / factory calls. |
- if (element.isConstructor) return giveup(node, 'StaticSend: constructor'); |
+ assert(!element.isConstructor); |
// TODO(lry): support foreign functions. |
if (element.isForeign(compiler)) return giveup(node, 'StaticSend: foreign'); |
- // TODO(lry): for elements that could not be resolved emit code to throw a |
- // [NoSuchMethodError]. |
- if (element.isErroneous) return giveup(node, 'StaticSend: erroneous'); |
- // TODO(lry): generate IR for object identicality. |
- if (element == compiler.identicalFunction) { |
- return giveup(node, 'StaticSend: identical'); |
- } |
Selector selector = elements.getSelector(node); |
@@ -1389,7 +1373,8 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
if (Elements.isLocal(element)) { |
valueToStore.useElementAsHint(element); |
assignedVars[variableIndex[element]] = valueToStore; |
- } else if (Elements.isStaticOrTopLevel(element)) { |
+ } else if ((!node.isSuperCall && Elements.isErroneousElement(element)) || |
+ Elements.isStaticOrTopLevel(element)) { |
assert(element.isField || element.isSetter); |
ir.Parameter v = new ir.Parameter(null); |
ir.Continuation k = new ir.Continuation([v]); |
@@ -1398,9 +1383,6 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
new ir.InvokeStatic(element, selector, k, [valueToStore]); |
add(new ir.LetCont(k, invoke)); |
} else { |
- if (element != null && Elements.isUnresolved(element)) { |
- return giveup(node, 'SendSet: non-local, non-static, unresolved'); |
- } |
// Setter or index-setter invocation |
ir.Parameter v = new ir.Parameter(null); |
ir.Continuation k = new ir.Continuation([v]); |
@@ -1429,12 +1411,9 @@ class IrBuilder extends ResolvedVisitor<ir.Primitive> { |
return translateConstant(node); |
} |
FunctionElement element = elements[node.send]; |
- if (Elements.isUnresolved(element)) { |
- return giveup(node, 'NewExpression: unresolved constructor'); |
- } |
Selector selector = elements.getSelector(node.send); |
ast.Node selectorNode = node.send.selector; |
- GenericType type = elements.getType(node); |
+ DartType type = elements.getType(node); |
List<ir.Primitive> args = |
node.send.arguments.mapToList(visit, growable:false); |
ir.Parameter v = new ir.Parameter(null); |