| 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 '../../js/js.dart' as js; | 8 import '../../js/js.dart' as js; |
| 9 import '../../js_backend/js_backend.dart' show | 9 import '../../js_backend/js_backend.dart' show |
| 10 JavaScriptBackend, | 10 JavaScriptBackend, |
| 11 Namer, | 11 Namer, |
| 12 ConstantEmitter; | 12 ConstantEmitter; |
| 13 | 13 |
| 14 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart' show | 14 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart' show |
| 15 DEFERRED_LIBRARY_URIS, | 15 DEFERRED_LIBRARY_URIS, |
| 16 DEFERRED_LIBRARY_HASHES, | 16 DEFERRED_LIBRARY_HASHES, |
| 17 INITIALIZE_LOADED_HUNK, | 17 INITIALIZE_LOADED_HUNK, |
| 18 IS_HUNK_LOADED; | 18 IS_HUNK_LOADED; |
| 19 | 19 |
| 20 import '../js_emitter.dart' show NativeGenerator; |
| 20 import '../model.dart'; | 21 import '../model.dart'; |
| 21 | 22 |
| 22 class ModelEmitter { | 23 class ModelEmitter { |
| 23 final Compiler compiler; | 24 final Compiler compiler; |
| 24 final Namer namer; | 25 final Namer namer; |
| 25 final ConstantEmitter constantEmitter; | 26 final ConstantEmitter constantEmitter; |
| 26 | 27 |
| 27 JavaScriptBackend get backend => compiler.backend; | 28 JavaScriptBackend get backend => compiler.backend; |
| 28 | 29 |
| 29 /// For deferred loading we communicate the initializers via this global var. | 30 /// For deferred loading we communicate the initializers via this global var. |
| 30 static const String deferredInitializersGlobal = | 31 static const String deferredInitializersGlobal = |
| 31 r"$__dart_deferred_initializers__"; | 32 r"$__dart_deferred_initializers__"; |
| 32 | 33 |
| 33 static const String deferredExtension = "part.js"; | 34 static const String deferredExtension = "part.js"; |
| 34 | 35 |
| 35 ModelEmitter(Compiler compiler, Namer namer) | 36 ModelEmitter(Compiler compiler, Namer namer) |
| 36 : this.compiler = compiler, | 37 : this.compiler = compiler, |
| 37 this.namer = namer, | 38 this.namer = namer, |
| 38 constantEmitter = | 39 constantEmitter = |
| 39 new ConstantEmitter(compiler, namer, makeConstantListTemplate); | 40 new ConstantEmitter(compiler, namer, makeConstantListTemplate); |
| 40 | 41 |
| 42 js.Expression generateEmbeddedGlobalAccess(String global) { |
| 43 // TODO(floitsch): We should not use "init" for globals. |
| 44 return js.js("init.$global"); |
| 45 } |
| 46 |
| 41 int emitProgram(Program program) { | 47 int emitProgram(Program program) { |
| 42 List<Output> outputs = program.outputs; | 48 List<Output> outputs = program.outputs; |
| 43 MainOutput mainUnit = outputs.first; | 49 MainOutput mainUnit = outputs.first; |
| 44 js.Statement mainAst = emitMainUnit(program); | 50 js.Statement mainAst = emitMainUnit(program); |
| 45 String mainCode = js.prettyPrint(mainAst, compiler).getText(); | 51 String mainCode = js.prettyPrint(mainAst, compiler).getText(); |
| 46 compiler.outputProvider(mainUnit.outputFileName, 'js') | 52 compiler.outputProvider(mainUnit.outputFileName, 'js') |
| 47 ..add(buildGeneratedBy(compiler)) | 53 ..add(buildGeneratedBy(compiler)) |
| 48 ..add(mainCode) | 54 ..add(mainCode) |
| 49 ..close(); | 55 ..close(); |
| 50 int totalSize = mainCode.length; | 56 int totalSize = mainCode.length; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 70 var suffix = ''; | 76 var suffix = ''; |
| 71 if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}'; | 77 if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}'; |
| 72 return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n'; | 78 return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n'; |
| 73 } | 79 } |
| 74 | 80 |
| 75 js.Statement emitMainUnit(Program program) { | 81 js.Statement emitMainUnit(Program program) { |
| 76 MainOutput unit = program.outputs.first; | 82 MainOutput unit = program.outputs.first; |
| 77 List<js.Expression> elements = unit.libraries.map(emitLibrary).toList(); | 83 List<js.Expression> elements = unit.libraries.map(emitLibrary).toList(); |
| 78 elements.add( | 84 elements.add( |
| 79 emitLazilyInitializedStatics(unit.staticLazilyInitializedFields)); | 85 emitLazilyInitializedStatics(unit.staticLazilyInitializedFields)); |
| 86 |
| 87 js.Statement nativeBoilerplate; |
| 88 if (NativeGenerator.needsIsolateAffinityTagInitialization(backend)) { |
| 89 nativeBoilerplate = |
| 90 NativeGenerator.generateIsolateAffinityTagInitialization( |
| 91 backend, |
| 92 generateEmbeddedGlobalAccess, |
| 93 // TODO(floitsch): convertToFastObject. |
| 94 js.js("(function(x) { return x; })", [])); |
| 95 } else { |
| 96 nativeBoilerplate = js.js.statement(";"); |
| 97 } |
| 98 |
| 80 js.Expression code = new js.ArrayInitializer(elements); | 99 js.Expression code = new js.ArrayInitializer(elements); |
| 100 |
| 81 return js.js.statement( | 101 return js.js.statement( |
| 82 boilerplate, | 102 boilerplate, |
| 83 {'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap), | 103 {'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap), |
| 84 'holders': emitHolders(unit.holders), | 104 'holders': emitHolders(unit.holders), |
| 85 'cyclicThrow': | 105 'cyclicThrow': |
| 86 backend.emitter.staticFunctionAccess(backend.getCyclicThrowHelper()), | 106 backend.emitter.staticFunctionAccess(backend.getCyclicThrowHelper()), |
| 87 'outputContainsConstantList': program.outputContainsConstantList, | 107 'outputContainsConstantList': program.outputContainsConstantList, |
| 88 'embeddedGlobals': emitEmbeddedGlobals(program.loadMap), | 108 'embeddedGlobals': emitEmbeddedGlobals(program.loadMap), |
| 89 'constants': emitConstants(unit.constants), | 109 'constants': emitConstants(unit.constants), |
| 90 'staticNonFinals': emitStaticNonFinalFields(unit.staticNonFinalFields), | 110 'staticNonFinals': emitStaticNonFinalFields(unit.staticNonFinalFields), |
| 111 'nativeBoilerplate': nativeBoilerplate, |
| 91 'eagerClasses': emitEagerClassInitializations(unit.libraries), | 112 'eagerClasses': emitEagerClassInitializations(unit.libraries), |
| 92 'main': unit.main, | 113 'main': unit.main, |
| 93 'code': code}); | 114 'code': code}); |
| 94 } | 115 } |
| 95 | 116 |
| 96 js.Block emitHolders(List<Holder> holders) { | 117 js.Block emitHolders(List<Holder> holders) { |
| 97 // The top-level variables for holders must *not* be renamed by the | 118 // The top-level variables for holders must *not* be renamed by the |
| 98 // JavaScript pretty printer because a lot of code already uses the | 119 // JavaScript pretty printer because a lot of code already uses the |
| 99 // non-renamed names. The generated code looks like this: | 120 // non-renamed names. The generated code looks like this: |
| 100 // | 121 // |
| (...skipping 24 matching lines...) Expand all Loading... |
| 125 | 146 |
| 126 js.Block emitEmbeddedGlobals(Map<String, List<Output>> loadMap) { | 147 js.Block emitEmbeddedGlobals(Map<String, List<Output>> loadMap) { |
| 127 List<js.Property> globals = <js.Property>[]; | 148 List<js.Property> globals = <js.Property>[]; |
| 128 | 149 |
| 129 if (loadMap.isNotEmpty) { | 150 if (loadMap.isNotEmpty) { |
| 130 globals.addAll(emitLoadUrisAndHashes(loadMap)); | 151 globals.addAll(emitLoadUrisAndHashes(loadMap)); |
| 131 globals.add(emitIsHunkLoadedFunction()); | 152 globals.add(emitIsHunkLoadedFunction()); |
| 132 globals.add(emitInitializeLoadedHunk()); | 153 globals.add(emitInitializeLoadedHunk()); |
| 133 } | 154 } |
| 134 | 155 |
| 135 if (globals.isEmpty) return new js.Block.empty(); | |
| 136 | |
| 137 js.ObjectInitializer globalsObject = new js.ObjectInitializer(globals); | 156 js.ObjectInitializer globalsObject = new js.ObjectInitializer(globals); |
| 138 | 157 |
| 139 List<js.Statement> statements = | 158 List<js.Statement> statements = |
| 140 [new js.ExpressionStatement( | 159 [new js.ExpressionStatement( |
| 141 new js.VariableDeclarationList( | 160 new js.VariableDeclarationList( |
| 142 [new js.VariableInitialization( | 161 [new js.VariableInitialization( |
| 143 new js.VariableDeclaration("init", allowRename: false), | 162 new js.VariableDeclaration("init", allowRename: false), |
| 144 globalsObject)]))]; | 163 globalsObject)]))]; |
| 145 return new js.Block(statements); | 164 return new js.Block(statements); |
| 146 } | 165 } |
| (...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 | 553 |
| 535 // Initialize globals. | 554 // Initialize globals. |
| 536 #embeddedGlobals; | 555 #embeddedGlobals; |
| 537 | 556 |
| 538 // Initialize constants. | 557 // Initialize constants. |
| 539 #constants; | 558 #constants; |
| 540 | 559 |
| 541 // Initialize static non-final fields. | 560 // Initialize static non-final fields. |
| 542 #staticNonFinals; | 561 #staticNonFinals; |
| 543 | 562 |
| 563 // Add native boilerplate code. |
| 564 #nativeBoilerplate; |
| 565 |
| 544 // Initialize eager classes. | 566 // Initialize eager classes. |
| 545 #eagerClasses; | 567 #eagerClasses; |
| 546 | 568 |
| 547 var end = Date.now(); | 569 var end = Date.now(); |
| 548 print('Setup: ' + (end - start) + ' ms.'); | 570 print('Setup: ' + (end - start) + ' ms.'); |
| 549 | 571 |
| 550 #main(); // Start main. | 572 #main(); // Start main. |
| 551 | 573 |
| 552 }(Date.now(), #code) | 574 }(Date.now(), #code) |
| 553 }"""; | 575 }"""; |
| 554 | 576 |
| 555 } | 577 } |
| OLD | NEW |