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 part of dart._runtime; | 7 part of dart._runtime; |
8 | 8 |
9 _canonicalFieldName(obj, name, args, displayName) => JS('', '''(() => { | 9 _canonicalFieldName(obj, name, args, displayName) => JS('', '''(() => { |
10 $name = $canonicalMember($obj, $name); | 10 $name = $canonicalMember($obj, $name); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 // If strongInstanceOf returns null, convert to false here. | 239 // If strongInstanceOf returns null, convert to false here. |
240 if (($obj == null) || $strongInstanceOf($obj, $type, true)) return true; | 240 if (($obj == null) || $strongInstanceOf($obj, $type, true)) return true; |
241 return false; | 241 return false; |
242 })()'''); | 242 })()'''); |
243 | 243 |
244 @JSExportName('is') | 244 @JSExportName('is') |
245 instanceOf(obj, type) => JS('', '''(() => { | 245 instanceOf(obj, type) => JS('', '''(() => { |
246 let result = $strongInstanceOf($obj, $type); | 246 let result = $strongInstanceOf($obj, $type); |
247 if (result !== null) return result; | 247 if (result !== null) return result; |
248 let actual = $getReifiedType($obj); | 248 let actual = $getReifiedType($obj); |
249 $throwStrongModeError('Strong mode is check failure: ' + | 249 $throwStrongModeError('Strong mode is-check failure: ' + |
250 $typeName(actual) + ' does not soundly subtype ' + | 250 $typeName(actual) + ' does not soundly subtype ' + |
251 $typeName($type)); | 251 $typeName($type)); |
252 })()'''); | 252 })()'''); |
253 | 253 |
254 @JSExportName('as') | 254 @JSExportName('as') |
255 cast(obj, type) { | 255 cast(obj, type) { |
256 if (JS('bool', '# == #', type, dynamic) || obj == null) return obj; | 256 if (JS('bool', '# == #', type, dynamic) || obj == null) return obj; |
257 bool result = strongInstanceOf(obj, type, true); | 257 bool result = strongInstanceOf(obj, type, true); |
258 if (JS('bool', '#', result)) return obj; | 258 if (JS('bool', '#', result)) return obj; |
259 _throwCastError(obj, type, result); | 259 _throwCastError(obj, type, result); |
260 } | 260 } |
261 | 261 |
| 262 check(obj, type) { |
| 263 if (JS('bool', '# == #', type, dynamic) || obj == null) return obj; |
| 264 bool result = strongInstanceOf(obj, type, true); |
| 265 if (JS('bool', '#', result)) return obj; |
| 266 _throwTypeError(obj, type, result); |
| 267 } |
| 268 |
262 bool test(obj) { | 269 bool test(obj) { |
263 if (obj is bool) return obj; | 270 if (obj is bool) return obj; |
264 return booleanConversionFailed(obj); | 271 return booleanConversionFailed(obj); |
265 } | 272 } |
266 | 273 |
267 bool booleanConversionFailed(obj) { | 274 bool booleanConversionFailed(obj) { |
268 if (obj == null) { | 275 if (obj == null) { |
269 throw new BooleanConversionAssertionError(); | 276 throw new BooleanConversionAssertionError(); |
270 } | 277 } |
271 var actual = getReifiedType(obj); | 278 var actual = getReifiedType(obj); |
272 var expected = JS('', '#', bool); | 279 var expected = JS('', '#', bool); |
273 throw new TypeErrorImplementation.fromMessage( | 280 throw new TypeErrorImplementation.fromMessage( |
274 "type '${typeName(actual)}' is not a subtype of " | 281 "type '${typeName(actual)}' is not a subtype of " |
275 "type '${typeName(expected)}' in boolean expression"); | 282 "type '${typeName(expected)}' in boolean expression"); |
276 } | 283 } |
277 | 284 |
278 void _throwCastError(obj, type, bool result) { | 285 void _throwCastError(obj, type, bool result) { |
279 var actual = getReifiedType(obj); | 286 var actual = getReifiedType(obj); |
280 if (result == false) throwCastError(actual, type); | 287 if (result == false) throwCastError(obj, actual, type); |
281 | 288 |
282 throwStrongModeError('Strong mode cast failure from ' + | 289 throwStrongModeCastError(obj, actual, type); |
283 typeName(actual) + ' to ' + typeName(type)); | 290 } |
| 291 |
| 292 void _throwTypeError(obj, type, bool result) { |
| 293 var actual = getReifiedType(obj); |
| 294 if (result == false) throwTypeError(obj, actual, type); |
| 295 |
| 296 throwStrongModeTypeError(obj, actual, type); |
284 } | 297 } |
285 | 298 |
286 asInt(obj) { | 299 asInt(obj) { |
287 if (obj == null) return null; | 300 if (obj == null) return null; |
288 | 301 |
289 if (JS('bool', 'Math.floor(#) != #', obj, obj)) { | 302 if (JS('bool', 'Math.floor(#) != #', obj, obj)) { |
290 throwCastError(getReifiedType(obj), JS('', '#', int)); | 303 throwCastError(obj, getReifiedType(obj), JS('', '#', int)); |
291 } | 304 } |
292 return obj; | 305 return obj; |
293 } | 306 } |
294 | 307 |
295 equals(x, y) => JS('', '''(() => { | 308 equals(x, y) => JS('', '''(() => { |
296 if ($x == null || $y == null) return $x == $y; | 309 if ($x == null || $y == null) return $x == $y; |
297 let eq = $x['==']; | 310 let eq = $x['==']; |
298 return eq ? eq.call($x, $y) : $x === $y; | 311 return eq ? eq.call($x, $y) : $x === $y; |
299 })()'''); | 312 })()'''); |
300 | 313 |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 constructor(dartIterator) { | 600 constructor(dartIterator) { |
588 this.dartIterator = dartIterator; | 601 this.dartIterator = dartIterator; |
589 } | 602 } |
590 next() { | 603 next() { |
591 let i = this.dartIterator; | 604 let i = this.dartIterator; |
592 let done = !i.moveNext(); | 605 let done = !i.moveNext(); |
593 return { done: done, value: done ? void 0 : i.current }; | 606 return { done: done, value: done ? void 0 : i.current }; |
594 } | 607 } |
595 } | 608 } |
596 '''); | 609 '''); |
OLD | NEW |