JSSymbolTableObject.cpp [plain text]
#include "config.h"
#include "JSSymbolTableObject.h"
#include "JSCInlines.h"
#include "PropertyNameArray.h"
namespace JSC {
const ClassInfo JSSymbolTableObject::s_info = { "SymbolTableObject", &Base::s_info, nullptr, CREATE_METHOD_TABLE(JSSymbolTableObject) };
void JSSymbolTableObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSSymbolTableObject* thisObject = jsCast<JSSymbolTableObject*>(cell);
ASSERT_GC_OBJECT_INHERITS(thisObject, info());
Base::visitChildren(thisObject, visitor);
visitor.append(&thisObject->m_symbolTable);
}
bool JSSymbolTableObject::deleteProperty(JSCell* cell, ExecState* exec, PropertyName propertyName)
{
JSSymbolTableObject* thisObject = jsCast<JSSymbolTableObject*>(cell);
if (thisObject->symbolTable()->contains(propertyName.uid()))
return false;
return Base::deleteProperty(thisObject, exec, propertyName);
}
void JSSymbolTableObject::getOwnNonIndexPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode)
{
JSSymbolTableObject* thisObject = jsCast<JSSymbolTableObject*>(object);
{
ConcurrentJITLocker locker(thisObject->symbolTable()->m_lock);
SymbolTable::Map::iterator end = thisObject->symbolTable()->end(locker);
for (SymbolTable::Map::iterator it = thisObject->symbolTable()->begin(locker); it != end; ++it) {
if (!(it->value.getAttributes() & DontEnum) || mode.includeDontEnumProperties()) {
if (it->key->isSymbol() && !propertyNames.includeSymbolProperties())
continue;
propertyNames.add(Identifier::fromUid(exec, it->key.get()));
}
}
}
Base::getOwnNonIndexPropertyNames(thisObject, exec, propertyNames, mode);
}
}