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

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

Issue 11447008: invocation_mirror_test passed (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: co19 status updated Created 8 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: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 19051befd201894a20c56fda429922539546a2c0..847c70d7ebff3b93e35bb20316e0201d697bea81 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -1256,7 +1256,7 @@ $classesCollector.$mangledName = {'':
// Note: the callElement will not have any enclosingElement.
FunctionElement callElement =
new ClosureInvocationElement(Namer.CLOSURE_INVOCATION_NAME, member);
-
+
String invocationName = namer.instanceMethodName(callElement);
List<String> arguments = new List<String>(parameterCount);
for (int i = 0; i < parameterCount; i++) {
@@ -1456,6 +1456,11 @@ $classesCollector.$mangledName = {'':
String noSuchMethodName = namer.publicInstanceMethodNameByArity(
Compiler.NO_SUCH_METHOD, Compiler.NO_SUCH_METHOD_ARG_COUNT);
+ Element createInvocationMirrorElement =
+ compiler.findHelper(const SourceString("createInvocationMirror"));
+ String createInvocationMirrorName =
+ namer.getName(createInvocationMirrorElement);
+
// Keep track of the JavaScript names we've already added so we
// do not introduce duplicates (bad for code size).
Set<String> addedJsNames = new Set<String>();
@@ -1478,7 +1483,7 @@ $classesCollector.$mangledName = {'':
return result;
}
- CodeBuffer generateMethod(String methodName, Selector selector) {
+ CodeBuffer generateMethod(String jsName, Selector selector) {
// Values match JSInvocationMirror in js-helper library.
const int METHOD = 0;
const int GETTER = 1;
@@ -1486,13 +1491,10 @@ $classesCollector.$mangledName = {'':
int type = METHOD;
if (selector.isGetter()) {
type = GETTER;
- assert(methodName.startsWith("get:"));
- methodName = methodName.substring(4);
} else if (selector.isSetter()) {
type = SETTER;
- assert(methodName.startsWith("set:"));
- methodName = "${methodName.substring(4)}=";
}
+ String methodName = selector.invocationMirrorMemberName;
CodeBuffer args = new CodeBuffer();
for (int i = 0; i < selector.argumentCount; i++) {
if (i != 0) args.add(', ');
@@ -1506,12 +1508,10 @@ $classesCollector.$mangledName = {'':
argNames.add(names[i].slowToString());
argNames.add('"');
}
- String internalName = namer.instanceMethodInvocationName(
- selector.library, new SourceString(methodName), selector);
CodeBuffer buffer = new CodeBuffer();
buffer.add('function($args) {\n');
buffer.add(' return this.$noSuchMethodName('
- '\$.createInvocationMirror("$methodName", "$internalName",'
+ '\$.$createInvocationMirrorName("$methodName", "$jsName",'
' $type, [$args], [$argNames]));\n');
buffer.add(' }');
return buffer;
@@ -1534,13 +1534,17 @@ $classesCollector.$mangledName = {'':
// Selector.applies() method.
if (element is AbstractFieldElement) {
AbstractFieldElement field = element;
- if (identical(selector.kind, SelectorKind.GETTER)) {
+ if (selector.isGetter()) {
return field.getter != null;
- } else if (identical(selector.kind, SelectorKind.SETTER)) {
+ } else if (selector.isSetter()) {
return field.setter != null;
} else {
return false;
}
+ } else if (element is VariableElement) {
+ if (selector.isSetter() && element.modifiers.isFinalOrConst()) {
+ return false;
+ }
}
return selector.applies(element, compiler);
}
@@ -1600,28 +1604,9 @@ $classesCollector.$mangledName = {'':
// does not implement bar.
Set<ClassElement> holders = noSuchMethodHoldersFor(receiverType);
if (holders.every(hasMatchingMember)) continue;
-
- String jsName = null;
- String methodName = null;
- String nameString = selector.name.slowToString();
- if (selector.isGetter()) {
- jsName = namer.getterName(selector.library, selector.name);
- methodName = 'get:$nameString';
- } else if (selector.isSetter()) {
- jsName = namer.setterName(selector.library, selector.name);
- methodName = 'set:$nameString';
- } else if (selector.isCall()) {
- jsName = namer.instanceMethodInvocationName(
- selector.library, selector.name, selector);
- methodName = nameString;
- } else {
- // We simply ignore selectors that do not need
- // noSuchMethod handlers.
- continue;
- }
-
+ String jsName = namer.invocationMirrorInternalName(selector);
if (!addedJsNames.contains(jsName)) {
- CodeBuffer jsCode = generateMethod(methodName, selector);
+ CodeBuffer jsCode = generateMethod(jsName, selector);
defineInstanceMember(jsName, jsCode);
addedJsNames.add(jsName);
}

Powered by Google App Engine
This is Rietveld 408576698