1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_TYPE_HINTS_H_
6#define V8_TYPE_HINTS_H_
7
8#include "src/base/flags.h"
9#include "src/utils.h"
10
11namespace v8 {
12namespace internal {
13
14// Type hints for an binary operation.
15enum class BinaryOperationHint : uint8_t {
16  kNone,
17  kSignedSmall,
18  kSigned32,
19  kNumberOrOddball,
20  kString,
21  kAny
22};
23
24inline size_t hash_value(BinaryOperationHint hint) {
25  return static_cast<unsigned>(hint);
26}
27
28std::ostream& operator<<(std::ostream&, BinaryOperationHint);
29
30// Type hints for an compare operation.
31enum class CompareOperationHint : uint8_t {
32  kNone,
33  kSignedSmall,
34  kNumber,
35  kNumberOrOddball,
36  kInternalizedString,
37  kString,
38  kReceiver,
39  kAny
40};
41
42inline size_t hash_value(CompareOperationHint hint) {
43  return static_cast<unsigned>(hint);
44}
45
46std::ostream& operator<<(std::ostream&, CompareOperationHint);
47
48// Type hints for the ToBoolean type conversion.
49enum class ToBooleanHint : uint16_t {
50  kNone = 0u,
51  kUndefined = 1u << 0,
52  kBoolean = 1u << 1,
53  kNull = 1u << 2,
54  kSmallInteger = 1u << 3,
55  kReceiver = 1u << 4,
56  kString = 1u << 5,
57  kSymbol = 1u << 6,
58  kHeapNumber = 1u << 7,
59  kAny = kUndefined | kBoolean | kNull | kSmallInteger | kReceiver | kString |
60         kSymbol | kHeapNumber,
61  kNeedsMap = kReceiver | kString | kSymbol | kHeapNumber,
62  kCanBeUndetectable = kReceiver,
63};
64
65std::ostream& operator<<(std::ostream&, ToBooleanHint);
66std::string ToString(ToBooleanHint);
67
68typedef base::Flags<ToBooleanHint, uint16_t> ToBooleanHints;
69
70std::ostream& operator<<(std::ostream&, ToBooleanHints);
71std::string ToString(ToBooleanHints);
72
73DEFINE_OPERATORS_FOR_FLAGS(ToBooleanHints)
74
75enum StringAddFlags {
76  // Omit both parameter checks.
77  STRING_ADD_CHECK_NONE = 0,
78  // Check left parameter.
79  STRING_ADD_CHECK_LEFT = 1 << 0,
80  // Check right parameter.
81  STRING_ADD_CHECK_RIGHT = 1 << 1,
82  // Check both parameters.
83  STRING_ADD_CHECK_BOTH = STRING_ADD_CHECK_LEFT | STRING_ADD_CHECK_RIGHT,
84  // Convert parameters when check fails (instead of throwing an exception).
85  STRING_ADD_CONVERT = 1 << 2,
86  STRING_ADD_CONVERT_LEFT = STRING_ADD_CHECK_LEFT | STRING_ADD_CONVERT,
87  STRING_ADD_CONVERT_RIGHT = STRING_ADD_CHECK_RIGHT | STRING_ADD_CONVERT
88};
89
90std::ostream& operator<<(std::ostream& os, const StringAddFlags& flags);
91
92}  // namespace internal
93}  // namespace v8
94
95#endif  // V8_TYPE_HINTS_H_
96