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

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart

Issue 1182913003: Split TypedSelector into Selector and TypeMask. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. 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/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
index 3bfeed456686a7f73bb206602e37e4d153e6f6f2..b29c9c7823550ebfe6e5084313a63f3a1097fd50 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
@@ -17,6 +17,7 @@ import '../js_backend/js_backend.dart' show JavaScriptBackend;
import '../resolution/semantic_visitor.dart';
import '../resolution/operators.dart' as op;
import '../tree/tree.dart' as ast;
+import '../types/types.dart' show TypeMask;
import '../universe/universe.dart' show SelectorKind, CallStructure;
import 'cps_ir_nodes.dart' as ir;
import 'cps_ir_builder.dart';
@@ -166,28 +167,6 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
/// Read the value of [field].
ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src);
- /// Creates a [TypedSelector] variant of [newSelector] using the type of
- /// [oldSelector], if available.
- ///
- /// This is needed to preserve inferred receiver types when creating new
- /// selectors.
- Selector useSelectorType(Selector newSelector, Selector oldSelector) {
- // TODO(asgerf,johnniwinther): This works but it is brittle.
- // We should decouple selectors from inferred receiver type masks.
- // TODO(asgerf): Use this whenever we create a selector for a dynamic call.
- if (oldSelector is TypedSelector) {
- return new TypedSelector(oldSelector.mask, newSelector, compiler.world);
- } else {
- return newSelector;
- }
- }
-
- /// Like [useSelectorType], except the original typed selector is obtained
- /// from the [node].
- Selector useSelectorTypeOfNode(Selector newSelector, ast.Send node) {
- return useSelectorType(newSelector, elements.getSelector(node));
- }
-
ir.FunctionDefinition _makeFunctionBody(FunctionElement element,
ast.FunctionExpression node) {
FunctionSignature signature = element.functionSignature;
@@ -334,6 +313,10 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
buildVariableDeclaration: subbuild(variableDeclaration),
variableElement: variableElement,
variableSelector: selector,
+ variableMask: elements.getTypeMask(identifier),
+ currentMask: elements.getCurrentTypeMask(node),
+ moveNextMask: elements.getMoveNextTypeMask(node),
+ iteratorMask: elements.getIteratorTypeMask(node),
buildBody: subbuild(node.body),
target: elements.getTargetDefinition(node),
closureScope: getClosureScopeForNode(node));
@@ -581,7 +564,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
_) {
return irBuilder.buildDynamicGet(
translateReceiver(receiver),
- selector);
+ selector,
+ elements.getTypeMask(node));
}
@override
@@ -593,7 +577,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ir.Primitive target = visit(receiver);
return irBuilder.buildIfNotNullSend(
target,
- nested(() => irBuilder.buildDynamicGet(target, selector)));
+ nested(() => irBuilder.buildDynamicGet(
+ target, selector, elements.getTypeMask(node))));
}
@override
@@ -678,7 +663,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ir.Primitive visitUnresolvedSuperGet(
ast.Send node,
Element element, _) {
- return buildInstanceNoSuchMethod(elements.getSelector(node), []);
+ return buildInstanceNoSuchMethod(
+ elements.getSelector(node), elements.getTypeMask(node), []);
}
@override
@@ -766,13 +752,12 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ast.Node left,
op.BinaryOperator operator,
ast.Node right) {
- Selector selector = useSelectorTypeOfNode(
- new Selector.binaryOperator(operator.selectorName),
- node);
+ Selector selector = new Selector.binaryOperator(operator.selectorName);
ir.Primitive receiver = visit(left);
List<ir.Primitive> arguments = <ir.Primitive>[visit(right)];
arguments = normalizeDynamicArguments(selector.callStructure, arguments);
- return irBuilder.buildDynamicInvocation(receiver, selector, arguments);
+ return irBuilder.buildDynamicInvocation(
+ receiver, selector, elements.getTypeMask(node), arguments);
}
@override
@@ -787,11 +772,12 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ir.Primitive visitIndex(ast.Send node,
ast.Node receiver,
ast.Node index, _) {
- Selector selector = useSelectorTypeOfNode(new Selector.index(), node);
+ Selector selector = new Selector.index();
ir.Primitive target = visit(receiver);
List<ir.Primitive> arguments = <ir.Primitive>[visit(index)];
arguments = normalizeDynamicArguments(selector.callStructure, arguments);
- return irBuilder.buildDynamicInvocation(target, selector, arguments);
+ return irBuilder.buildDynamicInvocation(
+ target, selector, elements.getTypeMask(node), arguments);
}
ir.Primitive translateSuperBinary(FunctionElement function,
@@ -875,7 +861,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
// TODO(johnniwinther): Clean up the creation of selectors.
Selector selector = operator.selector;
ir.Primitive receiver = translateReceiver(expression);
- return irBuilder.buildDynamicInvocation(receiver, selector, const []);
+ return irBuilder.buildDynamicInvocation(
+ receiver, selector, elements.getTypeMask(node), const []);
}
@override
@@ -932,7 +919,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
Selector selector,
_) {
return irBuilder.buildDynamicInvocation(
- translateReceiver(receiver), selector,
+ translateReceiver(receiver), selector, elements.getTypeMask(node),
translateDynamicArguments(arguments, selector.callStructure));
}
@@ -947,7 +934,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
return irBuilder.buildIfNotNullSend(
target,
nested(() => irBuilder.buildDynamicInvocation(
- target, selector,
+ target, selector, elements.getTypeMask(node),
translateDynamicArguments(arguments, selector.callStructure))));
}
@@ -1079,6 +1066,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
CallStructure callStructure, _) {
return buildInstanceNoSuchMethod(
elements.getSelector(node),
+ elements.getTypeMask(node),
translateDynamicArguments(arguments, callStructure));
}
@@ -1090,6 +1078,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
Selector selector, _) {
return buildInstanceNoSuchMethod(
elements.getSelector(node),
+ elements.getTypeMask(node),
translateDynamicArguments(arguments, selector.callStructure));
}
@@ -1123,7 +1112,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ast.Node rhs,
_) {
return irBuilder.buildDynamicIndexSet(
- visit(receiver), visit(index), visit(rhs));
+ visit(receiver), elements.getTypeMask(node), visit(index), visit(rhs));
}
@override
@@ -1163,8 +1152,10 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
List<ir.Primitive> arguments = <ir.Primitive>[rhsValue];
arguments = normalizeDynamicArguments(
operatorSelector.callStructure, arguments);
+ // TODO(johnniwinther): Find the type mask for the operation.
ir.Primitive result =
- irBuilder.buildDynamicInvocation(value, operatorSelector, arguments);
+ irBuilder.buildDynamicInvocation(
+ value, operatorSelector, null, arguments);
setValue(result);
return rhs.kind == CompoundKind.POSTFIX ? value : result;
}
@@ -1179,6 +1170,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
return irBuilder.buildDynamicSet(
translateReceiver(receiver),
selector,
+ elements.getTypeMask(node),
visit(rhs));
}
@@ -1192,7 +1184,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ir.Primitive target = visit(receiver);
return irBuilder.buildIfNotNullSend(
target,
- nested(() => irBuilder.buildDynamicSet(target, selector, visit(rhs))));
+ nested(() => irBuilder.buildDynamicSet(
+ target, selector, elements.getTypeMask(node), visit(rhs))));
}
@override
@@ -1264,7 +1257,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
@override
ir.Primitive handleDynamicCompounds(
- ast.Send node,
+ ast.SendSet node,
ast.Node receiver,
CompoundRhs rhs,
Selector getterSelector,
@@ -1273,10 +1266,14 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ir.Primitive target = translateReceiver(receiver);
ir.Primitive helper() {
return translateCompounds(
- getValue: () => irBuilder.buildDynamicGet(target, getterSelector),
+ getValue: () => irBuilder.buildDynamicGet(
+ target,
+ getterSelector,
+ elements.getGetterTypeMaskInComplexSendSet(node)),
rhs: rhs,
setValue: (ir.Primitive result) {
- irBuilder.buildDynamicSet(target, setterSelector, result);
+ irBuilder.buildDynamicSet(
+ target, setterSelector, elements.getTypeMask(node), result);
});
}
return node.isConditional
@@ -1364,15 +1361,19 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
});
}
- ir.Primitive buildSuperNoSuchGetter(Element element) {
+ ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) {
return buildInstanceNoSuchMethod(
new Selector.getter(element.name, element.library),
+ mask,
const <ir.Primitive>[]);
}
- ir.Primitive buildSuperNoSuchSetter(Element element, ir.Primitive value) {
+ ir.Primitive buildSuperNoSuchSetter(Element element,
+ TypeMask mask,
+ ir.Primitive value) {
return buildInstanceNoSuchMethod(
new Selector.setter(element.name, element.library),
+ mask,
<ir.Primitive>[value]);
}
@@ -1396,7 +1397,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
return irBuilder.buildSuperMethodGet(getter);
case CompoundGetter.UNRESOLVED:
// TODO(johnniwinther): Ensure [getter] is not null.
- return buildSuperNoSuchGetter(getter != null ? getter : setter);
+ return buildSuperNoSuchGetter(
+ getter != null ? getter : setter,
+ elements.getGetterTypeMaskInComplexSendSet(node));
}
},
rhs: rhs,
@@ -1407,7 +1410,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
case CompoundSetter.SETTER:
return irBuilder.buildSuperSetterSet(setter, result);
case CompoundSetter.INVALID:
- return buildSuperNoSuchSetter(setter, result);
+ return buildSuperNoSuchSetter(
+ setter, elements.getTypeMask(node), result);
}
});
}
@@ -1439,11 +1443,19 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
arguments =
normalizeDynamicArguments(selector.callStructure, arguments);
- return irBuilder.buildDynamicInvocation(target, selector, arguments);
+ return irBuilder.buildDynamicInvocation(
+ target,
+ selector,
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ arguments);
},
rhs: rhs,
setValue: (ir.Primitive result) {
- irBuilder.buildDynamicIndexSet(target, indexValue, result);
+ irBuilder.buildDynamicIndexSet(
+ target,
+ elements.getTypeMask(node),
+ indexValue,
+ result);
});
}
@@ -1464,7 +1476,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
return irBuilder.buildSuperIndex(indexFunction, indexValue);
} else {
return buildInstanceNoSuchMethod(
- new Selector.index(), <ir.Primitive>[indexValue]);
+ new Selector.index(),
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ <ir.Primitive>[indexValue]);
}
},
rhs: rhs,
@@ -1473,7 +1487,9 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result);
} else {
buildInstanceNoSuchMethod(
- new Selector.indexSet(), <ir.Primitive>[indexValue, result]);
+ new Selector.indexSet(),
+ elements.getTypeMask(node),
+ <ir.Primitive>[indexValue, result]);
}
});
}
@@ -1516,6 +1532,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ir.Primitive buildInstanceNoSuchMethod(
Selector selector,
+ TypeMask mask,
List<ir.Primitive> arguments);
ir.Primitive buildRuntimeError(String message);
@@ -1634,8 +1651,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
Element function,
ast.Node index, _) {
// Assume the index getter is missing.
- Selector selector = useSelectorTypeOfNode(new Selector.index(), node);
- return buildInstanceNoSuchMethod(selector, [visit(index)]);
+ return buildInstanceNoSuchMethod(
+ new Selector.index(), elements.getTypeMask(node), [visit(index)]);
}
@override
@@ -1646,6 +1663,7 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ast.Node argument, _) {
return buildInstanceNoSuchMethod(
elements.getSelector(node),
+ elements.getTypeMask(node),
[visit(argument)]);
}
@@ -1654,7 +1672,8 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ast.Send node,
op.UnaryOperator operator,
Element element, _) {
- return buildInstanceNoSuchMethod(elements.getSelector(node), []);
+ return buildInstanceNoSuchMethod(
+ elements.getSelector(node), elements.getTypeMask(node), []);
}
@override
@@ -1742,10 +1761,10 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
ast.SendSet node,
FieldElement field,
ast.Node rhs, _) {
- Selector selector = useSelectorTypeOfNode(
+ return buildInstanceNoSuchMethod(
new Selector.setter(field.name, field.library),
- node);
- return buildInstanceNoSuchMethod(selector, [visit(rhs)]);
+ elements.getTypeMask(node),
+ [visit(rhs)]);
}
@override
@@ -1810,10 +1829,10 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
FunctionElement getter,
ast.Node rhs,
_) {
- Selector selector = useSelectorTypeOfNode(
+ return buildInstanceNoSuchMethod(
new Selector.setter(getter.name, getter.library),
- node);
- return buildInstanceNoSuchMethod(selector, [visit(rhs)]);
+ elements.getTypeMask(node),
+ [visit(rhs)]);
}
@override
@@ -1822,20 +1841,20 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
MethodElement method,
ast.Node rhs,
_) {
- Selector selector = useSelectorTypeOfNode(
+ return buildInstanceNoSuchMethod(
new Selector.setter(method.name, method.library),
- node);
- return buildInstanceNoSuchMethod(selector, [visit(rhs)]);
+ elements.getTypeMask(node),
+ [visit(rhs)]);
}
@override
ir.Primitive visitSuperSetterGet(
ast.Send node,
FunctionElement setter, _) {
- Selector selector = useSelectorTypeOfNode(
+ return buildInstanceNoSuchMethod(
new Selector.setter(setter.name, setter.library),
- node);
- return buildInstanceNoSuchMethod(selector, []);
+ elements.getTypeMask(node),
+ []);
}
@override
@@ -1847,10 +1866,10 @@ abstract class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
List<ir.Primitive> args =
translateDynamicArguments(arguments, callStructure);
Name name = new Name(setter.name, setter.library);
- Selector selector = useSelectorTypeOfNode(
+ return buildInstanceNoSuchMethod(
new Selector(SelectorKind.CALL, name, callStructure),
- node);
- return buildInstanceNoSuchMethod(selector, args);
+ elements.getTypeMask(node),
+ args);
}
ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) {
@@ -2770,10 +2789,12 @@ class JsIrBuilderVisitor extends IrBuilderVisitor {
@override
ir.Primitive buildInstanceNoSuchMethod(Selector selector,
+ TypeMask mask,
List<ir.Primitive> arguments) {
return irBuilder.buildDynamicInvocation(
irBuilder.buildThis(),
- useSelectorType(compiler.noSuchMethodSelector, selector),
+ compiler.noSuchMethodSelector,
+ mask,
[irBuilder.buildInvocationMirror(selector, arguments)]);
}
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698