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

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

Issue 1431523002: Fix behavior when typed JS interop getters are called as functions. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 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 | tests/html/js_function_getter_test.dart » ('j') | tests/html/js_function_getter_test.dart » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index 5f5543926f33ac58d5bc4687c708fa304cfcba9e..4560a8c7d7117a54dced15e847afd3cc888223b4 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -30,7 +30,9 @@ import '../../constants/values.dart' show
import '../../core_types.dart' show
CoreClasses;
import '../../dart_types.dart' show
- DartType;
+ DartType,
+ FunctionType,
+ TypedefType;
import '../../elements/elements.dart' show
ClassElement,
Element,
@@ -38,6 +40,7 @@ import '../../elements/elements.dart' show
FieldElement,
FunctionElement,
FunctionSignature,
+ GetterElement,
LibraryElement,
MethodElement,
Name,
@@ -407,7 +410,41 @@ class ProgramBuilder {
}
}
+ bool isFunctionLike = false;
sra1 2015/10/30 20:54:59 Explain (comment) that this is generating stubs fo
Jacob 2015/10/30 22:31:53 Done.
+ FunctionType functionType;
sra1 2015/10/30 20:54:59 I like to add = null if it is not set one some pat
Jacob 2015/10/30 22:31:53 Done.
+
if (member.isFunction) {
+ FunctionElement fn = member;
+ functionType = fn.type;
+ } else if (member.isGetter) {
+ GetterElement getter = member;
+ DartType returnType = getter.type.returnType;
+ if (returnType.isFunctionType) {
+ functionType = returnType;
+ } else if (_compiler.types.isSubtype(returnType,
+ backend.coreTypes.functionType) ||
+ returnType.treatAsDynamic) {
sra1 2015/10/30 20:54:59 Horrible indentation. If it is the formatter, can
Jacob 2015/10/30 22:31:53 done. shame line length isn't 100.
+ if (returnType.isTypedef) {
+ TypedefType typedef = returnType;
+ functionType = typedef.element.functionSignature.type;
+ } else {
+ // Other misc function type such as coreTypes.Function.
+ // Allow any number of arguments.
+ isFunctionLike = true;
+ }
+ }
+ } // TODO(jacobr): handle field elements.
+
+ if (isFunctionLike || functionType != null) {
+ int minArgs;
+ int maxArgs;
+ if (functionType != null) {
+ minArgs = functionType.parameterTypes.length;
+ maxArgs = minArgs + functionType.optionalParameterTypes.length;
+ } else {
+ minArgs = 0;
+ maxArgs = 32767;
+ }
var selectors =
_compiler.codegenWorld.invocationsByName(member.name);
FunctionElement fn = member;
sra1 2015/10/30 20:54:59 'fn' unused below. Will fail if you TODO handle f
Jacob 2015/10/30 22:31:53 done. forgot to remove this.
@@ -418,15 +455,14 @@ class ProgramBuilder {
for (var selector in selectors.keys) {
// Check whether the arity matches this member.
var argumentCount = selector.argumentCount;
- if (argumentCount > fn.parameters.length) break;
- if (argumentCount < fn.parameters.length &&
- !fn.parameters[argumentCount].isOptional) break;
+ // JS interop does not support named arguments.
+ if (selector.namedArgumentCount > 0) break;
+ if (argumentCount < minArgs) break;
+ if (argumentCount > maxArgs) break;
var stubName = namer.invocationName(selector);
if (!stubNames.add(stubName.key)) break;
- var candidateParameterNames =
- 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMOPQRSTUVWXYZ';
var parameters = new List<String>.generate(argumentCount,
- (i) => candidateParameterNames[i]);
+ (i) => 'p$i');
Siggi Cherem (dart-lang) 2015/10/30 19:54:17 you could also keep the old naming scheme to optim
Jacob 2015/10/30 22:31:53 not needed. these names will be minified anyway so
interceptorClass.callStubs.add(_buildStubMethod(
stubName,
sra1 2015/10/30 20:54:59 Do you get duplicate stubs?
Jacob 2015/10/30 22:31:53 no because of if (!stubNames.add(stubName.key)) b
« no previous file with comments | « no previous file | tests/html/js_function_getter_test.dart » ('j') | tests/html/js_function_getter_test.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698