| Index: pkg/compiler/lib/src/js_emitter/registry.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/registry.dart b/pkg/compiler/lib/src/js_emitter/registry.dart
|
| index 0c036b3e3179a0b5b7b179753682de6c19fda0bb..e0115b1cd4a750a21699c6681e797bed8de784dc 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/registry.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/registry.dart
|
| @@ -54,6 +54,10 @@ class Registry {
|
| final Map<OutputUnit, Fragment> _deferredFragmentsMap =
|
| <OutputUnit, Fragment>{};
|
|
|
| + /// Cache for the last seen output unit.
|
| + OutputUnit _lastOutputUnit;
|
| + Fragment _lastFragment;
|
| +
|
| DeferredLoadTask get _deferredLoadTask => _compiler.deferredLoadTask;
|
| Iterable<Holder> get holders => _holdersMap.values;
|
| Iterable<Fragment> get deferredFragments => _deferredFragmentsMap.values;
|
| @@ -68,17 +72,23 @@ class Registry {
|
| OutputUnit get _mainOutputUnit => _deferredLoadTask.mainOutputUnit;
|
|
|
| Fragment _mapUnitToFragment(OutputUnit targetUnit) {
|
| + if (targetUnit == _lastOutputUnit) return _lastFragment;
|
| +
|
| if (mainFragment == null) {
|
| mainFragment = new Fragment.main(_deferredLoadTask.mainOutputUnit);
|
| }
|
| - if (!_isProgramSplit) {
|
| - assert(targetUnit == _deferredLoadTask.mainOutputUnit);
|
| - return mainFragment;
|
| +
|
| + Fragment result;
|
| + if (targetUnit == _mainOutputUnit) {
|
| + result = mainFragment;
|
| + } else {
|
| + String name = targetUnit.name;
|
| + result = _deferredFragmentsMap.putIfAbsent(
|
| + targetUnit, () => new Fragment.deferred(targetUnit, name));
|
| }
|
| - if (targetUnit == _mainOutputUnit) return mainFragment;
|
| - String name = targetUnit.name;
|
| - return _deferredFragmentsMap.putIfAbsent(
|
| - targetUnit, () => new Fragment.deferred(targetUnit, name));
|
| + _lastOutputUnit = targetUnit;
|
| + _lastFragment = result;
|
| + return result;
|
| }
|
|
|
| /// Adds all elements to their respective libraries in the correct fragment.
|
| @@ -89,6 +99,12 @@ class Registry {
|
| }
|
| }
|
|
|
| + void registerConstant(OutputUnit outputUnit, ConstantValue constantValue) {
|
| + // We just need to make sure that the target fragment is registered.
|
| + // Otherwise a fragment that contains only constants is not built.
|
| + _mapUnitToFragment(outputUnit);
|
| + }
|
| +
|
| Holder registerHolder(String name) {
|
| return _holdersMap.putIfAbsent(
|
| name,
|
|
|