Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: pkg/compiler/lib/src/js_emitter/new_emitter/model_emitter.dart

Issue 836753002: dart2js: First part of native support in the new emitter. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/new_emitter/emitter.dart ('k') | pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698