mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 983989 - Part b: Simplify code flow in XPCConvert::NativeData2JS; <3,r=bholley
This commit is contained in:
parent
7da37a381e
commit
599fcddb90
@ -105,16 +105,36 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
*pErr = NS_ERROR_XPC_BAD_CONVERT_NATIVE;
|
*pErr = NS_ERROR_XPC_BAD_CONVERT_NATIVE;
|
||||||
|
|
||||||
switch (type.TagPart()) {
|
switch (type.TagPart()) {
|
||||||
case nsXPTType::T_I8 : d.setInt32(*((int8_t*)s)); break;
|
case nsXPTType::T_I8 :
|
||||||
case nsXPTType::T_I16 : d.setInt32(*((int16_t*)s)); break;
|
d.setInt32(*((int8_t*)s));
|
||||||
case nsXPTType::T_I32 : d.setInt32(*((int32_t*)s)); break;
|
return true;
|
||||||
case nsXPTType::T_I64 : d.setNumber(double(*((int64_t*)s))); break;
|
case nsXPTType::T_I16 :
|
||||||
case nsXPTType::T_U8 : d.setInt32(*((uint8_t*)s)); break;
|
d.setInt32(*((int16_t*)s));
|
||||||
case nsXPTType::T_U16 : d.setInt32(*((uint16_t*)s)); break;
|
return true;
|
||||||
case nsXPTType::T_U32 : d.setNumber(*((uint32_t*)s)); break;
|
case nsXPTType::T_I32 :
|
||||||
case nsXPTType::T_U64 : d.setNumber(double(*((uint64_t*)s))); break;
|
d.setInt32(*((int32_t*)s));
|
||||||
case nsXPTType::T_FLOAT : d.setNumber(*((float*)s)); break;
|
return true;
|
||||||
case nsXPTType::T_DOUBLE: d.setNumber(*((double*)s)); break;
|
case nsXPTType::T_I64 :
|
||||||
|
d.setNumber(double(*((int64_t*)s)));
|
||||||
|
return true;
|
||||||
|
case nsXPTType::T_U8 :
|
||||||
|
d.setInt32(*((uint8_t*)s));
|
||||||
|
return true;
|
||||||
|
case nsXPTType::T_U16 :
|
||||||
|
d.setInt32(*((uint16_t*)s));
|
||||||
|
return true;
|
||||||
|
case nsXPTType::T_U32 :
|
||||||
|
d.setNumber(*((uint32_t*)s));
|
||||||
|
return true;
|
||||||
|
case nsXPTType::T_U64 :
|
||||||
|
d.setNumber(double(*((uint64_t*)s)));
|
||||||
|
return true;
|
||||||
|
case nsXPTType::T_FLOAT :
|
||||||
|
d.setNumber(*((float*)s));
|
||||||
|
return true;
|
||||||
|
case nsXPTType::T_DOUBLE:
|
||||||
|
d.setNumber(*((double*)s));
|
||||||
|
return true;
|
||||||
case nsXPTType::T_BOOL :
|
case nsXPTType::T_BOOL :
|
||||||
{
|
{
|
||||||
bool b = *((bool*)s);
|
bool b = *((bool*)s);
|
||||||
@ -122,7 +142,7 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
NS_WARN_IF_FALSE(b == 1 || b == 0,
|
NS_WARN_IF_FALSE(b == 1 || b == 0,
|
||||||
"Passing a malformed bool through XPConnect");
|
"Passing a malformed bool through XPConnect");
|
||||||
d.setBoolean(b);
|
d.setBoolean(b);
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
case nsXPTType::T_CHAR :
|
case nsXPTType::T_CHAR :
|
||||||
{
|
{
|
||||||
@ -138,7 +158,7 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
if (!(str = JS_NewStringCopyN(cx, p, 1)))
|
if (!(str = JS_NewStringCopyN(cx, p, 1)))
|
||||||
return false;
|
return false;
|
||||||
d.setString(str);
|
d.setString(str);
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
case nsXPTType::T_WCHAR :
|
case nsXPTType::T_WCHAR :
|
||||||
{
|
{
|
||||||
@ -149,7 +169,7 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
if (!(str = JS_NewUCStringCopyN(cx, p, 1)))
|
if (!(str = JS_NewUCStringCopyN(cx, p, 1)))
|
||||||
return false;
|
return false;
|
||||||
d.setString(str);
|
d.setString(str);
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
case nsXPTType::T_JSVAL :
|
case nsXPTType::T_JSVAL :
|
||||||
@ -157,15 +177,9 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
d.set(*((Value*)s));
|
d.set(*((Value*)s));
|
||||||
if (!JS_WrapValue(cx, d))
|
if (!JS_WrapValue(cx, d))
|
||||||
return false;
|
return false;
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
|
||||||
|
|
||||||
// set the default result
|
|
||||||
d.setNull();
|
|
||||||
|
|
||||||
switch (type.TagPart()) {
|
|
||||||
case nsXPTType::T_VOID:
|
case nsXPTType::T_VOID:
|
||||||
XPC_LOG_ERROR(("XPCConvert::NativeData2JS : void* params not supported"));
|
XPC_LOG_ERROR(("XPCConvert::NativeData2JS : void* params not supported"));
|
||||||
return false;
|
return false;
|
||||||
@ -173,14 +187,16 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
case nsXPTType::T_IID:
|
case nsXPTType::T_IID:
|
||||||
{
|
{
|
||||||
nsID* iid2 = *((nsID**)s);
|
nsID* iid2 = *((nsID**)s);
|
||||||
if (!iid2)
|
if (!iid2) {
|
||||||
break;
|
d.setNull();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
RootedObject scope(cx, JS::CurrentGlobalOrNull(cx));
|
RootedObject scope(cx, JS::CurrentGlobalOrNull(cx));
|
||||||
JSObject* obj;
|
JSObject* obj;
|
||||||
if (!(obj = xpc_NewIDObject(cx, scope, *iid2)))
|
if (!(obj = xpc_NewIDObject(cx, scope, *iid2)))
|
||||||
return false;
|
return false;
|
||||||
d.setObject(*obj);
|
d.setObject(*obj);
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
case nsXPTType::T_ASTRING:
|
case nsXPTType::T_ASTRING:
|
||||||
@ -189,28 +205,26 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
case nsXPTType::T_DOMSTRING:
|
case nsXPTType::T_DOMSTRING:
|
||||||
{
|
{
|
||||||
const nsAString* p = *((const nsAString**)s);
|
const nsAString* p = *((const nsAString**)s);
|
||||||
if (!p)
|
if (!p || p->IsVoid()) {
|
||||||
break;
|
d.setNull();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!p->IsVoid()) {
|
|
||||||
nsStringBuffer* buf;
|
nsStringBuffer* buf;
|
||||||
if (!XPCStringConvert::ReadableToJSVal(cx, *p, &buf, d))
|
if (!XPCStringConvert::ReadableToJSVal(cx, *p, &buf, d))
|
||||||
return false;
|
return false;
|
||||||
if (buf)
|
if (buf)
|
||||||
buf->AddRef();
|
buf->AddRef();
|
||||||
}
|
return true;
|
||||||
|
|
||||||
// *d is defaulted to JSVAL_NULL so no need to set it
|
|
||||||
// again if p is a "void" string
|
|
||||||
MOZ_ASSERT_IF(p->IsVoid(), d.isNull());
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case nsXPTType::T_CHAR_STR:
|
case nsXPTType::T_CHAR_STR:
|
||||||
{
|
{
|
||||||
char* p = *((char**)s);
|
char* p = *((char**)s);
|
||||||
if (!p)
|
if (!p) {
|
||||||
break;
|
d.setNull();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef STRICT_CHECK_OF_UNICODE
|
#ifdef STRICT_CHECK_OF_UNICODE
|
||||||
bool isAscii = true;
|
bool isAscii = true;
|
||||||
@ -225,30 +239,35 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
if (!(str = JS_NewStringCopyZ(cx, p)))
|
if (!(str = JS_NewStringCopyZ(cx, p)))
|
||||||
return false;
|
return false;
|
||||||
d.setString(str);
|
d.setString(str);
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
case nsXPTType::T_WCHAR_STR:
|
case nsXPTType::T_WCHAR_STR:
|
||||||
{
|
{
|
||||||
jschar* p = *((jschar**)s);
|
jschar* p = *((jschar**)s);
|
||||||
if (!p)
|
if (!p) {
|
||||||
break;
|
d.setNull();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
JSString* str;
|
JSString* str;
|
||||||
if (!(str = JS_NewUCStringCopyZ(cx, p)))
|
if (!(str = JS_NewUCStringCopyZ(cx, p)))
|
||||||
return false;
|
return false;
|
||||||
d.setString(str);
|
d.setString(str);
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
case nsXPTType::T_UTF8STRING:
|
case nsXPTType::T_UTF8STRING:
|
||||||
{
|
{
|
||||||
const nsACString* utf8String = *((const nsACString**)s);
|
const nsACString* utf8String = *((const nsACString**)s);
|
||||||
|
|
||||||
if (!utf8String || utf8String->IsVoid())
|
if (!utf8String || utf8String->IsVoid()) {
|
||||||
break;
|
d.setNull();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (utf8String->IsEmpty()) {
|
if (utf8String->IsEmpty()) {
|
||||||
d.set(JS_GetEmptyStringValue(cx));
|
d.set(JS_GetEmptyStringValue(cx));
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t len = CalcUTF8ToUnicodeLength(*utf8String);
|
const uint32_t len = CalcUTF8ToUnicodeLength(*utf8String);
|
||||||
@ -282,14 +301,16 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
}
|
}
|
||||||
|
|
||||||
d.setString(str);
|
d.setString(str);
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
case nsXPTType::T_CSTRING:
|
case nsXPTType::T_CSTRING:
|
||||||
{
|
{
|
||||||
const nsACString* cString = *((const nsACString**)s);
|
const nsACString* cString = *((const nsACString**)s);
|
||||||
|
|
||||||
if (!cString || cString->IsVoid())
|
if (!cString || cString->IsVoid()) {
|
||||||
break;
|
d.setNull();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// c-strings (binary blobs) are deliberately not converted from
|
// c-strings (binary blobs) are deliberately not converted from
|
||||||
// UTF-8 to UTF-16. T_UTF8Sting is for UTF-8 encoded strings
|
// UTF-8 to UTF-16. T_UTF8Sting is for UTF-8 encoded strings
|
||||||
@ -300,14 +321,18 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
d.setString(str);
|
d.setString(str);
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
case nsXPTType::T_INTERFACE:
|
case nsXPTType::T_INTERFACE:
|
||||||
case nsXPTType::T_INTERFACE_IS:
|
case nsXPTType::T_INTERFACE_IS:
|
||||||
{
|
{
|
||||||
nsISupports* iface = *((nsISupports**)s);
|
nsISupports* iface = *((nsISupports**)s);
|
||||||
if (iface) {
|
if (!iface) {
|
||||||
|
d.setNull();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (iid->Equals(NS_GET_IID(nsIVariant))) {
|
if (iid->Equals(NS_GET_IID(nsIVariant))) {
|
||||||
nsCOMPtr<nsIVariant> variant = do_QueryInterface(iface);
|
nsCOMPtr<nsIVariant> variant = do_QueryInterface(iface);
|
||||||
if (!variant)
|
if (!variant)
|
||||||
@ -318,25 +343,13 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s,
|
|||||||
}
|
}
|
||||||
// else...
|
// else...
|
||||||
xpcObjectHelper helper(iface);
|
xpcObjectHelper helper(iface);
|
||||||
if (!NativeInterface2JSObject(d, nullptr, helper, iid,
|
return NativeInterface2JSObject(d, nullptr, helper, iid, nullptr, true, pErr);
|
||||||
nullptr, true, pErr))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
JSObject* jsobj = d.toObjectOrNull();
|
|
||||||
if (jsobj && !js::GetObjectParent(jsobj))
|
|
||||||
MOZ_ASSERT(js::GetObjectClass(jsobj)->flags & JSCLASS_IS_GLOBAL,
|
|
||||||
"Why did we recreate this wrapper?");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
NS_ERROR("bad type");
|
NS_ERROR("bad type");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user