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

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

Issue 1126423002: Avoid reparsing metadata expressions (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 7 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 '../../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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 int emitProgram(Program program) { 127 int emitProgram(Program program) {
128 List<Fragment> fragments = program.fragments; 128 List<Fragment> fragments = program.fragments;
129 MainFragment mainFragment = fragments.first; 129 MainFragment mainFragment = fragments.first;
130 130
131 int totalSize = 0; 131 int totalSize = 0;
132 132
133 // We have to emit the deferred fragments first, since we need their 133 // We have to emit the deferred fragments first, since we need their
134 // deferred hash (which depends on the output) when emitting the main 134 // deferred hash (which depends on the output) when emitting the main
135 // fragment. 135 // fragment.
136 fragments.skip(1).forEach((DeferredFragment deferredUnit) { 136 fragments.skip(1).forEach((DeferredFragment deferredUnit) {
137 List<String> types = program.metadataTypes[deferredUnit.outputUnit]; 137 List<js.Expression> types =
138 program.metadataTypes[deferredUnit.outputUnit];
138 js.Expression ast = emitDeferredFragment(types, deferredUnit, 139 js.Expression ast = emitDeferredFragment(types, deferredUnit,
139 program.holders); 140 program.holders);
140 String code = js.prettyPrint(ast, compiler).getText(); 141 String code = js.prettyPrint(ast, compiler).getText();
141 totalSize += code.length; 142 totalSize += code.length;
142 compiler.outputProvider(deferredUnit.outputFileName, deferredExtension) 143 compiler.outputProvider(deferredUnit.outputFileName, deferredExtension)
143 ..add(code) 144 ..add(code)
144 ..close(); 145 ..close();
145 }); 146 });
146 147
147 js.Statement mainAst = emitMainFragment(program); 148 js.Statement mainAst = emitMainFragment(program);
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 411
411 js.Property emitGetTypeFromName() { 412 js.Property emitGetTypeFromName() {
412 js.Expression function = 413 js.Expression function =
413 js.js( """function(name) { 414 js.js( """function(name) {
414 return holdersMap[name][name].ensureResolved(); 415 return holdersMap[name][name].ensureResolved();
415 }"""); 416 }""");
416 return new js.Property(js.string(GET_TYPE_FROM_NAME), function); 417 return new js.Property(js.string(GET_TYPE_FROM_NAME), function);
417 } 418 }
418 419
419 List<js.Property> emitMetadata(Program program) { 420 List<js.Property> emitMetadata(Program program) {
420
421 List<js.Property> metadataGlobals = <js.Property>[]; 421 List<js.Property> metadataGlobals = <js.Property>[];
422 422 metadataGlobals.add(new js.Property(
423 js.Property createGlobal(List<String> list, String global) { 423 js.string(METADATA), new js.ArrayInitializer(program.metadata)));
424 String listAsString = "[${list.join(",")}]"; 424 List<js.Expression> types =
425 js.Expression metadata =
426 js.js.uncachedExpressionTemplate(listAsString).instantiate([]);
427 return new js.Property(js.string(global), metadata);
428 }
429
430 metadataGlobals.add(createGlobal(program.metadata, METADATA));
431 List<String> types =
432 program.metadataTypes[program.fragments.first.outputUnit]; 425 program.metadataTypes[program.fragments.first.outputUnit];
433 if (types == null) types = <String>[]; 426 if (types == null) types = <js.Expression>[];
434 metadataGlobals.add(createGlobal(types, TYPES)); 427 metadataGlobals.add(new js.Property(
428 js.string(TYPES), new js.ArrayInitializer(types)));
435 429
436 return metadataGlobals; 430 return metadataGlobals;
437 } 431 }
438 432
439 js.Expression emitDeferredFragment(List<String> types, 433 js.Expression emitDeferredFragment(List<js.Expression> types,
440 DeferredFragment fragment, 434 DeferredFragment fragment,
441 List<Holder> holders) { 435 List<Holder> holders) {
442 // TODO(floitsch): initialize eager classes. 436 // TODO(floitsch): initialize eager classes.
443 // TODO(floitsch): the hash must depend on the output. 437 // TODO(floitsch): the hash must depend on the output.
444 int hash = fragment.hashCode; 438 int hash = fragment.hashCode;
445 439
446 List<js.Expression> deferredCode = 440 List<js.Expression> deferredCode =
447 fragment.libraries.map(emitLibrary).toList(); 441 fragment.libraries.map(emitLibrary).toList();
448 442
449 deferredCode.add( 443 deferredCode.add(
450 emitLazilyInitializedStatics(fragment.staticLazilyInitializedFields)); 444 emitLazilyInitializedStatics(fragment.staticLazilyInitializedFields));
451 445
452 deferredCode.add(emitConstants(fragment.constants)); 446 deferredCode.add(emitConstants(fragment.constants));
453 447
454 js.ArrayInitializer deferredArray = new js.ArrayInitializer(deferredCode); 448 js.ArrayInitializer deferredArray = new js.ArrayInitializer(deferredCode);
455 449
456 // This is the code that must be evaluated after all deferred classes have 450 // This is the code that must be evaluated after all deferred classes have
457 // been setup. 451 // been setup.
458 js.Statement immediateCode = 452 js.Statement immediateCode =
459 emitEagerClassInitializations(fragment.libraries); 453 emitEagerClassInitializations(fragment.libraries);
460 454
461 js.LiteralString immediateString = unparse(compiler, immediateCode); 455 js.LiteralString immediateString = unparse(compiler, immediateCode);
462 456
463 js.Expression deferredTypes = types == null 457 js.Expression deferredTypes = types == null
464 ? js.string("[]") 458 ? js.string("[]")
465 : js.string("[${types.join(",")}]"); 459 : unparse(compiler, new js.ArrayInitializer(types));
466 460
467 js.ArrayInitializer hunk = 461 js.ArrayInitializer hunk =
468 new js.ArrayInitializer([deferredArray, immediateString, 462 new js.ArrayInitializer([deferredArray, immediateString,
469 deferredTypes]); 463 deferredTypes]);
470 464
471 return js.js("$deferredInitializersGlobal[$hash] = #", hunk); 465 return js.js("$deferredInitializersGlobal[$hash] = #", hunk);
472 } 466 }
473 467
474 // This string should be referenced wherever JavaScript code makes assumptions 468 // This string should be referenced wherever JavaScript code makes assumptions
475 // on the constants format. 469 // on the constants format.
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after
1176 1170
1177 var end = Date.now(); 1171 var end = Date.now();
1178 // print('Setup: ' + (end - start) + ' ms.'); 1172 // print('Setup: ' + (end - start) + ' ms.');
1179 1173
1180 #invokeMain; // Start main. 1174 #invokeMain; // Start main.
1181 1175
1182 }(Date.now(), #code) 1176 }(Date.now(), #code)
1183 }"""; 1177 }""";
1184 1178
1185 } 1179 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/model.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