#ifndef JSTypeInfo_h
#define JSTypeInfo_h
#include "JSType.h"
namespace JSC {
static const unsigned MasqueradesAsUndefined = 1; static const unsigned ImplementsHasInstance = 1 << 1;
static const unsigned OverridesHasInstance = 1 << 2;
static const unsigned ImplementsDefaultHasInstance = 1 << 3;
static const unsigned IsEnvironmentRecord = 1 << 4;
static const unsigned OverridesGetOwnPropertySlot = 1 << 5;
static const unsigned OverridesVisitChildren = 1 << 6;
static const unsigned OverridesGetPropertyNames = 1 << 7;
static const unsigned ProhibitsPropertyCaching = 1 << 8;
class TypeInfo {
public:
TypeInfo(JSType type, unsigned flags = 0)
: m_type(type)
, m_flags(flags & 0xff)
, m_flags2(flags >> 8)
{
ASSERT(flags <= 0x3ff);
ASSERT(type <= 0xff);
ASSERT(type >= CompoundType || !(flags & OverridesVisitChildren));
ASSERT((m_flags & (ImplementsHasInstance | OverridesHasInstance)) != OverridesHasInstance);
if ((m_flags & (ImplementsHasInstance | OverridesHasInstance)) == ImplementsHasInstance)
m_flags |= ImplementsDefaultHasInstance;
}
JSType type() const { return static_cast<JSType>(m_type); }
bool isObject() const { return type() >= ObjectType; }
bool isFinalObject() const { return type() == FinalObjectType; }
bool isNumberObject() const { return type() == NumberObjectType; }
bool masqueradesAsUndefined() const { return isSetOnFlags1(MasqueradesAsUndefined); }
bool implementsHasInstance() const { return isSetOnFlags1(ImplementsHasInstance); }
bool isEnvironmentRecord() const { return isSetOnFlags1(IsEnvironmentRecord); }
bool overridesHasInstance() const { return isSetOnFlags1(OverridesHasInstance); }
bool implementsDefaultHasInstance() const { return isSetOnFlags1(ImplementsDefaultHasInstance); }
bool overridesGetOwnPropertySlot() const { return isSetOnFlags1(OverridesGetOwnPropertySlot); }
bool overridesVisitChildren() const { return isSetOnFlags1(OverridesVisitChildren); }
bool overridesGetPropertyNames() const { return isSetOnFlags1(OverridesGetPropertyNames); }
bool prohibitsPropertyCaching() const { return isSetOnFlags2(ProhibitsPropertyCaching); }
static ptrdiff_t flagsOffset()
{
return OBJECT_OFFSETOF(TypeInfo, m_flags);
}
static ptrdiff_t typeOffset()
{
return OBJECT_OFFSETOF(TypeInfo, m_type);
}
private:
bool isSetOnFlags1(unsigned flag) const { ASSERT(flag <= (1 << 7)); return m_flags & flag; }
bool isSetOnFlags2(unsigned flag) const { ASSERT(flag >= (1 << 8)); return m_flags2 & (flag >> 8); }
unsigned char m_type;
unsigned char m_flags;
unsigned char m_flags2;
};
}
#endif // JSTypeInfo_h