JSBool xpc_qsXPCOMObjectToJsval(XPCLazyCallContext &lccx, qsObjectHelper &aHelper, const nsIID *iid, XPCNativeInterface **iface, jsval *rval) { NS_PRECONDITION(iface, "Who did that and why?"); // From the T_INTERFACE case in XPCConvert::NativeData2JS. // This is one of the slowest things quick stubs do. JSContext *cx = lccx.GetJSContext(); nsresult rv; if (!XPCConvert::NativeInterface2JSObject(lccx, rval, nullptr, aHelper, iid, iface, true, &rv)) { // I can't tell if NativeInterface2JSObject throws JS exceptions // or not. This is a sloppy stab at the right semantics; the // method really ought to be fixed to behave consistently. if (!JS_IsExceptionPending(cx)) xpc_qsThrow(cx, NS_FAILED(rv) ? rv : NS_ERROR_UNEXPECTED); return false; } #ifdef DEBUG JSObject* jsobj = JSVAL_TO_OBJECT(*rval); if (jsobj && !js::GetObjectParent(jsobj)) NS_ASSERTION(js::GetObjectClass(jsobj)->flags & JSCLASS_IS_GLOBAL, "Why did we recreate this wrapper?"); #endif return true; }
JSBool xpc_qsVariantToJsval(XPCLazyCallContext &lccx, nsIVariant *p, jsval *rval) { // From the T_INTERFACE case in XPCConvert::NativeData2JS. // Error handling is in XPCWrappedNative::CallMethod. if (p) { nsresult rv; JSBool ok = XPCVariant::VariantDataToJS(lccx, p, &rv, rval); if (!ok) xpc_qsThrow(lccx.GetJSContext(), rv); return ok; } *rval = JSVAL_NULL; return true; }
JSBool xpc_qsXPCOMObjectToJsval(XPCLazyCallContext &lccx, nsISupports *p, nsWrapperCache *cache, const nsIID *iid, XPCNativeInterface **iface, jsval *rval) { // From the T_INTERFACE case in XPCConvert::NativeData2JS. // This is one of the slowest things quick stubs do. JSContext *cx = lccx.GetJSContext(); if(!iface) return xpc_qsThrow(cx, NS_ERROR_XPC_BAD_CONVERT_NATIVE); // XXX The OBJ_IS_NOT_GLOBAL here is not really right. In // fact, this code is depending on the fact that the // global object will not have been collected, and // therefore this NativeInterface2JSObject will not end up // creating a new XPCNativeScriptableShared. nsresult rv; if(!XPCConvert::NativeInterface2JSObject(lccx, rval, nsnull, p, iid, iface, cache, lccx.GetCurrentJSObject(), PR_TRUE, OBJ_IS_NOT_GLOBAL, &rv)) { // I can't tell if NativeInterface2JSObject throws JS exceptions // or not. This is a sloppy stab at the right semantics; the // method really ought to be fixed to behave consistently. if(!JS_IsExceptionPending(cx)) xpc_qsThrow(cx, NS_FAILED(rv) ? rv : NS_ERROR_UNEXPECTED); return JS_FALSE; } #ifdef DEBUG JSObject* jsobj = JSVAL_TO_OBJECT(*rval); if(jsobj && !STOBJ_GET_PARENT(jsobj)) NS_ASSERTION(STOBJ_GET_CLASS(jsobj)->flags & JSCLASS_IS_GLOBAL, "Why did we recreate this wrapper?"); #endif return JS_TRUE; }