2  * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. 
   4  * Redistribution and use in source and binary forms, with or without 
   5  * modification, are permitted provided that the following conditions 
   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. 
  13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, 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 COMPUTER, 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.  
  27 #include "JSCallbackFunction.h" 
  31 #include "CodeBlock.h" 
  33 #include "ExceptionHelpers.h" 
  34 #include "FunctionPrototype.h" 
  35 #include "JSFunction.h" 
  36 #include "JSGlobalObject.h" 
  38 #include "Operations.h" 
  39 #include <wtf/Vector.h> 
  43 ASSERT_HAS_TRIVIAL_DESTRUCTOR(JSCallbackFunction
); 
  45 const ClassInfo 
JSCallbackFunction::s_info 
= { "CallbackFunction", &InternalFunction::s_info
, 0, 0, CREATE_METHOD_TABLE(JSCallbackFunction
) }; 
  47 JSCallbackFunction::JSCallbackFunction(JSGlobalObject
* globalObject
, Structure
* structure
, JSObjectCallAsFunctionCallback callback
) 
  48     : InternalFunction(globalObject
, structure
) 
  49     , m_callback(callback
) 
  53 void JSCallbackFunction::finishCreation(VM
& vm
, const String
& name
) 
  55     Base::finishCreation(vm
, name
); 
  56     ASSERT(inherits(&s_info
)); 
  59 JSCallbackFunction
* JSCallbackFunction::create(ExecState
* exec
, JSGlobalObject
* globalObject
, JSObjectCallAsFunctionCallback callback
, const String
& name
) 
  61     JSCallbackFunction
* function 
= new (NotNull
, allocateCell
<JSCallbackFunction
>(*exec
->heap())) JSCallbackFunction(globalObject
, globalObject
->callbackFunctionStructure(), callback
); 
  62     function
->finishCreation(exec
->vm(), name
); 
  66 EncodedJSValue 
JSCallbackFunction::call(ExecState
* exec
) 
  68     JSContextRef execRef 
= toRef(exec
); 
  69     JSObjectRef functionRef 
= toRef(exec
->callee()); 
  70     JSObjectRef thisObjRef 
= toRef(exec
->hostThisValue().toThisObject(exec
)); 
  72     size_t argumentCount 
= exec
->argumentCount(); 
  73     Vector
<JSValueRef
, 16> arguments
; 
  74     arguments
.reserveInitialCapacity(argumentCount
); 
  75     for (size_t i 
= 0; i 
< argumentCount
; ++i
) 
  76         arguments
.uncheckedAppend(toRef(exec
, exec
->argument(i
))); 
  78     JSValueRef exception 
= 0; 
  81         APICallbackShim 
callbackShim(exec
); 
  82         result 
= jsCast
<JSCallbackFunction
*>(toJS(functionRef
))->m_callback(execRef
, functionRef
, thisObjRef
, argumentCount
, arguments
.data(), &exception
); 
  85         throwError(exec
, toJS(exec
, exception
)); 
  87     // result must be a valid JSValue. 
  89         return JSValue::encode(jsUndefined()); 
  91     return JSValue::encode(toJS(exec
, result
)); 
  94 CallType 
JSCallbackFunction::getCallData(JSCell
*, CallData
& callData
) 
  96     callData
.native
.function 
= call
;