18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Eric Seidel <eric@webkit.org> 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 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 * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef JSCallbackObject_h 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define JSCallbackObject_h 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSObjectRef.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSValueRef.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSObject.h" 33e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include <wtf/PassOwnPtr.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstruct JSCallbackObjectData : WeakHandleOwner { 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSCallbackObjectData(void* privateData, JSClassRef jsClass) 39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : privateData(privateData) 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , jsClass(jsClass) 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSClassRetain(jsClass); 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ~JSCallbackObjectData() 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSClassRelease(jsClass); 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSValue getPrivateProperty(const Identifier& propertyName) const 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_privateProperties) 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return JSValue(); 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_privateProperties->getPrivateProperty(propertyName); 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setPrivateProperty(JSGlobalData& globalData, JSCell* owner, const Identifier& propertyName, JSValue value) 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_privateProperties) 60e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke m_privateProperties = adoptPtr(new JSPrivatePropertyMap); 612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_privateProperties->setPrivateProperty(globalData, owner, propertyName, value); 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void deletePrivateProperty(const Identifier& propertyName) 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_privateProperties) 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_privateProperties->deletePrivateProperty(propertyName); 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void markChildren(MarkStack& markStack) 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_privateProperties) 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_privateProperties->markChildren(markStack); 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void* privateData; 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSClassRef jsClass; 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block struct JSPrivatePropertyMap { 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSValue getPrivateProperty(const Identifier& propertyName) const 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 83f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick PrivatePropertyMap::const_iterator location = m_propertyMap.find(propertyName.impl()); 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (location == m_propertyMap.end()) 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return JSValue(); 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return location->second.get(); 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setPrivateProperty(JSGlobalData& globalData, JSCell* owner, const Identifier& propertyName, JSValue value) 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WriteBarrier<Unknown> empty; 922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_propertyMap.add(propertyName.impl(), empty).first->second.set(globalData, owner, value); 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void deletePrivateProperty(const Identifier& propertyName) 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 97f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_propertyMap.remove(propertyName.impl()); 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void markChildren(MarkStack& markStack) 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (PrivatePropertyMap::iterator ptr = m_propertyMap.begin(); ptr != m_propertyMap.end(); ++ptr) { 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (ptr->second) 1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block markStack.append(&ptr->second); 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block private: 1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block typedef HashMap<RefPtr<StringImpl>, WriteBarrier<Unknown>, IdentifierRepHash> PrivatePropertyMap; 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block PrivatePropertyMap m_propertyMap; 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block }; 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block OwnPtr<JSPrivatePropertyMap> m_privateProperties; 1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual void finalize(Handle<Unknown>, void*); 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttemplate <class Base> 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass JSCallbackObject : public Base { 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch JSCallbackObject(ExecState*, JSGlobalObject*, Structure*, JSClassRef, void* data); 1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch JSCallbackObject(JSGlobalData&, JSClassRef, Structure*); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setPrivate(void* data); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* getPrivate(); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch static const ClassInfo s_info; 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSClassRef classRef() const { return m_callbackObjectData->jsClass; } 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool inherits(JSClassRef) const; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* createStructure(JSGlobalData& globalData, JSValue proto) 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1332bde8e466a4451c7319e3a072d118917957d6554Steve Block return Structure::create(globalData, proto, TypeInfo(ObjectType, StructureFlags), Base::AnonymousSlotCount, &s_info); 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSValue getPrivateProperty(const Identifier& propertyName) const 137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_callbackObjectData->getPrivateProperty(propertyName); 139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setPrivateProperty(JSGlobalData& globalData, const Identifier& propertyName, JSValue value) 142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 1432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_callbackObjectData->setPrivateProperty(globalData, this, propertyName, value); 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void deletePrivateProperty(const Identifier& propertyName) 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_callbackObjectData->deletePrivateProperty(propertyName); 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 151cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockprotected: 152cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesHasInstance | OverridesMarkChildren | OverridesGetPropertyNames | Base::StructureFlags; 153cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual UString className() const; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); 158d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian virtual void put(ExecState*, const Identifier&, JSValue, PutPropertySlot&); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool deleteProperty(ExecState*, const Identifier&); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool deleteProperty(ExecState*, unsigned); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian virtual bool hasInstance(ExecState* exec, JSValue value, JSValue proto); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 167d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual double toNumber(ExecState*) const; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual UString toString(ExecState*) const; 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual ConstructType getConstructData(ConstructData&); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual CallType getCallData(CallData&); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block virtual void markChildren(MarkStack& markStack) 176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Base::markChildren(markStack); 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_callbackObjectData->markChildren(markStack); 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void init(ExecState*); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static JSCallbackObject* asCallbackObject(JSValue); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 185545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch static EncodedJSValue JSC_HOST_CALL call(ExecState*); 186545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch static EncodedJSValue JSC_HOST_CALL construct(ExecState*); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static JSValue staticValueGetter(ExecState*, JSValue, const Identifier&); 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static JSValue staticFunctionGetter(ExecState*, JSValue, const Identifier&); 190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static JSValue callbackGetter(ExecState*, JSValue, const Identifier&); 191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OwnPtr<JSCallbackObjectData> m_callbackObjectData; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// include the actual template class implementation 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSCallbackObjectFunctions.h" 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // JSCallbackObject_h 201