/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
case nsIDataType::VTYPE_UINT32:
aOutData->u.mUint32Value = u.mUint32Value;
aOutData->mType = nsIDataType::VTYPE_UINT32; return NS_OK;
// This group results in a double...
case nsIDataType::VTYPE_INT64: case nsIDataType::VTYPE_UINT64: // XXX Need boundary checking here. // We may need to return NS_SUCCESS_LOSS_OF_INSIGNIFICANT_DATA
aOutData->u.mDoubleValue = double(u.mInt64Value);
aOutData->mType = nsIDataType::VTYPE_DOUBLE; return NS_OK; case nsIDataType::VTYPE_FLOAT:
aOutData->u.mDoubleValue = u.mFloatValue;
aOutData->mType = nsIDataType::VTYPE_DOUBLE; return NS_OK; case nsIDataType::VTYPE_DOUBLE:
aOutData->u.mDoubleValue = u.mDoubleValue;
aOutData->mType = nsIDataType::VTYPE_DOUBLE; return NS_OK; case nsIDataType::VTYPE_CHAR_STR: case nsIDataType::VTYPE_STRING_SIZE_IS:
rv = String2Double(u.str.mStringValue, &aOutData->u.mDoubleValue); if (NS_FAILED(rv)) { return rv;
}
aOutData->mType = nsIDataType::VTYPE_DOUBLE; return NS_OK; case nsIDataType::VTYPE_ASTRING:
rv = AString2Double(*u.mAStringValue, &aOutData->u.mDoubleValue); if (NS_FAILED(rv)) { return rv;
}
aOutData->mType = nsIDataType::VTYPE_DOUBLE; return NS_OK; case nsIDataType::VTYPE_UTF8STRING:
rv = AUTF8String2Double(*u.mUTF8StringValue, &aOutData->u.mDoubleValue); if (NS_FAILED(rv)) { return rv;
}
aOutData->mType = nsIDataType::VTYPE_DOUBLE; return NS_OK; case nsIDataType::VTYPE_CSTRING:
rv = ACString2Double(*u.mCStringValue, &aOutData->u.mDoubleValue); if (NS_FAILED(rv)) { return rv;
}
aOutData->mType = nsIDataType::VTYPE_DOUBLE; return NS_OK; case nsIDataType::VTYPE_WCHAR_STR: case nsIDataType::VTYPE_WSTRING_SIZE_IS:
rv = AString2Double(nsDependentString(u.wstr.mWStringValue),
&aOutData->u.mDoubleValue); if (NS_FAILED(rv)) { return rv;
}
aOutData->mType = nsIDataType::VTYPE_DOUBLE; return NS_OK;
// This group fails...
case nsIDataType::VTYPE_VOID: case nsIDataType::VTYPE_ID: case nsIDataType::VTYPE_INTERFACE: case nsIDataType::VTYPE_INTERFACE_IS: case nsIDataType::VTYPE_ARRAY: case nsIDataType::VTYPE_EMPTY_ARRAY: case nsIDataType::VTYPE_EMPTY: default: return NS_ERROR_CANNOT_CONVERT_DATA;
}
}
#define CASE__FREE_ARRAY_PTR(type_, ctype_) \ case nsIDataType::type_: { \
ctype_** p = (ctype_**)u.array.mArrayValue; \ for (uint32_t i = u.array.mArrayCount; i > 0; p++, i--) \ if (*p) free((char*)*p); \ break; \
}
#define CASE__FREE_ARRAY_IFACE(type_, ctype_) \ case nsIDataType::type_: { \
ctype_** p = (ctype_**)u.array.mArrayValue; \ for (uint32_t i = u.array.mArrayCount; i > 0; p++, i--) \ if (*p) (*p)->Release(); \ break; \
}
switch (u.array.mArrayType) { case nsIDataType::VTYPE_INT8: case nsIDataType::VTYPE_INT16: case nsIDataType::VTYPE_INT32: case nsIDataType::VTYPE_INT64: case nsIDataType::VTYPE_UINT8: case nsIDataType::VTYPE_UINT16: case nsIDataType::VTYPE_UINT32: case nsIDataType::VTYPE_UINT64: case nsIDataType::VTYPE_FLOAT: case nsIDataType::VTYPE_DOUBLE: case nsIDataType::VTYPE_BOOL: case nsIDataType::VTYPE_CHAR: case nsIDataType::VTYPE_WCHAR: break;
// XXX We ASSUME that "array of nsID" means "array of pointers to nsID".
CASE__FREE_ARRAY_PTR(VTYPE_ID, nsID)
CASE__FREE_ARRAY_PTR(VTYPE_CHAR_STR, char)
CASE__FREE_ARRAY_PTR(VTYPE_WCHAR_STR, char16_t)
CASE__FREE_ARRAY_IFACE(VTYPE_INTERFACE, nsISupports)
CASE__FREE_ARRAY_IFACE(VTYPE_INTERFACE_IS, nsISupports)
// The rest are illegal. case nsIDataType::VTYPE_VOID: case nsIDataType::VTYPE_ASTRING: case nsIDataType::VTYPE_UTF8STRING: case nsIDataType::VTYPE_CSTRING: case nsIDataType::VTYPE_WSTRING_SIZE_IS: case nsIDataType::VTYPE_STRING_SIZE_IS: case nsIDataType::VTYPE_ARRAY: case nsIDataType::VTYPE_EMPTY_ARRAY: case nsIDataType::VTYPE_EMPTY: default:
NS_ERROR("bad type in array!"); break;
}
// Free the array memory.
free((char*)u.array.mArrayValue);
// First we figure out the size of the elements for the new u.array.
size_t elementSize;
size_t allocSize;
switch (aInType) { case nsIDataType::VTYPE_INT8:
elementSize = sizeof(int8_t); break; case nsIDataType::VTYPE_INT16:
elementSize = sizeof(int16_t); break; case nsIDataType::VTYPE_INT32:
elementSize = sizeof(int32_t); break; case nsIDataType::VTYPE_INT64:
elementSize = sizeof(int64_t); break; case nsIDataType::VTYPE_UINT8:
elementSize = sizeof(uint8_t); break; case nsIDataType::VTYPE_UINT16:
elementSize = sizeof(uint16_t); break; case nsIDataType::VTYPE_UINT32:
elementSize = sizeof(uint32_t); break; case nsIDataType::VTYPE_UINT64:
elementSize = sizeof(uint64_t); break; case nsIDataType::VTYPE_FLOAT:
elementSize = sizeof(float); break; case nsIDataType::VTYPE_DOUBLE:
elementSize = sizeof(double); break; case nsIDataType::VTYPE_BOOL:
elementSize = sizeof(bool); break; case nsIDataType::VTYPE_CHAR:
elementSize = sizeof(char); break; case nsIDataType::VTYPE_WCHAR:
elementSize = sizeof(char16_t); break;
// XXX We ASSUME that "array of nsID" means "array of pointers to nsID". case nsIDataType::VTYPE_ID: case nsIDataType::VTYPE_CHAR_STR: case nsIDataType::VTYPE_WCHAR_STR: case nsIDataType::VTYPE_INTERFACE: case nsIDataType::VTYPE_INTERFACE_IS:
elementSize = sizeof(void*); break;
// The rest are illegal. case nsIDataType::VTYPE_ASTRING: case nsIDataType::VTYPE_UTF8STRING: case nsIDataType::VTYPE_CSTRING: case nsIDataType::VTYPE_STRING_SIZE_IS: case nsIDataType::VTYPE_WSTRING_SIZE_IS: case nsIDataType::VTYPE_VOID: case nsIDataType::VTYPE_ARRAY: case nsIDataType::VTYPE_EMPTY_ARRAY: case nsIDataType::VTYPE_EMPTY: default:
NS_ERROR("bad type in array!"); return NS_ERROR_CANNOT_CONVERT_DATA;
}
switch (aInType) { case nsIDataType::VTYPE_INT8: case nsIDataType::VTYPE_INT16: case nsIDataType::VTYPE_INT32: case nsIDataType::VTYPE_INT64: case nsIDataType::VTYPE_UINT8: case nsIDataType::VTYPE_UINT16: case nsIDataType::VTYPE_UINT32: case nsIDataType::VTYPE_UINT64: case nsIDataType::VTYPE_FLOAT: case nsIDataType::VTYPE_DOUBLE: case nsIDataType::VTYPE_BOOL: case nsIDataType::VTYPE_CHAR: case nsIDataType::VTYPE_WCHAR:
memcpy(*aOutValue, aInValue, allocSize); break;
case nsIDataType::VTYPE_INTERFACE_IS: if (aOutIID) {
*aOutIID = *aInIID;
}
[[fallthrough]];
case nsIDataType::VTYPE_INTERFACE: {
memcpy(*aOutValue, aInValue, allocSize);
nsISupports** p = (nsISupports**)*aOutValue; for (i = aInCount; i > 0; ++p, --i) if (*p) {
(*p)->AddRef();
} break;
}
// XXX We ASSUME that "array of nsID" means "array of pointers to nsID". case nsIDataType::VTYPE_ID: {
nsID** inp = (nsID**)aInValue;
nsID** outp = (nsID**)*aOutValue; for (i = aInCount; i > 0; --i) {
nsID* idp = *(inp++); if (idp) {
*(outp++) = idp->Clone();
} else {
*(outp++) = nullptr;
}
} break;
}
case nsIDataType::VTYPE_CHAR_STR: { char** inp = (char**)aInValue; char** outp = (char**)*aOutValue; for (i = aInCount; i > 0; i--) { char* str = *(inp++); if (str) {
*(outp++) = moz_xstrdup(str);
} else {
*(outp++) = nullptr;
}
} break;
}
case nsIDataType::VTYPE_WCHAR_STR: {
char16_t** inp = (char16_t**)aInValue;
char16_t** outp = (char16_t**)*aOutValue; for (i = aInCount; i > 0; i--) {
char16_t* str = *(inp++); if (str) {
*(outp++) = NS_xstrdup(str);
} else {
*(outp++) = nullptr;
}
} break;
}
// The rest are illegal. case nsIDataType::VTYPE_VOID: case nsIDataType::VTYPE_ARRAY: case nsIDataType::VTYPE_EMPTY_ARRAY: case nsIDataType::VTYPE_EMPTY: case nsIDataType::VTYPE_ASTRING: case nsIDataType::VTYPE_UTF8STRING: case nsIDataType::VTYPE_CSTRING: case nsIDataType::VTYPE_STRING_SIZE_IS: case nsIDataType::VTYPE_WSTRING_SIZE_IS: default:
NS_ERROR("bad type in array!"); return NS_ERROR_CANNOT_CONVERT_DATA;
}
// XXX toFloat conversions need to be fixed!
NUMERIC_CONVERSION_METHOD_BEGIN(VTYPE_FLOAT, float, Float)
CASE__NUMERIC_CONVERSION_INT32_JUST_CAST(float)
CASE__NUMERIC_CONVERSION_UINT32_JUST_CAST(float)
CASE__NUMERIC_CONVERSION_DOUBLE_JUST_CAST(float)
NUMERIC_CONVERSION_METHOD_END
double val;
nsresult rv = ConvertToDouble(&val); if (NS_FAILED(rv)) { return rv;
} // NaN is falsy in JS, so we might as well make it false here. if (std::isnan(val)) {
*aResult = false;
} else {
*aResult = 0.0 != val;
} return rv;
}
switch (mType) { case nsIDataType::VTYPE_CHAR_STR: case nsIDataType::VTYPE_STRING_SIZE_IS: return aPid->Parse(u.str.mStringValue); case nsIDataType::VTYPE_CSTRING: return aPid->Parse(PromiseFlatCString(*u.mCStringValue).get()); case nsIDataType::VTYPE_UTF8STRING: return aPid->Parse(PromiseFlatUTF8String(*u.mUTF8StringValue).get()); case nsIDataType::VTYPE_ASTRING:
pString = u.mAStringValue; break; case nsIDataType::VTYPE_WCHAR_STR: case nsIDataType::VTYPE_WSTRING_SIZE_IS:
tempString.Assign(u.wstr.mWStringValue);
pString = &tempString; break; default:
NS_ERROR("bad type in call to String2ID"); returnfalse;
}
char* pChars = ToNewCString(*pString, mozilla::fallible); if (!pChars) { returnfalse;
} bool result = aPid->Parse(pChars);
free(pChars); return result;
}
switch (mType) { case nsIDataType::VTYPE_ID:
*aResult = u.mIDValue; return NS_OK; case nsIDataType::VTYPE_INTERFACE:
*aResult = NS_GET_IID(nsISupports); return NS_OK; case nsIDataType::VTYPE_INTERFACE_IS:
*aResult = u.iface.mInterfaceID; return NS_OK; case nsIDataType::VTYPE_ASTRING: case nsIDataType::VTYPE_UTF8STRING: case nsIDataType::VTYPE_CSTRING: case nsIDataType::VTYPE_CHAR_STR: case nsIDataType::VTYPE_WCHAR_STR: case nsIDataType::VTYPE_STRING_SIZE_IS: case nsIDataType::VTYPE_WSTRING_SIZE_IS: if (!String2ID(&id)) { return NS_ERROR_CANNOT_CONVERT_DATA;
}
*aResult = id; return NS_OK; default: return NS_ERROR_CANNOT_CONVERT_DATA;
}
}
switch (mType) { // all the stuff we don't handle... case nsIDataType::VTYPE_ASTRING: case nsIDataType::VTYPE_UTF8STRING: case nsIDataType::VTYPE_CSTRING: case nsIDataType::VTYPE_CHAR_STR: case nsIDataType::VTYPE_WCHAR_STR: case nsIDataType::VTYPE_STRING_SIZE_IS: case nsIDataType::VTYPE_WSTRING_SIZE_IS: case nsIDataType::VTYPE_WCHAR:
NS_ERROR("ToString being called for a string type - screwy logic!");
[[fallthrough]];
// XXX We might want stringified versions of these... ???
case nsIDataType::VTYPE_VOID: case nsIDataType::VTYPE_EMPTY:
aOutString.SetIsVoid(true); return NS_OK;
case nsIDataType::VTYPE_EMPTY_ARRAY: case nsIDataType::VTYPE_ARRAY: case nsIDataType::VTYPE_INTERFACE: case nsIDataType::VTYPE_INTERFACE_IS: default: return NS_ERROR_CANNOT_CONVERT_DATA;
// nsID has its own text formatter.
case nsIDataType::VTYPE_ID: {
aOutString.Assign(u.mIDValue.ToString().get()); return NS_OK;
}
// Can't use Smprintf for floats, since it's locale-dependent #define CASE__APPENDFLOAT_NUMBER(type_, member_) \ case nsIDataType::type_: { \
nsAutoCString str; \
str.AppendFloat(u.member_); \
aOutString.Assign(str); \ return NS_OK; \
}
// the rest can be Smprintf'd and use common code.
#define CASE__SMPRINTF_NUMBER(type_, format_, cast_, member_) \ case nsIDataType::type_: \
static_assert(sizeof(cast_) >= sizeof(u.member_), \ "size of type should be at least as big as member"); \
pptr = mozilla::Smprintf(format_, (cast_)u.member_); \ break;
if (!pptr) { return NS_ERROR_OUT_OF_MEMORY;
}
aOutString.Assign(pptr.get()); return NS_OK;
}
nsresult nsDiscriminatedUnion::ConvertToAString(nsAString& aResult) const { switch (mType) { case nsIDataType::VTYPE_ASTRING:
aResult.Assign(*u.mAStringValue); return NS_OK; case nsIDataType::VTYPE_CSTRING:
CopyASCIItoUTF16(*u.mCStringValue, aResult); return NS_OK; case nsIDataType::VTYPE_UTF8STRING:
CopyUTF8toUTF16(*u.mUTF8StringValue, aResult); return NS_OK; case nsIDataType::VTYPE_CHAR_STR:
CopyASCIItoUTF16(mozilla::MakeStringSpan(u.str.mStringValue), aResult); return NS_OK; case nsIDataType::VTYPE_WCHAR_STR:
aResult.Assign(u.wstr.mWStringValue); return NS_OK; case nsIDataType::VTYPE_STRING_SIZE_IS:
CopyASCIItoUTF16(
nsDependentCString(u.str.mStringValue, u.str.mStringLength), aResult); return NS_OK; case nsIDataType::VTYPE_WSTRING_SIZE_IS:
aResult.Assign(u.wstr.mWStringValue, u.wstr.mWStringLength); return NS_OK; case nsIDataType::VTYPE_WCHAR:
aResult.Assign(u.mWCharValue); return NS_OK; default: {
nsAutoCString tempCString;
nsresult rv = ToString(tempCString); if (NS_FAILED(rv)) { return rv;
}
CopyASCIItoUTF16(tempCString, aResult); return NS_OK;
}
}
}
nsresult nsDiscriminatedUnion::ConvertToACString(nsACString& aResult) const { switch (mType) { case nsIDataType::VTYPE_ASTRING:
LossyCopyUTF16toASCII(*u.mAStringValue, aResult); return NS_OK; case nsIDataType::VTYPE_CSTRING:
aResult.Assign(*u.mCStringValue); return NS_OK; case nsIDataType::VTYPE_UTF8STRING: // XXX This is an extra copy that should be avoided // once Jag lands support for UTF8String and associated // conversion methods.
LossyCopyUTF16toASCII(NS_ConvertUTF8toUTF16(*u.mUTF8StringValue),
aResult); return NS_OK; case nsIDataType::VTYPE_CHAR_STR:
aResult.Assign(*u.str.mStringValue); return NS_OK; case nsIDataType::VTYPE_WCHAR_STR:
LossyCopyUTF16toASCII(nsDependentString(u.wstr.mWStringValue), aResult); return NS_OK; case nsIDataType::VTYPE_STRING_SIZE_IS:
aResult.Assign(u.str.mStringValue, u.str.mStringLength); return NS_OK; case nsIDataType::VTYPE_WSTRING_SIZE_IS:
LossyCopyUTF16toASCII(
nsDependentString(u.wstr.mWStringValue, u.wstr.mWStringLength),
aResult); return NS_OK; case nsIDataType::VTYPE_WCHAR: { const char16_t* str = &u.mWCharValue;
LossyCopyUTF16toASCII(Substring(str, 1), aResult); return NS_OK;
} default: return ToString(aResult);
}
}
nsresult nsDiscriminatedUnion::ConvertToAUTF8String(
nsAUTF8String& aResult) const { switch (mType) { case nsIDataType::VTYPE_ASTRING:
CopyUTF16toUTF8(*u.mAStringValue, aResult); return NS_OK; case nsIDataType::VTYPE_CSTRING: // XXX Extra copy, can be removed if we're sure CSTRING can // only contain ASCII.
CopyUTF16toUTF8(NS_ConvertASCIItoUTF16(*u.mCStringValue), aResult); return NS_OK; case nsIDataType::VTYPE_UTF8STRING:
aResult.Assign(*u.mUTF8StringValue); return NS_OK; case nsIDataType::VTYPE_CHAR_STR: // XXX Extra copy, can be removed if we're sure CHAR_STR can // only contain ASCII.
CopyUTF16toUTF8(NS_ConvertASCIItoUTF16(u.str.mStringValue), aResult); return NS_OK; case nsIDataType::VTYPE_WCHAR_STR:
CopyUTF16toUTF8(mozilla::MakeStringSpan(u.wstr.mWStringValue), aResult); return NS_OK; case nsIDataType::VTYPE_STRING_SIZE_IS: // XXX Extra copy, can be removed if we're sure CHAR_STR can // only contain ASCII.
CopyUTF16toUTF8(NS_ConvertASCIItoUTF16(nsDependentCString(
u.str.mStringValue, u.str.mStringLength)),
aResult); return NS_OK; case nsIDataType::VTYPE_WSTRING_SIZE_IS:
CopyUTF16toUTF8(
nsDependentString(u.wstr.mWStringValue, u.wstr.mWStringLength),
aResult); return NS_OK; case nsIDataType::VTYPE_WCHAR: { const char16_t* str = &u.mWCharValue;
CopyUTF16toUTF8(Substring(str, 1), aResult); return NS_OK;
} default: {
nsAutoCString tempCString;
nsresult rv = ToString(tempCString); if (NS_FAILED(rv)) { return rv;
} // XXX Extra copy, can be removed if we're sure tempCString can // only contain ASCII.
CopyUTF16toUTF8(NS_ConvertASCIItoUTF16(tempCString), aResult); return NS_OK;
}
}
}
switch (mType) { case nsIDataType::VTYPE_INTERFACE:
piid = &NS_GET_IID(nsISupports); break; case nsIDataType::VTYPE_INTERFACE_IS:
piid = &u.iface.mInterfaceID; break; default: return NS_ERROR_CANNOT_CONVERT_DATA;
}
*aIID = piid->Clone();
if (u.iface.mInterfaceValue) { return u.iface.mInterfaceValue->QueryInterface(*piid, aInterface);
}
*aInterface = nullptr; return NS_OK;
}
nsresult nsDiscriminatedUnion::ConvertToArray(uint16_t* aType, nsIID* aIID,
uint32_t* aCount, void** aPtr) const { // XXX perhaps we'd like to add support for converting each of the various // types into an array containing one element of that type. We can leverage // CloneArray to do this if we want to support this.
case nsIDataType::VTYPE_ASTRING: case nsIDataType::VTYPE_WCHAR_STR: case nsIDataType::VTYPE_WSTRING_SIZE_IS:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_ASTRING);
u.mAStringValue = new nsString();
rv = aValue->GetAsAString(*u.mAStringValue); if (NS_FAILED(rv)) { delete u.mAStringValue;
}
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_ASTRING)
case nsIDataType::VTYPE_CSTRING:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_CSTRING);
u.mCStringValue = new nsCString();
rv = aValue->GetAsACString(*u.mCStringValue); if (NS_FAILED(rv)) { delete u.mCStringValue;
}
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_CSTRING)
case nsIDataType::VTYPE_UTF8STRING:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_UTF8STRING);
u.mUTF8StringValue = new nsUTF8String();
rv = aValue->GetAsAUTF8String(*u.mUTF8StringValue); if (NS_FAILED(rv)) { delete u.mUTF8StringValue;
}
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_UTF8STRING)
case nsIDataType::VTYPE_CHAR_STR: case nsIDataType::VTYPE_STRING_SIZE_IS:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_STRING_SIZE_IS);
rv = aValue->GetAsStringWithSize(&u.str.mStringLength,
&u.str.mStringValue);
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_STRING_SIZE_IS)
case nsIDataType::VTYPE_INTERFACE: case nsIDataType::VTYPE_INTERFACE_IS:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_INTERFACE_IS); // XXX This iid handling is ugly!
nsIID* iid;
rv = aValue->GetAsInterface(&iid, (void**)&u.iface.mInterfaceValue); if (NS_SUCCEEDED(rv)) {
u.iface.mInterfaceID = *iid;
free((char*)iid);
}
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_INTERFACE_IS)
case nsIDataType::VTYPE_ARRAY:
CASE__SET_FROM_VARIANT_VTYPE_PROLOGUE(VTYPE_ARRAY);
rv = aValue->GetAsArray(&u.array.mArrayType, &u.array.mArrayInterfaceID,
&u.array.mArrayCount, &u.array.mArrayValue);
CASE__SET_FROM_VARIANT_VTYPE_EPILOGUE(VTYPE_ARRAY)
case nsIDataType::VTYPE_VOID:
SetToVoid();
rv = NS_OK; break; case nsIDataType::VTYPE_EMPTY_ARRAY:
SetToEmptyArray();
rv = NS_OK; break; case nsIDataType::VTYPE_EMPTY:
SetToEmpty();
rv = NS_OK; break; default:
NS_ERROR("bad type in variant!");
rv = NS_ERROR_FAILURE; break;
} return rv;
}
void nsDiscriminatedUnion::Cleanup() { switch (mType) { case nsIDataType::VTYPE_INT8: case nsIDataType::VTYPE_INT16: case nsIDataType::VTYPE_INT32: case nsIDataType::VTYPE_INT64: case nsIDataType::VTYPE_UINT8: case nsIDataType::VTYPE_UINT16: case nsIDataType::VTYPE_UINT32: case nsIDataType::VTYPE_UINT64: case nsIDataType::VTYPE_FLOAT: case nsIDataType::VTYPE_DOUBLE: case nsIDataType::VTYPE_BOOL: case nsIDataType::VTYPE_CHAR: case nsIDataType::VTYPE_WCHAR: case nsIDataType::VTYPE_VOID: case nsIDataType::VTYPE_ID: break; case nsIDataType::VTYPE_ASTRING: delete u.mAStringValue; break; case nsIDataType::VTYPE_CSTRING: delete u.mCStringValue; break; case nsIDataType::VTYPE_UTF8STRING: delete u.mUTF8StringValue; break; case nsIDataType::VTYPE_CHAR_STR: case nsIDataType::VTYPE_STRING_SIZE_IS:
free((char*)u.str.mStringValue); break; case nsIDataType::VTYPE_WCHAR_STR: case nsIDataType::VTYPE_WSTRING_SIZE_IS:
free((char*)u.wstr.mWStringValue); break; case nsIDataType::VTYPE_INTERFACE: case nsIDataType::VTYPE_INTERFACE_IS:
NS_IF_RELEASE(u.iface.mInterfaceValue); break; case nsIDataType::VTYPE_ARRAY:
FreeArray(); break; case nsIDataType::VTYPE_EMPTY_ARRAY: case nsIDataType::VTYPE_EMPTY: break; default:
NS_ERROR("bad type in variant!"); break;
}
mType = nsIDataType::VTYPE_EMPTY;
}
void nsDiscriminatedUnion::Traverse(
nsCycleCollectionTraversalCallback& aCb) const { switch (mType) { case nsIDataType::VTYPE_INTERFACE: case nsIDataType::VTYPE_INTERFACE_IS:
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(aCb, "mData");
aCb.NoteXPCOMChild(u.iface.mInterfaceValue); break; case nsIDataType::VTYPE_ARRAY: switch (u.array.mArrayType) { case nsIDataType::VTYPE_INTERFACE: case nsIDataType::VTYPE_INTERFACE_IS: {
nsISupports** p = (nsISupports**)u.array.mArrayValue; for (uint32_t i = u.array.mArrayCount; i > 0; ++p, --i) {
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(aCb, "mData[i]");
aCb.NoteXPCOMChild(*p);
} break;
} default: break;
} break; default: break;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.