X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/4e4e5a6f2694187498445a6ac6f1634ce8141119..6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174:/runtime/JSStaticScopeObject.cpp?ds=inline diff --git a/runtime/JSStaticScopeObject.cpp b/runtime/JSStaticScopeObject.cpp index ad10218..f8942b5 100644 --- a/runtime/JSStaticScopeObject.cpp +++ b/runtime/JSStaticScopeObject.cpp @@ -27,51 +27,69 @@ #include "JSStaticScopeObject.h" -namespace JSC { +#include "Error.h" +namespace JSC { ASSERT_CLASS_FITS_IN_CELL(JSStaticScopeObject); -void JSStaticScopeObject::markChildren(MarkStack& markStack) +const ClassInfo JSStaticScopeObject::s_info = { "Object", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSStaticScopeObject) }; + +void JSStaticScopeObject::destroy(JSCell* cell) +{ + jsCast(cell)->JSStaticScopeObject::~JSStaticScopeObject(); +} + +void JSStaticScopeObject::visitChildren(JSCell* cell, SlotVisitor& visitor) { - JSVariableObject::markChildren(markStack); - markStack.append(d()->registerStore.jsValue()); + JSStaticScopeObject* thisObject = jsCast(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, &s_info); + COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); + ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren()); + JSVariableObject::visitChildren(thisObject, visitor); + visitor.append(&thisObject->m_registerStore); } -JSObject* JSStaticScopeObject::toThisObject(ExecState* exec) const +JSObject* JSStaticScopeObject::toThisObject(JSCell*, ExecState* exec) { return exec->globalThisValue(); } -void JSStaticScopeObject::put(ExecState*, const Identifier& propertyName, JSValue value, PutPropertySlot&) +void JSStaticScopeObject::put(JSCell* cell, ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) { - if (symbolTablePut(propertyName, value)) + JSStaticScopeObject* thisObject = jsCast(cell); + if (slot.isStrictMode()) { + // Double lookup in strict mode, but this only occurs when + // a) indirectly writing to an exception slot + // b) writing to a function expression name + // (a) is unlikely, and (b) is an error. + // Also with a single entry the symbol table lookup should simply be + // a pointer compare. + PropertySlot slot; + bool isWritable = true; + thisObject->symbolTableGet(propertyName, slot, isWritable); + if (!isWritable) { + throwError(exec, createTypeError(exec, StrictModeReadonlyPropertyWriteError)); + return; + } + } + if (thisObject->symbolTablePut(exec, propertyName, value, slot.isStrictMode())) return; ASSERT_NOT_REACHED(); } -void JSStaticScopeObject::putWithAttributes(ExecState*, const Identifier& propertyName, JSValue value, unsigned attributes) +void JSStaticScopeObject::putDirectVirtual(JSObject* object, ExecState* exec, const Identifier& propertyName, JSValue value, unsigned attributes) { - if (symbolTablePutWithAttributes(propertyName, value, attributes)) + JSStaticScopeObject* thisObject = jsCast(object); + if (thisObject->symbolTablePutWithAttributes(exec->globalData(), propertyName, value, attributes)) return; ASSERT_NOT_REACHED(); } -bool JSStaticScopeObject::isDynamicScope(bool&) const -{ - return false; -} - -JSStaticScopeObject::~JSStaticScopeObject() -{ - ASSERT(d()); - delete d(); -} - -inline bool JSStaticScopeObject::getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot& slot) +bool JSStaticScopeObject::getOwnPropertySlot(JSCell* cell, ExecState*, const Identifier& propertyName, PropertySlot& slot) { - return symbolTableGet(propertyName, slot); + return jsCast(cell)->symbolTableGet(propertyName, slot); } }