Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library dart2js.js_emitter.program_builder; | 5 library dart2js.js_emitter.program_builder; |
| 6 | 6 |
| 7 import '../js_emitter.dart' show | 7 import '../js_emitter.dart' show |
| 8 ClassStubGenerator, | 8 ClassStubGenerator, |
| 9 CodeEmitterTask, | 9 CodeEmitterTask, |
| 10 computeMixinClass, | 10 computeMixinClass, |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 Names, | 23 Names, |
| 24 Selectors; | 24 Selectors; |
| 25 import '../../compiler.dart' show | 25 import '../../compiler.dart' show |
| 26 Compiler; | 26 Compiler; |
| 27 import '../../constants/values.dart' show | 27 import '../../constants/values.dart' show |
| 28 ConstantValue, | 28 ConstantValue, |
| 29 InterceptorConstantValue; | 29 InterceptorConstantValue; |
| 30 import '../../core_types.dart' show | 30 import '../../core_types.dart' show |
| 31 CoreClasses; | 31 CoreClasses; |
| 32 import '../../dart_types.dart' show | 32 import '../../dart_types.dart' show |
| 33 DartType; | 33 DartType, |
| 34 FunctionType, | |
| 35 TypedefType; | |
| 34 import '../../elements/elements.dart' show | 36 import '../../elements/elements.dart' show |
| 35 ClassElement, | 37 ClassElement, |
| 36 Element, | 38 Element, |
| 37 Elements, | 39 Elements, |
| 38 FieldElement, | 40 FieldElement, |
| 39 FunctionElement, | 41 FunctionElement, |
| 40 FunctionSignature, | 42 FunctionSignature, |
| 43 GetterElement, | |
| 41 LibraryElement, | 44 LibraryElement, |
| 42 MethodElement, | 45 MethodElement, |
| 43 Name, | 46 Name, |
| 44 ParameterElement, | 47 ParameterElement, |
| 45 TypedefElement, | 48 TypedefElement, |
| 46 VariableElement; | 49 VariableElement; |
| 47 import '../../js/js.dart' as js; | 50 import '../../js/js.dart' as js; |
| 48 import '../../js_backend/backend_helpers.dart' show | 51 import '../../js_backend/backend_helpers.dart' show |
| 49 BackendHelpers; | 52 BackendHelpers; |
| 50 import '../../js_backend/js_backend.dart' show | 53 import '../../js_backend/js_backend.dart' show |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 if (stubNames.add(stubName.key)) { | 403 if (stubNames.add(stubName.key)) { |
| 401 interceptorClass.callStubs.add(_buildStubMethod( | 404 interceptorClass.callStubs.add(_buildStubMethod( |
| 402 stubName, | 405 stubName, |
| 403 js.js('function(obj, v) { return obj.# = v }', | 406 js.js('function(obj, v) { return obj.# = v }', |
| 404 [member.name]), | 407 [member.name]), |
| 405 element: member)); | 408 element: member)); |
| 406 } | 409 } |
| 407 } | 410 } |
| 408 } | 411 } |
| 409 | 412 |
| 413 bool isFunctionLike = false; | |
| 414 FunctionType functionType; | |
| 415 | |
| 410 if (member.isFunction) { | 416 if (member.isFunction) { |
| 417 FunctionElement fn = member; | |
| 418 functionType = fn.type; | |
| 419 } else if (member.isGetter) { | |
|
Siggi Cherem (dart-lang)
2015/10/30 20:14:57
minor nit - up to you: if you only care about Gett
Jacob
2015/10/30 22:31:53
Acknowledged.
| |
| 420 if (_compiler.trustTypeAnnotations) { | |
| 421 GetterElement getter = member; | |
| 422 DartType returnType = getter.type.returnType; | |
| 423 if (returnType.isFunctionType) { | |
| 424 functionType = returnType; | |
| 425 } else if (_compiler.types.isSubtype(returnType, | |
| 426 backend.coreTypes.functionType) || | |
| 427 returnType.treatAsDynamic) { | |
| 428 if (returnType.isTypedef) { | |
| 429 TypedefType typedef = returnType; | |
| 430 functionType = typedef.element.functionSignature.type; | |
|
Siggi Cherem (dart-lang)
2015/10/30 20:14:57
actually, I think here you can do `typedef.unalias
| |
| 431 } else { | |
| 432 // Other misc function type such as coreTypes.Function. | |
| 433 // Allow any number of arguments. | |
| 434 isFunctionLike = true; | |
| 435 } | |
| 436 } | |
| 437 } else { | |
| 438 isFunctionLike = true; | |
| 439 } | |
| 440 } // TODO(jacobr): handle field elements. | |
| 441 | |
| 442 if (isFunctionLike || functionType != null) { | |
| 443 int minArgs; | |
| 444 int maxArgs; | |
| 445 if (functionType != null) { | |
| 446 minArgs = functionType.parameterTypes.length; | |
| 447 maxArgs = minArgs + functionType.optionalParameterTypes.length; | |
| 448 } else { | |
| 449 minArgs = 0; | |
| 450 maxArgs = 32767; | |
| 451 } | |
| 411 var selectors = | 452 var selectors = |
| 412 _compiler.codegenWorld.invocationsByName(member.name); | 453 _compiler.codegenWorld.invocationsByName(member.name); |
| 413 FunctionElement fn = member; | 454 FunctionElement fn = member; |
| 414 // Named arguments are not yet supported. In the future we | 455 // Named arguments are not yet supported. In the future we |
| 415 // may want to map named arguments to an object literal containing | 456 // may want to map named arguments to an object literal containing |
| 416 // all named arguments. | 457 // all named arguments. |
| 417 if (selectors != null && !selectors.isEmpty) { | 458 if (selectors != null && !selectors.isEmpty) { |
| 418 for (var selector in selectors.keys) { | 459 for (var selector in selectors.keys) { |
| 419 // Check whether the arity matches this member. | 460 // Check whether the arity matches this member. |
| 420 var argumentCount = selector.argumentCount; | 461 var argumentCount = selector.argumentCount; |
| 421 if (argumentCount > fn.parameters.length) break; | 462 // JS interop does not support named arguments. |
| 422 if (argumentCount < fn.parameters.length && | 463 if (selector.namedArgumentCount > 0) break; |
| 423 !fn.parameters[argumentCount].isOptional) break; | 464 if (argumentCount < minArgs) break; |
| 465 if (argumentCount > maxArgs) break; | |
| 424 var stubName = namer.invocationName(selector); | 466 var stubName = namer.invocationName(selector); |
| 425 if (!stubNames.add(stubName.key)) break; | 467 if (!stubNames.add(stubName.key)) break; |
| 426 var candidateParameterNames = | |
| 427 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMOPQRSTUVWXYZ'; | |
| 428 var parameters = new List<String>.generate(argumentCount, | 468 var parameters = new List<String>.generate(argumentCount, |
| 429 (i) => candidateParameterNames[i]); | 469 (i) => 'p$i'); |
| 430 | 470 |
| 431 interceptorClass.callStubs.add(_buildStubMethod( | 471 interceptorClass.callStubs.add(_buildStubMethod( |
| 432 stubName, | 472 stubName, |
| 433 js.js('function(receiver, #) { return receiver.#(#) }', | 473 js.js('function(receiver, #) { return receiver.#(#) }', |
| 434 [parameters, member.name, parameters]), | 474 [parameters, member.name, parameters]), |
| 435 element: member)); | 475 element: member)); |
| 436 } | 476 } |
| 437 } | 477 } |
| 438 } | 478 } |
| 439 }); | 479 }); |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 964 Constant constant = new Constant(name, holder, constantValue); | 1004 Constant constant = new Constant(name, holder, constantValue); |
| 965 _constants[constantValue] = constant; | 1005 _constants[constantValue] = constant; |
| 966 } | 1006 } |
| 967 } | 1007 } |
| 968 | 1008 |
| 969 Holder _registerStaticStateHolder() { | 1009 Holder _registerStaticStateHolder() { |
| 970 return _registry.registerHolder( | 1010 return _registry.registerHolder( |
| 971 namer.staticStateHolder, isStaticStateHolder: true); | 1011 namer.staticStateHolder, isStaticStateHolder: true); |
| 972 } | 1012 } |
| 973 } | 1013 } |
| OLD | NEW |