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

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: Merged with r42040. 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 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 e95aa0f0faaa9ac78030551c8384a2e5e655e6c5..aef7a06e88aa52f45b2b69d08653ab1e79b7546b 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,39 +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>[];
+ bool isStatic = !element.isInstanceMember;
+
+ /// Either a global object (non-instance members) or a prototype (instance
+ /// members).
+ jsAst.Node holder;
+
if (element.isInstanceMember) {
- jsAst.Node elementAccess = namer.elementAccess(element.enclosingClass);
- statements.add(
- js.statement('#.prototype.# = f', [elementAccess, name]));
+ 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(#, #, #, #, #)',
+ [partialDescriptor, js.string(name), holder,
+ new jsAst.LiteralBool(isStatic), globalFunctionsAccess]);
}
String prettyPrintJs(jsAst.Node node) {
@@ -1133,6 +1131,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