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