2 * Copyright (C) 2013 Apple Inc. All rights reserved.
3 * Copyright (C) 2009 Google Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #include "ScriptFunctionCall.h"
35 #include "JSCInlines.h"
37 #include "ScriptValue.h"
38 #include <wtf/text/WTFString.h>
42 namespace Deprecated
{
44 void ScriptCallArgumentHandler::appendArgument(const Deprecated::ScriptObject
& argument
)
46 if (argument
.scriptState() != m_exec
) {
50 m_arguments
.append(argument
.jsObject());
53 void ScriptCallArgumentHandler::appendArgument(const Deprecated::ScriptValue
& argument
)
55 m_arguments
.append(argument
.jsValue());
58 void ScriptCallArgumentHandler::appendArgument(const String
& argument
)
60 JSLockHolder
lock(m_exec
);
61 m_arguments
.append(jsString(m_exec
, argument
));
64 void ScriptCallArgumentHandler::appendArgument(const char* argument
)
66 JSLockHolder
lock(m_exec
);
67 m_arguments
.append(jsString(m_exec
, String(argument
)));
70 void ScriptCallArgumentHandler::appendArgument(JSValue argument
)
72 m_arguments
.append(argument
);
75 void ScriptCallArgumentHandler::appendArgument(long argument
)
77 JSLockHolder
lock(m_exec
);
78 m_arguments
.append(jsNumber(argument
));
81 void ScriptCallArgumentHandler::appendArgument(long long argument
)
83 JSLockHolder
lock(m_exec
);
84 m_arguments
.append(jsNumber(argument
));
87 void ScriptCallArgumentHandler::appendArgument(unsigned int argument
)
89 JSLockHolder
lock(m_exec
);
90 m_arguments
.append(jsNumber(argument
));
93 void ScriptCallArgumentHandler::appendArgument(unsigned long argument
)
95 JSLockHolder
lock(m_exec
);
96 m_arguments
.append(jsNumber(argument
));
99 void ScriptCallArgumentHandler::appendArgument(int argument
)
101 JSLockHolder
lock(m_exec
);
102 m_arguments
.append(jsNumber(argument
));
105 void ScriptCallArgumentHandler::appendArgument(bool argument
)
107 m_arguments
.append(jsBoolean(argument
));
110 ScriptFunctionCall::ScriptFunctionCall(const Deprecated::ScriptObject
& thisObject
, const String
& name
, ScriptFunctionCallHandler callHandler
)
111 : ScriptCallArgumentHandler(thisObject
.scriptState())
112 , m_callHandler(callHandler
)
113 , m_thisObject(thisObject
)
118 Deprecated::ScriptValue
ScriptFunctionCall::call(bool& hadException
)
120 JSObject
* thisObject
= m_thisObject
.jsObject();
122 JSLockHolder
lock(m_exec
);
124 JSValue function
= thisObject
->get(m_exec
, Identifier::fromString(m_exec
, m_name
));
125 if (m_exec
->hadException()) {
127 return Deprecated::ScriptValue();
131 CallType callType
= getCallData(function
, callData
);
132 if (callType
== CallTypeNone
)
133 return Deprecated::ScriptValue();
136 NakedPtr
<Exception
> exception
;
138 result
= m_callHandler(m_exec
, function
, callType
, callData
, thisObject
, m_arguments
, exception
);
140 result
= JSC::call(m_exec
, function
, callType
, callData
, thisObject
, m_arguments
, exception
);
144 return Deprecated::ScriptValue();
147 return Deprecated::ScriptValue(m_exec
->vm(), result
);
150 Deprecated::ScriptValue
ScriptFunctionCall::call()
152 bool hadException
= false;
153 return call(hadException
);
156 } // namespace Deprecated