| Index: sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart
|
| ===================================================================
|
| --- sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart (revision 31273)
|
| +++ sdk/lib/_internal/compiler/implementation/inferrer/closure_tracer.dart (working copy)
|
| @@ -5,17 +5,18 @@
|
| part of type_graph_inferrer;
|
|
|
| class ClosureTracerVisitor extends TracerVisitor {
|
| - ClosureTracerVisitor(tracedType, inferrer) : super(tracedType, inferrer);
|
| + final FunctionElement tracedElement;
|
|
|
| + ClosureTracerVisitor(this.tracedElement, tracedType, inferrer)
|
| + : super(tracedType, inferrer);
|
| +
|
| void run() {
|
| - ClosureTypeInformation closure = tracedType;
|
| - FunctionElement element = closure.element;
|
| - element.functionSignature.forEachParameter((Element parameter) {
|
| + tracedElement.functionSignature.forEachParameter((Element parameter) {
|
| ElementTypeInformation info = inferrer.types.getInferredTypeOf(parameter);
|
| info.abandonInferencing = false;
|
| });
|
| analyze();
|
| - element.functionSignature.forEachParameter((Element parameter) {
|
| + tracedElement.functionSignature.forEachParameter((Element parameter) {
|
| ElementTypeInformation info = inferrer.types.getInferredTypeOf(parameter);
|
| if (continueAnalyzing) {
|
| info.disableHandleSpecialCases = true;
|
| @@ -30,12 +31,10 @@
|
| }
|
|
|
| void analyzeCall(CallSiteTypeInformation info) {
|
| - ClosureTypeInformation closure = tracedType;
|
| - FunctionElement element = closure.element;
|
| Selector selector = info.selector;
|
| - if (!selector.signatureApplies(element, compiler)) return;
|
| + if (!selector.signatureApplies(tracedElement, compiler)) return;
|
| inferrer.updateParameterAssignments(
|
| - info, element, info.arguments, selector, remove: false,
|
| + info, tracedElement, info.arguments, selector, remove: false,
|
| addToQueue: false);
|
| }
|
|
|
| @@ -51,10 +50,16 @@
|
| visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) {
|
| super.visitStaticCallSiteTypeInformation(info);
|
| Element called = info.calledElement;
|
| - if (called.isForeign(compiler) && called.name == 'JS') {
|
| - bailout('Used in JS ${info.call}');
|
| + if (called.isForeign(compiler)) {
|
| + String name = called.name;
|
| + if (name == 'JS' || name == 'DART_CLOSURE_TO_JS') {
|
| + bailout('Used in JS ${info.call}');
|
| + }
|
| }
|
| - if (inferrer.types.getInferredTypeOf(called) == currentUser) {
|
| + if (called.isGetter()
|
| + && info.selector != null
|
| + && info.selector.isCall()
|
| + && inferrer.types.getInferredTypeOf(called) == currentUser) {
|
| // This node can be a closure call as well. For example, `foo()`
|
| // where `foo` is a getter.
|
| analyzeCall(info);
|
| @@ -77,3 +82,17 @@
|
| }
|
| }
|
| }
|
| +
|
| +class StaticTearOffClosureTracerVisitor extends ClosureTracerVisitor {
|
| + StaticTearOffClosureTracerVisitor(tracedElement, tracedType, inferrer)
|
| + : super(tracedElement, tracedType, inferrer);
|
| +
|
| + visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) {
|
| + super.visitStaticCallSiteTypeInformation(info);
|
| + if (info.calledElement == tracedElement
|
| + && info.selector != null
|
| + && info.selector.isGetter()) {
|
| + addNewEscapeInformation(info);
|
| + }
|
| + }
|
| +}
|
|
|