Fix build by adding all (hopefully) the missing includes.
[WebKit-https.git] / JavaScriptCore / kjs / FunctionPrototype.cpp
1 /*
2  *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
3  *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  *
19  */
20
21 #include "config.h"
22 #include "FunctionPrototype.h"
23
24 #include "JSArray.h"
25 #include "JSFunction.h"
26 #include "JSString.h"
27
28 namespace KJS {
29
30 static JSValue* functionProtoFuncToString(ExecState*, JSObject*, JSValue*, const ArgList&);
31 static JSValue* functionProtoFuncApply(ExecState*, JSObject*, JSValue*, const ArgList&);
32 static JSValue* functionProtoFuncCall(ExecState*, JSObject*, JSValue*, const ArgList&);
33
34 FunctionPrototype::FunctionPrototype(ExecState* exec)
35 {
36     putDirect(exec->propertyNames().length, jsNumber(exec, 0), DontDelete | ReadOnly | DontEnum);
37
38     putDirectFunction(new (exec) PrototypeFunction(exec, this, 0, exec->propertyNames().toString, functionProtoFuncToString), DontEnum);
39     putDirectFunction(new (exec) PrototypeFunction(exec, this, 2, exec->propertyNames().apply, functionProtoFuncApply), DontEnum);
40     putDirectFunction(new (exec) PrototypeFunction(exec, this, 1, exec->propertyNames().call, functionProtoFuncCall), DontEnum);
41 }
42
43 static JSValue* callFunctionPrototype(ExecState*, JSObject*, JSValue*, const ArgList&)
44 {
45     return jsUndefined();
46 }
47
48 // ECMA 15.3.4
49 CallType FunctionPrototype::getCallData(CallData& callData)
50 {
51     callData.native.function = callFunctionPrototype;
52     return CallTypeNative;
53 }
54
55 // Functions
56
57 JSValue* functionProtoFuncToString(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList&)
58 {
59     if (!thisValue->isObject(&InternalFunction::info))
60         return throwError(exec, TypeError);
61
62     InternalFunction* function = static_cast<InternalFunction*>(thisValue);
63
64     if (function->inherits(&JSFunction::info)) {
65         JSFunction* fi = static_cast<JSFunction*>(thisValue);
66         return jsString(exec, "function " + fi->functionName().ustring() + "(" + fi->body->paramString() + ") " + fi->body->toSourceString());
67     }
68
69     return jsString(exec, "function " + function->functionName().ustring() + "() {\n    [native code]\n}");
70 }
71
72 JSValue* functionProtoFuncApply(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
73 {
74     CallData callData;
75     CallType callType = thisValue->getCallData(callData);
76     if (callType == CallTypeNone)
77         return throwError(exec, TypeError);
78
79     JSValue* thisArg = args[0];
80     JSValue* argArray = args[1];
81
82     JSValue* applyThis;
83     if (thisArg->isUndefinedOrNull())
84         applyThis = exec->globalThisValue();
85     else
86         applyThis = thisArg->toObject(exec);
87
88     ArgList applyArgs;
89     if (!argArray->isUndefinedOrNull()) {
90         if (argArray->isObject() &&
91             (static_cast<JSObject*>(argArray)->inherits(&JSArray::info) ||
92              static_cast<JSObject*>(argArray)->inherits(&Arguments::info))) {
93
94             JSObject* argArrayObj = static_cast<JSObject*>(argArray);
95             unsigned int length = argArrayObj->get(exec, exec->propertyNames().length)->toUInt32(exec);
96             for (unsigned int i = 0; i < length; i++)
97                 applyArgs.append(argArrayObj->get(exec, i));
98         } else
99             return throwError(exec, TypeError);
100     }
101
102     return call(exec, thisValue, callType, callData, applyThis, applyArgs);
103 }
104
105 JSValue* functionProtoFuncCall(ExecState* exec, JSObject*, JSValue* thisValue, const ArgList& args)
106 {
107     CallData callData;
108     CallType callType = thisValue->getCallData(callData);
109     if (callType == CallTypeNone)
110         return throwError(exec, TypeError);
111
112     JSValue* thisArg = args[0];
113
114     JSObject* callThis;
115     if (thisArg->isUndefinedOrNull())
116         callThis = exec->globalThisValue();
117     else
118         callThis = thisArg->toObject(exec);
119
120     ArgList argsTail;
121     args.getSlice(1, argsTail);
122     return call(exec, thisValue, callType, callData, callThis, argsTail);
123 }
124
125 } // namespace KJS