#pragma once
#include "JSString.h"
#include "PrivateName.h"
namespace JSC {
class Symbol final : public JSCell {
public:
typedef JSCell Base;
static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal | OverridesToThis;
template<typename>
static CompleteSubspace* subspaceFor(VM& vm)
{
return &vm.cellJSValueOOBSpace;
}
DECLARE_EXPORT_INFO;
static const bool needsDestruction = true;
static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
{
return Structure::create(vm, globalObject, prototype, TypeInfo(SymbolType, StructureFlags), info());
}
static Symbol* create(VM&);
static Symbol* create(ExecState*, JSString* description);
JS_EXPORT_PRIVATE static Symbol* create(VM&, SymbolImpl& uid);
const PrivateName& privateName() const { return m_privateName; }
String descriptiveString() const;
String description() const;
JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
bool getPrimitiveNumber(ExecState*, double& number, JSValue&) const;
JSObject* toObject(ExecState*, JSGlobalObject*) const;
double toNumber(ExecState*) const;
static ptrdiff_t offsetOfSymbolImpl()
{
return OBJECT_OFFSETOF(Symbol, m_privateName);
}
protected:
static void destroy(JSCell*);
Symbol(VM&);
Symbol(VM&, const String&);
Symbol(VM&, SymbolImpl& uid);
void finishCreation(VM&);
PrivateName m_privateName;
};
Symbol* asSymbol(JSValue);
inline Symbol* asSymbol(JSValue value)
{
ASSERT(value.asCell()->isSymbol());
return jsCast<Symbol*>(value.asCell());
}
}