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

Unified Diff: pkg/compiler/lib/src/ssa/builder.dart

Issue 2502033002: Set runtime type information when converting list literals. (Closed)
Patch Set: . Created 4 years, 1 month 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: 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 f3e3ade6e2f78004a9e0e12e2877dec8aea392af..323609941cfd032e7548111c0ac7494a8109f4e4 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -743,7 +743,8 @@ class SsaBuilder extends ast.Visitor
parameters.values.where((p) => p.instructionType.isEmpty);
if (emptyParameters.length > 0) {
addComment('${emptyParameters} inferred as [empty]');
- pushInvokeStatic(function.body, helpers.assertUnreachableMethod, []);
+ pushInvokeStatic(helpers.assertUnreachableMethod, [],
+ location: function.body);
pop();
return closeFunction();
}
@@ -1604,7 +1605,7 @@ class SsaBuilder extends ast.Visitor
// assertHelper(condition);
//
visit(node.condition);
- pushInvokeStatic(node, helpers.assertHelper, [pop()]);
+ pushInvokeStatic(helpers.assertHelper, [pop()], location: node);
pop();
return;
}
@@ -1614,12 +1615,12 @@ class SsaBuilder extends ast.Visitor
//
void buildCondition() {
visit(node.condition);
- pushInvokeStatic(node, helpers.assertTest, [pop()]);
+ pushInvokeStatic(helpers.assertTest, [pop()], location: node);
}
void fail() {
visit(node.message);
- pushInvokeStatic(node, helpers.assertThrow, [pop()]);
+ pushInvokeStatic(helpers.assertThrow, [pop()], location: node);
pop();
}
@@ -2097,7 +2098,7 @@ class SsaBuilder extends ast.Visitor
String uri = prefixElement.deferredImport.uri.toString();
HInstruction uriConstant = addConstantString(uri);
Element helper = helpers.checkDeferredIsLoaded;
- pushInvokeStatic(location, helper, [loadIdConstant, uriConstant]);
+ pushInvokeStatic(helper, [loadIdConstant, uriConstant], location: location);
pop();
}
@@ -2198,8 +2199,8 @@ class SsaBuilder extends ast.Visitor
if (getter.isDeferredLoaderGetter) {
generateDeferredLoaderGet(node, getter, sourceInformation);
} else {
- pushInvokeStatic(node, getter, <HInstruction>[],
- sourceInformation: sourceInformation);
+ pushInvokeStatic(getter, <HInstruction>[],
+ sourceInformation: sourceInformation, location: node);
}
}
@@ -2357,7 +2358,7 @@ class SsaBuilder extends ast.Visitor
message: "Unexpected non instance setter: $element."));
if (Elements.isStaticOrTopLevelField(element)) {
if (element.isSetter) {
- pushInvokeStatic(location, element, <HInstruction>[value]);
+ pushInvokeStatic(element, <HInstruction>[value], location: location);
pop();
} else {
FieldElement field = element;
@@ -2465,7 +2466,7 @@ class SsaBuilder extends ast.Visitor
typeBuilder.addTypeVariableReference(type, sourceElement);
Element helper = helpers.checkSubtypeOfRuntimeType;
List<HInstruction> inputs = <HInstruction>[expression, runtimeType];
- pushInvokeStatic(null, helper, inputs, typeMask: backend.boolType);
+ pushInvokeStatic(helper, inputs, typeMask: backend.boolType);
HInstruction call = pop();
return new HIs.variable(type, expression, call, backend.boolType);
} else if (RuntimeTypes.hasTypeArguments(type)) {
@@ -2486,7 +2487,8 @@ class SsaBuilder extends ast.Visitor
representations,
asFieldName
];
- pushInvokeStatic(node, helper, inputs, typeMask: backend.boolType);
+ pushInvokeStatic(helper, inputs,
+ typeMask: backend.boolType, location: node);
HInstruction call = pop();
return new HIs.compound(type, expression, call, backend.boolType);
} else {
@@ -2737,7 +2739,7 @@ class SsaBuilder extends ast.Visitor
if (element == null) {
reporter.internalError(node, 'Isolate library and compiler mismatch.');
}
- pushInvokeStatic(null, element, [], typeMask: backend.dynamicType);
+ pushInvokeStatic(element, [], typeMask: backend.dynamicType);
}
}
@@ -2932,7 +2934,8 @@ class SsaBuilder extends ast.Visitor
}
List<HInstruction> inputs = <HInstruction>[];
addGenericSendArgumentsToList(link, inputs);
- pushInvokeStatic(node, element, inputs, typeMask: backend.dynamicType);
+ pushInvokeStatic(element, inputs,
+ typeMask: backend.dynamicType, location: node);
}
}
@@ -3091,7 +3094,6 @@ class SsaBuilder extends ast.Visitor
constantSystem.createInt(selector.invocationMirrorKind);
pushInvokeStatic(
- null,
createInvocationMirror,
[
graph.addConstant(nameConstant, compiler),
@@ -3298,44 +3300,7 @@ class SsaBuilder extends ast.Visitor
});
// TODO(15489): Register at codegen.
registry?.registerInstantiation(type);
- return callSetRuntimeTypeInfoWithTypeArguments(
- type.element, inputs, newObject);
- }
-
- HInstruction callSetRuntimeTypeInfoWithTypeArguments(ClassElement element,
- List<HInstruction> rtiInputs, HInstruction newObject) {
- if (!backend.classNeedsRti(element)) {
- return newObject;
- }
-
- HInstruction typeInfo = new HTypeInfoExpression(
- TypeInfoExpressionKind.INSTANCE,
- element.thisType,
- rtiInputs,
- backend.dynamicType);
- add(typeInfo);
- return callSetRuntimeTypeInfo(typeInfo, newObject);
- }
-
- HInstruction callSetRuntimeTypeInfo(
- HInstruction typeInfo, HInstruction newObject) {
- // Set the runtime type information on the object.
- Element typeInfoSetterElement = helpers.setRuntimeTypeInfo;
- pushInvokeStatic(
- null, typeInfoSetterElement, <HInstruction>[newObject, typeInfo],
- typeMask: backend.dynamicType,
- sourceInformation: newObject.sourceInformation);
-
- // The new object will now be referenced through the
- // `setRuntimeTypeInfo` call. We therefore set the type of that
- // instruction to be of the object's type.
- assert(invariant(CURRENT_ELEMENT_SPANNABLE,
- stack.last is HInvokeStatic || stack.last == newObject,
- message: "Unexpected `stack.last`: Found ${stack.last}, "
- "expected ${newObject} or an HInvokeStatic. "
- "State: typeInfo=$typeInfo, stack=$stack."));
- stack.last.instructionType = newObject.instructionType;
- return pop();
+ return callSetRuntimeTypeInfoWithTypeArguments(type, inputs, newObject);
}
void handleNewSend(ast.NewExpression node) {
@@ -3514,10 +3479,11 @@ class SsaBuilder extends ast.Visitor
sourceInformationBuilder.buildNew(send);
potentiallyAddTypeArguments(inputs, cls, expectedType);
addInlinedInstantiation(expectedType);
- pushInvokeStatic(node, constructor.declaration, inputs,
+ pushInvokeStatic(constructor.declaration, inputs,
typeMask: elementType,
instanceType: expectedType,
- sourceInformation: sourceInformation);
+ sourceInformation: sourceInformation,
+ location: node);
removeInlinedInstantiation(expectedType);
}
HInstruction newInstance = stack.last;
@@ -3631,9 +3597,10 @@ class SsaBuilder extends ast.Visitor
new HIdentity(inputs[0], inputs[1], null, backend.boolType), node);
return;
} else {
- pushInvokeStatic(node, function, inputs,
+ pushInvokeStatic(function, inputs,
sourceInformation:
- sourceInformationBuilder.buildCall(node, node.selector));
+ sourceInformationBuilder.buildCall(node, node.selector),
+ location: node);
}
}
@@ -3832,9 +3799,9 @@ class SsaBuilder extends ast.Visitor
DartType type = localsHandler.substInContext(typeVariable);
HInstruction value = typeBuilder.analyzeTypeArgument(type, sourceElement,
sourceInformation: sourceInformationBuilder.buildGet(node));
- pushInvokeStatic(node, helpers.runtimeTypeToString, [value],
- typeMask: backend.stringType);
- pushInvokeStatic(node, helpers.createRuntimeType, [pop()]);
+ pushInvokeStatic(helpers.runtimeTypeToString, [value],
+ typeMask: backend.stringType, location: node);
+ pushInvokeStatic(helpers.createRuntimeType, [pop()], location: node);
}
}
@@ -3871,7 +3838,7 @@ class SsaBuilder extends ast.Visitor
void generateError(ast.Node node, String message, Element helper) {
HInstruction errorMessage = addConstantString(message);
- pushInvokeStatic(node, helper, [errorMessage]);
+ pushInvokeStatic(helper, [errorMessage], location: node);
}
void generateRuntimeError(ast.Node node, String message) {
@@ -3921,9 +3888,8 @@ class SsaBuilder extends ast.Visitor
} else {
existingNamesList = graph.addConstantNull(compiler);
}
- pushInvokeStatic(
- diagnosticNode, helper, [receiver, name, arguments, existingNamesList],
- sourceInformation: sourceInformation);
+ pushInvokeStatic(helper, [receiver, name, arguments, existingNamesList],
+ sourceInformation: sourceInformation, location: diagnosticNode);
}
/**
@@ -4164,11 +4130,11 @@ class SsaBuilder extends ast.Visitor
nativeBehavior: nativeBehavior)..sourceInformation = sourceInformation;
}
- void pushInvokeStatic(
- ast.Node location, MethodElement element, List<HInstruction> arguments,
+ void pushInvokeStatic(MethodElement element, List<HInstruction> arguments,
{TypeMask typeMask,
InterfaceType instanceType,
- SourceInformation sourceInformation}) {
+ SourceInformation sourceInformation,
+ ast.Node location}) {
assert(element.isDeclaration);
// TODO(johnniwinther): Use [sourceInformation] instead of [location].
if (tryInlineMethod(element, null, null, arguments, location,
@@ -5159,7 +5125,7 @@ class SsaBuilder extends ast.Visitor
inputs.add(typeBuilder.analyzeTypeArgument(argument, sourceElement));
});
}
- pushInvokeStatic(node, targetConstructor.declaration, inputs);
+ pushInvokeStatic(targetConstructor.declaration, inputs, location: node);
HInstruction value = pop();
emitReturn(value, node);
}
@@ -5273,7 +5239,10 @@ class SsaBuilder extends ast.Visitor
// TODO(15489): Register at codegen.
registry?.registerInstantiation(type);
return callSetRuntimeTypeInfoWithTypeArguments(
- type.element, arguments, object);
+ // TODO(efortuna): this was type.element.thisType. Is this equivalent?
+ type,
+ arguments,
+ object);
}
visitLiteralList(ast.LiteralList node) {
@@ -5390,8 +5359,9 @@ class SsaBuilder extends ast.Visitor
visit(node.expression);
HInstruction expression = pop();
- pushInvokeStatic(node, helpers.streamIteratorConstructor,
- [expression, graph.addConstantNull(compiler)]);
+ pushInvokeStatic(helpers.streamIteratorConstructor,
+ [expression, graph.addConstantNull(compiler)],
+ location: node);
streamIterator = pop();
void buildInitializer() {}
@@ -5564,8 +5534,8 @@ class SsaBuilder extends ast.Visitor
//
HInstruction length = buildGetLength();
push(new HIdentity(length, originalLength, null, boolType));
- pushInvokeStatic(
- node, helpers.checkConcurrentModificationError, [pop(), array]);
+ pushInvokeStatic(helpers.checkConcurrentModificationError, [pop(), array],
+ location: node);
pop();
}
@@ -5749,8 +5719,8 @@ class SsaBuilder extends ast.Visitor
mapType.intersection(returnTypeMask, compiler.closedWorld);
addInlinedInstantiation(expectedType);
- pushInvokeStatic(node, constructor, inputs,
- typeMask: instructionType, instanceType: expectedType);
+ pushInvokeStatic(constructor, inputs,
+ typeMask: instructionType, instanceType: expectedType, location: node);
removeInlinedInstantiation(expectedType);
}
@@ -6049,7 +6019,7 @@ class SsaBuilder extends ast.Visitor
buildSwitchCase(switchCase);
if (!isAborted()) {
if (caseIterator.hasNext && isReachable) {
- pushInvokeStatic(switchCase, helpers.fallThroughError, []);
+ pushInvokeStatic(helpers.fallThroughError, [], location: switchCase);
HInstruction error = pop();
closeAndGotoExit(new HThrow(error, error.sourceInformation));
} else if (!isDefaultCase(switchCase)) {
@@ -6269,7 +6239,7 @@ class SsaBuilder extends ast.Visitor
HInstruction oldRethrowableException = rethrowableException;
rethrowableException = exception;
- pushInvokeStatic(node, helpers.exceptionUnwrapper, [exception]);
+ pushInvokeStatic(helpers.exceptionUnwrapper, [exception], location: node);
HInvokeStatic unwrappedException = pop();
tryInstruction.exception = exception;
Link<ast.Node> link = node.catchBlocks.nodes;
@@ -6314,7 +6284,8 @@ class SsaBuilder extends ast.Visitor
}
ast.Node trace = catchBlock.trace;
if (trace != null) {
- pushInvokeStatic(trace, helpers.traceFromException, [exception]);
+ pushInvokeStatic(helpers.traceFromException, [exception],
+ location: trace);
HInstruction traceInstruction = pop();
LocalVariableElement traceVariable = elements[trace];
localsHandler.updateLocal(traceVariable, traceInstruction);

Powered by Google App Engine
This is Rietveld 408576698