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 '../../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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |