18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Maks Orlovich 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef JSFunction_h 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define JSFunction_h 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "InternalFunction.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block class ExecutableBase; 32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block class FunctionExecutable; 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class FunctionPrototype; 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class JSActivation; 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class JSGlobalObject; 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class JSFunction : public InternalFunction { 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project friend class JIT; 39d0825bca7fe65beaee391d30da42e937db621564Steve Block friend class JSGlobalData; 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project typedef InternalFunction Base; 42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block JSFunction(ExecState*, NonNullPassRefPtr<Structure>, int length, const Identifier&, NativeFunction); 45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block JSFunction(ExecState*, NonNullPassRefPtr<FunctionExecutable>, ScopeChainNode*); 46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual ~JSFunction(); 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObject* construct(ExecState*, const ArgList&); 495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue call(ExecState*, JSValue thisValue, const ArgList&); 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void setScope(const ScopeChain& scopeChain) { setScopeChain(scopeChain); } 525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ScopeChain& scope() { return scopeChain(); } 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ExecutableBase* executable() const { return m_executable.get(); } 55058ccc7ba0a4d59b9f6e92808332aa9895425fc7Andrei Popescu 56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // To call either of these methods include Executable.h 57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block inline bool isHostFunction() const; 58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block FunctionExecutable* jsExecutable() const; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static JS_EXPORTDATA const ClassInfo info; 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static PassRefPtr<Structure> createStructure(JSValue prototype) 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 64d0825bca7fe65beaee391d30da42e937db621564Steve Block return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian NativeFunction nativeFunction() 685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 69cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return *WTF::bitwise_cast<NativeFunction*>(m_data); 705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual ConstructType getConstructData(ConstructData&); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual CallType getCallData(CallData&); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 75cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block protected: 76cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block const static unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesMarkChildren | OverridesGetPropertyNames | InternalFunction::StructureFlags; 77cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian private: 79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block JSFunction(NonNullPassRefPtr<Structure>); 80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 81231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool isHostFunctionNonInline() const; 82231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&); 84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&); 85d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties); 86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&); 87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool deleteProperty(ExecState*, const Identifier& propertyName); 88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual void markChildren(MarkStack&); 90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian virtual const ClassInfo* classInfo() const { return &info; } 925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static JSValue argumentsGetter(ExecState*, const Identifier&, const PropertySlot&); 945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static JSValue callerGetter(ExecState*, const Identifier&, const PropertySlot&); 955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static JSValue lengthGetter(ExecState*, const Identifier&, const PropertySlot&); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 97231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block RefPtr<ExecutableBase> m_executable; 985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian ScopeChain& scopeChain() 995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!isHostFunctionNonInline()); 101cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return *WTF::bitwise_cast<ScopeChain*>(m_data); 1025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void clearScopeChain() 1045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!isHostFunctionNonInline()); 1065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian new (m_data) ScopeChain(NoScopeChain()); 1075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void setScopeChain(ScopeChainNode* sc) 1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 110231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!isHostFunctionNonInline()); 1115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian new (m_data) ScopeChain(sc); 1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void setScopeChain(const ScopeChain& sc) 1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 115231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block ASSERT(!isHostFunctionNonInline()); 116cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *WTF::bitwise_cast<ScopeChain*>(m_data) = sc; 1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void setNativeFunction(NativeFunction func) 1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 120cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block *WTF::bitwise_cast<NativeFunction*>(m_data) = func; 1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian unsigned char m_data[sizeof(void*)]; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSFunction* asFunction(JSValue); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian inline JSFunction* asFunction(JSValue value) 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(asObject(value)->inherits(&JSFunction::info)); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<JSFunction*>(asObject(value)); 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace JSC 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // JSFunction_h 136