| 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_emitter; | 5 library dart2js.new_js_emitter.model_emitter; |
| 6 | 6 |
| 7 import '../../dart2jslib.dart' show Compiler; | 7 import '../../dart2jslib.dart' show Compiler; |
| 8 import '../../dart_types.dart' show DartType; | 8 import '../../dart_types.dart' show DartType; |
| 9 import '../../elements/elements.dart' show ClassElement; |
| 9 import '../../js/js.dart' as js; | 10 import '../../js/js.dart' as js; |
| 10 import '../../js_backend/js_backend.dart' show | 11 import '../../js_backend/js_backend.dart' show |
| 11 JavaScriptBackend, | 12 JavaScriptBackend, |
| 12 Namer, | 13 Namer, |
| 13 ConstantEmitter; | 14 ConstantEmitter; |
| 14 | 15 |
| 15 import '../js_emitter.dart' show | 16 import '../js_emitter.dart' show |
| 16 NativeEmitter; | 17 NativeEmitter; |
| 17 | 18 |
| 18 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart' show | 19 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart' show |
| 19 DEFERRED_LIBRARY_URIS, | 20 DEFERRED_LIBRARY_URIS, |
| 20 DEFERRED_LIBRARY_HASHES, | 21 DEFERRED_LIBRARY_HASHES, |
| 21 GET_TYPE_FROM_NAME, | 22 GET_TYPE_FROM_NAME, |
| 22 INITIALIZE_LOADED_HUNK, | 23 INITIALIZE_LOADED_HUNK, |
| 23 INTERCEPTORS_BY_TAG, | 24 INTERCEPTORS_BY_TAG, |
| 24 IS_HUNK_INITIALIZED, | 25 IS_HUNK_INITIALIZED, |
| 25 IS_HUNK_LOADED, | 26 IS_HUNK_LOADED, |
| 26 LEAF_TAGS, | 27 LEAF_TAGS, |
| 27 MANGLED_GLOBAL_NAMES, | 28 MANGLED_GLOBAL_NAMES, |
| 28 METADATA, | 29 METADATA, |
| 29 TYPE_TO_INTERCEPTOR_MAP; | 30 TYPE_TO_INTERCEPTOR_MAP; |
| 30 | 31 |
| 31 import '../js_emitter.dart' show NativeGenerator, buildTearOffCode; | 32 import '../js_emitter.dart' show NativeGenerator, buildTearOffCode; |
| 32 import '../model.dart'; | 33 import '../model.dart'; |
| 33 | 34 |
| 34 | 35 |
| 36 |
| 35 class ModelEmitter { | 37 class ModelEmitter { |
| 36 final Compiler compiler; | 38 final Compiler compiler; |
| 37 final Namer namer; | 39 final Namer namer; |
| 38 final ConstantEmitter constantEmitter; | 40 final ConstantEmitter constantEmitter; |
| 39 final NativeEmitter nativeEmitter; | 41 final NativeEmitter nativeEmitter; |
| 40 | 42 |
| 41 JavaScriptBackend get backend => compiler.backend; | 43 JavaScriptBackend get backend => compiler.backend; |
| 42 | 44 |
| 43 /// For deferred loading we communicate the initializers via this global var. | 45 /// For deferred loading we communicate the initializers via this global var. |
| 44 static const String deferredInitializersGlobal = | 46 static const String deferredInitializersGlobal = |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 globals.addAll(emitLoadUrisAndHashes(program.loadMap)); | 204 globals.addAll(emitLoadUrisAndHashes(program.loadMap)); |
| 203 globals.add(emitIsHunkLoadedFunction()); | 205 globals.add(emitIsHunkLoadedFunction()); |
| 204 globals.add(emitInitializeLoadedHunk()); | 206 globals.add(emitInitializeLoadedHunk()); |
| 205 } | 207 } |
| 206 | 208 |
| 207 if (program.typeToInterceptorMap != null) { | 209 if (program.typeToInterceptorMap != null) { |
| 208 globals.add(new js.Property(js.string(TYPE_TO_INTERCEPTOR_MAP), | 210 globals.add(new js.Property(js.string(TYPE_TO_INTERCEPTOR_MAP), |
| 209 program.typeToInterceptorMap)); | 211 program.typeToInterceptorMap)); |
| 210 } | 212 } |
| 211 | 213 |
| 212 globals.add(new js.Property(js.string(MANGLED_GLOBAL_NAMES), | 214 globals.add(emitMangledGlobalNames()); |
| 213 js.js('Object.create(null)', []))); | |
| 214 | 215 |
| 215 globals.add(emitGetTypeFromName()); | 216 globals.add(emitGetTypeFromName()); |
| 216 | 217 |
| 217 globals.add(emitMetadata(program)); | 218 globals.add(emitMetadata(program)); |
| 218 | 219 |
| 219 if (program.outputContainsNativeClasses) { | 220 if (program.outputContainsNativeClasses) { |
| 220 globals.add(new js.Property(js.string(INTERCEPTORS_BY_TAG), | 221 globals.add(new js.Property(js.string(INTERCEPTORS_BY_TAG), |
| 221 js.js('Object.create(null)', []))); | 222 js.js('Object.create(null)', []))); |
| 222 globals.add(new js.Property(js.string(LEAF_TAGS), | 223 globals.add(new js.Property(js.string(LEAF_TAGS), |
| 223 js.js('Object.create(null)', []))); | 224 js.js('Object.create(null)', []))); |
| 224 } | 225 } |
| 225 | 226 |
| 226 js.ObjectInitializer globalsObject = new js.ObjectInitializer(globals); | 227 js.ObjectInitializer globalsObject = new js.ObjectInitializer(globals); |
| 227 | 228 |
| 228 List<js.Statement> statements = | 229 List<js.Statement> statements = |
| 229 [new js.ExpressionStatement( | 230 [new js.ExpressionStatement( |
| 230 new js.VariableDeclarationList( | 231 new js.VariableDeclarationList( |
| 231 [new js.VariableInitialization( | 232 [new js.VariableInitialization( |
| 232 new js.VariableDeclaration("init", allowRename: false), | 233 new js.VariableDeclaration("init", allowRename: false), |
| 233 globalsObject)]))]; | 234 globalsObject)]))]; |
| 234 return new js.Block(statements); | 235 return new js.Block(statements); |
| 235 } | 236 } |
| 236 | 237 |
| 238 js.Property emitMangledGlobalNames() { |
| 239 List<js.Property> names = <js.Property>[]; |
| 240 |
| 241 // We want to keep the original names for the most common core classes when |
| 242 // calling toString on them. |
| 243 List<ClassElement> nativeClassesNeedingUnmangledName = |
| 244 [compiler.intClass, compiler.doubleClass, compiler.numClass, |
| 245 compiler.stringClass, compiler.boolClass, compiler.nullClass, |
| 246 compiler.listClass]; |
| 247 nativeClassesNeedingUnmangledName.forEach((element) { |
| 248 names.add(new js.Property(js.string(namer.getNameOfClass(element)), |
| 249 js.string(element.name))); |
| 250 }); |
| 251 |
| 252 return new js.Property(js.string(MANGLED_GLOBAL_NAMES), |
| 253 new js.ObjectInitializer(names)); |
| 254 } |
| 255 |
| 237 List<js.Property> emitLoadUrisAndHashes(Map<String, List<Fragment>> loadMap) { | 256 List<js.Property> emitLoadUrisAndHashes(Map<String, List<Fragment>> loadMap) { |
| 238 js.ArrayInitializer outputUris(List<Fragment> fragments) { | 257 js.ArrayInitializer outputUris(List<Fragment> fragments) { |
| 239 return js.stringArray(fragments.map((DeferredFragment fragment) => | 258 return js.stringArray(fragments.map((DeferredFragment fragment) => |
| 240 "${fragment.outputFileName}$deferredExtension")); | 259 "${fragment.outputFileName}$deferredExtension")); |
| 241 } | 260 } |
| 242 js.ArrayInitializer outputHashes(List<Fragment> fragments) { | 261 js.ArrayInitializer outputHashes(List<Fragment> fragments) { |
| 243 // TODO(floitsch): the hash must depend on the generated code. | 262 // TODO(floitsch): the hash must depend on the generated code. |
| 244 return js.numArray( | 263 return js.numArray( |
| 245 fragments.map((DeferredFragment fragment) => fragment.hashCode)); | 264 fragments.map((DeferredFragment fragment) => fragment.hashCode)); |
| 246 } | 265 } |
| (...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 | 906 |
| 888 var end = Date.now(); | 907 var end = Date.now(); |
| 889 print('Setup: ' + (end - start) + ' ms.'); | 908 print('Setup: ' + (end - start) + ' ms.'); |
| 890 | 909 |
| 891 #main(); // Start main. | 910 #main(); // Start main. |
| 892 | 911 |
| 893 }(Date.now(), #code) | 912 }(Date.now(), #code) |
| 894 }"""; | 913 }"""; |
| 895 | 914 |
| 896 } | 915 } |
| OLD | NEW |