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

Unified Diff: dart/pkg/dart2js_incremental/lib/library_updater.dart

Issue 654523003: Handle top-level tear offs. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 months 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 b3a6c018cb5b9ccd5cacdf64332d7d9aa80ea2bb..0c31acfd316f4f804c84d232f813879633739a66 100644
--- a/dart/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/dart/pkg/dart2js_incremental/lib/library_updater.dart
@@ -18,6 +18,7 @@ import 'package:compiler/implementation/dart2jslib.dart' show
import 'package:compiler/implementation/elements/elements.dart' show
Element,
+ FunctionElement,
LibraryElement;
import 'package:compiler/implementation/scanner/scannerlib.dart' show
@@ -38,10 +39,15 @@ import 'package:compiler/implementation/js/js.dart' show
import 'package:compiler/implementation/js/js.dart' as jsAst;
import 'package:compiler/implementation/js_emitter/js_emitter.dart' show
- ClassBuilder;
+ CodeEmitterTask,
+ MemberInfo;
import 'package:compiler/js_lib/shared/embedded_names.dart' as embeddedNames;
+import 'package:compiler/implementation/js_backend/js_backend.dart' show
+ JavaScriptBackend,
+ Namer;
+
import 'diff.dart' show
Difference,
computeDifference;
@@ -76,6 +82,12 @@ class LibraryUpdater {
this.logTime,
this.logVerbose);
+ JavaScriptBackend get backend => compiler.backend;
+
+ Namer get namer => backend.namer;
+
+ CodeEmitterTask get emitter => backend.emitter;
+
/// Used as tear-off passed to [LibraryLoaderTask.resetAsync].
Future<bool> reuseLibrary(LibraryElement library) {
assert(compiler != null);
@@ -205,7 +217,9 @@ class LibraryUpdater {
List<jsAst.Statement> updates = <jsAst.Statement>[];
for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) {
- updates.add(computeMemberUpdateJs(element));
+ if (!element.isField) {
+ updates.add(computeMemberUpdateJs(element));
+ }
}
if (updates.length == 1) {
@@ -216,22 +230,28 @@ class LibraryUpdater {
}
jsAst.Node computeMemberUpdateJs(Element element) {
- ClassBuilder builder = new ClassBuilder(element, compiler.backend.namer);
-
- compiler.backend.emitter.oldEmitter.containerBuilder.addMember(
- element, builder);
- jsAst.Property property = builder.properties.single;
- jsAst.Node name = property.name;
- jsAst.Node function = property.value;
- jsAst.Node elementAccess = compiler.backend.namer.elementAccess(element);
+ MemberInfo info = emitter.oldEmitter.containerBuilder
+ .analyzeMemberMethod(element);
+ if (info == null) {
+ throw '$element ${element.runtimeType}';
Johnni Winther 2014/10/14 07:40:26 internalError instead of throw?
ahe 2014/10/15 09:11:12 Good idea, I hadn't thought about this as part of
+ }
+ String name = info.name;
+ jsAst.Node function = info.code;
+ jsAst.Node elementAccess = namer.elementAccess(element);
jsAst.Expression globalFunctionsAccess =
- compiler.backend.emitter.generateEmbeddedGlobalAccess(
- embeddedNames.GLOBAL_FUNCTIONS);
+ emitter.generateEmbeddedGlobalAccess(embeddedNames.GLOBAL_FUNCTIONS);
List<jsAst.Statement> statements = <jsAst.Statement>[];
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)]));
+ }
// 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.
@@ -244,6 +264,13 @@ class LibraryUpdater {
printer.blockOutWithoutBraces(node);
return printer.outBuffer.getText();
}
+
+ String callNameFor(FunctionElement element) {
+ // TODO(ahe): Call a method in the compiler to obtain this name.
+ String callPrefix = namer.callPrefix;
+ int parameterCount = element.functionSignature.parameterCount;
+ return '$callPrefix\$$parameterCount';
+ }
}
/// Represents an update (aka patch) of [before] to [after]. We use the word

Powered by Google App Engine
This is Rietveld 408576698