|  | // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | /// Description of the exception behaviour of native code. | 
|  | enum NativeThrowBehavior { | 
|  | never, | 
|  | may, | 
|  |  | 
|  | /// Throws only if first argument is null. | 
|  | nullNsm, | 
|  |  | 
|  | /// Throws if first argument is null, then may throw. | 
|  | nullNsmThenMay; | 
|  |  | 
|  | bool get canThrow => this != never; | 
|  |  | 
|  | /// Does this behavior always throw a noSuchMethod check on a null first | 
|  | /// argument before any side effect or other exception? | 
|  | bool get isNullNSMGuard => this == nullNsm || this == nullNsmThenMay; | 
|  |  | 
|  | /// Does this behavior always act as a null noSuchMethod check, and has no | 
|  | /// other throwing behavior? | 
|  | bool get isOnlyNullNSMGuard => this == nullNsm; | 
|  |  | 
|  | /// Returns the behavior if we assume the first argument is not null. | 
|  | NativeThrowBehavior get onNonNull { | 
|  | if (this == nullNsm) return never; | 
|  | if (this == nullNsmThenMay) return may; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | @override | 
|  | String toString() { | 
|  | if (this == never) return 'never'; | 
|  | if (this == may) return 'may'; | 
|  | if (this == nullNsm) return 'null(1)'; | 
|  | if (this == nullNsmThenMay) return 'null(1)+may'; | 
|  | return 'NativeThrowBehavior($index)'; | 
|  | } | 
|  |  | 
|  | /// Sequence operator. | 
|  | NativeThrowBehavior then(NativeThrowBehavior second) { | 
|  | if (this == never) return second; | 
|  | if (this == may) return may; | 
|  | if (this == nullNsmThenMay) return nullNsmThenMay; | 
|  | assert(this == nullNsm); | 
|  | if (second == never) return this; | 
|  | return nullNsmThenMay; | 
|  | } | 
|  |  | 
|  | /// Choice operator. | 
|  | NativeThrowBehavior or(NativeThrowBehavior other) { | 
|  | if (this == other) return this; | 
|  | return may; | 
|  | } | 
|  | } |