1// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
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.
4
5#ifndef RUNTIME_LIB_INVOCATION_MIRROR_H_
6#define RUNTIME_LIB_INVOCATION_MIRROR_H_
7
8#include "vm/allocation.h"
9
10namespace dart {
11
12class InvocationMirror : public AllStatic {
13 public:
14 // These enum correspond to the constants in invocation_mirror_patch.dart.
15 // It is used to communicate the reason for statically thrown
16 // NoSuchMethodErrors by the compiler.
17 enum Kind {
18 // Constants describing the invocation type.
19 // kField cannot be generated by regular invocation mirrors.
20 kMethod = 0,
21 kGetter = 1,
22 kSetter = 2,
23 kField = 3,
24 kLocalVar = 4,
25 kKindShift = 0,
26 kKindBits = 3,
27 kKindMask = (1 << kKindBits) - 1
28 };
29
30 enum Level {
31 // These values, except kDynamic and kSuper, are only used when throwing
32 // NoSuchMethodError for compile-time resolution failures.
33 kDynamic = 0,
34 kSuper = 1,
35 kStatic = 2,
36 kConstructor = 3,
37 kTopLevel = 4,
38 kLevelShift = kKindBits,
39 kLevelBits = 3,
40 kLevelMask = (1 << kLevelBits) - 1
41 };
42
43 static int EncodeType(Level level, Kind kind) {
44 return (level << kLevelShift) | kind;
45 }
46
47 static void DecodeType(int type, Level* level, Kind* kind) {
48 *level = static_cast<Level>(type >> kLevelShift);
49 *kind = static_cast<Kind>(type & kKindMask);
50 }
51};
52
53} // namespace dart
54
55#endif // RUNTIME_LIB_INVOCATION_MIRROR_H_
56