#pragma once
namespace JSC {
enum class GetByIdMode : uint8_t {
ProtoLoad = 0, Default = 1,
Unset = 2,
ArrayLength = 3,
};
struct GetByIdModeMetadataDefault {
StructureID structureID;
PropertyOffset cachedOffset;
unsigned padding1;
};
static_assert(sizeof(GetByIdModeMetadataDefault) == 12);
struct GetByIdModeMetadataUnset {
StructureID structureID;
unsigned padding1;
unsigned padding2;
};
static_assert(sizeof(GetByIdModeMetadataUnset) == 12);
struct GetByIdModeMetadataArrayLength {
ArrayProfile arrayProfile;
};
static_assert(sizeof(GetByIdModeMetadataArrayLength) == 12);
struct GetByIdModeMetadataProtoLoad {
StructureID structureID;
PropertyOffset cachedOffset;
JSObject* cachedSlot;
};
#if CPU(LITTLE_ENDIAN) && CPU(ADDRESS64)
static_assert(sizeof(GetByIdModeMetadataProtoLoad) == 16);
#endif
#if CPU(LITTLE_ENDIAN) && CPU(ADDRESS64)
union GetByIdModeMetadata {
GetByIdModeMetadata()
{
defaultMode.structureID = 0;
defaultMode.cachedOffset = 0;
defaultMode.padding1 = 0;
mode = GetByIdMode::Default;
hitCountForLLIntCaching = Options::prototypeHitCountForLLIntCaching();
}
void clearToDefaultModeWithoutCache();
void setUnsetMode(Structure*);
void setArrayLengthMode();
void setProtoLoadMode(Structure*, PropertyOffset, JSObject*);
struct {
uint32_t padding1;
uint32_t padding2;
uint32_t padding3;
uint16_t padding4;
GetByIdMode mode;
uint8_t hitCountForLLIntCaching; };
GetByIdModeMetadataDefault defaultMode;
GetByIdModeMetadataUnset unsetMode;
GetByIdModeMetadataArrayLength arrayLengthMode;
GetByIdModeMetadataProtoLoad protoLoadMode;
};
static_assert(sizeof(GetByIdModeMetadata) == 16);
#else
struct GetByIdModeMetadata {
GetByIdModeMetadata()
{
defaultMode.structureID = 0;
defaultMode.cachedOffset = 0;
defaultMode.padding1 = 0;
mode = GetByIdMode::Default;
hitCountForLLIntCaching = Options::prototypeHitCountForLLIntCaching();
}
void clearToDefaultModeWithoutCache();
void setUnsetMode(Structure*);
void setArrayLengthMode();
void setProtoLoadMode(Structure*, PropertyOffset, JSObject*);
union {
GetByIdModeMetadataDefault defaultMode;
GetByIdModeMetadataUnset unsetMode;
GetByIdModeMetadataArrayLength arrayLengthMode;
GetByIdModeMetadataProtoLoad protoLoadMode;
};
GetByIdMode mode;
uint8_t hitCountForLLIntCaching;
};
#endif
inline void GetByIdModeMetadata::clearToDefaultModeWithoutCache()
{
mode = GetByIdMode::Default;
defaultMode.structureID = 0;
defaultMode.cachedOffset = 0;
}
inline void GetByIdModeMetadata::setUnsetMode(Structure* structure)
{
mode = GetByIdMode::Unset;
unsetMode.structureID = structure->id();
}
inline void GetByIdModeMetadata::setArrayLengthMode()
{
mode = GetByIdMode::ArrayLength;
new (&arrayLengthMode.arrayProfile) ArrayProfile;
hitCountForLLIntCaching = 0;
}
inline void GetByIdModeMetadata::setProtoLoadMode(Structure* structure, PropertyOffset offset, JSObject* cachedSlot)
{
mode = GetByIdMode::ProtoLoad; protoLoadMode.structureID = structure->id();
protoLoadMode.cachedOffset = offset;
protoLoadMode.cachedSlot = cachedSlot;
ASSERT(mode == GetByIdMode::ProtoLoad);
ASSERT(!hitCountForLLIntCaching);
ASSERT(protoLoadMode.structureID == structure->id());
ASSERT(protoLoadMode.cachedOffset == offset);
ASSERT(protoLoadMode.cachedSlot == cachedSlot);
}
}