18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef APICast_h 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define APICast_h 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "JSAPIValueWrapper.h" 30cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include "JSGlobalObject.h" 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "JSValue.h" 325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/UnusedParam.h> 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace JSC { 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class ExecState; 36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class PropertyNameArray; 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class JSGlobalData; 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class JSObject; 395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian class JSValue; 40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef const struct OpaqueJSContextGroup* JSContextGroupRef; 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef const struct OpaqueJSContext* JSContextRef; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef struct OpaqueJSContext* JSGlobalContextRef; 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef struct OpaqueJSPropertyNameAccumulator* JSPropertyNameAccumulatorRef; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef const struct OpaqueJSValue* JSValueRef; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef struct OpaqueJSValue* JSObjectRef; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* Opaque typing convenience methods */ 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSC::ExecState* toJS(JSContextRef c) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(c); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSC::ExecState*>(const_cast<OpaqueJSContext*>(c)); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSC::ExecState* toJS(JSGlobalContextRef c) 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(c); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSC::ExecState*>(c); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockinline JSC::JSValue toJS(JSC::ExecState* exec, JSValueRef v) 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_UNUSED(exec, exec); 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(v); 670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64) 680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSCell* jsCell = reinterpret_cast<JSC::JSCell*>(const_cast<OpaqueJSValue*>(v)); 690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!jsCell) 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return JSC::JSValue(); 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (jsCell->isAPIValueWrapper()) 720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return static_cast<JSC::JSAPIValueWrapper*>(jsCell)->value(); 730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return jsCell; 745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(const_cast<OpaqueJSValue*>(v))); 765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 79643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockinline JSC::JSValue toJSForGC(JSC::ExecState* exec, JSValueRef v) 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT_UNUSED(exec, exec); 82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(v); 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(JSVALUE32_64) 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block JSC::JSCell* jsCell = reinterpret_cast<JSC::JSCell*>(const_cast<OpaqueJSValue*>(v)); 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!jsCell) 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return JSC::JSValue(); 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return jsCell; 88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else 89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(const_cast<OpaqueJSValue*>(v))); 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSC::JSObject* toJS(JSObjectRef o) 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSC::JSObject*>(o); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSC::PropertyNameArray* toJS(JSPropertyNameAccumulatorRef a) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSC::PropertyNameArray*>(a); 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSC::JSGlobalData* toJS(JSContextGroupRef g) 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSC::JSGlobalData*>(const_cast<OpaqueJSContextGroup*>(g)); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianinline JSValueRef toRef(JSC::ExecState* exec, JSC::JSValue v) 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64) 1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!v) 1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return 0; 1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!v.isCell()) 114e14391e94c850b8bd03680c23b38978db68687a8John Reck return reinterpret_cast<JSValueRef>(JSC::jsAPIValueWrapper(exec, v).asCell()); 115e14391e94c850b8bd03680c23b38978db68687a8John Reck return reinterpret_cast<JSValueRef>(v.asCell()); 1165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch UNUSED_PARAM(exec); 1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return reinterpret_cast<JSValueRef>(JSC::JSValue::encode(v)); 1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSObjectRef toRef(JSC::JSObject* o) 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSObjectRef>(o); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSObjectRef toRef(const JSC::JSObject* o) 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSObjectRef>(const_cast<JSC::JSObject*>(o)); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSContextRef toRef(JSC::ExecState* e) 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSContextRef>(e); 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSGlobalContextRef toGlobalRef(JSC::ExecState* e) 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 139cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(e == e->lexicalGlobalObject()->globalExec()); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSGlobalContextRef>(e); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSPropertyNameAccumulatorRef toRef(JSC::PropertyNameArray* l) 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSPropertyNameAccumulatorRef>(l); 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline JSContextGroupRef toRef(JSC::JSGlobalData* g) 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return reinterpret_cast<JSContextGroupRef>(g); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // APICast_h 154