1#ifndef JSDestructibleObject_h 2#define JSDestructibleObject_h 3 4#include "JSObject.h" 5 6namespace JSC { 7 8struct ClassInfo; 9 10class JSDestructibleObject : public JSNonFinalObject { 11public: 12 typedef JSNonFinalObject Base; 13 14 static const bool needsDestruction = true; 15 16 const ClassInfo* classInfo() const { return m_classInfo; } 17 18 static ptrdiff_t classInfoOffset() { return OBJECT_OFFSETOF(JSDestructibleObject, m_classInfo); } 19 20protected: 21 JSDestructibleObject(VM& vm, Structure* structure, Butterfly* butterfly = 0) 22 : JSNonFinalObject(vm, structure, butterfly) 23 , m_classInfo(structure->classInfo()) 24 { 25 ASSERT(m_classInfo); 26 } 27 28private: 29 const ClassInfo* m_classInfo; 30}; 31 32inline const ClassInfo* JSCell::classInfo() const 33{ 34 MarkedBlock* block = MarkedBlock::blockFor(this); 35 if (block->destructorType() == MarkedBlock::Normal) 36 return static_cast<const JSDestructibleObject*>(this)->classInfo(); 37 return structure(*block->vm())->classInfo(); 38} 39 40} // namespace JSC 41 42#endif 43