1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifndef V8_TYPE_HINTS_H_
6f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define V8_TYPE_HINTS_H_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/flags.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/utils.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Type hints for an binary operation.
15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochenum class BinaryOperationHint : uint8_t {
16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kNone,
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kSignedSmall,
18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kSigned32,
19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kNumberOrOddball,
20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kString,
21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kAny
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochinline size_t hash_value(BinaryOperationHint hint) {
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return static_cast<unsigned>(hint);
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstd::ostream& operator<<(std::ostream&, BinaryOperationHint);
29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Type hints for an compare operation.
31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochenum class CompareOperationHint : uint8_t {
32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kNone,
33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kSignedSmall,
34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kNumber,
35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kNumberOrOddball,
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  kInternalizedString,
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  kString,
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  kReceiver,
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  kAny
4013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch};
4113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochinline size_t hash_value(CompareOperationHint hint) {
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return static_cast<unsigned>(hint);
44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochstd::ostream& operator<<(std::ostream&, CompareOperationHint);
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Type hints for the ToBoolean type conversion.
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class ToBooleanHint : uint16_t {
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kNone = 0u,
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kUndefined = 1u << 0,
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kBoolean = 1u << 1,
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kNull = 1u << 2,
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kSmallInteger = 1u << 3,
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kReceiver = 1u << 4,
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kString = 1u << 5,
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kSymbol = 1u << 6,
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kHeapNumber = 1u << 7,
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  kAny = kUndefined | kBoolean | kNull | kSmallInteger | kReceiver | kString |
6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         kSymbol | kHeapNumber,
6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  kNeedsMap = kReceiver | kString | kSymbol | kHeapNumber,
62c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  kCanBeUndetectable = kReceiver,
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream&, ToBooleanHint);
6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstd::string ToString(ToBooleanHint);
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtypedef base::Flags<ToBooleanHint, uint16_t> ToBooleanHints;
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream&, ToBooleanHints);
7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstd::string ToString(ToBooleanHints);
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_OPERATORS_FOR_FLAGS(ToBooleanHints)
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
75c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochenum StringAddFlags {
76c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Omit both parameter checks.
77c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  STRING_ADD_CHECK_NONE = 0,
78c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Check left parameter.
79c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  STRING_ADD_CHECK_LEFT = 1 << 0,
80c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Check right parameter.
81c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  STRING_ADD_CHECK_RIGHT = 1 << 1,
82c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Check both parameters.
83c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  STRING_ADD_CHECK_BOTH = STRING_ADD_CHECK_LEFT | STRING_ADD_CHECK_RIGHT,
84c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Convert parameters when check fails (instead of throwing an exception).
85c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  STRING_ADD_CONVERT = 1 << 2,
86c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  STRING_ADD_CONVERT_LEFT = STRING_ADD_CHECK_LEFT | STRING_ADD_CONVERT,
87c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  STRING_ADD_CONVERT_RIGHT = STRING_ADD_CHECK_RIGHT | STRING_ADD_CONVERT
88c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch};
89c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
90c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstd::ostream& operator<<(std::ostream& os, const StringAddFlags& flags);
91c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
95f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif  // V8_TYPE_HINTS_H_
96