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

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

Issue 1182053010: Revert "Split TypedSelector into Selector and TypeMask." (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 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
« no previous file with comments | « pkg/compiler/lib/src/resolution/tree_elements.dart ('k') | pkg/compiler/lib/src/ssa/codegen.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 fb7b0792020f66244d7417a1f4fd6991fdcbb99b..fc906e54b72041bc7853c3a43711ad8d5e8f1c8a 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -1297,7 +1297,6 @@ class SsaBuilder extends NewResolvedVisitor {
*/
bool tryInlineMethod(Element element,
Selector selector,
- TypeMask mask,
List<HInstruction> providedArguments,
ast.Node currentNode,
{InterfaceType instanceType}) {
@@ -1329,11 +1328,8 @@ class SsaBuilder extends NewResolvedVisitor {
Elements.isStaticOrTopLevel(element) ||
element.isGenerativeConstructorBody,
message: "Missing selector for inlining of $element."));
- if (selector != null) {
- if (!selector.applies(function, compiler.world)) return false;
- if (mask != null && !mask.canHit(function, selector, compiler.world)) {
- return false;
- }
+ if (selector != null && !selector.applies(function, compiler.world)) {
+ return false;
}
// Don't inline operator== methods if the parameter can be null.
@@ -1452,9 +1448,9 @@ class SsaBuilder extends NewResolvedVisitor {
// Add an explicit null check on the receiver before doing the
// inlining. We use [element] to get the same name in the
// NoSuchMethodError message as if we had called it.
- if (element.isInstanceMember &&
- !element.isGenerativeConstructorBody &&
- (mask == null || mask.isNullable)) {
+ if (element.isInstanceMember
+ && !element.isGenerativeConstructorBody
+ && (selector.mask == null || selector.mask.isNullable)) {
addWithPosition(
new HFieldGet(null, providedArguments[0], backend.dynamicType,
isAssignable: false),
@@ -2301,7 +2297,7 @@ class SsaBuilder extends NewResolvedVisitor {
}
if (!isNativeUpgradeFactory && // TODO(13836): Fix inlining.
- tryInlineMethod(body, null, null, bodyCallInputs, function)) {
+ tryInlineMethod(body, null, bodyCallInputs, function)) {
pop();
} else {
HInvokeConstructorBody invoke = new HInvokeConstructorBody(
@@ -2455,7 +2451,6 @@ class SsaBuilder extends NewResolvedVisitor {
pushInvokeDynamic(
null,
new Selector.call(name, backend.jsHelperLibrary, 1),
- null,
arguments);
return new HTypeConversion(type, kind, original.instructionType, pop());
@@ -3196,11 +3191,7 @@ class SsaBuilder extends NewResolvedVisitor {
}
}
- pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [operand]);
+ pushInvokeDynamic(node, elements.getSelector(node), [operand]);
}
@override
@@ -3232,7 +3223,6 @@ class SsaBuilder extends NewResolvedVisitor {
visitAndPop(left),
visitAndPop(right),
elements.getSelector(node),
- elements.getTypeMask(node),
node,
location: node.selector);
}
@@ -3242,10 +3232,9 @@ class SsaBuilder extends NewResolvedVisitor {
void visitBinarySend(HInstruction left,
HInstruction right,
Selector selector,
- TypeMask mask,
ast.Send send,
{ast.Node location}) {
- pushInvokeDynamic(send, selector, mask, [left, right], location: location);
+ pushInvokeDynamic(send, selector, [left, right], location: location);
}
HInstruction generateInstanceSendReceiver(ast.Send send) {
@@ -3267,14 +3256,12 @@ class SsaBuilder extends NewResolvedVisitor {
* Returns a set of interceptor classes that contain the given
* [selector].
*/
- void generateInstanceGetterWithCompiledReceiver(
- ast.Send send,
- Selector selector,
- TypeMask mask,
- HInstruction receiver) {
+ void generateInstanceGetterWithCompiledReceiver(ast.Send send,
+ Selector selector,
+ HInstruction receiver) {
assert(Elements.isInstanceSend(send, elements));
assert(selector.isGetter);
- pushInvokeDynamic(send, selector, mask, [receiver]);
+ pushInvokeDynamic(send, selector, [receiver]);
}
/// Inserts a call to checkDeferredIsLoaded for [prefixElement].
@@ -3392,7 +3379,7 @@ class SsaBuilder extends NewResolvedVisitor {
void generateDynamicGet(ast.Send node) {
HInstruction receiver = generateInstanceSendReceiver(node);
generateInstanceGetterWithCompiledReceiver(
- node, elements.getSelector(node), elements.getTypeMask(node), receiver);
+ node, elements.getSelector(node), receiver);
}
/// Generate a closurization of the static or top level [function].
@@ -3439,13 +3426,8 @@ class SsaBuilder extends NewResolvedVisitor {
pushCheckNull(expression);
},
() => stack.add(expression),
- () {
- generateInstanceGetterWithCompiledReceiver(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- expression);
- });
+ () => generateInstanceGetterWithCompiledReceiver(
+ node, elements.getSelector(node), expression));
}
/// Pushes a boolean checking [expression] against null.
@@ -3529,22 +3511,18 @@ class SsaBuilder extends NewResolvedVisitor {
HInstruction receiver,
HInstruction value,
{Selector selector,
- TypeMask mask,
ast.Node location}) {
assert(send == null || Elements.isInstanceSend(send, elements));
if (selector == null) {
assert(send != null);
selector = elements.getSelector(send);
- if (mask == null) {
- mask = elements.getTypeMask(send);
- }
}
if (location == null) {
assert(send != null);
location = send;
}
assert(selector.isSetter);
- pushInvokeDynamic(location, selector, mask, [receiver, value]);
+ pushInvokeDynamic(location, selector, [receiver, value]);
pop();
stack.add(value);
}
@@ -3679,9 +3657,7 @@ class SsaBuilder extends NewResolvedVisitor {
if (type.isFunctionType) {
List arguments = [buildFunctionType(type), expression];
pushInvokeDynamic(
- node,
- new Selector.call('_isTest', backend.jsHelperLibrary, 1),
- null,
+ node, new Selector.call('_isTest', backend.jsHelperLibrary, 1),
arguments);
return new HIs.compound(type, expression, pop(), backend.boolType);
} else if (type.isTypeVariable) {
@@ -3803,13 +3779,12 @@ class SsaBuilder extends NewResolvedVisitor {
void _generateDynamicSend(ast.Send node, HInstruction receiver) {
Selector selector = elements.getSelector(node);
- TypeMask mask = elements.getTypeMask(node);
List<HInstruction> inputs = <HInstruction>[];
inputs.add(receiver);
addDynamicSendArgumentsToList(node, inputs);
- pushInvokeDynamic(node, selector, mask, inputs);
+ pushInvokeDynamic(node, selector, inputs);
if (selector.isSetter || selector.isIndexSet) {
pop();
stack.add(inputs.last);
@@ -4173,7 +4148,8 @@ class SsaBuilder extends NewResolvedVisitor {
// If the isolate library is not used, we just invoke the
// closure.
visit(link.tail.head);
- push(new HInvokeClosure(new Selector.callClosure(0),
+ Selector selector = new Selector.callClosure(0);
+ push(new HInvokeClosure(selector,
<HInstruction>[pop()],
backend.dynamicType));
} else {
@@ -4315,7 +4291,7 @@ class SsaBuilder extends NewResolvedVisitor {
// class is _not_ the default implementation from [Object], in
// case the [noSuchMethod] implementation calls
// [JSInvocationMirror._invokeOn].
- registry.registerSelectorUse(selector);
+ registry.registerSelectorUse(selector.asUntyped);
}
String publicName = name;
if (selector.isSetter) publicName += '=';
@@ -5331,11 +5307,9 @@ class SsaBuilder extends NewResolvedVisitor {
Selector selector = elements.getSelector(node);
List<HInstruction> inputs = <HInstruction>[target];
addDynamicSendArgumentsToList(node, inputs);
+ Selector closureSelector = new Selector.callClosureFrom(selector);
pushWithPosition(
- new HInvokeClosure(
- new Selector.callClosureFrom(selector),
- inputs, backend.dynamicType),
- node);
+ new HInvokeClosure(closureSelector, inputs, backend.dynamicType), node);
}
visitGetterSend(ast.Send node) {
@@ -5464,7 +5438,6 @@ class SsaBuilder extends NewResolvedVisitor {
void pushInvokeDynamic(ast.Node node,
Selector selector,
- TypeMask mask,
List<HInstruction> arguments,
{ast.Node location}) {
if (location == null) location = node;
@@ -5505,13 +5478,13 @@ class SsaBuilder extends NewResolvedVisitor {
return false;
}
- Element element = compiler.world.locateSingleElement(selector, mask);
- if (element != null &&
- !element.isField &&
- !(element.isGetter && selector.isCall) &&
- !(element.isFunction && selector.isGetter) &&
- !isOptimizableOperation(selector, element)) {
- if (tryInlineMethod(element, selector, mask, arguments, node)) {
+ Element element = compiler.world.locateSingleElement(selector);
+ if (element != null
+ && !element.isField
+ && !(element.isGetter && selector.isCall)
+ && !(element.isFunction && selector.isGetter)
+ && !isOptimizableOperation(selector, element)) {
+ if (tryInlineMethod(element, selector, arguments, node)) {
return;
}
}
@@ -5523,19 +5496,18 @@ class SsaBuilder extends NewResolvedVisitor {
inputs.add(invokeInterceptor(receiver));
}
inputs.addAll(arguments);
- TypeMask type =
- TypeMaskFactory.inferredTypeForSelector(selector, mask, compiler);
+ TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
if (selector.isGetter) {
pushWithPosition(
- new HInvokeDynamicGetter(selector, mask, null, inputs, type),
+ new HInvokeDynamicGetter(selector, null, inputs, type),
location);
} else if (selector.isSetter) {
pushWithPosition(
- new HInvokeDynamicSetter(selector, mask, null, inputs, type),
+ new HInvokeDynamicSetter(selector, null, inputs, type),
location);
} else {
pushWithPosition(
- new HInvokeDynamicMethod(selector, mask, inputs, type, isIntercepted),
+ new HInvokeDynamicMethod(selector, inputs, type, isIntercepted),
location);
}
}
@@ -5545,7 +5517,7 @@ class SsaBuilder extends NewResolvedVisitor {
List<HInstruction> arguments,
{TypeMask typeMask,
InterfaceType instanceType}) {
- if (tryInlineMethod(element, null, null, arguments, location,
+ if (tryInlineMethod(element, null, arguments, location,
instanceType: instanceType)) {
return;
}
@@ -5600,8 +5572,7 @@ class SsaBuilder extends NewResolvedVisitor {
inputs,
type,
isSetter: selector.isSetter || selector.isIndexSet);
- instruction.sideEffects =
- compiler.world.getSideEffectsOfSelector(selector, null);
+ instruction.sideEffects = compiler.world.getSideEffectsOfSelector(selector);
return instruction;
}
@@ -5618,7 +5589,6 @@ class SsaBuilder extends NewResolvedVisitor {
}
visitBinarySend(receiver, rhs,
elements.getOperatorSelectorInComplexSendSet(node),
- elements.getOperatorTypeMaskInComplexSendSet(node),
node,
location: node.assignmentOperator);
}
@@ -5716,7 +5686,6 @@ class SsaBuilder extends NewResolvedVisitor {
pushInvokeDynamic(
node,
elements.getGetterSelectorInComplexSendSet(node),
- elements.getGetterTypeMaskInComplexSendSet(node),
[receiver, index]);
HInstruction getterInstruction = pop();
if (node.isIfNullAssignment) {
@@ -5731,10 +5700,7 @@ class SsaBuilder extends NewResolvedVisitor {
visit(arguments.head);
HInstruction value = pop();
pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [receiver, index, value]);
+ node, elements.getSelector(node), [receiver, index, value]);
pop();
stack.add(value);
});
@@ -5742,10 +5708,7 @@ class SsaBuilder extends NewResolvedVisitor {
handleComplexOperatorSend(node, getterInstruction, arguments);
HInstruction value = pop();
pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [receiver, index, value]);
+ node, elements.getSelector(node), [receiver, index, value]);
pop();
if (node.isPostfix) {
stack.add(getterInstruction);
@@ -6032,10 +5995,7 @@ class SsaBuilder extends NewResolvedVisitor {
void generateAssignment(HInstruction receiver) {
// desugars `e.x op= e2` to `e.x = e.x op e2`
generateInstanceGetterWithCompiledReceiver(
- node,
- elements.getGetterSelectorInComplexSendSet(node),
- elements.getGetterTypeMaskInComplexSendSet(node),
- receiver);
+ node, elements.getGetterSelectorInComplexSendSet(node), receiver);
HInstruction getterInstruction = pop();
if (node.isIfNullAssignment) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
@@ -6486,8 +6446,7 @@ class SsaBuilder extends NewResolvedVisitor {
HInstruction buildCondition() {
Selector selector = elements.getMoveNextSelector(node);
- TypeMask mask = elements.getMoveNextTypeMask(node);
- pushInvokeDynamic(node, selector, mask, [streamIterator]);
+ pushInvokeDynamic(node, selector, [streamIterator]);
HInstruction future = pop();
push(new HAwait(future, new TypeMask.subclass(compiler.objectClass,
compiler.world)));
@@ -6495,13 +6454,11 @@ class SsaBuilder extends NewResolvedVisitor {
}
void buildBody() {
Selector call = elements.getCurrentSelector(node);
- TypeMask callMask = elements.getCurrentTypeMask(node);
- pushInvokeDynamic(node, call, callMask, [streamIterator]);
+ pushInvokeDynamic(node, call, [streamIterator]);
ast.Node identifier = node.declaredIdentifier;
Element variable = elements.getForInVariable(node);
Selector selector = elements.getSelector(identifier);
- TypeMask mask = elements.getTypeMask(identifier);
HInstruction value = pop();
if (identifier.asSend() != null
@@ -6513,7 +6470,6 @@ class SsaBuilder extends NewResolvedVisitor {
receiver,
value,
selector: selector,
- mask: mask,
location: identifier);
} else {
generateNonInstanceSetter(
@@ -6533,9 +6489,7 @@ class SsaBuilder extends NewResolvedVisitor {
buildUpdate,
buildBody);
}, () {
- pushInvokeDynamic(node,
- new Selector.call("cancel", null, 0),
- null,
+ pushInvokeDynamic(node, new Selector.call("cancel", null, 0),
[streamIterator]);
push(new HAwait(pop(), new TypeMask.subclass(compiler.objectClass,
compiler.world)));
@@ -6555,7 +6509,7 @@ class SsaBuilder extends NewResolvedVisitor {
// case.
Selector selector = elements.getIteratorSelector(node);
- TypeMask mask = elements.getIteratorTypeMask(node);
+ TypeMask mask = selector.mask;
ClassWorld classWorld = compiler.world;
if (mask != null && mask.satisfies(backend.jsIndexableClass, classWorld)) {
@@ -6577,24 +6531,21 @@ class SsaBuilder extends NewResolvedVisitor {
void buildInitializer() {
Selector selector = elements.getIteratorSelector(node);
- TypeMask mask = elements.getIteratorTypeMask(node);
visit(node.expression);
HInstruction receiver = pop();
- pushInvokeDynamic(node, selector, mask, [receiver]);
+ pushInvokeDynamic(node, selector, [receiver]);
iterator = pop();
}
HInstruction buildCondition() {
Selector selector = elements.getMoveNextSelector(node);
- TypeMask mask = elements.getMoveNextTypeMask(node);
- pushInvokeDynamic(node, selector, mask, [iterator]);
+ pushInvokeDynamic(node, selector, [iterator]);
return popBoolified();
}
void buildBody() {
Selector call = elements.getCurrentSelector(node);
- TypeMask mask = elements.getCurrentTypeMask(node);
- pushInvokeDynamic(node, call, mask, [iterator]);
+ pushInvokeDynamic(node, call, [iterator]);
buildAssignLoopVariable(node, pop());
visit(node.body);
}
@@ -6606,7 +6557,6 @@ class SsaBuilder extends NewResolvedVisitor {
ast.Node identifier = node.declaredIdentifier;
Element variable = elements.getForInVariable(node);
Selector selector = elements.getSelector(identifier);
- TypeMask mask = elements.getTypeMask(identifier);
if (identifier.asSend() != null &&
Elements.isInstanceSend(identifier, elements)) {
@@ -6617,7 +6567,6 @@ class SsaBuilder extends NewResolvedVisitor {
receiver,
value,
selector: selector,
- mask: mask,
location: identifier);
} else {
generateNonInstanceSetter(null, variable, value, location: identifier);
@@ -6697,8 +6646,9 @@ class SsaBuilder extends NewResolvedVisitor {
// example, `get current` includes null.
// TODO(sra): The element type of a container type mask might be better.
Selector selector = new Selector.index();
- TypeMask type = TypeMaskFactory.inferredTypeForSelector(
- selector, arrayType, compiler);
+ Selector refined = new TypedSelector(arrayType, selector, compiler.world);
+ TypeMask type =
+ TypeMaskFactory.inferredTypeForSelector(refined, compiler);
HInstruction index = localsHandler.readLocal(indexVariable);
HInstruction value = new HIndex(array, index, null, type);
@@ -7615,12 +7565,12 @@ class StringBuilderVisitor extends ast.Visitor {
// If the `toString` method is guaranteed to return a string we can call it
// directly.
- Selector selector = new Selector.call('toString', null, 0);
- TypeMask type = TypeMaskFactory.inferredTypeForSelector(
- selector, expression.instructionType, compiler);
+ Selector selector =
+ new TypedSelector(expression.instructionType,
+ new Selector.call('toString', null, 0), compiler.world);
+ TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
if (type.containsOnlyString(compiler.world)) {
- builder.pushInvokeDynamic(
- node, selector, expression.instructionType, <HInstruction>[expression]);
+ builder.pushInvokeDynamic(node, selector, <HInstruction>[expression]);
append(builder.pop());
return;
}
« no previous file with comments | « pkg/compiler/lib/src/resolution/tree_elements.dart ('k') | pkg/compiler/lib/src/ssa/codegen.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698