OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dump_info; | 5 library dump_info; |
6 | 6 |
7 import 'dart:convert' | 7 import 'dart:convert' |
8 show HtmlEscape, JsonEncoder, StringConversionSink, ChunkedConversionSink; | 8 show HtmlEscape, JsonEncoder, StringConversionSink, ChunkedConversionSink; |
9 | 9 |
10 import 'package:dart2js_info/info.dart'; | 10 import 'package:dart2js_info/info.dart'; |
11 | 11 |
12 import 'common.dart'; | 12 import 'common.dart'; |
13 import 'common/tasks.dart' show | 13 import 'common/tasks.dart' show |
14 CompilerTask; | 14 CompilerTask; |
15 import 'constants/values.dart' show ConstantValue; | 15 import 'constants/values.dart' show ConstantValue; |
16 import 'compiler.dart' show | 16 import 'compiler.dart' show |
17 Compiler; | 17 Compiler; |
18 import 'elements/elements.dart'; | 18 import 'elements/elements.dart'; |
19 import 'elements/visitor.dart'; | 19 import 'elements/visitor.dart'; |
20 import 'types/types.dart' show | 20 import 'types/types.dart' show |
21 TypeMask; | 21 TypeMask; |
22 import 'deferred_load.dart' show | 22 import 'deferred_load.dart' show |
23 OutputUnit; | 23 OutputUnit; |
24 import 'js_backend/js_backend.dart' show | 24 import 'js_backend/js_backend.dart' show |
25 JavaScriptBackend; | 25 JavaScriptBackend; |
26 import 'js_emitter/full_emitter/emitter.dart' as full show | 26 import 'js_emitter/full_emitter/emitter.dart' as full show |
27 Emitter; | 27 Emitter; |
28 import 'js/js.dart' as jsAst; | 28 import 'js/js.dart' as jsAst; |
29 import 'universe/universe.dart' show | 29 import 'universe/use.dart' show |
30 UniverseSelector; | 30 DynamicUse; |
31 import 'info/send_info.dart' show collectSendMeasurements; | 31 import 'info/send_info.dart' show collectSendMeasurements; |
32 | 32 |
33 class ElementInfoCollector extends BaseElementVisitor<Info, dynamic> { | 33 class ElementInfoCollector extends BaseElementVisitor<Info, dynamic> { |
34 final Compiler compiler; | 34 final Compiler compiler; |
35 | 35 |
36 final AllInfo result = new AllInfo(); | 36 final AllInfo result = new AllInfo(); |
37 final Map<Element, Info> _elementToInfo = <Element, Info>{}; | 37 final Map<Element, Info> _elementToInfo = <Element, Info>{}; |
38 final Map<ConstantValue, Info> _constantToInfo = <ConstantValue, Info>{}; | 38 final Map<ConstantValue, Info> _constantToInfo = <ConstantValue, Info>{}; |
39 final Map<OutputUnit, OutputUnitInfo> _outputToInfo = {}; | 39 final Map<OutputUnit, OutputUnitInfo> _outputToInfo = {}; |
40 | 40 |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 final Set<jsAst.Node> _tracking = new Set<jsAst.Node>(); | 371 final Set<jsAst.Node> _tracking = new Set<jsAst.Node>(); |
372 // A mapping from Dart Elements to Javascript AST Nodes. | 372 // A mapping from Dart Elements to Javascript AST Nodes. |
373 final Map<Element, List<jsAst.Node>> _elementToNodes = | 373 final Map<Element, List<jsAst.Node>> _elementToNodes = |
374 <Element, List<jsAst.Node>>{}; | 374 <Element, List<jsAst.Node>>{}; |
375 final Map<ConstantValue, jsAst.Node> _constantToNode = | 375 final Map<ConstantValue, jsAst.Node> _constantToNode = |
376 <ConstantValue, jsAst.Node>{}; | 376 <ConstantValue, jsAst.Node>{}; |
377 // A mapping from Javascript AST Nodes to the size of their | 377 // A mapping from Javascript AST Nodes to the size of their |
378 // pretty-printed contents. | 378 // pretty-printed contents. |
379 final Map<jsAst.Node, int> _nodeToSize = <jsAst.Node, int>{}; | 379 final Map<jsAst.Node, int> _nodeToSize = <jsAst.Node, int>{}; |
380 | 380 |
381 final Map<Element, Set<UniverseSelector>> selectorsFromElement = {}; | 381 final Map<Element, Set<DynamicUse>> selectorsFromElement = {}; |
382 final Map<Element, int> inlineCount = <Element, int>{}; | 382 final Map<Element, int> inlineCount = <Element, int>{}; |
383 // A mapping from an element to a list of elements that are | 383 // A mapping from an element to a list of elements that are |
384 // inlined inside of it. | 384 // inlined inside of it. |
385 final Map<Element, List<Element>> inlineMap = <Element, List<Element>>{}; | 385 final Map<Element, List<Element>> inlineMap = <Element, List<Element>>{}; |
386 | 386 |
387 /// Register the size of the generated output. | 387 /// Register the size of the generated output. |
388 void reportSize(int programSize) { | 388 void reportSize(int programSize) { |
389 _programSize = programSize; | 389 _programSize = programSize; |
390 } | 390 } |
391 | 391 |
392 void reportInlined(Element element, Element inlinedFrom) { | 392 void reportInlined(Element element, Element inlinedFrom) { |
393 inlineCount.putIfAbsent(element, () => 0); | 393 inlineCount.putIfAbsent(element, () => 0); |
394 inlineCount[element] += 1; | 394 inlineCount[element] += 1; |
395 inlineMap.putIfAbsent(inlinedFrom, () => new List<Element>()); | 395 inlineMap.putIfAbsent(inlinedFrom, () => new List<Element>()); |
396 inlineMap[inlinedFrom].add(element); | 396 inlineMap[inlinedFrom].add(element); |
397 } | 397 } |
398 | 398 |
399 /** | 399 /** |
400 * Registers that a function uses a selector in the | 400 * Registers that a function uses a selector in the |
401 * function body | 401 * function body |
402 */ | 402 */ |
403 void elementUsesSelector(Element element, UniverseSelector selector) { | 403 void elementUsesSelector(Element element, DynamicUse selector) { |
404 if (compiler.dumpInfo) { | 404 if (compiler.dumpInfo) { |
405 selectorsFromElement | 405 selectorsFromElement |
406 .putIfAbsent(element, () => new Set<UniverseSelector>()) | 406 .putIfAbsent(element, () => new Set<DynamicUse>()) |
407 .add(selector); | 407 .add(selector); |
408 } | 408 } |
409 } | 409 } |
410 | 410 |
411 final Map<Element, Set<Element>> _dependencies = {}; | 411 final Map<Element, Set<Element>> _dependencies = {}; |
412 void registerDependency(Element source, Element target) { | 412 void registerDependency(Element source, Element target) { |
413 _dependencies.putIfAbsent(source, () => new Set()).add(target); | 413 _dependencies.putIfAbsent(source, () => new Set()).add(target); |
414 } | 414 } |
415 | 415 |
416 /** | 416 /** |
417 * Returns an iterable of [Selection]s that are used by | 417 * Returns an iterable of [Selection]s that are used by |
418 * [element]. Each [Selection] contains an element that is | 418 * [element]. Each [Selection] contains an element that is |
419 * used and the selector that selected the element. | 419 * used and the selector that selected the element. |
420 */ | 420 */ |
421 Iterable<Selection> getRetaining(Element element) { | 421 Iterable<Selection> getRetaining(Element element) { |
422 if (!selectorsFromElement.containsKey(element)) { | 422 if (!selectorsFromElement.containsKey(element)) { |
423 return const <Selection>[]; | 423 return const <Selection>[]; |
424 } else { | 424 } else { |
425 return selectorsFromElement[element].expand((UniverseSelector selector) { | 425 return selectorsFromElement[element].expand((DynamicUse selector) { |
426 return compiler.world.allFunctions | 426 return compiler.world.allFunctions |
427 .filter(selector.selector, selector.mask) | 427 .filter(selector.selector, selector.mask) |
428 .map((element) { | 428 .map((element) { |
429 return new Selection(element, selector.mask); | 429 return new Selection(element, selector.mask); |
430 }); | 430 }); |
431 }); | 431 }); |
432 } | 432 } |
433 } | 433 } |
434 | 434 |
435 // Returns true if we care about tracking the size of | 435 // Returns true if we care about tracking the size of |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 | 567 |
568 ChunkedConversionSink<Object> sink = encoder.startChunkedConversion( | 568 ChunkedConversionSink<Object> sink = encoder.startChunkedConversion( |
569 new StringConversionSink.fromStringSink(buffer)); | 569 new StringConversionSink.fromStringSink(buffer)); |
570 sink.add(new AllInfoJsonCodec().encode(result)); | 570 sink.add(new AllInfoJsonCodec().encode(result)); |
571 reporter.reportInfo(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, { | 571 reporter.reportInfo(NO_LOCATION_SPANNABLE, MessageKind.GENERIC, { |
572 'text': "View the dumped .info.json file at " | 572 'text': "View the dumped .info.json file at " |
573 "https://dart-lang.github.io/dump-info-visualizer" | 573 "https://dart-lang.github.io/dump-info-visualizer" |
574 }); | 574 }); |
575 } | 575 } |
576 } | 576 } |
OLD | NEW |