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

Unified Diff: pkg/compiler/lib/src/js_emitter/program_builder.dart

Issue 865223002: dart2js: store call stubs in the model. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 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: pkg/compiler/lib/src/js_emitter/program_builder.dart
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder.dart
index abbda7120d2ff3795a276c1dc80226d4af12be23..1bdfc8105e337045e07aa4fdf06c0a7b13ee18c9 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder.dart
@@ -15,9 +15,9 @@ import '../js_backend/js_backend.dart' show
JavaScriptBackend,
JavaScriptConstantCompiler;
-import 'js_emitter.dart' as emitterTask show
+import 'js_emitter.dart' show
+ ClassStubGenerator,
CodeEmitterTask,
- Emitter,
InterceptorStubGenerator,
TypeTestGenerator,
TypeTestProperties;
@@ -30,7 +30,7 @@ part 'registry.dart';
class ProgramBuilder {
final Compiler _compiler;
final Namer namer;
- final emitterTask.CodeEmitterTask _task;
+ final CodeEmitterTask _task;
final Registry _registry;
@@ -266,6 +266,7 @@ class ProgramBuilder {
bool onlyForRti = _task.typeTestRegistry.rtiNeededClasses.contains(element);
List<Method> methods = [];
+ List<StubMethod> callStubs = <StubMethod>[];
void visitMember(ClassElement enclosing, Element member) {
assert(invariant(element, member.isDeclaration));
@@ -276,13 +277,26 @@ class ProgramBuilder {
// TODO(kasperl): Figure out under which conditions code is null.
if (code != null) methods.add(_buildMethod(member, code));
}
+ if (member.isGetter || member.isField) {
+ Set<Selector> selectors =
+ _compiler.codegenWorld.invokedNames[member.name];
+ if (selectors != null && !selectors.isEmpty) {
+ ClassStubGenerator generator =
+ new ClassStubGenerator(_compiler, namer, backend);
+ Map<String, js.Expression> callStubsForMember =
+ generator.generateCallStubsForGetter(member, selectors);
+ callStubsForMember.forEach((String name, js.Expression code) {
+ callStubs.add(_buildStubMethod(name, code, element: member));
+ });
+ }
+ }
}
ClassElement implementation = element.implementation;
// MixinApplications run through the members of their mixin. Here, we are
// only interested in direct members.
- if (!element.isMixinApplication) {
+ if (!onlyForRti && !element.isMixinApplication) {
implementation.forEachMember(visitMember, includeBackendMembers: true);
}
@@ -291,9 +305,9 @@ class ProgramBuilder {
List<Field> staticFieldsForReflection =
onlyForRti ? const <Field>[] : _buildFields(element, true);
- emitterTask.TypeTestGenerator generator =
- new emitterTask.TypeTestGenerator(_compiler, _task, namer);
- emitterTask.TypeTestProperties typeTests =
+ TypeTestGenerator generator =
+ new TypeTestGenerator(_compiler, _task, namer);
+ TypeTestProperties typeTests =
generator.generateIsTests(
element,
storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata);
@@ -318,6 +332,7 @@ class ProgramBuilder {
name, holder,
instanceFields,
staticFieldsForReflection,
+ callStubs,
isChecks,
typeTests.functionTypeIndex,
isDirectlyInstantiated: isInstantiated,
@@ -326,6 +341,7 @@ class ProgramBuilder {
result = new Class(element,
name, holder, methods, instanceFields,
staticFieldsForReflection,
+ callStubs,
isChecks,
typeTests.functionTypeIndex,
isDirectlyInstantiated: isInstantiated,
@@ -342,9 +358,14 @@ class ProgramBuilder {
return new Method(element, name, code, needsTearOff: false);
}
- Method _buildStubMethod(String name, js.Expression code) {
+ /// Builds a stub method.
+ ///
+ /// Stub methods may have an element that can be used for code-size
+ /// attribution.
+ Method _buildStubMethod(String name, js.Expression code,
+ {Element element}) {
// TODO(floitsch): compute `needsTearOff`.
- return new StubMethod(name, code, needsTearOff: false);
+ return new StubMethod(name, code, needsTearOff: false, element: element);
}
// The getInterceptor methods directly access the prototype of classes.
@@ -362,8 +383,8 @@ class ProgramBuilder {
}
Iterable<StaticMethod> _generateGetInterceptorMethods() {
- emitterTask.InterceptorStubGenerator stubGenerator =
- new emitterTask.InterceptorStubGenerator(_compiler, namer, backend);
+ InterceptorStubGenerator stubGenerator =
+ new InterceptorStubGenerator(_compiler, namer, backend);
String holderName = namer.globalObjectFor(backend.interceptorsLibrary);
Holder holder = _registry.registerHolder(holderName);
@@ -426,8 +447,8 @@ class ProgramBuilder {
}
Iterable<StaticMethod> _generateOneShotInterceptors() {
- emitterTask.InterceptorStubGenerator stubGenerator =
- new emitterTask.InterceptorStubGenerator(_compiler, namer, backend);
+ InterceptorStubGenerator stubGenerator =
+ new InterceptorStubGenerator(_compiler, namer, backend);
String holderName = namer.globalObjectFor(backend.interceptorsLibrary);
Holder holder = _registry.registerHolder(holderName);

Powered by Google App Engine
This is Rietveld 408576698