| // 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_ |