OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** | 5 /** |
6 * A function element that represents a closure call. The signature is copied | 6 * A function element that represents a closure call. The signature is copied |
7 * from the given element. | 7 * from the given element. |
8 */ | 8 */ |
9 class ClosureInvocationElement extends FunctionElement { | 9 class ClosureInvocationElement extends FunctionElement { |
10 ClosureInvocationElement(SourceString name, | 10 ClosureInvocationElement(SourceString name, |
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 String currentIsolate = "${namer.CURRENT_ISOLATE}"; | 646 String currentIsolate = "${namer.CURRENT_ISOLATE}"; |
647 String mainEnsureGetter = ''; | 647 String mainEnsureGetter = ''; |
648 // Since we pass the closurized version of the main method to | 648 // Since we pass the closurized version of the main method to |
649 // the isolate method, we must make sure that it exists. | 649 // the isolate method, we must make sure that it exists. |
650 if (!compiler.universe.staticFunctionsNeedingGetter.contains(appMain)) { | 650 if (!compiler.universe.staticFunctionsNeedingGetter.contains(appMain)) { |
651 String invocationName = | 651 String invocationName = |
652 "${namer.closureInvocationName(Selector.INVOCATION_0)}"; | 652 "${namer.closureInvocationName(Selector.INVOCATION_0)}"; |
653 mainEnsureGetter = "$mainAccess.$invocationName = $mainAccess"; | 653 mainEnsureGetter = "$mainAccess.$invocationName = $mainAccess"; |
654 } | 654 } |
655 | 655 |
656 // TODO(ngeoffray): These globals are currently required by the isolate | 656 // TODO(ngeoffray): These globals are currently required by the isolate |
657 // library, but since leg already generates code on an Isolate object, they | 657 // library, but since leg already generates code on an Isolate object, they |
658 // are not really needed. We should remove them once Leg replaces Frog. | 658 // are not really needed. We should remove them once Leg replaces Frog. |
659 return """ | 659 return """ |
660 var \$globalThis = $currentIsolate; | 660 var \$globalThis = $currentIsolate; |
661 var \$globalState; | 661 var \$globalState; |
662 var \$globals; | 662 var \$globals; |
663 function \$static_init(){}; | 663 function \$static_init(){}; |
664 | 664 |
665 function \$initGlobals(context) { | 665 function \$initGlobals(context) { |
666 context.isolateStatics = new ${namer.ISOLATE}(); | 666 context.isolateStatics = new ${namer.ISOLATE}(); |
667 } | 667 } |
668 function \$setGlobals(context) { | 668 function \$setGlobals(context) { |
669 $currentIsolate = context.isolateStatics; | 669 $currentIsolate = context.isolateStatics; |
670 \$globalThis = $currentIsolate; | 670 \$globalThis = $currentIsolate; |
671 } | 671 } |
672 $mainEnsureGetter | 672 $mainEnsureGetter |
673 ${namer.isolateAccess(isolateMain)}($mainAccess);"""; | 673 ${namer.isolateAccess(isolateMain)}($mainAccess);"""; |
674 } | 674 } |
675 | 675 |
| 676 emitMain(StringBuffer buffer) { |
| 677 if (compiler.isMockCompilation) return; |
| 678 Element main = compiler.mainApp.find(Compiler.MAIN); |
| 679 if (compiler.isolateLibrary != null) { |
| 680 Element isolateMain = |
| 681 compiler.isolateLibrary.find(Compiler.START_ROOT_ISOLATE); |
| 682 buffer.add(buildIsolateSetup(main, isolateMain)); |
| 683 } else { |
| 684 buffer.add('${namer.isolateAccess(main)}();\n'); |
| 685 } |
| 686 } |
| 687 |
676 String assembleProgram() { | 688 String assembleProgram() { |
677 measure(() { | 689 measure(() { |
678 StringBuffer buffer = new StringBuffer(); | 690 StringBuffer buffer = new StringBuffer(); |
679 buffer.add('function ${namer.ISOLATE}() {'); | 691 buffer.add('function ${namer.ISOLATE}() {'); |
680 emitStaticNonFinalFieldInitializations(buffer); | 692 emitStaticNonFinalFieldInitializations(buffer); |
681 buffer.add('}\n\n'); | 693 buffer.add('}\n\n'); |
682 emitClasses(buffer); | 694 emitClasses(buffer); |
683 emitStaticFunctions(buffer); | 695 emitStaticFunctions(buffer); |
684 emitStaticFunctionGetters(buffer); | 696 emitStaticFunctionGetters(buffer); |
685 emitCompileTimeConstants(buffer); | 697 emitCompileTimeConstants(buffer); |
686 emitStaticFinalFieldInitializations(buffer); | 698 emitStaticFinalFieldInitializations(buffer); |
687 nativeEmitter.emitDynamicDispatchMetadata(buffer); | 699 nativeEmitter.emitDynamicDispatchMetadata(buffer); |
688 buffer.add('var ${namer.CURRENT_ISOLATE} = new ${namer.ISOLATE}();\n'); | 700 buffer.add('var ${namer.CURRENT_ISOLATE} = new ${namer.ISOLATE}();\n'); |
689 Element main = compiler.mainApp.find(Compiler.MAIN); | 701 emitMain(buffer); |
690 if (compiler.isolateLibrary != null) { | |
691 Element isolateMain = | |
692 compiler.isolateLibrary.find(Compiler.START_ROOT_ISOLATE); | |
693 buffer.add(buildIsolateSetup(main, isolateMain)); | |
694 } else { | |
695 buffer.add('${namer.isolateAccess(main)}();\n'); | |
696 } | |
697 compiler.assembledCode = buffer.toString(); | 702 compiler.assembledCode = buffer.toString(); |
698 }); | 703 }); |
699 return compiler.assembledCode; | 704 return compiler.assembledCode; |
700 } | 705 } |
701 } | 706 } |
OLD | NEW |