X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174:/runtime/JSVariableObject.cpp?ds=sidebyside diff --git a/runtime/JSVariableObject.cpp b/runtime/JSVariableObject.cpp index a36cefa..8ca6950 100644 --- a/runtime/JSVariableObject.cpp +++ b/runtime/JSVariableObject.cpp @@ -29,42 +29,70 @@ #include "config.h" #include "JSVariableObject.h" +#include "JSActivation.h" +#include "JSGlobalObject.h" +#include "JSStaticScopeObject.h" #include "PropertyNameArray.h" +#include "PropertyDescriptor.h" namespace JSC { -bool JSVariableObject::deleteProperty(ExecState* exec, const Identifier& propertyName) +void JSVariableObject::destroy(JSCell* cell) { - if (symbolTable().contains(propertyName.ustring().rep())) + jsCast(cell)->JSVariableObject::~JSVariableObject(); +} + +bool JSVariableObject::deleteProperty(JSCell* cell, ExecState* exec, const Identifier& propertyName) +{ + JSVariableObject* thisObject = jsCast(cell); + if (thisObject->symbolTable().contains(propertyName.impl())) return false; - return JSObject::deleteProperty(exec, propertyName); + return JSObject::deleteProperty(thisObject, exec, propertyName); } -void JSVariableObject::getPropertyNames(ExecState* exec, PropertyNameArray& propertyNames) +void JSVariableObject::getOwnPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) { - SymbolTable::const_iterator end = symbolTable().end(); - for (SymbolTable::const_iterator it = symbolTable().begin(); it != end; ++it) { - if (!(it->second.getAttributes() & DontEnum)) + JSVariableObject* thisObject = jsCast(object); + SymbolTable::const_iterator end = thisObject->symbolTable().end(); + for (SymbolTable::const_iterator it = thisObject->symbolTable().begin(); it != end; ++it) { + if (!(it->second.getAttributes() & DontEnum) || (mode == IncludeDontEnumProperties)) propertyNames.add(Identifier(exec, it->first.get())); } - JSObject::getPropertyNames(exec, propertyNames); + JSObject::getOwnPropertyNames(thisObject, exec, propertyNames, mode); } -bool JSVariableObject::getPropertyAttributes(ExecState* exec, const Identifier& propertyName, unsigned& attributes) const +bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertyDescriptor& descriptor) { - SymbolTableEntry entry = symbolTable().get(propertyName.ustring().rep()); + SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); if (!entry.isNull()) { - attributes = entry.getAttributes() | DontDelete; + descriptor.setDescriptor(registerAt(entry.getIndex()).get(), entry.getAttributes() | DontDelete); return true; } - return JSObject::getPropertyAttributes(exec, propertyName, attributes); + return false; +} + +void JSVariableObject::putDirectVirtual(JSObject*, ExecState*, const Identifier&, JSValue, unsigned) +{ + ASSERT_NOT_REACHED(); } -bool JSVariableObject::isVariableObject() const +bool JSVariableObject::isDynamicScope(bool& requiresDynamicChecks) const { - return true; + switch (structure()->typeInfo().type()) { + case GlobalObjectType: + return static_cast(this)->isDynamicScope(requiresDynamicChecks); + case ActivationObjectType: + return static_cast(this)->isDynamicScope(requiresDynamicChecks); + case StaticScopeObjectType: + return static_cast(this)->isDynamicScope(requiresDynamicChecks); + default: + ASSERT_NOT_REACHED(); + break; + } + + return false; } } // namespace JSC