diff options
Diffstat (limited to 'js/src/vm/SharedStencil.h')
-rw-r--r-- | js/src/vm/SharedStencil.h | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/js/src/vm/SharedStencil.h b/js/src/vm/SharedStencil.h index 58666919dc..a402895bd6 100644 --- a/js/src/vm/SharedStencil.h +++ b/js/src/vm/SharedStencil.h @@ -789,7 +789,11 @@ using SharedImmutableScriptDataTable = SharedImmutableScriptData::Hasher, SystemAllocPolicy>; struct MemberInitializers { +#ifdef ENABLE_DECORATORS + static constexpr size_t NumBits = 30; +#else static constexpr size_t NumBits = 31; +#endif static constexpr uint32_t MaxInitializers = BitMask(NumBits); #ifdef DEBUG @@ -798,20 +802,37 @@ struct MemberInitializers { bool hasPrivateBrand : 1; +#ifdef ENABLE_DECORATORS + bool hasDecorators : 1; +#endif + // This struct will eventually have a vector of constant values for optimizing // field initializers. uint32_t numMemberInitializers : NumBits; - MemberInitializers(bool hasPrivateBrand, uint32_t numMemberInitializers) + MemberInitializers(bool hasPrivateBrand, +#ifdef ENABLE_DECORATORS + bool hasDecorators, +#endif + uint32_t numMemberInitializers) : #ifdef DEBUG valid(true), #endif hasPrivateBrand(hasPrivateBrand), +#ifdef ENABLE_DECORATORS + hasDecorators(hasDecorators), +#endif numMemberInitializers(numMemberInitializers) { +#ifdef ENABLE_DECORATORS + MOZ_ASSERT( + this->numMemberInitializers == numMemberInitializers, + "numMemberInitializers should easily fit in the 30-bit bitfield"); +#else MOZ_ASSERT( this->numMemberInitializers == numMemberInitializers, "numMemberInitializers should easily fit in the 31-bit bitfield"); +#endif } static MemberInitializers Invalid() { return MemberInitializers(); } @@ -820,17 +841,33 @@ struct MemberInitializers { // fields. This is used when we elide the trivial data but still need a valid // set to stop scope walking. static const MemberInitializers& Empty() { - static const MemberInitializers zeroInitializers(false, 0); + static const MemberInitializers zeroInitializers(false, +#ifdef ENABLE_DECORATORS + false, +#endif + 0); return zeroInitializers; } uint32_t serialize() const { +#ifdef ENABLE_DECORATORS + auto serialised = (hasPrivateBrand << (NumBits + 1)) | + hasDecorators << NumBits | numMemberInitializers; + return serialised; +#else return (hasPrivateBrand << NumBits) | numMemberInitializers; +#endif } static MemberInitializers deserialize(uint32_t bits) { +#ifdef ENABLE_DECORATORS + return MemberInitializers((bits & Bit(NumBits + 1)) != 0, + (bits & Bit(NumBits)) != 0, + bits & BitMask(NumBits)); +#else return MemberInitializers((bits & Bit(NumBits)) != 0, bits & BitMask(NumBits)); +#endif } private: @@ -840,6 +877,9 @@ struct MemberInitializers { valid(false), #endif hasPrivateBrand(false), +#ifdef ENABLE_DECORATORS + hasDecorators(false), +#endif numMemberInitializers(0) { } }; |