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_incremental.library_updater; | 5 library dart2js_incremental.library_updater; |
6 | 6 |
7 import 'dart:async' show | 7 import 'dart:async' show |
8 Future; | 8 Future; |
9 | 9 |
10 import 'dart:convert' show | 10 import 'dart:convert' show |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
42 | 42 |
43 import 'package:compiler/src/js/js.dart' show | 43 import 'package:compiler/src/js/js.dart' show |
44 js; | 44 js; |
45 | 45 |
46 import 'package:compiler/src/js/js.dart' as jsAst; | 46 import 'package:compiler/src/js/js.dart' as jsAst; |
47 | 47 |
48 import 'package:compiler/src/js_emitter/js_emitter.dart' show | 48 import 'package:compiler/src/js_emitter/js_emitter.dart' show |
49 ClassBuilder, | 49 ClassBuilder, |
50 ClassEmitter, | 50 ClassEmitter, |
51 CodeEmitterTask, | 51 CodeEmitterTask, |
52 ContainerBuilder, | |
52 MemberInfo, | 53 MemberInfo, |
53 computeMixinClass; | 54 computeMixinClass; |
54 | 55 |
55 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart' | 56 import 'package:_internal/compiler/js_lib/shared/embedded_names.dart' |
56 as embeddedNames; | 57 as embeddedNames; |
57 | 58 |
58 import 'package:compiler/src/js_backend/js_backend.dart' show | 59 import 'package:compiler/src/js_backend/js_backend.dart' show |
59 JavaScriptBackend, | 60 JavaScriptBackend, |
60 Namer; | 61 Namer; |
61 | 62 |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
631 r''' | 632 r''' |
632 (new Function( | 633 (new Function( |
633 "$collectedClasses", "$desc", | 634 "$collectedClasses", "$desc", |
634 self.$dart_unsafe_eval.defineClass(#, #) +"\n;return " + #))({#: #})''', | 635 self.$dart_unsafe_eval.defineClass(#, #) +"\n;return " + #))({#: #})''', |
635 [js.string(name), js.stringArray(computeFields(cls)), | 636 [js.string(name), js.stringArray(computeFields(cls)), |
636 js.string(name), | 637 js.string(name), |
637 js.string(name), descriptor]); | 638 js.string(name), descriptor]); |
638 } | 639 } |
639 | 640 |
640 jsAst.Node computeMemberUpdateJs(Element element) { | 641 jsAst.Node computeMemberUpdateJs(Element element) { |
641 MemberInfo info = emitter.oldEmitter.containerBuilder | 642 MemberInfo info = containerBuilder.analyzeMemberMethod(element); |
642 .analyzeMemberMethod(element); | |
643 if (info == null) { | 643 if (info == null) { |
644 compiler.internalError(element, '${element.runtimeType}'); | 644 compiler.internalError(element, '${element.runtimeType}'); |
645 } | 645 } |
646 ClassBuilder builder = new ClassBuilder(element, namer); | |
647 containerBuilder.addMemberMethodFromInfo(info, builder); | |
648 jsAst.Node partialDescriptor = | |
649 builder.toObjectInitializer(omitClassDescriptor: true); | |
650 | |
646 String name = info.name; | 651 String name = info.name; |
647 jsAst.Node function = info.code; | 652 jsAst.Node function = info.code; |
648 List<jsAst.Statement> statements = <jsAst.Statement>[]; | 653 bool isStatic = !element.isInstanceMember; |
654 | |
655 /// Either a global object (non-instance members) or a prototype (instance | |
656 /// members). | |
657 jsAst.Node holder; | |
658 | |
649 if (element.isInstanceMember) { | 659 if (element.isInstanceMember) { |
650 jsAst.Node elementAccess = namer.elementAccess(element.enclosingClass); | 660 holder = js('#.prototype', namer.elementAccess(element.enclosingClass)); |
651 statements.add( | 661 } else { |
652 js.statement('#.prototype.# = f', [elementAccess, name])); | 662 holder = js('#', namer.globalObjectFor(element)); |
663 } | |
653 | 664 |
654 // TODO(ahe): Restore when isAliasedSuperMember is restored. | 665 jsAst.Expression globalFunctionsAccess = |
655 // if (backend.isAliasedSuperMember(element)) { | 666 emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS); |
656 // String superName = namer.getNameOfAliasedSuperMember(element); | 667 |
657 // statements.add( | 668 return js.statement( |
658 // js.statement('#.prototype.# = f', [elementAccess, superName])); | 669 r'self.$dart_unsafe_eval.addMethod(#, #, #, #, #)', |
Johnni Winther
2014/12/01 13:40:21
I think the many accesses to 'self.$dart_unsafe_ev
ahe
2014/12/01 14:03:38
Will do in follow up.
| |
659 // } | 670 [partialDescriptor, js.string(name), holder, |
660 } else { | 671 new jsAst.LiteralBool(isStatic), globalFunctionsAccess]); |
661 jsAst.Node elementAccess = namer.elementAccess(element); | |
662 jsAst.Expression globalFunctionsAccess = | |
663 emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS); | |
664 statements.add( | |
665 js.statement( | |
666 '#.# = # = f', | |
667 [globalFunctionsAccess, name, elementAccess])); | |
668 if (info.canTearOff) { | |
669 String globalName = namer.globalObjectFor(element); | |
670 statements.add( | |
671 js.statement( | |
672 '#.#().# = f', | |
673 [globalName, info.tearOffName, callNameFor(element)])); | |
674 } | |
675 } | |
676 // Create a scope by creating a new function. The updated function literal | |
677 // is passed as an argument to this function which ensures that temporary | |
678 // names in updateScope don't shadow global names. | |
679 jsAst.Fun updateScope = js('function (f) { # }', [statements]); | |
680 return js.statement('(#)(#)', [updateScope, function]); | |
681 } | 672 } |
682 | 673 |
683 String prettyPrintJs(jsAst.Node node) { | 674 String prettyPrintJs(jsAst.Node node) { |
684 jsAst.Printer printer = new jsAst.Printer(compiler, null); | 675 jsAst.Printer printer = new jsAst.Printer(compiler, null); |
685 printer.blockOutWithoutBraces(node); | 676 printer.blockOutWithoutBraces(node); |
686 return printer.outBuffer.getText(); | 677 return printer.outBuffer.getText(); |
687 } | 678 } |
688 | 679 |
689 String callNameFor(FunctionElement element) { | 680 String callNameFor(FunctionElement element) { |
690 // TODO(ahe): Call a method in the compiler to obtain this name. | 681 // TODO(ahe): Call a method in the compiler to obtain this name. |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1146 } | 1137 } |
1147 | 1138 |
1148 abstract class JsFeatures { | 1139 abstract class JsFeatures { |
1149 Compiler get compiler; | 1140 Compiler get compiler; |
1150 | 1141 |
1151 JavaScriptBackend get backend => compiler.backend; | 1142 JavaScriptBackend get backend => compiler.backend; |
1152 | 1143 |
1153 Namer get namer => backend.namer; | 1144 Namer get namer => backend.namer; |
1154 | 1145 |
1155 CodeEmitterTask get emitter => backend.emitter; | 1146 CodeEmitterTask get emitter => backend.emitter; |
1147 | |
1148 ContainerBuilder get containerBuilder => emitter.oldEmitter.containerBuilder; | |
1156 } | 1149 } |
1157 | 1150 |
1158 class EmitterHelper extends JsFeatures { | 1151 class EmitterHelper extends JsFeatures { |
1159 final Compiler compiler; | 1152 final Compiler compiler; |
1160 | 1153 |
1161 EmitterHelper(this.compiler); | 1154 EmitterHelper(this.compiler); |
1162 | 1155 |
1163 ClassEmitter get classEmitter => backend.emitter.oldEmitter.classEmitter; | 1156 ClassEmitter get classEmitter => backend.emitter.oldEmitter.classEmitter; |
1164 | 1157 |
1165 List<String> computeFields(ClassElement cls) { | 1158 List<String> computeFields(ClassElement cls) { |
1166 // TODO(ahe): Rewrite for new emitter. | 1159 // TODO(ahe): Rewrite for new emitter. |
1167 ClassBuilder builder = new ClassBuilder(cls, namer); | 1160 ClassBuilder builder = new ClassBuilder(cls, namer); |
1168 classEmitter.emitFields(cls, builder, ""); | 1161 classEmitter.emitFields(cls, builder, ""); |
1169 return builder.fields; | 1162 return builder.fields; |
1170 } | 1163 } |
1171 } | 1164 } |
1172 | 1165 |
1173 // TODO(ahe): Remove this method. | 1166 // TODO(ahe): Remove this method. |
1174 NO_WARN(x) => x; | 1167 NO_WARN(x) => x; |
OLD | NEW |