JavaScriptCore/API/APICast.h
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2006 Apple Computer, 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 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. 
       
    24  */
       
    25 
       
    26 #ifndef APICast_h
       
    27 #define APICast_h
       
    28 
       
    29 #include "JSAPIValueWrapper.h"
       
    30 #include "JSGlobalObject.h"
       
    31 #include "JSValue.h"
       
    32 #include <wtf/UnusedParam.h>
       
    33 
       
    34 namespace JSC {
       
    35     class ExecState;
       
    36     class PropertyNameArray;
       
    37     class JSGlobalData;
       
    38     class JSObject;
       
    39     class JSValue;
       
    40 }
       
    41 
       
    42 typedef const struct OpaqueJSContextGroup* JSContextGroupRef;
       
    43 typedef const struct OpaqueJSContext* JSContextRef;
       
    44 typedef struct OpaqueJSContext* JSGlobalContextRef;
       
    45 typedef struct OpaqueJSPropertyNameAccumulator* JSPropertyNameAccumulatorRef;
       
    46 typedef const struct OpaqueJSValue* JSValueRef;
       
    47 typedef struct OpaqueJSValue* JSObjectRef;
       
    48 
       
    49 /* Opaque typing convenience methods */
       
    50 
       
    51 inline JSC::ExecState* toJS(JSContextRef c)
       
    52 {
       
    53     ASSERT(c);
       
    54     return reinterpret_cast<JSC::ExecState*>(const_cast<OpaqueJSContext*>(c));
       
    55 }
       
    56 
       
    57 inline JSC::ExecState* toJS(JSGlobalContextRef c)
       
    58 {
       
    59     ASSERT(c);
       
    60     return reinterpret_cast<JSC::ExecState*>(c);
       
    61 }
       
    62 
       
    63 inline JSC::JSValue toJS(JSC::ExecState* exec, JSValueRef v)
       
    64 {
       
    65     ASSERT_UNUSED(exec, exec);
       
    66     ASSERT(v);
       
    67 #if USE(JSVALUE32_64)
       
    68     JSC::JSCell* jsCell = reinterpret_cast<JSC::JSCell*>(const_cast<OpaqueJSValue*>(v));
       
    69     if (!jsCell)
       
    70         return JSC::JSValue();
       
    71     if (jsCell->isAPIValueWrapper())
       
    72         return static_cast<JSC::JSAPIValueWrapper*>(jsCell)->value();
       
    73     return jsCell;
       
    74 #else
       
    75     return JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(const_cast<OpaqueJSValue*>(v)));
       
    76 #endif
       
    77 }
       
    78 
       
    79 inline JSC::JSValue toJSForGC(JSC::ExecState* exec, JSValueRef v)
       
    80 {
       
    81     ASSERT_UNUSED(exec, exec);
       
    82     ASSERT(v);
       
    83 #if USE(JSVALUE32_64)
       
    84     JSC::JSCell* jsCell = reinterpret_cast<JSC::JSCell*>(const_cast<OpaqueJSValue*>(v));
       
    85     if (!jsCell)
       
    86         return JSC::JSValue();
       
    87     return jsCell;
       
    88 #else
       
    89     return JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(const_cast<OpaqueJSValue*>(v)));
       
    90 #endif
       
    91 }
       
    92 
       
    93 inline JSC::JSObject* toJS(JSObjectRef o)
       
    94 {
       
    95     return reinterpret_cast<JSC::JSObject*>(o);
       
    96 }
       
    97 
       
    98 inline JSC::PropertyNameArray* toJS(JSPropertyNameAccumulatorRef a)
       
    99 {
       
   100     return reinterpret_cast<JSC::PropertyNameArray*>(a);
       
   101 }
       
   102 
       
   103 inline JSC::JSGlobalData* toJS(JSContextGroupRef g)
       
   104 {
       
   105     return reinterpret_cast<JSC::JSGlobalData*>(const_cast<OpaqueJSContextGroup*>(g));
       
   106 }
       
   107 
       
   108 inline JSValueRef toRef(JSC::ExecState* exec, JSC::JSValue v)
       
   109 {
       
   110 #if USE(JSVALUE32_64)
       
   111     if (!v)
       
   112         return 0;
       
   113     if (!v.isCell())
       
   114         return reinterpret_cast<JSValueRef>(asCell(JSC::jsAPIValueWrapper(exec, v)));
       
   115     return reinterpret_cast<JSValueRef>(asCell(v));
       
   116 #else
       
   117     UNUSED_PARAM(exec);
       
   118     return reinterpret_cast<JSValueRef>(JSC::JSValue::encode(v));
       
   119 #endif
       
   120 }
       
   121 
       
   122 inline JSObjectRef toRef(JSC::JSObject* o)
       
   123 {
       
   124     return reinterpret_cast<JSObjectRef>(o);
       
   125 }
       
   126 
       
   127 inline JSObjectRef toRef(const JSC::JSObject* o)
       
   128 {
       
   129     return reinterpret_cast<JSObjectRef>(const_cast<JSC::JSObject*>(o));
       
   130 }
       
   131 
       
   132 inline JSContextRef toRef(JSC::ExecState* e)
       
   133 {
       
   134     return reinterpret_cast<JSContextRef>(e);
       
   135 }
       
   136 
       
   137 inline JSGlobalContextRef toGlobalRef(JSC::ExecState* e)
       
   138 {
       
   139     ASSERT(e == e->lexicalGlobalObject()->globalExec());
       
   140     return reinterpret_cast<JSGlobalContextRef>(e);
       
   141 }
       
   142 
       
   143 inline JSPropertyNameAccumulatorRef toRef(JSC::PropertyNameArray* l)
       
   144 {
       
   145     return reinterpret_cast<JSPropertyNameAccumulatorRef>(l);
       
   146 }
       
   147 
       
   148 inline JSContextGroupRef toRef(JSC::JSGlobalData* g)
       
   149 {
       
   150     return reinterpret_cast<JSContextGroupRef>(g);
       
   151 }
       
   152 
       
   153 #endif // APICast_h