WeakSetPrototype.cpp [plain text]
#include "config.h"
#include "WeakSetPrototype.h"
#include "JSCJSValueInlines.h"
#include "JSWeakSet.h"
#include "StructureInlines.h"
#include "WeakMapData.h"
namespace JSC {
const ClassInfo WeakSetPrototype::s_info = { "WeakSet", &Base::s_info, 0, CREATE_METHOD_TABLE(WeakSetPrototype) };
static EncodedJSValue JSC_HOST_CALL protoFuncWeakSetDelete(ExecState*);
static EncodedJSValue JSC_HOST_CALL protoFuncWeakSetHas(ExecState*);
static EncodedJSValue JSC_HOST_CALL protoFuncWeakSetAdd(ExecState*);
void WeakSetPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject)
{
Base::finishCreation(vm);
ASSERT(inherits(info()));
vm.prototypeMap.addPrototype(this);
JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames->deleteKeyword, protoFuncWeakSetDelete, DontEnum, 1);
JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames->has, protoFuncWeakSetHas, DontEnum, 1);
JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION(vm.propertyNames->add, protoFuncWeakSetAdd, DontEnum, 1);
putDirectWithoutTransition(vm, vm.propertyNames->toStringTagSymbol, jsString(&vm, "WeakSet"), DontEnum | ReadOnly);
}
static WeakMapData* getWeakMapData(CallFrame* callFrame, JSValue value)
{
if (!value.isObject()) {
throwTypeError(callFrame, WTF::ASCIILiteral("Called WeakSet function on non-object"));
return nullptr;
}
if (JSWeakSet* weakSet = jsDynamicCast<JSWeakSet*>(value))
return weakSet->weakMapData();
throwTypeError(callFrame, WTF::ASCIILiteral("Called WeakSet function on a non-WeakSet object"));
return nullptr;
}
EncodedJSValue JSC_HOST_CALL protoFuncWeakSetDelete(CallFrame* callFrame)
{
WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
if (!map)
return JSValue::encode(jsUndefined());
JSValue key = callFrame->argument(0);
return JSValue::encode(jsBoolean(key.isObject() && map->remove(asObject(key))));
}
EncodedJSValue JSC_HOST_CALL protoFuncWeakSetHas(CallFrame* callFrame)
{
WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
if (!map)
return JSValue::encode(jsUndefined());
JSValue key = callFrame->argument(0);
return JSValue::encode(jsBoolean(key.isObject() && map->contains(asObject(key))));
}
EncodedJSValue JSC_HOST_CALL protoFuncWeakSetAdd(CallFrame* callFrame)
{
WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
if (!map)
return JSValue::encode(jsUndefined());
JSValue key = callFrame->argument(0);
if (!key.isObject())
return JSValue::encode(throwTypeError(callFrame, WTF::ASCIILiteral("Attempted to add a non-object key to a WeakSet")));
map->set(callFrame->vm(), asObject(key), jsUndefined());
return JSValue::encode(callFrame->thisValue());
}
}