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

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart

Issue 27524003: Generate tear-off closures dynamically. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed unit tests. Created 7 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/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index 1f5919ae49266190fa05130c2aad056bd4a976f3..8377766eacf60d48f71d5e9b4498ceeb4b970791 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -353,6 +353,16 @@ class CodeEmitterTask extends CompilerTask {
js('var s = fields.split(";")'),
js('fields = s[1] == "" ? [] : s[1].split(",")'),
js('supr = s[0]'),
+ js('split = supr.split(":")'),
+ js.if_('split.length == 2', [
+ js('supr = split[0]'),
+ js('var functionSignature = split[1]'),
+ js.if_('functionSignature',
+ js('desc.\$signature = #',
+ js.fun('s',
+ js.return_(js.fun([], js.return_('init.metadata[s]'))))(
+ js('functionSignature'))))
+ ]),
optional(needsMixinSupport, js.if_('supr && supr.indexOf("+") > 0', [
js('s = supr.split("+")'),
@@ -1198,6 +1208,7 @@ mainBuffer.add(r'''
mainBuffer.add('(function(${namer.currentIsolate})$_{$n');
}
+ mainBuffer.add('function dart() {}');
for (String globalObject in Namer.reservedGlobalObjectNames) {
// The global objects start as so-called "slow objects". For V8, this
// means that it won't try to make map transitions as we add properties
@@ -1205,7 +1216,7 @@ mainBuffer.add(r'''
// fast objects by calling "convertToFastObject" (see
// [emitConvertToFastObjectFunction]).
mainBuffer
- ..write('var ${globalObject}$_=$_{}$N')
+ ..write('var ${globalObject}$_=${_}new dart$N')
..write('delete ${globalObject}.x$N');
}
@@ -1252,26 +1263,12 @@ mainBuffer.add(r'''
nativeEmitter.finishGenerateNativeClasses();
nativeEmitter.assembleCode(nativeBuffer);
- // Might create methodClosures.
if (!deferredClasses.isEmpty) {
for (ClassElement element in deferredClasses) {
generateClass(element, getElementDecriptor(element));
}
}
- containerBuilder.emitStaticFunctionClosures();
-
- addComment('Method closures', mainBuffer);
- // Now that we have emitted all classes, we know all the method
- // closures that will be needed.
- containerBuilder.methodClosures.forEach((String code, Element closure) {
- // TODO(ahe): Some of these can be deferred.
- String mangledName = namer.getNameOfClass(closure);
- mainBuffer.add('$classesCollector.$mangledName$_=$_'
- '[${namer.globalObjectFor(closure)},$_$code]');
- mainBuffer.add("$N$n");
- });
-
// After this assignment we will produce invalid JavaScript code if we use
// the classesCollector variable.
classesCollector = 'classesCollector should not be used from now on';
@@ -1292,7 +1289,7 @@ mainBuffer.add(r'''
if (classEmitter.emitFields(
library, builder, null, emitStatics: true)) {
getElementDescriptorForOutputUnit(library, "main")
- .properties.addAll(builder.properties);
+ .properties.addAll(builder.toObjectInitializer().properties);
}
}
}
@@ -1331,7 +1328,7 @@ mainBuffer.add(r'''
}
}
mainBuffer
- ..write(getReflectionDataParser(classesCollector, namer))
+ ..write(getReflectionDataParser(classesCollector, backend))
..write('([$n');
List<Element> sortedElements =
@@ -1361,8 +1358,6 @@ mainBuffer.add(r'''
classesCollector = oldClassesCollector;
}
- containerBuilder.emitStaticFunctionGetters(mainBuffer);
-
typeTestEmitter.emitRuntimeTypeSupport(mainBuffer);
interceptorEmitter.emitGetInterceptorMethods(mainBuffer);
interceptorEmitter.emitOneShotInterceptors(mainBuffer);
@@ -1537,7 +1532,7 @@ if (typeof $printHelperName === "function") {
'$_${namer.isolateName}.prototype$N$n'
// The classesCollector object ($$).
'$classesCollector$_=$_{};$n')
- ..write(getReflectionDataParser(classesCollector, namer))
+ ..write(getReflectionDataParser(classesCollector, backend))
..write('([$n')
..addBuffer(deferredLibrariesBuffer)
..write('])$N');

Powered by Google App Engine
This is Rietveld 408576698