mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-22 16:37:31 +09:00
Bug 1411415.
This commit is contained in:
parent
8ffcc15d3f
commit
66bf4fa8f9
10 changed files with 91 additions and 33 deletions
|
|
@ -140,12 +140,16 @@ static_assert(sizeof(JSValueShiftedTag) == sizeof(uint64_t),
|
|||
|
||||
#define JSVAL_TYPE_TO_TAG(type) ((JSValueTag)(JSVAL_TAG_CLEAR | (type)))
|
||||
|
||||
#define JSVAL_RAW64_UNDEFINED (uint64_t(JSVAL_TAG_UNDEFINED) << 32)
|
||||
|
||||
#define JSVAL_UPPER_EXCL_TAG_OF_PRIMITIVE_SET JSVAL_TAG_OBJECT
|
||||
#define JSVAL_UPPER_INCL_TAG_OF_NUMBER_SET JSVAL_TAG_INT32
|
||||
#define JSVAL_LOWER_INCL_TAG_OF_GCTHING_SET JSVAL_TAG_STRING
|
||||
|
||||
#elif defined(JS_PUNBOX64)
|
||||
|
||||
#define JSVAL_RAW64_UNDEFINED (uint64_t(JSVAL_TAG_UNDEFINED) << JSVAL_TAG_SHIFT)
|
||||
|
||||
#define JSVAL_PAYLOAD_MASK 0x00007FFFFFFFFFFFLL
|
||||
#define JSVAL_TAG_MASK 0xFFFF800000000000LL
|
||||
#define JSVAL_TYPE_TO_TAG(type) ((JSValueTag)(JSVAL_TAG_MAX_DOUBLE | (type)))
|
||||
|
|
@ -817,7 +821,7 @@ class MOZ_NON_PARAM alignas(8) Value
|
|||
double asDouble;
|
||||
void* asPtr;
|
||||
|
||||
layout() = default;
|
||||
layout() : asBits(JSVAL_RAW64_UNDEFINED) {}
|
||||
explicit constexpr layout(uint64_t bits) : asBits(bits) {}
|
||||
explicit constexpr layout(double d) : asDouble(d) {}
|
||||
} data;
|
||||
|
|
@ -843,7 +847,7 @@ class MOZ_NON_PARAM alignas(8) Value
|
|||
size_t asWord;
|
||||
uintptr_t asUIntPtr;
|
||||
|
||||
layout() = default;
|
||||
layout() : asBits(JSVAL_RAW64_UNDEFINED) {}
|
||||
explicit constexpr layout(uint64_t bits) : asBits(bits) {}
|
||||
explicit constexpr layout(double d) : asDouble(d) {}
|
||||
} data;
|
||||
|
|
@ -871,7 +875,7 @@ class MOZ_NON_PARAM alignas(8) Value
|
|||
double asDouble;
|
||||
void* asPtr;
|
||||
|
||||
layout() = default;
|
||||
layout() : asBits(JSVAL_RAW64_UNDEFINED) {}
|
||||
explicit constexpr layout(uint64_t bits) : asBits(bits) {}
|
||||
explicit constexpr layout(double d) : asDouble(d) {}
|
||||
} data;
|
||||
|
|
@ -895,7 +899,7 @@ class MOZ_NON_PARAM alignas(8) Value
|
|||
size_t asWord;
|
||||
uintptr_t asUIntPtr;
|
||||
|
||||
layout() = default;
|
||||
layout() : asBits(JSVAL_RAW64_UNDEFINED) {}
|
||||
explicit constexpr layout(uint64_t bits) : asBits(bits) {}
|
||||
explicit constexpr layout(double d) : asDouble(d) {}
|
||||
} data;
|
||||
|
|
@ -948,8 +952,51 @@ class MOZ_NON_PARAM alignas(8) Value
|
|||
}
|
||||
} JS_HAZ_GC_POINTER;
|
||||
|
||||
/**
|
||||
* This is a null-constructible structure that can convert to and from
|
||||
* a Value, allowing UninitializedValue to be stored in unions.
|
||||
*/
|
||||
struct MOZ_NON_PARAM alignas(8) UninitializedValue
|
||||
{
|
||||
private:
|
||||
uint64_t bits;
|
||||
|
||||
public:
|
||||
UninitializedValue() = default;
|
||||
UninitializedValue(const UninitializedValue&) = default;
|
||||
MOZ_IMPLICIT UninitializedValue(const Value& val) : bits(val.asRawBits()) {}
|
||||
|
||||
inline uint64_t asRawBits() const {
|
||||
return bits;
|
||||
}
|
||||
|
||||
inline Value& asValueRef() {
|
||||
return *reinterpret_cast<Value*>(this);
|
||||
}
|
||||
inline const Value& asValueRef() const {
|
||||
return *reinterpret_cast<const Value*>(this);
|
||||
}
|
||||
|
||||
inline operator Value&() {
|
||||
return asValueRef();
|
||||
}
|
||||
inline operator Value const&() const {
|
||||
return asValueRef();
|
||||
}
|
||||
inline operator Value() const {
|
||||
return asValueRef();
|
||||
}
|
||||
|
||||
inline void operator=(Value const& other) {
|
||||
asValueRef() = other;
|
||||
}
|
||||
};
|
||||
|
||||
static_assert(sizeof(Value) == 8, "Value size must leave three tag bits, be a binary power, and is ubiquitously depended upon everywhere");
|
||||
|
||||
static_assert(sizeof(UninitializedValue) == sizeof(Value), "Value and UninitializedValue must be the same size");
|
||||
static_assert(alignof(UninitializedValue) == alignof(Value), "Value and UninitializedValue must have same alignment");
|
||||
|
||||
inline bool
|
||||
IsOptimizedPlaceholderMagicValue(const Value& v)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue