#ifndef StructureIDBlob_h
#define StructureIDBlob_h
#include "IndexingType.h"
#include "JSTypeInfo.h"
#include "StructureIDTable.h"
namespace JSC {
class StructureIDBlob {
friend class LLIntOffsetsExtractor;
public:
StructureIDBlob()
{
u.doubleWord = 0xbbadbeef;
}
StructureIDBlob(StructureID structureID, IndexingType indexingType, const TypeInfo& typeInfo)
{
u.fields.structureID = structureID;
u.fields.indexingType = indexingType;
u.fields.type = typeInfo.type();
u.fields.inlineTypeFlags = typeInfo.inlineTypeFlags();
u.fields.defaultGCData = JSCell::NotMarked;
}
void operator=(const StructureIDBlob& other) { u.doubleWord = other.u.doubleWord; }
StructureID structureID() const { return u.fields.structureID; }
IndexingType indexingType() const { return u.fields.indexingType; }
void setIndexingType(IndexingType indexingType) { u.fields.indexingType = indexingType; }
JSType type() const { return u.fields.type; }
TypeInfo::InlineTypeFlags inlineTypeFlags() const { return u.fields.inlineTypeFlags; }
TypeInfo typeInfo(TypeInfo::OutOfLineTypeFlags outOfLineTypeFlags) const { return TypeInfo(type(), inlineTypeFlags(), outOfLineTypeFlags); }
int32_t blobExcludingStructureID() const { return u.words.word2; }
int64_t blob() const { return u.doubleWord; }
static ptrdiff_t structureIDOffset()
{
return OBJECT_OFFSETOF(StructureIDBlob, u.fields.structureID);
}
static ptrdiff_t indexingTypeOffset()
{
return OBJECT_OFFSETOF(StructureIDBlob, u.fields.indexingType);
}
private:
union {
struct {
StructureID structureID;
IndexingType indexingType;
JSType type;
TypeInfo::InlineTypeFlags inlineTypeFlags;
JSCell::GCData defaultGCData;
} fields;
struct {
int32_t word1;
int32_t word2;
} words;
int64_t doubleWord;
} u;
};
}
#endif // StructureIDBlob_h