Chromium Code Reviews| 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 |