2  * Copyright (C) 2006, 2007, 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 "JSCallbackConstructor.h" 
  30 #include <runtime/JSGlobalObject.h> 
  31 #include <runtime/JSLock.h> 
  32 #include <runtime/ObjectPrototype.h> 
  33 #include <wtf/Vector.h> 
  37 const ClassInfo 
JSCallbackConstructor::info 
= { "CallbackConstructor", 0, 0, 0 }; 
  39 JSCallbackConstructor::JSCallbackConstructor(PassRefPtr
<Structure
> structure
, JSClassRef jsClass
, JSObjectCallAsConstructorCallback callback
) 
  42     , m_callback(callback
) 
  45         JSClassRetain(jsClass
); 
  48 JSCallbackConstructor::~JSCallbackConstructor() 
  51         JSClassRelease(m_class
); 
  54 static JSObject
* constructJSCallback(ExecState
* exec
, JSObject
* constructor
, const ArgList
& args
) 
  56     JSContextRef ctx 
= toRef(exec
); 
  57     JSObjectRef constructorRef 
= toRef(constructor
); 
  59     JSObjectCallAsConstructorCallback callback 
= static_cast<JSCallbackConstructor
*>(constructor
)->callback(); 
  61         int argumentCount 
= static_cast<int>(args
.size()); 
  62         Vector
<JSValueRef
, 16> arguments(argumentCount
); 
  63         for (int i 
= 0; i 
< argumentCount
; i
++) 
  64             arguments
[i
] = toRef(args
.at(exec
, i
)); 
  66         JSLock::DropAllLocks 
dropAllLocks(exec
); 
  67         return toJS(callback(ctx
, constructorRef
, argumentCount
, arguments
.data(), toRef(exec
->exceptionSlot()))); 
  70     return toJS(JSObjectMake(ctx
, static_cast<JSCallbackConstructor
*>(constructor
)->classRef(), 0)); 
  73 ConstructType 
JSCallbackConstructor::getConstructData(ConstructData
& constructData
) 
  75     constructData
.native
.function 
= constructJSCallback
; 
  76     return ConstructTypeHost
;