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

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

Issue 12517012: Revert "Revert "Use interceptor convention for methods declared on native classes."" (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 9 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
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index b6c8ea28ffea947a72f86fdbf3c7a8330cb66bfd..27c36748780915f4b03823941f2d735ca1b748ab 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -661,9 +661,9 @@ class CodeEmitterTask extends CompilerTask {
}
if (parameters.optionalParametersAreNamed
&& selector.namedArgumentCount == parameters.optionalParameterCount) {
- // If the selector has the same number of named arguments as
- // the element, we don't need to add a stub. The call site will
- // hit the method directly.
+ // If the selector has the same number of named arguments as the element,
+ // we don't need to add a stub. The call site will hit the method
+ // directly.
return;
}
ConstantHandler handler = compiler.constantHandler;
@@ -675,8 +675,7 @@ class CodeEmitterTask extends CompilerTask {
bool isInterceptedMethod = backend.isInterceptedMethod(member);
- // If the method is intercepted, we need to also pass
- // the actual receiver.
+ // If the method is intercepted, we need to also pass the actual receiver.
int extraArgumentCount = isInterceptedMethod ? 1 : 0;
// Use '$receiver' to avoid clashes with other parameter names. Using
// '$receiver' works because [:namer.safeName:] used for getting parameter
@@ -698,14 +697,16 @@ class CodeEmitterTask extends CompilerTask {
argumentsBuffer[0] = js[receiverArgumentName];
}
- int indexOfLastOptionalArgumentInParameters = positionalArgumentCount - 1;
+ int optionalParameterStart = positionalArgumentCount + extraArgumentCount;
+ // Includes extra receiver argument when using interceptor convention
+ int indexOfLastOptionalArgumentInParameters = optionalParameterStart - 1;
+
TreeElements elements =
compiler.enqueuer.resolution.getCachedElements(member);
parameters.orderedForEachParameter((Element element) {
String jsName = backend.namer.safeName(element.name.slowToString());
assert(jsName != receiverArgumentName);
- int optionalParameterStart = positionalArgumentCount + extraArgumentCount;
if (count < optionalParameterStart) {
parametersBuffer[count] = new jsAst.Parameter(jsName);
argumentsBuffer[count] = js[jsName];
@@ -741,7 +742,8 @@ class CodeEmitterTask extends CompilerTask {
List body;
if (member.hasFixedBackendName()) {
body = nativeEmitter.generateParameterStubStatements(
- member, invocationName, parametersBuffer, argumentsBuffer,
+ member, isInterceptedMethod, invocationName,
+ parametersBuffer, argumentsBuffer,
indexOfLastOptionalArgumentInParameters);
} else {
body = [js.return_(js['this'][namer.getName(member)](argumentsBuffer))];
@@ -2246,7 +2248,9 @@ if (typeof document !== "undefined" && document.readyState !== "complete") {
else if (cls == backend.jsNumberClass) hasNumber = true;
else if (cls == backend.jsStringClass) hasString = true;
else {
- assert(cls == compiler.objectClass);
+ // TODO(sra): The set of classes includes classes mixed-in to
+ // interceptor classes.
+ // assert(cls == compiler.objectClass || cls.isNative());
}
}
if (hasDouble) {

Powered by Google App Engine
This is Rietveld 408576698