| Index: pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
|
| index a018b6f5b3387e838537d6cede33166031361018..1754c5438bd2c69bc0a559c6a7b6a56ec72251ef 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
|
| @@ -8,18 +8,9 @@ import '../closure.dart' show ClosureClassElement;
|
| import '../common.dart';
|
| import '../common_elements.dart';
|
| import '../constants/values.dart';
|
| -import '../elements/elements.dart'
|
| - show
|
| - ClassElement,
|
| - FunctionElement,
|
| - FunctionSignature,
|
| - MethodElement,
|
| - ParameterElement;
|
| import '../elements/entities.dart';
|
| import '../js/js.dart' as jsAst;
|
| import '../js/js.dart' show js;
|
| -import '../js_backend/constant_handler_javascript.dart'
|
| - show JavaScriptConstantCompiler;
|
| import '../js_backend/namer.dart' show Namer;
|
| import '../js_backend/native_data.dart';
|
| import '../js_backend/interceptor_data.dart';
|
| @@ -38,7 +29,6 @@ class ParameterStubGenerator {
|
|
|
| final CommonElements _commonElements;
|
| final CodeEmitterTask _emitterTask;
|
| - final JavaScriptConstantCompiler _constants;
|
| final Namer _namer;
|
| final NativeData _nativeData;
|
| final InterceptorData _interceptorData;
|
| @@ -48,7 +38,6 @@ class ParameterStubGenerator {
|
| ParameterStubGenerator(
|
| this._commonElements,
|
| this._emitterTask,
|
| - this._constants,
|
| this._namer,
|
| this._nativeData,
|
| this._interceptorData,
|
| @@ -57,7 +46,7 @@ class ParameterStubGenerator {
|
|
|
| Emitter get _emitter => _emitterTask.emitter;
|
|
|
| - bool needsSuperGetter(FunctionElement element) =>
|
| + bool needsSuperGetter(FunctionEntity element) =>
|
| _codegenWorldBuilder.methodsNeedingSuperGetter.contains(element);
|
|
|
| /**
|
| @@ -77,21 +66,23 @@ class ParameterStubGenerator {
|
| * the input selector is non-null (and the member needs a stub).
|
| */
|
| ParameterStubMethod generateParameterStub(
|
| - MethodElement member, Selector selector, Selector callSelector) {
|
| + FunctionEntity member, Selector selector, Selector callSelector) {
|
| CallStructure callStructure = selector.callStructure;
|
| - FunctionSignature parameters = member.functionSignature;
|
| + ParameterStructure parameterStructure = member.parameterStructure;
|
| int positionalArgumentCount = callStructure.positionalArgumentCount;
|
| - if (positionalArgumentCount == parameters.parameterCount) {
|
| + if (positionalArgumentCount == parameterStructure.totalParameters) {
|
| assert(callStructure.isUnnamed);
|
| return null;
|
| }
|
| - if (parameters.optionalParametersAreNamed &&
|
| - callStructure.namedArgumentCount == parameters.optionalParameterCount) {
|
| + if (parameterStructure.namedParameters.isNotEmpty &&
|
| + callStructure.namedArgumentCount ==
|
| + parameterStructure.namedParameters.length) {
|
| // 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 null;
|
| }
|
| +
|
| List<String> names = callStructure.getOrderedNamedArguments();
|
|
|
| bool isInterceptedMethod = _interceptorData.isInterceptedMethod(member);
|
| @@ -108,7 +99,7 @@ class ParameterStubGenerator {
|
| new List<jsAst.Parameter>(selector.argumentCount + extraArgumentCount);
|
| // The arguments that will be passed to the real method.
|
| List<jsAst.Expression> argumentsBuffer = new List<jsAst.Expression>(
|
| - parameters.parameterCount + extraArgumentCount);
|
| + parameterStructure.totalParameters + extraArgumentCount);
|
|
|
| int count = 0;
|
| if (isInterceptedMethod) {
|
| @@ -121,15 +112,15 @@ class ParameterStubGenerator {
|
| // Includes extra receiver argument when using interceptor convention
|
| int indexOfLastOptionalArgumentInParameters = optionalParameterStart - 1;
|
|
|
| - parameters.orderedForEachParameter((_element) {
|
| - ParameterElement element = _element;
|
| - String jsName = _namer.safeVariableName(element.name);
|
| + _codegenWorldBuilder.forEachParameter(member,
|
| + (_, String name, ConstantValue value) {
|
| + String jsName = _namer.safeVariableName(name);
|
| assert(jsName != receiverArgumentName);
|
| if (count < optionalParameterStart) {
|
| parametersBuffer[count] = new jsAst.Parameter(jsName);
|
| argumentsBuffer[count] = js('#', jsName);
|
| } else {
|
| - int index = names.indexOf(element.name);
|
| + int index = names.indexOf(name);
|
| if (index != -1) {
|
| indexOfLastOptionalArgumentInParameters = count;
|
| // The order of the named arguments is not the same as the
|
| @@ -138,7 +129,6 @@ class ParameterStubGenerator {
|
| parametersBuffer[optionalParameterStart + index] =
|
| new jsAst.Parameter(jsName);
|
| } else {
|
| - ConstantValue value = _constants.getConstantValue(element.constant);
|
| if (value == null) {
|
| argumentsBuffer[count] =
|
| _emitter.constantReference(new NullConstantValue());
|
| @@ -166,7 +156,7 @@ class ParameterStubGenerator {
|
| indexOfLastOptionalArgumentInParameters);
|
| } else if (member.isInstanceMember) {
|
| if (needsSuperGetter(member)) {
|
| - ClassElement superClass = member.enclosingClass;
|
| + ClassEntity superClass = member.enclosingClass;
|
| jsAst.Name methodName = _namer.instanceMethodName(member);
|
| // When redirecting, we must ensure that we don't end up in a subclass.
|
| // We thus can't just invoke `this.foo$1.call(filledInArguments)`.
|
|
|