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

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

Issue 1212613009: dart2js: Implement frequency based naming. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 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
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 '../../constants/values.dart' show ConstantValue, FunctionConstantValue; 7 import '../../constants/values.dart' show ConstantValue, FunctionConstantValue;
8 import '../../dart2jslib.dart' show Compiler; 8 import '../../dart2jslib.dart' show Compiler;
9 import '../../elements/elements.dart' show ClassElement, FunctionElement; 9 import '../../elements/elements.dart' show ClassElement, FunctionElement;
10 import '../../js/js.dart' as js; 10 import '../../js/js.dart' as js;
(...skipping 15 matching lines...) Expand all
26 IS_HUNK_LOADED, 26 IS_HUNK_LOADED,
27 LEAF_TAGS, 27 LEAF_TAGS,
28 MANGLED_GLOBAL_NAMES, 28 MANGLED_GLOBAL_NAMES,
29 METADATA, 29 METADATA,
30 TYPE_TO_INTERCEPTOR_MAP, 30 TYPE_TO_INTERCEPTOR_MAP,
31 TYPES; 31 TYPES;
32 32
33 import '../js_emitter.dart' show NativeGenerator, buildTearOffCode; 33 import '../js_emitter.dart' show NativeGenerator, buildTearOffCode;
34 import '../model.dart'; 34 import '../model.dart';
35 35
36 /// Represents the LiteralString resulting from unparsing [expression]. The
37 /// actual unparsing is done on demand when requesting the [value] of this
38 /// node.
39 class _UnparsedNode extends js.DeferredString
40 implements AstContainer {
41 @override
42 final js.Node ast;
43 final Compiler _compiler;
44 final bool _protectForEval;
45 js.LiteralString _cachedLiteral;
46
47 /// A [js.Literal] that represents the string result of unparsing [ast].
48 ///
49 /// When its string [value] is requested, the node pretty-prints the given
50 /// [ast] and, if [protectForEval] is true, wraps the resulting
51 /// string in parenthesis. The result is also escaped.
52 _UnparsedNode(this.ast, this._compiler, this._protectForEval);
53
54 js.LiteralString get _literal {
55 if (_cachedLiteral == null) {
56 String text = js.prettyPrint(ast, _compiler).getText();
57 if (_protectForEval) {
58 if (ast is js.Fun) text = '($text)';
59 if (ast is js.LiteralExpression) {
60 js.LiteralExpression literalExpression = ast;
61 String template = literalExpression.template;
62 if (template.startsWith("function ") ||
63 template.startsWith("{")) {
64 text = '($text)';
65 }
66 }
67 }
68 _cachedLiteral = js.js.escapedString(text);
69 }
70 return _cachedLiteral;
71 }
72
73 @override
74 String get value => _literal.value;
75 }
76
77 class ModelEmitter { 36 class ModelEmitter {
78 final Compiler compiler; 37 final Compiler compiler;
79 final Namer namer; 38 final Namer namer;
80 ConstantEmitter constantEmitter; 39 ConstantEmitter constantEmitter;
81 final NativeEmitter nativeEmitter; 40 final NativeEmitter nativeEmitter;
82 41
83 JavaScriptBackend get backend => compiler.backend; 42 JavaScriptBackend get backend => compiler.backend;
84 43
85 /// For deferred loading we communicate the initializers via this global var. 44 /// For deferred loading we communicate the initializers via this global var.
86 static const String deferredInitializersGlobal = 45 static const String deferredInitializersGlobal =
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 // fragment. 137 // fragment.
179 List<js.Expression> fragmentsCode = fragments.skip(1).map( 138 List<js.Expression> fragmentsCode = fragments.skip(1).map(
180 (DeferredFragment deferredUnit) { 139 (DeferredFragment deferredUnit) {
181 js.Expression types = 140 js.Expression types =
182 program.metadataTypesForOutputUnit(deferredUnit.outputUnit); 141 program.metadataTypesForOutputUnit(deferredUnit.outputUnit);
183 return emitDeferredFragment(types, deferredUnit, program.holders); 142 return emitDeferredFragment(types, deferredUnit, program.holders);
184 }).toList(); 143 }).toList();
185 144
186 js.Statement mainAst = emitMainFragment(program); 145 js.Statement mainAst = emitMainFragment(program);
187 146
188 fragmentsCode.forEach(program.metadataFinalizer.countTokensInAst); 147 js.TokenCounter counter = new js.TokenCounter();
189 program.metadataFinalizer.countTokensInAst(mainAst); 148 fragmentsCode.forEach(counter.countTokens);
190 program.metadataFinalizer.finalizeTokens(); 149 counter.countTokens(mainAst);
150
151 program.finalizers.forEach((js.TokenFinalizer f) => f.finalizeTokens());
191 152
192 for (int i = 0; i < fragmentsCode.length; ++i) { 153 for (int i = 0; i < fragmentsCode.length; ++i) {
193 String code = js.prettyPrint(fragmentsCode[i], compiler).getText(); 154 String code = js.prettyPrint(fragmentsCode[i], compiler).getText();
194 totalSize += code.length; 155 totalSize += code.length;
195 compiler.outputProvider(fragments[i+1].outputFileName, deferredExtension) 156 compiler.outputProvider(fragments[i+1].outputFileName, deferredExtension)
196 ..add(code) 157 ..add(code)
197 ..close(); 158 ..close();
198 } 159 }
199 160
200 String mainCode = js.prettyPrint(mainAst, compiler).getText(); 161 String mainCode = js.prettyPrint(mainAst, compiler).getText();
201 compiler.outputProvider(mainFragment.outputFileName, 'js') 162 compiler.outputProvider(mainFragment.outputFileName, 'js')
202 ..add(buildGeneratedBy(compiler)) 163 ..add(buildGeneratedBy(compiler))
203 ..add(mainCode) 164 ..add(mainCode)
204 ..close(); 165 ..close();
205 totalSize += mainCode.length; 166 totalSize += mainCode.length;
206 167
207 return totalSize; 168 return totalSize;
208 } 169 }
209 170
210 /// Returns a [js.Literal] that represents the string result of unparsing 171 /// Returns a [js.Literal] that represents the string result of unparsing
211 /// [value]. 172 /// [value].
212 /// 173 ///
213 /// The returned node will, when its string value is requested, pretty-print 174 /// The returned node will, when its string value is requested, pretty-print
214 /// the given [value] and, if [protectForEval] is true, wrap the resulting 175 /// the given [value] and, if [protectForEval] is true, wrap the resulting
215 /// string in parenthesis. The result is also escaped. 176 /// string in parenthesis. The result is also escaped.
216 /// 177 ///
217 /// See [_UnparsedNode] for details. 178 /// See [_UnparsedNode] for details.
218 js.Literal unparse(Compiler compiler, js.Node value, 179 js.Literal unparse(Compiler compiler, js.Node value,
219 {bool protectForEval: true}) { 180 {bool protectForEval: true}) {
220 return new _UnparsedNode(value, compiler, protectForEval); 181 return new js.UnparsedNode(value, compiler, protectForEval);
221 } 182 }
222 183
223 String buildGeneratedBy(compiler) { 184 String buildGeneratedBy(compiler) {
224 var suffix = ''; 185 var suffix = '';
225 if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}'; 186 if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}';
226 return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n'; 187 return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n';
227 } 188 }
228 189
229 js.Statement emitMainFragment(Program program) { 190 js.Statement emitMainFragment(Program program) {
230 MainFragment fragment = program.fragments.first; 191 MainFragment fragment = program.fragments.first;
(...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after
1276 1237
1277 var end = Date.now(); 1238 var end = Date.now();
1278 // print('Setup: ' + (end - start) + ' ms.'); 1239 // print('Setup: ' + (end - start) + ' ms.');
1279 1240
1280 #invokeMain; // Start main. 1241 #invokeMain; // Start main.
1281 1242
1282 })(Date.now(), #code) 1243 })(Date.now(), #code)
1283 }"""; 1244 }""";
1284 1245
1285 } 1246 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698