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