// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_TYPE_HINTS_H_ #define V8_TYPE_HINTS_H_ #include "src/base/flags.h" #include "src/utils.h" namespace v8 { namespace internal { // Type hints for an binary operation. enum class BinaryOperationHint : uint8_t { kNone, kSignedSmall, kSigned32, kNumberOrOddball, kString, kAny }; inline size_t hash_value(BinaryOperationHint hint) { return static_cast(hint); } std::ostream& operator<<(std::ostream&, BinaryOperationHint); // Type hints for an compare operation. enum class CompareOperationHint : uint8_t { kNone, kSignedSmall, kNumber, kNumberOrOddball, kInternalizedString, kString, kReceiver, kAny }; inline size_t hash_value(CompareOperationHint hint) { return static_cast(hint); } std::ostream& operator<<(std::ostream&, CompareOperationHint); // Type hints for the ToBoolean type conversion. enum class ToBooleanHint : uint16_t { kNone = 0u, kUndefined = 1u << 0, kBoolean = 1u << 1, kNull = 1u << 2, kSmallInteger = 1u << 3, kReceiver = 1u << 4, kString = 1u << 5, kSymbol = 1u << 6, kHeapNumber = 1u << 7, kAny = kUndefined | kBoolean | kNull | kSmallInteger | kReceiver | kString | kSymbol | kHeapNumber, kNeedsMap = kReceiver | kString | kSymbol | kHeapNumber, kCanBeUndetectable = kReceiver, }; std::ostream& operator<<(std::ostream&, ToBooleanHint); std::string ToString(ToBooleanHint); typedef base::Flags ToBooleanHints; std::ostream& operator<<(std::ostream&, ToBooleanHints); std::string ToString(ToBooleanHints); DEFINE_OPERATORS_FOR_FLAGS(ToBooleanHints) enum StringAddFlags { // Omit both parameter checks. STRING_ADD_CHECK_NONE = 0, // Check left parameter. STRING_ADD_CHECK_LEFT = 1 << 0, // Check right parameter. STRING_ADD_CHECK_RIGHT = 1 << 1, // Check both parameters. STRING_ADD_CHECK_BOTH = STRING_ADD_CHECK_LEFT | STRING_ADD_CHECK_RIGHT, // Convert parameters when check fails (instead of throwing an exception). STRING_ADD_CONVERT = 1 << 2, STRING_ADD_CONVERT_LEFT = STRING_ADD_CHECK_LEFT | STRING_ADD_CONVERT, STRING_ADD_CONVERT_RIGHT = STRING_ADD_CHECK_RIGHT | STRING_ADD_CONVERT }; std::ostream& operator<<(std::ostream& os, const StringAddFlags& flags); } // namespace internal } // namespace v8 #endif // V8_TYPE_HINTS_H_