X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..refs/heads/master:/API/APICast.h diff --git a/API/APICast.h b/API/APICast.h index 1344a16..8fe8d60 100644 --- a/API/APICast.h +++ b/API/APICast.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2006 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,10 +10,10 @@ * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR @@ -26,14 +26,17 @@ #ifndef APICast_h #define APICast_h -#include "JSValue.h" +#include "JSAPIValueWrapper.h" +#include "JSCJSValue.h" +#include "JSCJSValueInlines.h" +#include "JSGlobalObject.h" namespace JSC { class ExecState; class PropertyNameArray; - class JSGlobalData; + class VM; class JSObject; - class JSValuePtr; + class JSValue; } typedef const struct OpaqueJSContextGroup* JSContextGroupRef; @@ -47,42 +50,91 @@ typedef struct OpaqueJSValue* JSObjectRef; inline JSC::ExecState* toJS(JSContextRef c) { + ASSERT(c); return reinterpret_cast(const_cast(c)); } inline JSC::ExecState* toJS(JSGlobalContextRef c) { + ASSERT(c); return reinterpret_cast(c); } -inline JSC::JSValuePtr toJS(JSValueRef v) +inline JSC::JSValue toJS(JSC::ExecState* exec, JSValueRef v) { - return JSC::JSValuePtr::decode(reinterpret_cast(const_cast(v))); + ASSERT_UNUSED(exec, exec); +#if USE(JSVALUE32_64) + JSC::JSCell* jsCell = reinterpret_cast(const_cast(v)); + if (!jsCell) + return JSC::jsNull(); + JSC::JSValue result; + if (jsCell->isAPIValueWrapper()) + result = JSC::jsCast(jsCell)->value(); + else + result = jsCell; +#else + JSC::JSValue result = JSC::JSValue::decode(reinterpret_cast(const_cast(v))); +#endif + if (!result) + return JSC::jsNull(); + if (result.isCell()) + RELEASE_ASSERT(result.asCell()->methodTable()); + return result; } -inline JSC::JSObject* toJS(JSObjectRef o) +inline JSC::JSValue toJSForGC(JSC::ExecState* exec, JSValueRef v) +{ + ASSERT_UNUSED(exec, exec); +#if USE(JSVALUE32_64) + JSC::JSCell* jsCell = reinterpret_cast(const_cast(v)); + if (!jsCell) + return JSC::JSValue(); + JSC::JSValue result = jsCell; +#else + JSC::JSValue result = JSC::JSValue::decode(reinterpret_cast(const_cast(v))); +#endif + if (result && result.isCell()) + RELEASE_ASSERT(result.asCell()->methodTable()); + return result; +} + +// Used in JSObjectGetPrivate as that may be called during finalization +inline JSC::JSObject* uncheckedToJS(JSObjectRef o) { return reinterpret_cast(o); } -inline JSC::PropertyNameArray* toJS(JSPropertyNameAccumulatorRef a) +inline JSC::JSObject* toJS(JSObjectRef o) { - return reinterpret_cast(a); + JSC::JSObject* object = uncheckedToJS(o); + if (object) + RELEASE_ASSERT(object->methodTable()); + return object; } -inline JSC::JSGlobalData* toJS(JSContextGroupRef g) +inline JSC::PropertyNameArray* toJS(JSPropertyNameAccumulatorRef a) { - return reinterpret_cast(const_cast(g)); + return reinterpret_cast(a); } -inline JSValueRef toRef(JSC::JSValuePtr v) +inline JSC::VM* toJS(JSContextGroupRef g) { - return reinterpret_cast(JSC::JSValuePtr::encode(v)); + return reinterpret_cast(const_cast(g)); } -inline JSValueRef* toRef(JSC::JSValuePtr* v) +inline JSValueRef toRef(JSC::ExecState* exec, JSC::JSValue v) { - return reinterpret_cast(v); + ASSERT(exec->vm().currentThreadIsHoldingAPILock()); +#if USE(JSVALUE32_64) + if (!v) + return 0; + if (!v.isCell()) + return reinterpret_cast(JSC::jsAPIValueWrapper(exec, v).asCell()); + return reinterpret_cast(v.asCell()); +#else + UNUSED_PARAM(exec); + return reinterpret_cast(JSC::JSValue::encode(v)); +#endif } inline JSObjectRef toRef(JSC::JSObject* o) @@ -102,6 +154,7 @@ inline JSContextRef toRef(JSC::ExecState* e) inline JSGlobalContextRef toGlobalRef(JSC::ExecState* e) { + ASSERT(e == e->lexicalGlobalObject()->globalExec()); return reinterpret_cast(e); } @@ -110,7 +163,7 @@ inline JSPropertyNameAccumulatorRef toRef(JSC::PropertyNameArray* l) return reinterpret_cast(l); } -inline JSContextGroupRef toRef(JSC::JSGlobalData* g) +inline JSContextGroupRef toRef(JSC::VM* g) { return reinterpret_cast(g); }