| // Copyright (c) 2013, 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. | 
 |  | 
 | #ifndef RUNTIME_LIB_INVOCATION_MIRROR_H_ | 
 | #define RUNTIME_LIB_INVOCATION_MIRROR_H_ | 
 |  | 
 | #include "vm/allocation.h" | 
 |  | 
 | namespace dart { | 
 |  | 
 | class InvocationMirror : public AllStatic { | 
 |  public: | 
 |   // These enum correspond to the constants in invocation_mirror_patch.dart. | 
 |   // It is used to communicate the reason for statically thrown | 
 |   // NoSuchMethodErrors by the compiler. | 
 |   enum Kind { | 
 |     // Constants describing the invocation type. | 
 |     // kField cannot be generated by regular invocation mirrors. | 
 |     kMethod = 0, | 
 |     kGetter = 1, | 
 |     kSetter = 2, | 
 |     kField = 3, | 
 |     kLocalVar = 4, | 
 |     kKindShift = 0, | 
 |     kKindBits = 3, | 
 |     kKindMask = (1 << kKindBits) - 1 | 
 |   }; | 
 |  | 
 |   enum Level { | 
 |     // These values, except kDynamic and kSuper, are only used when throwing | 
 |     // NoSuchMethodError for compile-time resolution failures. | 
 |     kDynamic = 0, | 
 |     kSuper = 1, | 
 |     kStatic = 2, | 
 |     kConstructor = 3, | 
 |     kTopLevel = 4, | 
 |     kLevelShift = kKindBits, | 
 |     kLevelBits = 3, | 
 |     kLevelMask = (1 << kLevelBits) - 1 | 
 |   }; | 
 |  | 
 |   static int EncodeType(Level level, Kind kind) { | 
 |     return (level << kLevelShift) | kind; | 
 |   } | 
 |  | 
 |   static void DecodeType(int type, Level* level, Kind* kind) { | 
 |     *level = static_cast<Level>(type >> kLevelShift); | 
 |     *kind = static_cast<Kind>(type & kKindMask); | 
 |   } | 
 | }; | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // RUNTIME_LIB_INVOCATION_MIRROR_H_ |