1/* 2 * Copyright (C) 2013 Apple Inc. All rights reserved. 3 * Copyright (C) 2009 Google Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 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 14 * distribution. 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. 18 * 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. 30 */ 31 32#include "config.h" 33#include "ScriptFunctionCall.h" 34 35#include "JSCInlines.h" 36#include "JSLock.h" 37#include "ScriptValue.h" 38#include <wtf/text/WTFString.h> 39 40using namespace JSC; 41 42namespace Deprecated { 43 44void ScriptCallArgumentHandler::appendArgument(const Deprecated::ScriptObject& argument) 45{ 46 if (argument.scriptState() != m_exec) { 47 ASSERT_NOT_REACHED(); 48 return; 49 } 50 m_arguments.append(argument.jsObject()); 51} 52 53void ScriptCallArgumentHandler::appendArgument(const Deprecated::ScriptValue& argument) 54{ 55 m_arguments.append(argument.jsValue()); 56} 57 58void ScriptCallArgumentHandler::appendArgument(const String& argument) 59{ 60 JSLockHolder lock(m_exec); 61 m_arguments.append(jsString(m_exec, argument)); 62} 63 64void ScriptCallArgumentHandler::appendArgument(const char* argument) 65{ 66 JSLockHolder lock(m_exec); 67 m_arguments.append(jsString(m_exec, String(argument))); 68} 69 70void ScriptCallArgumentHandler::appendArgument(JSValue argument) 71{ 72 m_arguments.append(argument); 73} 74 75void ScriptCallArgumentHandler::appendArgument(long argument) 76{ 77 JSLockHolder lock(m_exec); 78 m_arguments.append(jsNumber(argument)); 79} 80 81void ScriptCallArgumentHandler::appendArgument(long long argument) 82{ 83 JSLockHolder lock(m_exec); 84 m_arguments.append(jsNumber(argument)); 85} 86 87void ScriptCallArgumentHandler::appendArgument(unsigned int argument) 88{ 89 JSLockHolder lock(m_exec); 90 m_arguments.append(jsNumber(argument)); 91} 92 93void ScriptCallArgumentHandler::appendArgument(unsigned long argument) 94{ 95 JSLockHolder lock(m_exec); 96 m_arguments.append(jsNumber(argument)); 97} 98 99void ScriptCallArgumentHandler::appendArgument(int argument) 100{ 101 JSLockHolder lock(m_exec); 102 m_arguments.append(jsNumber(argument)); 103} 104 105void ScriptCallArgumentHandler::appendArgument(bool argument) 106{ 107 m_arguments.append(jsBoolean(argument)); 108} 109 110ScriptFunctionCall::ScriptFunctionCall(const Deprecated::ScriptObject& thisObject, const String& name, ScriptFunctionCallHandler callHandler) 111 : ScriptCallArgumentHandler(thisObject.scriptState()) 112 , m_callHandler(callHandler) 113 , m_thisObject(thisObject) 114 , m_name(name) 115{ 116} 117 118Deprecated::ScriptValue ScriptFunctionCall::call(bool& hadException) 119{ 120 JSObject* thisObject = m_thisObject.jsObject(); 121 122 JSLockHolder lock(m_exec); 123 124 JSValue function = thisObject->get(m_exec, Identifier(m_exec, m_name)); 125 if (m_exec->hadException()) { 126 hadException = true; 127 return Deprecated::ScriptValue(); 128 } 129 130 CallData callData; 131 CallType callType = getCallData(function, callData); 132 if (callType == CallTypeNone) 133 return Deprecated::ScriptValue(); 134 135 JSValue result; 136 JSValue exception; 137 if (m_callHandler) 138 result = m_callHandler(m_exec, function, callType, callData, thisObject, m_arguments, &exception); 139 else 140 result = JSC::call(m_exec, function, callType, callData, thisObject, m_arguments, &exception); 141 142 if (exception) { 143 hadException = true; 144 return Deprecated::ScriptValue(); 145 } 146 147 return Deprecated::ScriptValue(m_exec->vm(), result); 148} 149 150Deprecated::ScriptValue ScriptFunctionCall::call() 151{ 152 bool hadException = false; 153 return call(hadException); 154} 155 156} // namespace Deprecated 157