Index: pkg/compiler/lib/src/dump_info.dart |
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart |
index 987696a0abae46059354f3f2efd0d6662a3393e6..f9faa1a99a936a17a8170963bb6375096d014ee6 100644 |
--- a/pkg/compiler/lib/src/dump_info.dart |
+++ b/pkg/compiler/lib/src/dump_info.dart |
@@ -20,8 +20,8 @@ import 'deferred_load.dart' show OutputUnit; |
import 'js_backend/js_backend.dart' show JavaScriptBackend; |
import 'js_emitter/full_emitter/emitter.dart' as full show Emitter; |
import 'js/js.dart' as jsAst; |
-import 'universe/use.dart' show |
- DynamicUse; |
+import 'universe/universe.dart' show ReceiverConstraint; |
+import 'universe/world_impact.dart' show WorldImpact; |
import 'info/send_info.dart' show collectSendMeasurements; |
class ElementInfoCollector extends BaseElementVisitor<Info, dynamic> { |
@@ -52,10 +52,10 @@ class ElementInfoCollector extends BaseElementVisitor<Info, dynamic> { |
/// Whether to emit information about [element]. |
/// |
/// By default we emit information for any element that contributes to the |
- /// output size. Either becuase the it is a function being emitted or inlined, |
+ /// output size. Either because the it is a function being emitted or inlined, |
/// or because it is an element that holds dependencies to other elements. |
bool shouldKeep(Element element) { |
- return compiler.dumpInfoTask.selectorsFromElement.containsKey(element) || |
+ return compiler.dumpInfoTask.impacts.containsKey(element) || |
compiler.dumpInfoTask.inlineCount.containsKey(element); |
} |
@@ -349,7 +349,7 @@ class ElementInfoCollector extends BaseElementVisitor<Info, dynamic> { |
class Selection { |
final Element selectedElement; |
- final TypeMask mask; |
+ final ReceiverConstraint mask; |
Selection(this.selectedElement, this.mask); |
} |
@@ -386,12 +386,13 @@ class DumpInfoTask extends CompilerTask implements InfoReporter { |
// pretty-printed contents. |
final Map<jsAst.Node, int> _nodeToSize = <jsAst.Node, int>{}; |
- final Map<Element, Set<DynamicUse>> selectorsFromElement = {}; |
final Map<Element, int> inlineCount = <Element, int>{}; |
// A mapping from an element to a list of elements that are |
// inlined inside of it. |
final Map<Element, List<Element>> inlineMap = <Element, List<Element>>{}; |
+ final Map<Element, WorldImpact> impacts = <Element, WorldImpact>{}; |
+ |
/// Register the size of the generated output. |
void reportSize(int programSize) { |
_programSize = programSize; |
@@ -404,40 +405,35 @@ class DumpInfoTask extends CompilerTask implements InfoReporter { |
inlineMap[inlinedFrom].add(element); |
} |
- /** |
- * Registers that a function uses a selector in the |
- * function body |
- */ |
- void elementUsesSelector(Element element, DynamicUse selector) { |
- if (compiler.dumpInfo) { |
- selectorsFromElement |
- .putIfAbsent(element, () => new Set<DynamicUse>()) |
- .add(selector); |
- } |
- } |
- |
final Map<Element, Set<Element>> _dependencies = {}; |
void registerDependency(Element source, Element target) { |
_dependencies.putIfAbsent(source, () => new Set()).add(target); |
} |
+ void registerImpact(Element element, WorldImpact impact) { |
+ if (compiler.dumpInfo) { |
+ impacts[element] = impact; |
+ } |
+ } |
+ |
/** |
* Returns an iterable of [Selection]s that are used by |
* [element]. Each [Selection] contains an element that is |
* used and the selector that selected the element. |
*/ |
Iterable<Selection> getRetaining(Element element) { |
- if (!selectorsFromElement.containsKey(element)) { |
- return const <Selection>[]; |
- } else { |
- return selectorsFromElement[element].expand((DynamicUse selector) { |
- return compiler.world.allFunctions |
- .filter(selector.selector, selector.mask) |
- .map((element) { |
- return new Selection(element, selector.mask); |
- }); |
- }); |
- } |
+ var impact = impacts[element]; |
+ if (impact == null) return const <Selection>[]; |
+ |
+ var selections = <Selection>[]; |
+ selections.addAll(impact.dynamicUses.expand((dynamicUse) { |
+ return compiler.world.allFunctions |
+ .filter(dynamicUse.selector, dynamicUse.mask) |
+ .map((e) => new Selection(e, dynamicUse.mask)); |
+ })); |
+ selections.addAll(impact.staticUses |
+ .map((staticUse) => new Selection(staticUse.element, null))); |
+ return selections; |
} |
// Returns true if we care about tracking the size of |