• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
3  *  Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
4  *  Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca)
5  *  Copyright (C) 2007 Maks Orlovich
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Library General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Library General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Library General Public License
18  *  along with this library; see the file COPYING.LIB.  If not, write to
19  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  *  Boston, MA 02110-1301, USA.
21  *
22  */
23 
24 #ifndef JSFunction_h
25 #define JSFunction_h
26 
27 #include "InternalFunction.h"
28 
29 namespace JSC {
30 
31     class ExecutableBase;
32     class FunctionExecutable;
33     class FunctionPrototype;
34     class JSActivation;
35     class JSGlobalObject;
36 
37     class JSFunction : public InternalFunction {
38         friend class JIT;
39         friend class JSGlobalData;
40 
41         typedef InternalFunction Base;
42 
43     public:
44         JSFunction(ExecState*, NonNullPassRefPtr<Structure>, int length, const Identifier&, NativeFunction);
45         JSFunction(ExecState*, NonNullPassRefPtr<FunctionExecutable>, ScopeChainNode*);
46         virtual ~JSFunction();
47 
48         JSObject* construct(ExecState*, const ArgList&);
49         JSValue call(ExecState*, JSValue thisValue, const ArgList&);
50 
setScope(const ScopeChain & scopeChain)51         void setScope(const ScopeChain& scopeChain) { setScopeChain(scopeChain); }
scope()52         ScopeChain& scope() { return scopeChain(); }
53 
executable()54         ExecutableBase* executable() const { return m_executable.get(); }
55 
56         // To call either of these methods include Executable.h
57         inline bool isHostFunction() const;
58         FunctionExecutable* jsExecutable() const;
59 
60         static JS_EXPORTDATA const ClassInfo info;
61 
createStructure(JSValue prototype)62         static PassRefPtr<Structure> createStructure(JSValue prototype)
63         {
64             return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount);
65         }
66 
nativeFunction()67         NativeFunction nativeFunction()
68         {
69             return *WTF::bitwise_cast<NativeFunction*>(m_data);
70         }
71 
72         virtual ConstructType getConstructData(ConstructData&);
73         virtual CallType getCallData(CallData&);
74 
75     protected:
76         const static unsigned StructureFlags = OverridesGetOwnPropertySlot | ImplementsHasInstance | OverridesMarkChildren | OverridesGetPropertyNames | InternalFunction::StructureFlags;
77 
78     private:
79         JSFunction(NonNullPassRefPtr<Structure>);
80 
81         bool isHostFunctionNonInline() const;
82 
83         virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
84         virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&);
85         virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
86         virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&);
87         virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
88 
89         virtual void markChildren(MarkStack&);
90 
classInfo()91         virtual const ClassInfo* classInfo() const { return &info; }
92 
93         static JSValue argumentsGetter(ExecState*, const Identifier&, const PropertySlot&);
94         static JSValue callerGetter(ExecState*, const Identifier&, const PropertySlot&);
95         static JSValue lengthGetter(ExecState*, const Identifier&, const PropertySlot&);
96 
97         RefPtr<ExecutableBase> m_executable;
scopeChain()98         ScopeChain& scopeChain()
99         {
100             ASSERT(!isHostFunctionNonInline());
101             return *WTF::bitwise_cast<ScopeChain*>(m_data);
102         }
clearScopeChain()103         void clearScopeChain()
104         {
105             ASSERT(!isHostFunctionNonInline());
106             new (m_data) ScopeChain(NoScopeChain());
107         }
setScopeChain(ScopeChainNode * sc)108         void setScopeChain(ScopeChainNode* sc)
109         {
110             ASSERT(!isHostFunctionNonInline());
111             new (m_data) ScopeChain(sc);
112         }
setScopeChain(const ScopeChain & sc)113         void setScopeChain(const ScopeChain& sc)
114         {
115             ASSERT(!isHostFunctionNonInline());
116             *WTF::bitwise_cast<ScopeChain*>(m_data) = sc;
117         }
setNativeFunction(NativeFunction func)118         void setNativeFunction(NativeFunction func)
119         {
120             *WTF::bitwise_cast<NativeFunction*>(m_data) = func;
121         }
122         unsigned char m_data[sizeof(void*)];
123     };
124 
125     JSFunction* asFunction(JSValue);
126 
asFunction(JSValue value)127     inline JSFunction* asFunction(JSValue value)
128     {
129         ASSERT(asObject(value)->inherits(&JSFunction::info));
130         return static_cast<JSFunction*>(asObject(value));
131     }
132 
133 } // namespace JSC
134 
135 #endif // JSFunction_h
136