OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 dart2js.new_js_emitter.model; | 5 library dart2js.new_js_emitter.model; |
6 | 6 |
7 import '../js/js.dart' as js show Expression, Statement; | 7 import '../js/js.dart' as js show Expression, Statement; |
8 import '../constants/values.dart' show ConstantValue; | 8 import '../constants/values.dart' show ConstantValue; |
9 | 9 |
10 import '../deferred_load.dart' show OutputUnit; | 10 import '../deferred_load.dart' show OutputUnit; |
11 | 11 |
12 import 'js_emitter.dart' show MetadataCollector; | 12 import 'js_emitter.dart' show MetadataCollector; |
13 | 13 |
14 import '../common.dart'; | 14 import '../common.dart'; |
15 | 15 |
16 class Program { | 16 class Program { |
17 final List<Fragment> fragments; | 17 final List<Fragment> fragments; |
| 18 final List<Holder> holders; |
18 final bool outputContainsConstantList; | 19 final bool outputContainsConstantList; |
19 final bool outputContainsNativeClasses; | 20 final bool outputContainsNativeClasses; |
20 final bool hasIsolateSupport; | 21 final bool hasIsolateSupport; |
21 /// A map from load id to the list of fragments that need to be loaded. | 22 /// A map from load id to the list of fragments that need to be loaded. |
22 final Map<String, List<Fragment>> loadMap; | 23 final Map<String, List<Fragment>> loadMap; |
23 | 24 |
24 // If this field is not `null` then its value must be emitted in the embedded | 25 // If this field is not `null` then its value must be emitted in the embedded |
25 // global `TYPE_TO_INTERCEPTOR_MAP`. The map references constants and classes. | 26 // global `TYPE_TO_INTERCEPTOR_MAP`. The map references constants and classes. |
26 final js.Expression typeToInterceptorMap; | 27 final js.Expression typeToInterceptorMap; |
27 | 28 |
28 // TODO(floitsch): we should store the metadata directly instead of storing | 29 // TODO(floitsch): we should store the metadata directly instead of storing |
29 // the collector. However, the old emitter still updates the data. | 30 // the collector. However, the old emitter still updates the data. |
30 final MetadataCollector _metadataCollector; | 31 final MetadataCollector _metadataCollector; |
31 | 32 |
32 Program(this.fragments, | 33 Program(this.fragments, |
| 34 this.holders, |
33 this.loadMap, | 35 this.loadMap, |
34 this.typeToInterceptorMap, | 36 this.typeToInterceptorMap, |
35 this._metadataCollector, | 37 this._metadataCollector, |
36 {this.outputContainsNativeClasses, | 38 {this.outputContainsNativeClasses, |
37 this.outputContainsConstantList, | 39 this.outputContainsConstantList, |
38 this.hasIsolateSupport}) { | 40 this.hasIsolateSupport}) { |
39 assert(outputContainsNativeClasses != null); | 41 assert(outputContainsNativeClasses != null); |
40 assert(outputContainsConstantList != null); | 42 assert(outputContainsConstantList != null); |
41 assert(hasIsolateSupport != null); | 43 assert(hasIsolateSupport != null); |
42 } | 44 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 /// Output file name without extension. | 90 /// Output file name without extension. |
89 final String outputFileName; | 91 final String outputFileName; |
90 | 92 |
91 Fragment(this.outputUnit, | 93 Fragment(this.outputUnit, |
92 this.outputFileName, | 94 this.outputFileName, |
93 this.libraries, | 95 this.libraries, |
94 this.staticNonFinalFields, | 96 this.staticNonFinalFields, |
95 this.staticLazilyInitializedFields, | 97 this.staticLazilyInitializedFields, |
96 this.constants); | 98 this.constants); |
97 | 99 |
98 bool get isMainFragment => mainFragment == this; | 100 bool get isMainFragment; |
99 MainFragment get mainFragment; | |
100 } | 101 } |
101 | 102 |
102 /** | 103 /** |
103 * The main output file. | 104 * The main output file. |
104 * | 105 * |
105 * This code emitted from this [Fragment] must be loaded first. It can then load | 106 * This code emitted from this [Fragment] must be loaded first. It can then load |
106 * other [DeferredFragment]s. | 107 * other [DeferredFragment]s. |
107 */ | 108 */ |
108 class MainFragment extends Fragment { | 109 class MainFragment extends Fragment { |
109 final js.Statement invokeMain; | 110 final js.Statement invokeMain; |
110 final List<Holder> holders; | |
111 | 111 |
112 MainFragment(OutputUnit outputUnit, | 112 MainFragment(OutputUnit outputUnit, |
113 String outputFileName, | 113 String outputFileName, |
114 this.invokeMain, | 114 this.invokeMain, |
115 List<Library> libraries, | 115 List<Library> libraries, |
116 List<StaticField> staticNonFinalFields, | 116 List<StaticField> staticNonFinalFields, |
117 List<StaticField> staticLazilyInitializedFields, | 117 List<StaticField> staticLazilyInitializedFields, |
118 List<Constant> constants, | 118 List<Constant> constants) |
119 this.holders) | |
120 : super(outputUnit, | 119 : super(outputUnit, |
121 outputFileName, | 120 outputFileName, |
122 libraries, | 121 libraries, |
123 staticNonFinalFields, | 122 staticNonFinalFields, |
124 staticLazilyInitializedFields, | 123 staticLazilyInitializedFields, |
125 constants); | 124 constants); |
126 | 125 |
127 MainFragment get mainFragment => this; | 126 bool get isMainFragment => true; |
128 } | 127 } |
129 | 128 |
130 /** | 129 /** |
131 * An output (file) for deferred code. | 130 * An output (file) for deferred code. |
132 */ | 131 */ |
133 class DeferredFragment extends Fragment { | 132 class DeferredFragment extends Fragment { |
134 final MainFragment mainFragment; | |
135 final String name; | 133 final String name; |
136 | 134 |
137 List<Holder> get holders => mainFragment.holders; | |
138 | |
139 DeferredFragment(OutputUnit outputUnit, | 135 DeferredFragment(OutputUnit outputUnit, |
140 String outputFileName, | 136 String outputFileName, |
141 this.name, | 137 this.name, |
142 this.mainFragment, | |
143 List<Library> libraries, | 138 List<Library> libraries, |
144 List<StaticField> staticNonFinalFields, | 139 List<StaticField> staticNonFinalFields, |
145 List<StaticField> staticLazilyInitializedFields, | 140 List<StaticField> staticLazilyInitializedFields, |
146 List<Constant> constants) | 141 List<Constant> constants) |
147 : super(outputUnit, | 142 : super(outputUnit, |
148 outputFileName, | 143 outputFileName, |
149 libraries, | 144 libraries, |
150 staticNonFinalFields, | 145 staticNonFinalFields, |
151 staticLazilyInitializedFields, | 146 staticLazilyInitializedFields, |
152 constants); | 147 constants); |
| 148 |
| 149 bool get isMainFragment => false; |
153 } | 150 } |
154 | 151 |
155 class Constant { | 152 class Constant { |
156 final String name; | 153 final String name; |
157 final Holder holder; | 154 final Holder holder; |
158 final ConstantValue value; | 155 final ConstantValue value; |
159 | 156 |
160 Constant(this.name, this.holder, this.value); | 157 Constant(this.name, this.holder, this.value); |
161 } | 158 } |
162 | 159 |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 tearOffName : tearOffName, | 434 tearOffName : tearOffName, |
438 canBeApplied : canBeApplied, | 435 canBeApplied : canBeApplied, |
439 canBeReflected : canBeReflected); | 436 canBeReflected : canBeReflected); |
440 } | 437 } |
441 | 438 |
442 class StaticStubMethod extends StubMethod implements StaticMethod { | 439 class StaticStubMethod extends StubMethod implements StaticMethod { |
443 Holder holder; | 440 Holder holder; |
444 StaticStubMethod(String name, this.holder, js.Expression code) | 441 StaticStubMethod(String name, this.holder, js.Expression code) |
445 : super(name, code); | 442 : super(name, code); |
446 } | 443 } |
OLD | NEW |