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