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

Unified Diff: pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart

Issue 897643002: dart2js: move generation of noSuchMethodStubs into ClassStubGenerator. (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
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/class_stub_generator.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart
index 42470d81e1406530d696520f65716de65c02afbc..c9ae7014c832af85e5ecbea00aec97d49aeff291 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/nsm_emitter.dart
@@ -20,82 +20,13 @@ class NsmEmitter extends CodeEmitterHelper {
void emitNoSuchMethodHandlers(AddPropertyFunction addProperty) {
- void computeSelectorsForNsmHandlers(Map<String, Selector> jsNames) {
-
- // Do not generate no such method handlers if there is no class.
- if (compiler.codegenWorld.directlyInstantiatedClasses.isEmpty) return;
-
- void addNoSuchMethodHandlers(String ignore, Set<Selector> selectors) {
- // Cache the object class and type.
- ClassElement objectClass = compiler.objectClass;
- DartType objectType = objectClass.rawType;
-
- for (Selector selector in selectors) {
- TypeMask mask = selector.mask;
- if (mask == null) {
- mask = new TypeMask.subclass(compiler.objectClass,
- compiler.world);
- }
-
- if (!mask.needsNoSuchMethodHandling(selector, compiler.world)) {
- continue;
- }
- String jsName = namer.invocationMirrorInternalName(selector);
- jsNames[jsName] = selector;
- }
- }
-
- compiler.codegenWorld.invokedNames.forEach(addNoSuchMethodHandlers);
- compiler.codegenWorld.invokedGetters.forEach(addNoSuchMethodHandlers);
- compiler.codegenWorld.invokedSetters.forEach(addNoSuchMethodHandlers);
- }
-
- jsAst.Expression generateMethod(Selector selector) {
- // Values match JSInvocationMirror in js-helper library.
- int type = selector.invocationMirrorKind;
- List<String> parameterNames =
- new List.generate(selector.argumentCount, (i) => '\$$i');
-
- List<jsAst.Expression> argNames =
- selector.getOrderedNamedArguments().map((String name) =>
- js.string(name)).toList();
-
- String methodName = selector.invocationMirrorMemberName;
- String internalName = namer.invocationMirrorInternalName(selector);
-
- assert(backend.isInterceptedName(Compiler.NO_SUCH_METHOD));
- jsAst.Expression expression =
- js('''this.#noSuchMethodName(this,
- #createInvocationMirror(#methodName,
- #internalName,
- #type,
- #arguments,
- #namedArguments))''',
- {'noSuchMethodName': namer.noSuchMethodName,
- 'createInvocationMirror':
- backend.emitter.staticFunctionAccess(
- backend.getCreateInvocationMirror()),
- 'methodName':
- js.string(compiler.enableMinification
- ? internalName : methodName),
- 'internalName': js.string(internalName),
- 'type': js.number(type),
- 'arguments':
- new jsAst.ArrayInitializer(parameterNames.map(js).toList()),
- 'namedArguments': new jsAst.ArrayInitializer(argNames)});
-
- if (backend.isInterceptedName(selector.name)) {
- return js(r'function($receiver, #) { return # }',
- [parameterNames, expression]);
- } else {
- return js(r'function(#) { return # }', [parameterNames, expression]);
- }
- }
+ ClassStubGenerator generator =
+ new ClassStubGenerator(compiler, namer, backend);
// Keep track of the JavaScript names we've already added so we
// do not introduce duplicates (bad for code size).
Map<String, Selector> addedJsNames = new Map<String, Selector>();
- computeSelectorsForNsmHandlers(addedJsNames);
+ generator.computeSelectorsForNsmHandlers(addedJsNames);
floitsch 2015/02/03 10:48:51 In the next CL return the map from the generator (
zarah 2015/02/03 11:55:18 Done.
// Set flag used by generateMethod helper below. If we have very few
// handlers we use addProperty for them all, rather than try to generate
@@ -120,7 +51,7 @@ class NsmEmitter extends CodeEmitterHelper {
trivialNsmHandlers.add(selector);
}
- jsAst.Expression method = generateMethod(jsName, selector);
+ jsAst.Expression method = generator.generateStubForNoSuchMethod(selector);
if (method != null) {
addProperty(jsName, method);
if (reflectionName != null) {
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/class_stub_generator.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698