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