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

Unified Diff: sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart

Issue 363113004: Handle unresolved elements in the new IR (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 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: 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);

Powered by Google App Engine
This is Rietveld 408576698