5 #ifndef V8_RUNTIME_RUNTIME_UTILS_H_ 6 #define V8_RUNTIME_RUNTIME_UTILS_H_ 8 #include "src/base/logging.h" 9 #include "src/globals.h" 10 #include "src/runtime/runtime.h" 18 #define CONVERT_ARG_CHECKED(Type, name, index) \ 19 CHECK(args[index]->Is##Type()); \ 20 Type##ArgType name = Type::cast(args[index]); 22 #define CONVERT_ARG_HANDLE_CHECKED(Type, name, index) \ 23 CHECK(args[index]->Is##Type()); \ 24 Handle<Type> name = args.at<Type>(index); 26 #define CONVERT_NUMBER_ARG_HANDLE_CHECKED(name, index) \ 27 CHECK(args[index]->IsNumber()); \ 28 Handle<Object> name = args.at(index); 32 #define CONVERT_BOOLEAN_ARG_CHECKED(name, index) \ 33 CHECK(args[index]->IsBoolean()); \ 34 bool name = args[index]->IsTrue(isolate); 38 #define CONVERT_SMI_ARG_CHECKED(name, index) \ 39 CHECK(args[index]->IsSmi()); \ 40 int name = args.smi_at(index); 45 #define CONVERT_DOUBLE_ARG_CHECKED(name, index) \ 46 CHECK(args[index]->IsNumber()); \ 47 double name = args.number_at(index); 51 #define CONVERT_SIZE_ARG_CHECKED(name, index) \ 52 CHECK(args[index]->IsNumber()); \ 53 Handle<Object> name##_object = args.at(index); \ 55 CHECK(TryNumberToSize(*name##_object, &name)); 60 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ 61 CHECK(obj->IsNumber()); \ 62 type name = NumberTo##Type(obj); 66 #define CONVERT_PROPERTY_DETAILS_CHECKED(name, index) \ 67 CHECK(args[index]->IsSmi()); \ 68 PropertyDetails name = PropertyDetails(Smi::cast(args[index])); 72 #define CONVERT_LANGUAGE_MODE_ARG_CHECKED(name, index) \ 73 CHECK(args[index]->IsNumber()); \ 74 int32_t __tmp_##name = 0; \ 75 CHECK(args[index]->ToInt32(&__tmp_##name)); \ 76 CHECK(is_valid_language_mode(__tmp_##name)); \ 77 LanguageMode name = static_cast<LanguageMode>(__tmp_##name); 81 #define CONVERT_INT32_ARG_CHECKED(name, index) \ 82 CHECK(args[index]->IsNumber()); \ 84 CHECK(args[index]->ToInt32(&name)); 89 #define CONVERT_UINT32_ARG_CHECKED(name, index) \ 90 CHECK(args[index]->IsNumber()); \ 92 CHECK(args[index]->ToUint32(&name)); 97 #define CONVERT_PROPERTY_ATTRIBUTES_CHECKED(name, index) \ 98 CHECK(args[index]->IsSmi()); \ 99 CHECK_EQ(args.smi_at(index) & ~(READ_ONLY | DONT_ENUM | DONT_DELETE), 0); \ 100 PropertyAttributes name = static_cast<PropertyAttributes>(args.smi_at(index)); 110 #ifdef V8_HOST_ARCH_64_BIT 117 static inline ObjectPair MakePair(Object* x, Object* y) {
118 ObjectPair result = {x, y};
123 #elif V8_TARGET_ARCH_X64 && V8_TARGET_ARCH_32_BIT 135 static inline ObjectPair MakePair(Object* x, Object* y) {
136 ObjectPair result = {x, 0, y, 0};
141 typedef uint64_t ObjectPair;
142 static inline ObjectPair MakePair(Object* x, Object* y) {
143 #if defined(V8_TARGET_LITTLE_ENDIAN) 144 return reinterpret_cast<uint32_t>(x) |
145 (reinterpret_cast<ObjectPair>(y) << 32);
146 #elif defined(V8_TARGET_BIG_ENDIAN) 147 return reinterpret_cast<uint32_t>(y) |
148 (reinterpret_cast<ObjectPair>(x) << 32);
150 #error Unknown endianness 158 #endif // V8_RUNTIME_RUNTIME_UTILS_H_