X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/ba379fdc102753d6be2c4d937058fe40257329fe..93a3786624b2768d89bfa27e46598dc64e2fb70a:/runtime/JSVariableObject.h diff --git a/runtime/JSVariableObject.h b/runtime/JSVariableObject.h index b969da5..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,135 +30,48 @@ #define JSVariableObject_h #include "JSObject.h" +#include "JSSymbolTableObject.h" #include "Register.h" #include "SymbolTable.h" -#include "UnusedParam.h" #include -#include namespace JSC { + class LLIntOffsetsExtractor; class Register; - class JSVariableObject : public JSObject { + class JSVariableObject : public JSSymbolTableObject { friend class JIT; + friend class LLIntOffsetsExtractor; public: - SymbolTable& symbolTable() const { return *d->symbolTable; } + typedef JSSymbolTableObject Base; - virtual void putWithAttributes(ExecState*, const Identifier&, JSValue, unsigned attributes) = 0; + WriteBarrierBase& registerAt(int index) const { return m_registers[index]; } - virtual bool deleteProperty(ExecState*, const Identifier&); - virtual void getPropertyNames(ExecState*, PropertyNameArray&); - - virtual bool isVariableObject() const; - virtual bool isDynamicScope() const = 0; + WriteBarrierBase* const * addressOfRegisters() const { return &m_registers; } + static size_t offsetOfRegisters() { return OBJECT_OFFSETOF(JSVariableObject, m_registers); } - virtual bool getPropertyAttributes(ExecState*, const Identifier& propertyName, unsigned& attributes) const; - - Register& registerAt(int index) const { return d->registers[index]; } + static const ClassInfo s_info; protected: - // Subclasses of JSVariableObject can subclass this struct to add data - // without increasing their own size (since there's a hard limit on the - // size of a JSCell). - struct JSVariableObjectData { - JSVariableObjectData(SymbolTable* symbolTable, Register* registers) - : symbolTable(symbolTable) - , registers(registers) - { - ASSERT(symbolTable); - } - - SymbolTable* symbolTable; // Maps name -> offset from "r" in register file. - Register* registers; // "r" in the register file. - OwnArrayPtr registerArray; // Independent copy of registers, used when a variable object copies its registers out of the register file. - - private: - JSVariableObjectData(const JSVariableObjectData&); - JSVariableObjectData& operator=(const JSVariableObjectData&); - }; - - JSVariableObject(PassRefPtr structure, JSVariableObjectData* data) - : JSObject(structure) - , d(data) // Subclass owns this pointer. + 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)) { } - Register* copyRegisterArray(Register* src, size_t count); - void setRegisters(Register* r, Register* registerArray); - - bool symbolTableGet(const Identifier&, PropertySlot&); - bool symbolTableGet(const Identifier&, PropertySlot&, bool& slotIsWriteable); - bool symbolTablePut(const Identifier&, JSValue); - bool symbolTablePutWithAttributes(const Identifier&, JSValue, unsigned attributes); - - JSVariableObjectData* d; + WriteBarrierBase* m_registers; // "r" in the stack. }; - inline bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertySlot& slot) - { - SymbolTableEntry entry = symbolTable().inlineGet(propertyName.ustring().rep()); - if (!entry.isNull()) { - slot.setRegisterSlot(®isterAt(entry.getIndex())); - return true; - } - return false; - } - - inline bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertySlot& slot, bool& slotIsWriteable) - { - SymbolTableEntry entry = symbolTable().inlineGet(propertyName.ustring().rep()); - if (!entry.isNull()) { - slot.setRegisterSlot(®isterAt(entry.getIndex())); - slotIsWriteable = !entry.isReadOnly(); - return true; - } - return false; - } - - inline bool JSVariableObject::symbolTablePut(const Identifier& propertyName, JSValue value) - { - ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); - - SymbolTableEntry entry = symbolTable().inlineGet(propertyName.ustring().rep()); - if (entry.isNull()) - return false; - if (entry.isReadOnly()) - return true; - registerAt(entry.getIndex()) = value; - return true; - } - - inline bool JSVariableObject::symbolTablePutWithAttributes(const Identifier& propertyName, JSValue value, unsigned attributes) - { - ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); - - SymbolTable::iterator iter = symbolTable().find(propertyName.ustring().rep()); - if (iter == symbolTable().end()) - return false; - SymbolTableEntry& entry = iter->second; - ASSERT(!entry.isNull()); - entry.setAttributes(attributes); - registerAt(entry.getIndex()) = value; - return true; - } - - inline Register* JSVariableObject::copyRegisterArray(Register* src, size_t count) - { - Register* registerArray = new Register[count]; - memcpy(registerArray, src, count * sizeof(Register)); - - return registerArray; - } - - inline void JSVariableObject::setRegisters(Register* registers, Register* registerArray) - { - ASSERT(registerArray != d->registerArray.get()); - d->registerArray.set(registerArray); - d->registers = registers; - } - } // namespace JSC #endif // JSVariableObject_h