X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/b37bf2e156556c589aea3e1f58a377f2b1189665..refs/heads/master:/API/APICast.h diff --git a/API/APICast.h b/API/APICast.h index d8c7c18..8fe8d60 100644 --- a/API/APICast.h +++ b/API/APICast.h @@ -1,6 +1,5 @@ -// -*- mode: c++; c-basic-offset: 4 -*- /* - * 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 @@ -11,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 @@ -27,94 +26,146 @@ #ifndef APICast_h #define APICast_h -#include "ustring.h" -#include "ExecState.h" +#include "JSAPIValueWrapper.h" +#include "JSCJSValue.h" +#include "JSCJSValueInlines.h" +#include "JSGlobalObject.h" -namespace KJS { +namespace JSC { class ExecState; - class JSValue; - class JSObject; class PropertyNameArray; + class VM; + class JSObject; + class JSValue; } +typedef const struct OpaqueJSContextGroup* JSContextGroupRef; typedef const struct OpaqueJSContext* JSContextRef; typedef struct OpaqueJSContext* JSGlobalContextRef; -typedef struct OpaqueJSString* JSStringRef; typedef struct OpaqueJSPropertyNameAccumulator* JSPropertyNameAccumulatorRef; typedef const struct OpaqueJSValue* JSValueRef; typedef struct OpaqueJSValue* JSObjectRef; /* Opaque typing convenience methods */ -inline KJS::ExecState* toJS(JSContextRef c) +inline JSC::ExecState* toJS(JSContextRef c) { - return reinterpret_cast(const_cast(c)); + ASSERT(c); + return reinterpret_cast(const_cast(c)); } -inline KJS::ExecState* toJS(JSGlobalContextRef c) +inline JSC::ExecState* toJS(JSGlobalContextRef c) { - return reinterpret_cast(c); + ASSERT(c); + return reinterpret_cast(c); } -inline KJS::JSValue* toJS(JSValueRef v) +inline JSC::JSValue toJS(JSC::ExecState* exec, JSValueRef v) { - return 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 KJS::UString::Rep* toJS(JSStringRef b) +inline JSC::JSValue toJSForGC(JSC::ExecState* exec, JSValueRef v) { - return reinterpret_cast(b); + 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; } -inline KJS::JSObject* toJS(JSObjectRef o) +// Used in JSObjectGetPrivate as that may be called during finalization +inline JSC::JSObject* uncheckedToJS(JSObjectRef o) { - return reinterpret_cast(o); + return reinterpret_cast(o); } -inline KJS::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 JSValueRef toRef(KJS::JSValue* v) +inline JSC::PropertyNameArray* toJS(JSPropertyNameAccumulatorRef a) { - return reinterpret_cast(v); + return reinterpret_cast(a); } -inline JSValueRef* toRef(KJS::JSValue** v) +inline JSC::VM* toJS(JSContextGroupRef g) { - return reinterpret_cast(const_cast(v)); + return reinterpret_cast(const_cast(g)); } -inline JSStringRef toRef(KJS::UString::Rep* s) +inline JSValueRef toRef(JSC::ExecState* exec, JSC::JSValue v) { - return reinterpret_cast(s); + 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(KJS::JSObject* o) +inline JSObjectRef toRef(JSC::JSObject* o) { return reinterpret_cast(o); } -inline JSObjectRef toRef(const KJS::JSObject* o) +inline JSObjectRef toRef(const JSC::JSObject* o) { - return reinterpret_cast(const_cast(o)); + return reinterpret_cast(const_cast(o)); } -inline JSContextRef toRef(KJS::ExecState* e) +inline JSContextRef toRef(JSC::ExecState* e) { return reinterpret_cast(e); } -inline JSGlobalContextRef toGlobalRef(KJS::ExecState* e) +inline JSGlobalContextRef toGlobalRef(JSC::ExecState* e) { - ASSERT(!e->callingExecState()); + ASSERT(e == e->lexicalGlobalObject()->globalExec()); return reinterpret_cast(e); } -inline JSPropertyNameAccumulatorRef toRef(KJS::PropertyNameArray* l) +inline JSPropertyNameAccumulatorRef toRef(JSC::PropertyNameArray* l) { return reinterpret_cast(l); } +inline JSContextGroupRef toRef(JSC::VM* g) +{ + return reinterpret_cast(g); +} + #endif // APICast_h