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

Unified 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, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: dart/pkg/dart2js_incremental/lib/library_updater.dart
diff --git a/dart/pkg/dart2js_incremental/lib/library_updater.dart b/dart/pkg/dart2js_incremental/lib/library_updater.dart
index 17cebea158ed64a204d2d6f988315897e8fe9aab..70f00264d8ed505002eaf09316ab1f0a3c2fc2b0 100644
--- a/dart/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart
@@ -49,6 +49,7 @@ import 'package:compiler/src/js_emitter/js_emitter.dart' show
ClassBuilder,
ClassEmitter,
CodeEmitterTask,
+ ContainerBuilder,
MemberInfo,
computeMixinClass;
@@ -638,46 +639,36 @@ class LibraryUpdater extends JsFeatures {
}
jsAst.Node computeMemberUpdateJs(Element element) {
- MemberInfo info = emitter.oldEmitter.containerBuilder
- .analyzeMemberMethod(element);
+ MemberInfo info = containerBuilder.analyzeMemberMethod(element);
if (info == null) {
compiler.internalError(element, '${element.runtimeType}');
}
+ ClassBuilder builder = new ClassBuilder(element, namer);
+ containerBuilder.addMemberMethodFromInfo(info, builder);
+ jsAst.Node partialDescriptor =
+ builder.toObjectInitializer(omitClassDescriptor: true);
+
String name = info.name;
jsAst.Node function = info.code;
- List<jsAst.Statement> statements = <jsAst.Statement>[];
- if (element.isInstanceMember) {
- jsAst.Node elementAccess = namer.elementAccess(element.enclosingClass);
- statements.add(
- js.statement('#.prototype.# = f', [elementAccess, name]));
+ bool isStatic = !element.isInstanceMember;
- // TODO(ahe): Restore when isAliasedSuperMember is restored.
- // if (backend.isAliasedSuperMember(element)) {
- // String superName = namer.getNameOfAliasedSuperMember(element);
- // statements.add(
- // js.statement('#.prototype.# = f', [elementAccess, superName]));
- // }
+ /// Either a global object (non-instance members) or a prototype (instance
+ /// members).
+ jsAst.Node holder;
+
+ if (element.isInstanceMember) {
+ holder = js('#.prototype', namer.elementAccess(element.enclosingClass));
} else {
- jsAst.Node elementAccess = namer.elementAccess(element);
- jsAst.Expression globalFunctionsAccess =
- emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
- statements.add(
- js.statement(
- '#.# = # = f',
- [globalFunctionsAccess, name, elementAccess]));
- if (info.canTearOff) {
- String globalName = namer.globalObjectFor(element);
- statements.add(
- js.statement(
- '#.#().# = f',
- [globalName, info.tearOffName, callNameFor(element)]));
- }
+ holder = js('#', namer.globalObjectFor(element));
}
- // Create a scope by creating a new function. The updated function literal
- // is passed as an argument to this function which ensures that temporary
- // names in updateScope don't shadow global names.
- jsAst.Fun updateScope = js('function (f) { # }', [statements]);
- return js.statement('(#)(#)', [updateScope, function]);
+
+ jsAst.Expression globalFunctionsAccess =
+ emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
+
+ return js.statement(
+ 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.
+ [partialDescriptor, js.string(name), holder,
+ new jsAst.LiteralBool(isStatic), globalFunctionsAccess]);
}
String prettyPrintJs(jsAst.Node node) {
@@ -1153,6 +1144,8 @@ abstract class JsFeatures {
Namer get namer => backend.namer;
CodeEmitterTask get emitter => backend.emitter;
+
+ ContainerBuilder get containerBuilder => emitter.oldEmitter.containerBuilder;
}
class EmitterHelper extends JsFeatures {

Powered by Google App Engine
This is Rietveld 408576698