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.js_emitter.program_builder; | 5 library dart2js.js_emitter.program_builder; |
6 | 6 |
7 import '../js_emitter.dart' show computeMixinClass, Emitter; | 7 import '../js_emitter.dart' show computeMixinClass, Emitter; |
8 import '../model.dart'; | 8 import '../model.dart'; |
9 | 9 |
10 import '../../common.dart'; | 10 import '../../common.dart'; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 // to check that the library has been loaded. | 93 // to check that the library has been loaded. |
94 _compiler.deferredLoadTask.allOutputUnits.forEach( | 94 _compiler.deferredLoadTask.allOutputUnits.forEach( |
95 _registry.registerOutputUnit); | 95 _registry.registerOutputUnit); |
96 collector.outputClassLists.forEach(_registry.registerElements); | 96 collector.outputClassLists.forEach(_registry.registerElements); |
97 collector.outputStaticLists.forEach(_registry.registerElements); | 97 collector.outputStaticLists.forEach(_registry.registerElements); |
98 collector.outputConstantLists.forEach(_registerConstants); | 98 collector.outputConstantLists.forEach(_registerConstants); |
99 collector.outputStaticNonFinalFieldLists.forEach( | 99 collector.outputStaticNonFinalFieldLists.forEach( |
100 _registry.registerElements); | 100 _registry.registerElements); |
101 | 101 |
102 // We always add the current isolate holder. | 102 // We always add the current isolate holder. |
103 _registry.registerHolder( | 103 _registerStaticStateHolder(); |
104 namer.staticStateHolder, isStaticStateHolder: true); | |
105 | 104 |
106 // We need to run the native-preparation before we build the output. The | 105 // We need to run the native-preparation before we build the output. The |
107 // preparation code, in turn needs the classes to be set up. | 106 // preparation code, in turn needs the classes to be set up. |
108 // We thus build the classes before building their containers. | 107 // We thus build the classes before building their containers. |
109 collector.outputClassLists.forEach((OutputUnit _, List<ClassElement> classes
) { | 108 collector.outputClassLists.forEach((OutputUnit _, List<ClassElement> classes
) { |
110 classes.forEach(_buildClass); | 109 classes.forEach(_buildClass); |
111 }); | 110 }); |
112 | 111 |
113 // Resolve the superclass references after we've processed all the classes. | 112 // Resolve the superclass references after we've processed all the classes. |
114 _classes.forEach((ClassElement element, Class c) { | 113 _classes.forEach((ClassElement element, Class c) { |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 return staticNonFinalFields | 243 return staticNonFinalFields |
245 .map(_buildStaticField) | 244 .map(_buildStaticField) |
246 .toList(growable: false); | 245 .toList(growable: false); |
247 } | 246 } |
248 | 247 |
249 StaticField _buildStaticField(Element element) { | 248 StaticField _buildStaticField(Element element) { |
250 JavaScriptConstantCompiler handler = backend.constants; | 249 JavaScriptConstantCompiler handler = backend.constants; |
251 ConstantValue initialValue = handler.getInitialValueFor(element); | 250 ConstantValue initialValue = handler.getInitialValueFor(element); |
252 // TODO(zarah): The holder should not be registered during building of | 251 // TODO(zarah): The holder should not be registered during building of |
253 // a static field. | 252 // a static field. |
254 _registry.registerHolder(namer.globalObjectForConstant(initialValue)); | 253 _registry.registerHolder( |
| 254 namer.globalObjectForConstant(initialValue), isConstantsHolder: true); |
255 js.Expression code = _task.emitter.constantReference(initialValue); | 255 js.Expression code = _task.emitter.constantReference(initialValue); |
256 js.Name name = namer.globalPropertyName(element); | 256 js.Name name = namer.globalPropertyName(element); |
257 bool isFinal = false; | 257 bool isFinal = false; |
258 bool isLazy = false; | 258 bool isLazy = false; |
259 | 259 |
260 // TODO(floitsch): we shouldn't update the registry in the middle of | 260 // TODO(floitsch): we shouldn't update the registry in the middle of |
261 // building a static field. (Note that the $ holder is already registered | 261 // building a static field. (Note that the static-state holder was |
262 // earlier). | 262 // already registered earlier, and that we just call the register to get |
| 263 // the holder-instance. |
263 return new StaticField(element, | 264 return new StaticField(element, |
264 name, _registry.registerHolder(r'$'), code, | 265 name, _registerStaticStateHolder(), code, |
265 isFinal, isLazy); | 266 isFinal, isLazy); |
266 } | 267 } |
267 | 268 |
268 List<StaticField> _buildStaticLazilyInitializedFields( | 269 List<StaticField> _buildStaticLazilyInitializedFields( |
269 LibrariesMap librariesMap) { | 270 LibrariesMap librariesMap) { |
270 // TODO(floitsch): lazy fields should just be in their respective | 271 // TODO(floitsch): lazy fields should just be in their respective |
271 // libraries. | 272 // libraries. |
272 if (librariesMap != _registry.mainLibrariesMap) { | 273 if (librariesMap != _registry.mainLibrariesMap) { |
273 return const <StaticField>[]; | 274 return const <StaticField>[]; |
274 } | 275 } |
(...skipping 11 matching lines...) Expand all Loading... |
286 js.Expression code = backend.generatedCode[element]; | 287 js.Expression code = backend.generatedCode[element]; |
287 // The code is null if we ended up not needing the lazily | 288 // The code is null if we ended up not needing the lazily |
288 // initialized field after all because of constant folding | 289 // initialized field after all because of constant folding |
289 // before code generation. | 290 // before code generation. |
290 if (code == null) return null; | 291 if (code == null) return null; |
291 | 292 |
292 js.Name name = namer.globalPropertyName(element); | 293 js.Name name = namer.globalPropertyName(element); |
293 bool isFinal = element.isFinal; | 294 bool isFinal = element.isFinal; |
294 bool isLazy = true; | 295 bool isLazy = true; |
295 // TODO(floitsch): we shouldn't update the registry in the middle of | 296 // TODO(floitsch): we shouldn't update the registry in the middle of |
296 // building a static field. (Note that the $ holder is already registered | 297 // building a static field. (Note that the static-state holder was |
297 // earlier). | 298 // already registered earlier, and that we just call the register to get |
| 299 // the holder-instance. |
298 return new StaticField(element, | 300 return new StaticField(element, |
299 name, _registry.registerHolder(r'$'), code, | 301 name, _registerStaticStateHolder(), code, |
300 isFinal, isLazy); | 302 isFinal, isLazy); |
301 } | 303 } |
302 | 304 |
303 List<Library> _buildLibraries(LibrariesMap librariesMap) { | 305 List<Library> _buildLibraries(LibrariesMap librariesMap) { |
304 List<Library> libraries = new List<Library>(librariesMap.length); | 306 List<Library> libraries = new List<Library>(librariesMap.length); |
305 int count = 0; | 307 int count = 0; |
306 librariesMap.forEach((LibraryElement library, List<Element> elements) { | 308 librariesMap.forEach((LibraryElement library, List<Element> elements) { |
307 libraries[count++] = _buildLibrary(library, elements); | 309 libraries[count++] = _buildLibrary(library, elements); |
308 }); | 310 }); |
309 return libraries; | 311 return libraries; |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 | 788 |
787 void _registerConstants(OutputUnit outputUnit, | 789 void _registerConstants(OutputUnit outputUnit, |
788 Iterable<ConstantValue> constantValues) { | 790 Iterable<ConstantValue> constantValues) { |
789 // `constantValues` is null if an outputUnit doesn't contain any constants. | 791 // `constantValues` is null if an outputUnit doesn't contain any constants. |
790 if (constantValues == null) return; | 792 if (constantValues == null) return; |
791 for (ConstantValue constantValue in constantValues) { | 793 for (ConstantValue constantValue in constantValues) { |
792 _registry.registerConstant(outputUnit, constantValue); | 794 _registry.registerConstant(outputUnit, constantValue); |
793 assert(!_constants.containsKey(constantValue)); | 795 assert(!_constants.containsKey(constantValue)); |
794 js.Name name = namer.constantName(constantValue); | 796 js.Name name = namer.constantName(constantValue); |
795 String constantObject = namer.globalObjectForConstant(constantValue); | 797 String constantObject = namer.globalObjectForConstant(constantValue); |
796 Holder holder = _registry.registerHolder(constantObject); | 798 Holder holder = |
| 799 _registry.registerHolder(constantObject, isConstantsHolder: true); |
797 Constant constant = new Constant(name, holder, constantValue); | 800 Constant constant = new Constant(name, holder, constantValue); |
798 _constants[constantValue] = constant; | 801 _constants[constantValue] = constant; |
799 } | 802 } |
800 } | 803 } |
| 804 |
| 805 Holder _registerStaticStateHolder() { |
| 806 return _registry.registerHolder( |
| 807 namer.staticStateHolder, isStaticStateHolder: true); |
| 808 } |
801 } | 809 } |
OLD | NEW |