More 32bit build fixes
[WebKit-https.git] / Source / JavaScriptCore / API / APICallbackFunction.h
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef APICallbackFunction_h
27 #define APICallbackFunction_h
28
29 #include "APICast.h"
30 #include "APIShims.h"
31 #include "Error.h"
32 #include <wtf/Vector.h>
33
34 namespace JSC {
35
36 struct APICallbackFunction {
37
38 template <typename T> static EncodedJSValue JSC_HOST_CALL call(ExecState*);
39
40 };
41
42 template <typename T>
43 EncodedJSValue JSC_HOST_CALL APICallbackFunction::call(ExecState* exec)
44 {
45     JSContextRef execRef = toRef(exec);
46     JSObjectRef functionRef = toRef(exec->callee());
47     JSObjectRef thisObjRef = toRef(jsCast<JSObject*>(exec->hostThisValue().toThis(exec, NotStrictMode)));
48
49     int argumentCount = static_cast<int>(exec->argumentCount());
50     Vector<JSValueRef, 16> arguments;
51     arguments.reserveInitialCapacity(argumentCount);
52     for (int i = 0; i < argumentCount; i++)
53         arguments.uncheckedAppend(toRef(exec, exec->argument(i)));
54
55     JSValueRef exception = 0;
56     JSValueRef result;
57     {
58         APICallbackShim callbackShim(exec);
59         result = jsCast<T*>(toJS(functionRef))->m_callback(execRef, functionRef, thisObjRef, argumentCount, arguments.data(), &exception);
60     }
61     if (exception)
62         throwError(exec, toJS(exec, exception));
63
64     // result must be a valid JSValue.
65     if (!result)
66         return JSValue::encode(jsUndefined());
67
68     return JSValue::encode(toJS(exec, result));
69 }
70 } // namespace JSC
71
72 #endif // APICallbackFunction_h