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