| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 /* This library defines runtime operations on objects used by the code | 5 /* This library defines runtime operations on objects used by the code |
| 6 * generator. | 6 * generator. |
| 7 */ | 7 */ |
| 8 dart_library.library('dart/_operations', null, /* Imports */[ | 8 dart_library.library('dart/_operations', null, /* Imports */[ |
| 9 ], /* Lazy Imports */[ | 9 ], /* Lazy Imports */[ |
| 10 'dart/_utils', | 10 'dart/_utils', |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 } | 96 } |
| 97 return true; | 97 return true; |
| 98 } | 98 } |
| 99 | 99 |
| 100 function throwNoSuchMethod(obj, name, args, opt_func) { | 100 function throwNoSuchMethod(obj, name, args, opt_func) { |
| 101 if (obj === void 0) obj = opt_func; | 101 if (obj === void 0) obj = opt_func; |
| 102 errors.throwNoSuchMethod(obj, name, args); | 102 errors.throwNoSuchMethod(obj, name, args); |
| 103 } | 103 } |
| 104 | 104 |
| 105 function checkAndCall(f, ftype, obj, args, name) { | 105 function checkAndCall(f, ftype, obj, args, name) { |
| 106 let originalFunction = f; |
| 106 if (!(f instanceof Function)) { | 107 if (!(f instanceof Function)) { |
| 107 // We're not a function (and hence not a method either) | 108 // We're not a function (and hence not a method either) |
| 108 // Grab the `call` method if it's not a function. | 109 // Grab the `call` method if it's not a function. |
| 109 if (f != null) { | 110 if (f != null) { |
| 110 ftype = classes.getMethodType(f, 'call'); | 111 ftype = classes.getMethodType(f, 'call'); |
| 111 f = f.call; | 112 f = f.call; |
| 112 } | 113 } |
| 113 if (!(f instanceof Function)) { | 114 if (!(f instanceof Function)) { |
| 114 throwNoSuchMethod(obj, name, args); | 115 throwNoSuchMethod(obj, name, args, originalFunction); |
| 115 } | 116 } |
| 116 } | 117 } |
| 117 // If f is a function, but not a method (no method type) | 118 // If f is a function, but not a method (no method type) |
| 118 // then it should have been a function valued field, so | 119 // then it should have been a function valued field, so |
| 119 // get the type from the function. | 120 // get the type from the function. |
| 120 if (ftype === void 0) { | 121 if (ftype === void 0) { |
| 121 ftype = rtti.read(f); | 122 ftype = rtti.read(f); |
| 122 } | 123 } |
| 123 | 124 |
| 124 if (!ftype) { | 125 if (!ftype) { |
| 125 // TODO(leafp): Allow JS objects to go through? | 126 // TODO(leafp): Allow JS objects to go through? |
| 126 // This includes the DOM. | 127 // This includes the DOM. |
| 127 return f.apply(obj, args); | 128 return f.apply(obj, args); |
| 128 } | 129 } |
| 129 | 130 |
| 130 if (checkApply(ftype, args)) { | 131 if (checkApply(ftype, args)) { |
| 131 return f.apply(obj, args); | 132 return f.apply(obj, args); |
| 132 } | 133 } |
| 133 | 134 |
| 134 // TODO(leafp): throw a type error (rather than NSM) | 135 // TODO(leafp): throw a type error (rather than NSM) |
| 135 // if the arity matches but the types are wrong. | 136 // if the arity matches but the types are wrong. |
| 136 throwNoSuchMethod(obj, name, args, f); | 137 throwNoSuchMethod(obj, name, args, originalFunction); |
| 137 } | 138 } |
| 138 | 139 |
| 139 function dcall(f, ...args) { | 140 function dcall(f, ...args) { |
| 140 let ftype = rtti.read(f); | 141 let ftype = rtti.read(f); |
| 141 return checkAndCall(f, ftype, void 0, args, 'call'); | 142 return checkAndCall(f, ftype, void 0, args, 'call'); |
| 142 } | 143 } |
| 143 exports.dcall = dcall; | 144 exports.dcall = dcall; |
| 144 | 145 |
| 145 /** Shared code for dsend, dindex, and dsetindex. */ | 146 /** Shared code for dsend, dindex, and dsetindex. */ |
| 146 function callMethod(obj, name, args, displayName) { | 147 function callMethod(obj, name, args, displayName) { |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 next() { | 458 next() { |
| 458 let i = this.dartIterator; | 459 let i = this.dartIterator; |
| 459 let done = !i.moveNext(); | 460 let done = !i.moveNext(); |
| 460 return { done: done, value: done ? void 0 : i.current }; | 461 return { done: done, value: done ? void 0 : i.current }; |
| 461 } | 462 } |
| 462 } | 463 } |
| 463 exports.JsIterator = JsIterator; | 464 exports.JsIterator = JsIterator; |
| 464 | 465 |
| 465 | 466 |
| 466 }); | 467 }); |
| OLD | NEW |