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

Side by Side Diff: dart/pkg/dart2js_incremental/lib/library_updater.dart

Issue 764533002: Incremental compiler: Use addStubs for adding methods. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years 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_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
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
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
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;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698