18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef JSVariableObject_h 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define JSVariableObject_h 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSObject.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Register.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SymbolTable.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "UnusedParam.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/OwnArrayPtr.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/UnusedParam.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class Register; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch class JSVariableObject : public JSNonFinalObject { 44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project friend class JIT; 45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 472bde8e466a4451c7319e3a072d118917957d6554Steve Block SymbolTable& symbolTable() const { return *m_symbolTable; } 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian virtual void putWithAttributes(ExecState*, const Identifier&, JSValue, unsigned attributes) = 0; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool deleteProperty(ExecState*, const Identifier&); 52d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties); 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool isVariableObject() const; 556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen virtual bool isDynamicScope(bool& requiresDynamicChecks) const = 0; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 572bde8e466a4451c7319e3a072d118917957d6554Steve Block WriteBarrier<Unknown>& registerAt(int index) const { return m_registers[index]; } 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 592bde8e466a4451c7319e3a072d118917957d6554Steve Block WriteBarrier<Unknown>* const * addressOfRegisters() const { return &m_registers; } 602bde8e466a4451c7319e3a072d118917957d6554Steve Block 612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* createStructure(JSGlobalData& globalData, JSValue prototype) 62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block { 632bde8e466a4451c7319e3a072d118917957d6554Steve Block return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); 64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } 65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project protected: 67cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const unsigned StructureFlags = OverridesGetPropertyNames | JSObject::StructureFlags; 682bde8e466a4451c7319e3a072d118917957d6554Steve Block 692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch JSVariableObject(JSGlobalData& globalData, Structure* structure, SymbolTable* symbolTable, Register* registers) 702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch : JSNonFinalObject(globalData, structure) 712bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_symbolTable(symbolTable) 722bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_registers(reinterpret_cast<WriteBarrier<Unknown>*>(registers)) 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 742bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(m_symbolTable); 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch COMPILE_ASSERT(sizeof(WriteBarrier<Unknown>) == sizeof(Register), Register_should_be_same_size_as_WriteBarrier); 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch PassOwnArrayPtr<WriteBarrier<Unknown> > copyRegisterArray(JSGlobalData&, WriteBarrier<Unknown>* src, size_t count, size_t callframeStarts); 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void setRegisters(WriteBarrier<Unknown>* registers, PassOwnArrayPtr<WriteBarrier<Unknown> > registerArray); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool symbolTableGet(const Identifier&, PropertySlot&); 82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool symbolTableGet(const Identifier&, PropertyDescriptor&); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool symbolTableGet(const Identifier&, PropertySlot&, bool& slotIsWriteable); 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool symbolTablePut(JSGlobalData&, const Identifier&, JSValue); 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool symbolTablePutWithAttributes(JSGlobalData&, const Identifier&, JSValue, unsigned attributes); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 872bde8e466a4451c7319e3a072d118917957d6554Steve Block SymbolTable* m_symbolTable; // Maps name -> offset from "r" in register file. 882bde8e466a4451c7319e3a072d118917957d6554Steve Block WriteBarrier<Unknown>* m_registers; // "r" in the register file. 892bde8e466a4451c7319e3a072d118917957d6554Steve Block OwnArrayPtr<WriteBarrier<Unknown> > m_registerArray; // Independent copy of registers, used when a variable object copies its registers out of the register file. 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inline bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertySlot& slot) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 94f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!entry.isNull()) { 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch slot.setValue(registerAt(entry.getIndex()).get()); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inline bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertySlot& slot, bool& slotIsWriteable) 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 104f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!entry.isNull()) { 10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch slot.setValue(registerAt(entry.getIndex()).get()); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project slotIsWriteable = !entry.isReadOnly(); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch inline bool JSVariableObject::symbolTablePut(JSGlobalData& globalData, const Identifier& propertyName, JSValue value) 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 117f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (entry.isNull()) 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (entry.isReadOnly()) 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch registerAt(entry.getIndex()).set(globalData, this, value); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch inline bool JSVariableObject::symbolTablePutWithAttributes(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes) 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 130f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick SymbolTable::iterator iter = symbolTable().find(propertyName.impl()); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (iter == symbolTable().end()) 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SymbolTableEntry& entry = iter->second; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!entry.isNull()); 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project entry.setAttributes(attributes); 13681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch registerAt(entry.getIndex()).set(globalData, this, value); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inline PassOwnArrayPtr<WriteBarrier<Unknown> > JSVariableObject::copyRegisterArray(JSGlobalData& globalData, WriteBarrier<Unknown>* src, size_t count, size_t callframeStarts) 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 14281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnArrayPtr<WriteBarrier<Unknown> > registerArray = adoptArrayPtr(new WriteBarrier<Unknown>[count]); 1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (size_t i = 0; i < callframeStarts; i++) 1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch registerArray[i].set(globalData, this, src[i].get()); 1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (size_t i = callframeStarts + RegisterFile::CallFrameHeaderSize; i < count; i++) 14681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch registerArray[i].set(globalData, this, src[i].get()); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return registerArray.release(); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 15181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch inline void JSVariableObject::setRegisters(WriteBarrier<Unknown>* registers, PassOwnArrayPtr<WriteBarrier<Unknown> > registerArray) 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1532bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(registerArray != m_registerArray); 1542bde8e466a4451c7319e3a072d118917957d6554Steve Block m_registerArray = registerArray; 1552bde8e466a4451c7319e3a072d118917957d6554Steve Block m_registers = registers; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // JSVariableObject_h 161