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

Unified Diff: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart

Issue 12033056: Implement "one-shot" interceptors. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 11 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: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
===================================================================
--- sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart (revision 17552)
+++ sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart (working copy)
@@ -2097,6 +2097,48 @@
}
}
+ void emitOneShotInterceptors(CodeBuffer buffer) {
+ JavaScriptBackend backend = compiler.backend;
+ for (Selector selector in backend.oneShotInterceptors) {
+ Set<ClassElement> classes = backend.getInterceptedClassesOn(selector);
+ String oneShotInterceptorName = namer.oneShotInterceptorName(selector);
+ String getInterceptorName =
+ namer.getInterceptorName(backend.getInterceptorMethod, classes);
+
+ List<js.Parameter> parameters = <js.Parameter>[];
+ List<js.Expression> arguments = <js.Expression>[];
+ parameters.add(new js.Parameter('receiver'));
+ arguments.add(js.use('receiver'));
+
+ if (selector.isSetter()) {
+ parameters.add(new js.Parameter('value'));
+ arguments.add(js.use('value'));
+ } else {
+ for (int i = 0; i < selector.argumentCount; i++) {
+ String argName = 'a$i';
+ parameters.add(new js.Parameter(argName));
+ arguments.add(js.use(argName));
+ }
+ }
+
+ String invocationName = backend.namer.invocationName(selector);
+ js.Fun function =
+ new js.Fun(parameters,
+ js.block1(js.return_(
+ js.use(isolateProperties)
+ .dot(getInterceptorName)
+ .callWith([js.use('receiver')])
+ .dot(invocationName)
+ .callWith(arguments))));
+
+ js.PropertyAccess property =
+ js.fieldAccess(js.use(isolateProperties), oneShotInterceptorName);
+
+ buffer.add(js.prettyPrint(js.assign(property, function), compiler));
+ buffer.add(N);
+ }
+ }
+
String assembleProgram() {
measure(() {
computeNeededClasses();
@@ -2126,6 +2168,7 @@
// Static field initializations require the classes and compile-time
// constants to be set up.
emitStaticNonFinalFieldInitializations(mainBuffer);
+ emitOneShotInterceptors(mainBuffer);
emitGetInterceptorMethods(mainBuffer);
emitLazilyInitializedStaticFields(mainBuffer);

Powered by Google App Engine
This is Rietveld 408576698