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

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

Issue 662663003: dart2js: Add interceptors to new emitter. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/_internal/compiler/implementation/js_emitter/program_builder.dart
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/program_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/program_builder.dart
index 53794e30e3e481b24bcab52591e3106830976902..0529219bc9cfe8e16ae0f0819e7f380999470b09 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/program_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/program_builder.dart
@@ -13,9 +13,10 @@ import '../js_backend/js_backend.dart' show
JavaScriptBackend,
JavaScriptConstantCompiler;
-import '../js_emitter/js_emitter.dart' as emitterTask show
+import 'js_emitter.dart' as emitterTask show
CodeEmitterTask,
- Emitter;
+ Emitter,
+ InterceptorStubGenerator;
import '../universe/universe.dart' show Universe;
import '../deferred_load.dart' show DeferredLoadTask, OutputUnit;
@@ -189,6 +190,11 @@ class ProgramBuilder {
.where((e) => universe.staticFunctionsNeedingGetter.contains(e))
.map(_buildStaticMethodTearOff));
+ if (library == backend.interceptorsLibrary) {
+ statics.addAll(_generateGetInterceptorMethods());
+ statics.addAll(_generateOneShotInterceptors());
+ }
+
List<Class> classes = elements
.where((e) => e is ClassElement)
.map(_buildClass)
@@ -221,6 +227,37 @@ class ProgramBuilder {
return new Method(name, code);
}
+ Iterable<StaticMethod> _generateGetInterceptorMethods() {
+ emitterTask.InterceptorStubGenerator stubGenerator =
+ new emitterTask.InterceptorStubGenerator(_compiler, namer, backend);
+
+ String holderName = namer.globalObjectFor(backend.interceptorsLibrary);
+ Holder holder = _registry.registerHolder(holderName);
+
+ Map<String, Set<ClassElement>> specializedGetInterceptors =
+ backend.specializedGetInterceptors;
+ List<String> names = specializedGetInterceptors.keys.toList()..sort();
+ return names.map((String name) {
+ Set<ClassElement> classes = specializedGetInterceptors[name];
+ js.Expression code = stubGenerator.generateGetInterceptorMethod(classes);
+ return new StaticMethod(name, holder, code);
+ });
+ }
+
+ Iterable<StaticMethod> _generateOneShotInterceptors() {
+ emitterTask.InterceptorStubGenerator stubGenerator =
+ new emitterTask.InterceptorStubGenerator(_compiler, namer, backend);
+
+ String holderName = namer.globalObjectFor(backend.interceptorsLibrary);
+ Holder holder = _registry.registerHolder(holderName);
+
+ List<String> names = backend.oneShotInterceptors.keys.toList()..sort();
+ return names.map((String name) {
+ js.Expression code = stubGenerator.generateOneShotInterceptor(name);
+ return new StaticMethod(name, holder, code);
+ });
+ }
+
StaticMethod _buildStaticMethod(FunctionElement element) {
String name = namer.getNameOfMember(element);
String holder = namer.globalObjectFor(element);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698