• 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 #include "JSVariableObject.h"
29 #include "SymbolTable.h"
30 #include "Nodes.h"
31 #include "JSObject.h"
32 
33 namespace JSC {
34 
35     class FunctionBodyNode;
36     class FunctionPrototype;
37     class JSActivation;
38     class JSGlobalObject;
39 
40     class JSFunction : public InternalFunction {
41         friend class JIT;
42         friend struct VPtrSet;
43 
44         typedef InternalFunction Base;
45 
JSFunction(PassRefPtr<Structure> structure)46         JSFunction(PassRefPtr<Structure> structure)
47             : InternalFunction(structure)
48         {
49             clearScopeChain();
50         }
51 
52     public:
53         JSFunction(ExecState*, PassRefPtr<Structure>, int length, const Identifier&, NativeFunction);
54         JSFunction(ExecState*, const Identifier&, FunctionBodyNode*, ScopeChainNode*);
55         ~JSFunction();
56 
57         virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
58         virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&);
59         virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
60 
61         JSObject* construct(ExecState*, const ArgList&);
62         JSValue call(ExecState*, JSValue thisValue, const ArgList&);
63 
setScope(const ScopeChain & scopeChain)64         void setScope(const ScopeChain& scopeChain) { setScopeChain(scopeChain); }
scope()65         ScopeChain& scope() { return scopeChain(); }
66 
setBody(FunctionBodyNode * body)67         void setBody(FunctionBodyNode* body) { m_body = body; }
setBody(PassRefPtr<FunctionBodyNode> body)68         void setBody(PassRefPtr<FunctionBodyNode> body) { m_body = body; }
body()69         FunctionBodyNode* body() const { return m_body.get(); }
70 
71         virtual void markChildren(MarkStack&);
72 
73         static JS_EXPORTDATA const ClassInfo info;
74 
createStructure(JSValue prototype)75         static PassRefPtr<Structure> createStructure(JSValue prototype)
76         {
77             return Structure::create(prototype, TypeInfo(ObjectType, ImplementsHasInstance));
78         }
79 
80 #if ENABLE(JIT)
isHostFunction()81         bool isHostFunction() const { return m_body && m_body->isHostFunction(); }
82 #else
isHostFunction()83         bool isHostFunction() const { return false; }
84 #endif
nativeFunction()85         NativeFunction nativeFunction()
86         {
87             return *reinterpret_cast<NativeFunction*>(m_data);
88         }
89 
90         virtual ConstructType getConstructData(ConstructData&);
91         virtual CallType getCallData(CallData&);
92 
93     private:
classInfo()94         virtual const ClassInfo* classInfo() const { return &info; }
95 
96         static JSValue argumentsGetter(ExecState*, const Identifier&, const PropertySlot&);
97         static JSValue callerGetter(ExecState*, const Identifier&, const PropertySlot&);
98         static JSValue lengthGetter(ExecState*, const Identifier&, const PropertySlot&);
99 
100         RefPtr<FunctionBodyNode> m_body;
scopeChain()101         ScopeChain& scopeChain()
102         {
103             ASSERT(!isHostFunction());
104             return *reinterpret_cast<ScopeChain*>(m_data);
105         }
clearScopeChain()106         void clearScopeChain()
107         {
108             ASSERT(!isHostFunction());
109             new (m_data) ScopeChain(NoScopeChain());
110         }
setScopeChain(ScopeChainNode * sc)111         void setScopeChain(ScopeChainNode* sc)
112         {
113             ASSERT(!isHostFunction());
114             new (m_data) ScopeChain(sc);
115         }
setScopeChain(const ScopeChain & sc)116         void setScopeChain(const ScopeChain& sc)
117         {
118             ASSERT(!isHostFunction());
119             *reinterpret_cast<ScopeChain*>(m_data) = sc;
120         }
setNativeFunction(NativeFunction func)121         void setNativeFunction(NativeFunction func)
122         {
123             *reinterpret_cast<NativeFunction*>(m_data) = func;
124         }
125         unsigned char m_data[sizeof(void*)];
126     };
127 
128     JSFunction* asFunction(JSValue);
129 
asFunction(JSValue value)130     inline JSFunction* asFunction(JSValue value)
131     {
132         ASSERT(asObject(value)->inherits(&JSFunction::info));
133         return static_cast<JSFunction*>(asObject(value));
134     }
135 
136 } // namespace JSC
137 
138 #endif // JSFunction_h
139