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

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

Issue 1153243003: dart2js: Use frequency of occurence to sort metadata indices. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Addressed sra's comments Created 5 years, 6 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 '../../dart_types.dart' show DartType; 9 import '../../dart_types.dart' show DartType;
10 import '../../elements/elements.dart' show ClassElement, FunctionElement; 10 import '../../elements/elements.dart' show ClassElement, FunctionElement;
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 int emitProgram(Program program) { 131 int emitProgram(Program program) {
132 List<Fragment> fragments = program.fragments; 132 List<Fragment> fragments = program.fragments;
133 MainFragment mainFragment = fragments.first; 133 MainFragment mainFragment = fragments.first;
134 134
135 int totalSize = 0; 135 int totalSize = 0;
136 136
137 // We have to emit the deferred fragments first, since we need their 137 // We have to emit the deferred fragments first, since we need their
138 // deferred hash (which depends on the output) when emitting the main 138 // deferred hash (which depends on the output) when emitting the main
139 // fragment. 139 // fragment.
140 fragments.skip(1).forEach((DeferredFragment deferredUnit) { 140 fragments.skip(1).forEach((DeferredFragment deferredUnit) {
141 List<js.Expression> types = 141 js.Expression types =
142 program.metadataTypes[deferredUnit.outputUnit]; 142 program.metadataTypesForOutputUnit(deferredUnit.outputUnit);
143 js.Expression ast = emitDeferredFragment(types, deferredUnit, 143 js.Expression ast = emitDeferredFragment(types, deferredUnit,
144 program.holders); 144 program.holders);
145 String code = js.prettyPrint(ast, compiler).getText(); 145 String code = js.prettyPrint(ast, compiler).getText();
146 totalSize += code.length; 146 totalSize += code.length;
147 compiler.outputProvider(deferredUnit.outputFileName, deferredExtension) 147 compiler.outputProvider(deferredUnit.outputFileName, deferredExtension)
148 ..add(code) 148 ..add(code)
149 ..close(); 149 ..close();
150 }); 150 });
151 151
152 js.Statement mainAst = emitMainFragment(program); 152 js.Statement mainAst = emitMainFragment(program);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n'; 185 return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n';
186 } 186 }
187 187
188 js.Statement emitMainFragment(Program program) { 188 js.Statement emitMainFragment(Program program) {
189 MainFragment fragment = program.fragments.first; 189 MainFragment fragment = program.fragments.first;
190 List<js.Expression> elements = fragment.libraries.map(emitLibrary).toList(); 190 List<js.Expression> elements = fragment.libraries.map(emitLibrary).toList();
191 elements.add( 191 elements.add(
192 emitLazilyInitializedStatics(fragment.staticLazilyInitializedFields)); 192 emitLazilyInitializedStatics(fragment.staticLazilyInitializedFields));
193 elements.add(emitConstants(fragment.constants)); 193 elements.add(emitConstants(fragment.constants));
194 194
195
196 js.Expression code = new js.ArrayInitializer(elements); 195 js.Expression code = new js.ArrayInitializer(elements);
197 196
198 Map<String, dynamic> holes = 197 Map<String, dynamic> holes =
199 {'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap), 198 {'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap),
200 'holders': emitHolders(program.holders), 199 'holders': emitHolders(program.holders),
201 'tearOff': buildTearOffCode(backend), 200 'tearOff': buildTearOffCode(backend),
202 'parseFunctionDescriptor': 201 'parseFunctionDescriptor':
203 js.js.statement(parseFunctionDescriptorBoilerplate, 202 js.js.statement(parseFunctionDescriptorBoilerplate,
204 {'argumentCount': js.string(namer.requiredParameterField), 203 {'argumentCount': js.string(namer.requiredParameterField),
205 'defaultArgumentValues': js.string(namer.defaultValuesField), 204 'defaultArgumentValues': js.string(namer.defaultValuesField),
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 js.ArrayInitializer unparseExpressions(List<js.Expression> expressions) { 484 js.ArrayInitializer unparseExpressions(List<js.Expression> expressions) {
486 if (expressions == null) expressions = <js.Expression>[]; 485 if (expressions == null) expressions = <js.Expression>[];
487 List<js.LiteralString> unparsedExpressions = expressions 486 List<js.LiteralString> unparsedExpressions = expressions
488 .map((expr) => unparse(compiler, expr, protectForEval: false)) 487 .map((expr) => unparse(compiler, expr, protectForEval: false))
489 .toList(); 488 .toList();
490 return new js.ArrayInitializer(unparsedExpressions); 489 return new js.ArrayInitializer(unparsedExpressions);
491 } 490 }
492 491
493 List<js.Property> metadataGlobals = <js.Property>[]; 492 List<js.Property> metadataGlobals = <js.Property>[];
494 493
495 js.ArrayInitializer unparsedMetadata = unparseExpressions(program.metadata); 494 js.Property createGlobal(js.Expression metadata, String global) {
496 metadataGlobals.add(new js.Property(js.string(lazyMetadataName), 495 return new js.Property(js.string(global), metadata);
497 unparsedMetadata)); 496 }
498 metadataGlobals.add(new js.Property(js.string(METADATA),
499 new js.ArrayInitializer([])));
500 497
501 List<js.Expression> types = 498 metadataGlobals.add(createGlobal(program.metadata, METADATA));
502 program.metadataTypes[program.fragments.first.outputUnit]; 499 js.Expression types =
503 metadataGlobals.add(new js.Property(js.string(TYPES), 500 program.metadataTypesForOutputUnit(program.mainFragment.outputUnit);
504 unparseExpressions(types))); 501 metadataGlobals.add(createGlobal(types, TYPES));
505 502
506 return metadataGlobals; 503 return metadataGlobals;
507 } 504 }
508 505
509 js.Expression emitDeferredFragment(List<js.Expression> types, 506 js.Expression emitDeferredFragment(js.Expression deferredTypes,
510 DeferredFragment fragment, 507 DeferredFragment fragment,
511 List<Holder> holders) { 508 List<Holder> holders) {
512 // TODO(floitsch): initialize eager classes. 509 // TODO(floitsch): initialize eager classes.
513 // TODO(floitsch): the hash must depend on the output. 510 // TODO(floitsch): the hash must depend on the output.
514 int hash = fragment.hashCode; 511 int hash = fragment.hashCode;
515 512
516 List<js.Expression> deferredCode = 513 List<js.Expression> deferredCode =
517 fragment.libraries.map(emitLibrary).toList(); 514 fragment.libraries.map(emitLibrary).toList();
518 515
519 deferredCode.add( 516 deferredCode.add(
520 emitLazilyInitializedStatics(fragment.staticLazilyInitializedFields)); 517 emitLazilyInitializedStatics(fragment.staticLazilyInitializedFields));
521 deferredCode.add(emitConstants(fragment.constants)); 518 deferredCode.add(emitConstants(fragment.constants));
522 519
523 js.ArrayInitializer deferredArray = new js.ArrayInitializer(deferredCode); 520 js.ArrayInitializer deferredArray = new js.ArrayInitializer(deferredCode);
524 521
525 // This is the code that must be evaluated after all deferred classes have 522 // This is the code that must be evaluated after all deferred classes have
526 // been setup. 523 // been setup.
527 js.Statement immediateCode = new js.Block([ 524 js.Statement immediateCode = new js.Block([
528 emitStaticNonFinalFields(fragment.staticNonFinalFields), 525 emitStaticNonFinalFields(fragment.staticNonFinalFields),
529 emitEagerClassInitializations(fragment.libraries)]); 526 emitEagerClassInitializations(fragment.libraries)]);
530 527
531 528
532 js.LiteralString immediateString = unparse(compiler, immediateCode); 529 js.LiteralString immediateString = unparse(compiler, immediateCode);
533 530
534 js.Expression deferredTypes = (types == null)
535 ? js.string("[]")
536 : unparse(compiler, new js.ArrayInitializer(types));
537
538 js.ArrayInitializer hunk = 531 js.ArrayInitializer hunk =
539 new js.ArrayInitializer([deferredArray, immediateString, 532 new js.ArrayInitializer([deferredArray, immediateString,
540 deferredTypes]); 533 deferredTypes]);
541 534
542 return js.js("$deferredInitializersGlobal[$hash] = #", hunk); 535 return js.js("$deferredInitializersGlobal[$hash] = #", hunk);
543 } 536 }
544 537
545 // This string should be referenced wherever JavaScript code makes assumptions 538 // This string should be referenced wherever JavaScript code makes assumptions
546 // on the constants format. 539 // on the constants format.
547 static final String constantsDescription = 540 static final String constantsDescription =
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 1247
1255 var end = Date.now(); 1248 var end = Date.now();
1256 // print('Setup: ' + (end - start) + ' ms.'); 1249 // print('Setup: ' + (end - start) + ' ms.');
1257 1250
1258 #invokeMain; // Start main. 1251 #invokeMain; // Start main.
1259 1252
1260 }(Date.now(), #code) 1253 }(Date.now(), #code)
1261 }"""; 1254 }""";
1262 1255
1263 } 1256 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/model.dart ('k') | pkg/compiler/lib/src/js_emitter/old_emitter/class_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698