JSFunction.h revision 635860845790a19bf50bbc51ba8fb66a96dde068
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#include "JSVariableObject.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SymbolTable.h"
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Nodes.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSObject.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class FunctionBodyNode;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class FunctionPrototype;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class JSActivation;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class JSGlobalObject;
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class JSFunction : public InternalFunction {
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        friend class JIT;
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        friend class Interpreter;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef InternalFunction Base;
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        JSFunction(PassRefPtr<Structure> structure)
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            : InternalFunction(structure)
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , m_scopeChain(NoScopeChain())
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSFunction(ExecState*, const Identifier&, FunctionBodyNode*, ScopeChainNode*);
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ~JSFunction();
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        virtual void put(ExecState*, const Identifier& propertyName, JSValuePtr, PutPropertySlot&);
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSObject* construct(ExecState*, const ArgList&);
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        JSValuePtr call(ExecState*, JSValuePtr thisValue, const ArgList&);
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setScope(const ScopeChain& scopeChain) { m_scopeChain = scopeChain; }
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChain& scope() { return m_scopeChain; }
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setBody(FunctionBodyNode* body) { m_body = body; }
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void setBody(PassRefPtr<FunctionBodyNode> body) { m_body = body; }
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        FunctionBodyNode* body() const { return m_body.get(); }
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        virtual void mark();
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const ClassInfo info;
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        static PassRefPtr<Structure> createStructure(JSValuePtr prototype)
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return Structure::create(prototype, TypeInfo(ObjectType, ImplementsHasInstance));
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        virtual const ClassInfo* classInfo() const { return &info; }
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        virtual ConstructType getConstructData(ConstructData&);
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        virtual CallType getCallData(CallData&);
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        static JSValuePtr argumentsGetter(ExecState*, const Identifier&, const PropertySlot&);
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        static JSValuePtr callerGetter(ExecState*, const Identifier&, const PropertySlot&);
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        static JSValuePtr lengthGetter(ExecState*, const Identifier&, const PropertySlot&);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        RefPtr<FunctionBodyNode> m_body;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChain m_scopeChain;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    JSFunction* asFunction(JSValuePtr);
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    inline JSFunction* asFunction(JSValuePtr value)
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(asObject(value)->inherits(&JSFunction::info));
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return static_cast<JSFunction*>(asObject(value));
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace JSC
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // JSFunction_h
104