/*
- * 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
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * 3. Neither the name of Apple Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
#define JSVariableObject_h
#include "JSObject.h"
+#include "JSSymbolTableObject.h"
#include "Register.h"
#include "SymbolTable.h"
-#include "UnusedParam.h"
-#include <wtf/OwnArrayPtr.h>
-#include <wtf/UnusedParam.h>
namespace JSC {
- class Register;
+class LLIntOffsetsExtractor;
+class Register;
- class JSVariableObject : public JSObject {
- friend class JIT;
+class JSVariableObject : public JSSymbolTableObject {
+ friend class JIT;
+ friend class LLIntOffsetsExtractor;
- public:
- SymbolTable& symbolTable() const { return *d->symbolTable; }
+public:
+ typedef JSSymbolTableObject Base;
- virtual void putWithAttributes(ExecState*, const Identifier&, JSValuePtr, unsigned attributes) = 0;
+ WriteBarrierBase<Unknown>* registers() { return m_registers; }
+ WriteBarrierBase<Unknown>& 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<Unknown>* 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;
+ DECLARE_INFO;
- Register& registerAt(int index) const { return d->registers[index]; }
+protected:
+ static const unsigned StructureFlags = Base::StructureFlags;
- 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<Register> 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> structure, JSVariableObjectData* data)
- : JSObject(structure)
- , d(data) // Subclass owns this pointer.
- {
- }
-
- 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&, JSValuePtr);
- bool symbolTablePutWithAttributes(const Identifier&, JSValuePtr, unsigned attributes);
-
- JSVariableObjectData* d;
- };
-
- 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, JSValuePtr 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, JSValuePtr 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)
+ JSVariableObject(
+ VM& vm,
+ Structure* structure,
+ Register* registers,
+ JSScope* scope,
+ SymbolTable* symbolTable = 0)
+ : Base(vm, structure, scope, symbolTable)
+ , m_registers(reinterpret_cast<WriteBarrierBase<Unknown>*>(registers))
{
- 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;
- }
+ WriteBarrierBase<Unknown>* m_registers; // "r" in the stack.
+};
} // namespace JSC