X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/a253471d7f8e4d91bf6ebabab00155c3b387d3d0..93a3786624b2768d89bfa27e46598dc64e2fb70a:/runtime/JSVariableObject.h diff --git a/runtime/JSVariableObject.h b/runtime/JSVariableObject.h index bcfe4ab..615aa33 100644 --- a/runtime/JSVariableObject.h +++ b/runtime/JSVariableObject.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2007, 2008, 2012 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,146 +30,48 @@ #define JSVariableObject_h #include "JSObject.h" +#include "JSSymbolTableObject.h" #include "Register.h" #include "SymbolTable.h" -#include #include -#include namespace JSC { class LLIntOffsetsExtractor; class Register; - class JSVariableObject : public JSNonFinalObject { + class JSVariableObject : public JSSymbolTableObject { friend class JIT; friend class LLIntOffsetsExtractor; public: - typedef JSNonFinalObject Base; + typedef JSSymbolTableObject Base; - SymbolTable& symbolTable() const { return *m_symbolTable; } + WriteBarrierBase& registerAt(int index) const { return m_registers[index]; } - JS_EXPORT_PRIVATE static void destroy(JSCell*); - - static NO_RETURN_DUE_TO_ASSERT void putDirectVirtual(JSObject*, ExecState*, const Identifier&, JSValue, unsigned attributes); - - JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, const Identifier&); - JS_EXPORT_PRIVATE static void getOwnPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); - - bool isDynamicScope(bool& requiresDynamicChecks) const; - - WriteBarrier& registerAt(int index) const { return m_registers[index]; } - - WriteBarrier* const * addressOfRegisters() const { return &m_registers; } + WriteBarrierBase* const * addressOfRegisters() const { return &m_registers; } static size_t offsetOfRegisters() { return OBJECT_OFFSETOF(JSVariableObject, m_registers); } - static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype) - { - return Structure::create(globalData, globalObject, prototype, TypeInfo(VariableObjectType, StructureFlags), &s_info); - } - - protected: - static const unsigned StructureFlags = OverridesGetPropertyNames | JSNonFinalObject::StructureFlags; + static const ClassInfo s_info; - JSVariableObject(JSGlobalData& globalData, Structure* structure, SymbolTable* symbolTable, Register* registers) - : JSNonFinalObject(globalData, structure) - , m_symbolTable(symbolTable) - , m_registers(reinterpret_cast*>(registers)) - { - } - - void finishCreation(JSGlobalData& globalData) + protected: + static const unsigned StructureFlags = Base::StructureFlags; + + JSVariableObject( + VM& vm, + Structure* structure, + Register* registers, + JSScope* scope, + SharedSymbolTable* symbolTable = 0 + ) + : Base(vm, structure, scope, symbolTable) + , m_registers(reinterpret_cast*>(registers)) { - Base::finishCreation(globalData); - ASSERT(m_symbolTable); - COMPILE_ASSERT(sizeof(WriteBarrier) == sizeof(Register), Register_should_be_same_size_as_WriteBarrier); } - PassOwnArrayPtr > copyRegisterArray(JSGlobalData&, WriteBarrier* src, size_t count, size_t callframeStarts); - void setRegisters(WriteBarrier* registers, PassOwnArrayPtr > registerArray); - - bool symbolTableGet(const Identifier&, PropertySlot&); - JS_EXPORT_PRIVATE bool symbolTableGet(const Identifier&, PropertyDescriptor&); - bool symbolTableGet(const Identifier&, PropertySlot&, bool& slotIsWriteable); - bool symbolTablePut(ExecState*, const Identifier&, JSValue, bool shouldThrow); - bool symbolTablePutWithAttributes(JSGlobalData&, const Identifier&, JSValue, unsigned attributes); - - SymbolTable* m_symbolTable; // Maps name -> offset from "r" in register file. - WriteBarrier* m_registers; // "r" in the register file. - OwnArrayPtr > m_registerArray; // Independent copy of registers, used when a variable object copies its registers out of the register file. + WriteBarrierBase* m_registers; // "r" in the stack. }; - inline bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertySlot& slot) - { - SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); - if (!entry.isNull()) { - slot.setValue(registerAt(entry.getIndex()).get()); - return true; - } - return false; - } - - inline bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertySlot& slot, bool& slotIsWriteable) - { - SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); - if (!entry.isNull()) { - slot.setValue(registerAt(entry.getIndex()).get()); - slotIsWriteable = !entry.isReadOnly(); - return true; - } - return false; - } - - inline bool JSVariableObject::symbolTablePut(ExecState* exec, const Identifier& propertyName, JSValue value, bool shouldThrow) - { - JSGlobalData& globalData = exec->globalData(); - ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); - - SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); - if (entry.isNull()) - return false; - if (entry.isReadOnly()) { - if (shouldThrow) - throwTypeError(exec, StrictModeReadonlyPropertyWriteError); - return true; - } - registerAt(entry.getIndex()).set(globalData, this, value); - return true; - } - - inline bool JSVariableObject::symbolTablePutWithAttributes(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes) - { - ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); - - SymbolTable::iterator iter = symbolTable().find(propertyName.impl()); - if (iter == symbolTable().end()) - return false; - SymbolTableEntry& entry = iter->second; - ASSERT(!entry.isNull()); - entry.setAttributes(attributes); - registerAt(entry.getIndex()).set(globalData, this, value); - return true; - } - - inline PassOwnArrayPtr > JSVariableObject::copyRegisterArray(JSGlobalData& globalData, WriteBarrier* src, size_t count, size_t callframeStarts) - { - OwnArrayPtr > registerArray = adoptArrayPtr(new WriteBarrier[count]); - for (size_t i = 0; i < callframeStarts; i++) - registerArray[i].set(globalData, this, src[i].get()); - for (size_t i = callframeStarts + RegisterFile::CallFrameHeaderSize; i < count; i++) - registerArray[i].set(globalData, this, src[i].get()); - - return registerArray.release(); - } - - inline void JSVariableObject::setRegisters(WriteBarrier* registers, PassOwnArrayPtr > registerArray) - { - ASSERT(registerArray != m_registerArray); - m_registerArray = registerArray; - m_registers = registers; - } - } // namespace JSC #endif // JSVariableObject_h