]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - runtime/JSVariableObject.h
JavaScriptCore-1218.tar.gz
[apple/javascriptcore.git] / runtime / JSVariableObject.h
index b969da5e48bddcf031c09fee10a54f744e9df92e..615aa331f52ba56771807f0b0e4587e78c030267 100644 (file)
@@ -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
 #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 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<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;
-
-        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<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.
+        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<WriteBarrierBase<Unknown>*>(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<Unknown>* 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(&registerAt(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(&registerAt(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