From 7935719c876d5450a81a750d4bc301e1bb6b0649 Mon Sep 17 00:00:00 2001 From: Ben Turner Date: Sat, 19 Sep 2009 12:24:24 -0700 Subject: [PATCH] More nsresult -> bool fixes, and fix windows bustage from NPEvent stub impl. --- dom/plugins/BrowserStreamParent.cpp | 15 +-- dom/plugins/NPEventWindows.h | 5 +- dom/plugins/PluginInstanceChild.cpp | 12 +- dom/plugins/PluginInstanceParent.cpp | 49 ++++---- dom/plugins/PluginModuleChild.cpp | 58 +++++---- dom/plugins/PluginModuleParent.cpp | 41 ++++--- dom/plugins/PluginScriptableObjectChild.cpp | 125 +++++++++++--------- 7 files changed, 175 insertions(+), 130 deletions(-) diff --git a/dom/plugins/BrowserStreamParent.cpp b/dom/plugins/BrowserStreamParent.cpp index eac9557bd32b..a1cbe22ef201 100644 --- a/dom/plugins/BrowserStreamParent.cpp +++ b/dom/plugins/BrowserStreamParent.cpp @@ -23,7 +23,7 @@ BrowserStreamParent::AnswerNPN_RequestRead(const IPCByteRanges& ranges, if (ranges.size() > PR_INT32_MAX) { // TODO: abort all processing! - return NS_ERROR_INVALID_ARG; + return false; } nsAutoArrayPtr rp(new NPByteRange[ranges.size()]); @@ -41,9 +41,10 @@ int32_t BrowserStreamParent::WriteReady() { int32_t result; - nsresult rv = CallNPP_WriteReady(mStream->end, &result); - if (NS_FAILED(rv)) { + if (!CallNPP_WriteReady(mStream->end, &result)) { mNPP->mNPNIface->destroystream(mNPP->mNPP, mStream, NPRES_NETWORK_ERR); + // XXX is this right? + return -1; } return result; } @@ -54,11 +55,11 @@ BrowserStreamParent::Write(int32_t offset, void* buffer) { int32_t result; - nsresult rv = CallNPP_Write(offset, - nsDependentCString(static_cast(buffer), len), - &result); - if (NS_FAILED(rv)) + if (!CallNPP_Write(offset, + nsDependentCString(static_cast(buffer), len), + &result)) { return -1; + } if (result == -1) mNPP->CallPBrowserStreamDestructor(this, NPRES_USER_BREAK, true); diff --git a/dom/plugins/NPEventWindows.h b/dom/plugins/NPEventWindows.h index 2a5272161569..0dcd9d8bb96b 100644 --- a/dom/plugins/NPEventWindows.h +++ b/dom/plugins/NPEventWindows.h @@ -42,7 +42,9 @@ #include "npapi.h" -#warning This is only a stub implementation IMPLEMENT ME +#pragma message(__FILE__ ": This is only a stub implementation IMPLEMENT ME") + +namespace IPC { template <> struct ParamTraits @@ -63,5 +65,6 @@ struct ParamTraits } }; +} // namespace IPC #endif // ifndef mozilla_dom_plugins_NPEventWindows_h diff --git a/dom/plugins/PluginInstanceChild.cpp b/dom/plugins/PluginInstanceChild.cpp index 70fcf1896db6..800f5e98fed0 100644 --- a/dom/plugins/PluginInstanceChild.cpp +++ b/dom/plugins/PluginInstanceChild.cpp @@ -130,7 +130,9 @@ PluginInstanceChild::NPN_GetValue(NPNVariable aVar, case NPNVjavascriptEnabledBool: { bool v = false; NPError result; - CallNPN_GetValue_NPNVjavascriptEnabledBool(&v, &result); + if (!CallNPN_GetValue_NPNVjavascriptEnabledBool(&v, &result)) { + return NPERR_GENERIC_ERROR; + } *static_cast(aValue) = v; return result; } @@ -138,7 +140,9 @@ PluginInstanceChild::NPN_GetValue(NPNVariable aVar, case NPNVisOfflineBool: { bool v = false; NPError result; - CallNPN_GetValue_NPNVisOfflineBool(&v, &result); + if (!CallNPN_GetValue_NPNVisOfflineBool(&v, &result)) { + return NPERR_GENERIC_ERROR; + } *static_cast(aValue) = v; return result; } @@ -146,7 +150,9 @@ PluginInstanceChild::NPN_GetValue(NPNVariable aVar, case NPNVprivateModeBool: { bool v = false; NPError result; - CallNPN_GetValue_NPNVprivateModeBool(&v, &result); + if (!CallNPN_GetValue_NPNVprivateModeBool(&v, &result)) { + return NPERR_GENERIC_ERROR; + } *static_cast(aValue) = v; return result; } diff --git a/dom/plugins/PluginInstanceParent.cpp b/dom/plugins/PluginInstanceParent.cpp index 6c962cbfec02..2e6387f19439 100644 --- a/dom/plugins/PluginInstanceParent.cpp +++ b/dom/plugins/PluginInstanceParent.cpp @@ -203,20 +203,19 @@ PluginInstanceParent::NPP_GetValue(NPPVariable variable, void *ret_value) // FIXME/cjones: HACK ALERT! should forward to child switch(variable) { #ifdef OS_LINUX - case NPPVpluginNeedsXEmbed: - (*(PRBool*)ret_value) = PR_TRUE; - return NPERR_NO_ERROR; + case NPPVpluginNeedsXEmbed: + (*(PRBool*)ret_value) = PR_TRUE; + return NPERR_NO_ERROR; #endif -#if 0 //Coming soon! - case NPPVpluginScriptableNPObject: - PPluginScriptableObjectParent* actor; - NPError rv; - CallNPP_GetValue_NPPVpluginScriptableNPObject(&actor, &rv); - break; -#endif - default: - return NPERR_GENERIC_ERROR; + case NPPVpluginScriptableNPObject: { + PPluginScriptableObjectParent* actor; + NPError rv; + if (!CallNPP_GetValue_NPPVpluginScriptableNPObject(&actor, &rv)) { + return NPERR_GENERIC_ERROR; + } + return rv; + } } NS_NOTREACHED("Don't get here!"); @@ -244,25 +243,31 @@ PluginInstanceParent::NPP_NewStream(NPMIMEType type, NPStream* stream, _MOZ_LOG(__FUNCTION__); NPError err; - CallPBrowserStreamConstructor(new BrowserStreamParent(this, stream), - nsCString(stream->url), - stream->end, - stream->lastmodified, - static_cast(stream->notifyData), - nsCString(stream->headers), - nsCString(type), seekable, &err, stype); + if (!CallPBrowserStreamConstructor(new BrowserStreamParent(this, stream), + nsCString(stream->url), + stream->end, + stream->lastmodified, + static_cast(stream->notifyData), + nsCString(stream->headers), + nsCString(type), seekable, &err, stype)) { + return NPERR_GENERIC_ERROR; + } return err; -} +} NPError PluginInstanceParent::NPP_DestroyStream(NPStream* stream, NPReason reason) { BrowserStreamParent* sp = static_cast(stream->pdata); - if (sp->mNPP != this) + if (sp->mNPP != this) { NS_RUNTIMEABORT("Mismatched plugin data"); + } - return CallPBrowserStreamDestructor(sp, reason, false); + if (!CallPBrowserStreamDestructor(sp, reason, false)) { + return NPERR_GENERIC_ERROR; + } + return NPERR_NO_ERROR; } PPluginScriptableObjectParent* diff --git a/dom/plugins/PluginModuleChild.cpp b/dom/plugins/PluginModuleChild.cpp index f4ac7b4eda59..36ae9402c5aa 100644 --- a/dom/plugins/PluginModuleChild.cpp +++ b/dom/plugins/PluginModuleChild.cpp @@ -647,9 +647,11 @@ _getstringidentifier(const NPUTF8* aName) _MOZ_LOG(__FUNCTION__); NPRemoteIdentifier ident; - nsresult rv = PluginModuleChild::current()-> - SendNPN_GetStringIdentifier(nsDependentCString(aName), &ident); - NS_ENSURE_SUCCESS(rv, 0); + if (!PluginModuleChild::current()-> + SendNPN_GetStringIdentifier(nsDependentCString(aName), &ident)) { + NS_WARNING("Failed to send message!"); + ident = 0; + } return (NPIdentifier)ident; } @@ -668,20 +670,14 @@ _getstringidentifiers(const NPUTF8** aNames, nsAutoTArray names; nsAutoTArray ids; - PRBool ok = names.SetCapacity(aNameCount); - NS_WARN_IF_FALSE(ok, "Out of memory!"); - - if (ok) { + if (names.SetCapacity(aNameCount)) { for (int32_t index = 0; index < aNameCount; index++) { names.AppendElement(nsDependentCString(aNames[index])); } NS_ASSERTION(names.Length() == aNameCount, "Should equal here!"); - nsresult rv = PluginModuleChild::current()-> - SendNPN_GetStringIdentifiers(names, &ids); - NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "Failed to send message!"); - - if (NS_SUCCEEDED(rv)) { + if (PluginModuleChild::current()-> + SendNPN_GetStringIdentifiers(names, &ids)) { NS_ASSERTION(ids.Length() == aNameCount, "Bad length!"); for (int32_t index = 0; index < aNameCount; index++) { @@ -689,6 +685,7 @@ _getstringidentifiers(const NPUTF8** aNames, } return; } + NS_WARNING("Failed to send message!"); } // Something must have failed above. @@ -703,9 +700,12 @@ _identifierisstring(NPIdentifier aIdentifier) _MOZ_LOG(__FUNCTION__); bool isString; - nsresult rv = PluginModuleChild::current()-> - SendNPN_IdentifierIsString((NPRemoteIdentifier)aIdentifier, &isString); - NS_ENSURE_SUCCESS(rv, false); + if (!PluginModuleChild::current()-> + SendNPN_IdentifierIsString((NPRemoteIdentifier)aIdentifier, + &isString)) { + NS_WARNING("Failed to send message!"); + isString = false; + } return isString; } @@ -716,9 +716,11 @@ _getintidentifier(int32_t aIntId) _MOZ_LOG(__FUNCTION__); NPRemoteIdentifier ident; - nsresult rv = PluginModuleChild::current()-> - SendNPN_GetIntIdentifier(aIntId, &ident); - NS_ENSURE_SUCCESS(rv, 0); + if (!PluginModuleChild::current()-> + SendNPN_GetIntIdentifier(aIntId, &ident)) { + NS_WARNING("Failed to send message!"); + ident = 0; + } return (NPIdentifier)ident; } @@ -730,10 +732,12 @@ _utf8fromidentifier(NPIdentifier aIdentifier) NPError err; nsCAutoString val; - nsresult rv = PluginModuleChild::current()-> - SendNPN_UTF8FromIdentifier((NPRemoteIdentifier)aIdentifier, - &err, &val); - NS_ENSURE_SUCCESS(rv, 0); + if (!PluginModuleChild::current()-> + SendNPN_UTF8FromIdentifier((NPRemoteIdentifier)aIdentifier, + &err, &val)) { + NS_WARNING("Failed to send message!"); + return 0; + } return (NPERR_NO_ERROR == err) ? strdup(val.get()) : 0; } @@ -745,10 +749,12 @@ _intfromidentifier(NPIdentifier aIdentifier) NPError err; int32_t val; - nsresult rv = PluginModuleChild::current()-> - SendNPN_IntFromIdentifier((NPRemoteIdentifier)aIdentifier, - &err, &val); - NS_ENSURE_SUCCESS(rv, 0); + if (!PluginModuleChild::current()-> + SendNPN_IntFromIdentifier((NPRemoteIdentifier)aIdentifier, + &err, &val)) { + NS_WARNING("Failed to send message!"); + return -1; + } // -1 for consistency return (NPERR_NO_ERROR == err) ? val : -1; diff --git a/dom/plugins/PluginModuleParent.cpp b/dom/plugins/PluginModuleParent.cpp index 81748852d164..ea279a79ddb3 100644 --- a/dom/plugins/PluginModuleParent.cpp +++ b/dom/plugins/PluginModuleParent.cpp @@ -131,7 +131,7 @@ PluginModuleParent::SetPluginFuncs(NPPluginFuncs* aFuncs) #ifdef OS_LINUX NPError PluginModuleParent::NP_Initialize(const NPNetscapeFuncs* npnIface, - NPPluginFuncs* nppIface) + NPPluginFuncs* nppIface) { _MOZ_LOG(__FUNCTION__); @@ -152,7 +152,7 @@ PluginModuleParent::NP_Initialize(const NPNetscapeFuncs* npnIface) NPError prv; if (!CallNP_Initialize(&prv)) - return NP_ERR_GENERIC_ERROR; + return NPERR_GENERIC_ERROR; return prv; } @@ -325,8 +325,10 @@ bool PluginModuleParent::RecvNPN_GetStringIdentifier(const nsCString& aString, NPRemoteIdentifier* aId) { - if (aString.IsVoid()) + if (aString.IsVoid()) { + NS_ERROR("Someone sent over a void string?!"); return false; + } NPIdentifier ident = _getstringidentifier(aString.BeginReading()); if (!ident) { @@ -335,8 +337,10 @@ PluginModuleParent::RecvNPN_GetStringIdentifier(const nsCString& aString, } nsVoidPtrHashKey* newEntry = mValidIdentifiers.PutEntry(ident); - if (!newEntry) + if (!newEntry) { + NS_ERROR("Out of memory?"); return false; + } *aId = (NPRemoteIdentifier)ident; return true; @@ -353,8 +357,10 @@ PluginModuleParent::RecvNPN_GetIntIdentifier(const int32_t& aInt, } nsVoidPtrHashKey* newEntry = mValidIdentifiers.PutEntry(ident); - if (!newEntry) + if (!newEntry) { + NS_ERROR("Out of memory?"); return false; + } *aId = (NPRemoteIdentifier)ident; return true; @@ -419,18 +425,20 @@ PluginModuleParent::RecvNPN_GetStringIdentifiers(const nsTArray& aNam NS_ASSERTION(aIds->IsEmpty(), "Non-empty array!"); PRUint32 count = aNames.Length(); - NS_ENSURE_ARG_MIN(count, 1); + if (!count) { + NS_ERROR("No names to get!"); + return false; + } nsAutoTArray buffers; - PRBool ok = buffers.SetLength(count); - NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY); - nsAutoTArray ids; - ok = ids.SetLength(count); - NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY); - ok = aIds->SetCapacity(count); - NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY); + if (!(buffers.SetLength(count) && + ids.SetLength(count) && + aIds->SetCapacity(count))) { + NS_ERROR("Out of memory?"); + return false; + } for (PRUint32 index = 0; index < count; index++) { buffers[index] = const_cast(aNames[index].BeginReading()); @@ -442,12 +450,13 @@ PluginModuleParent::RecvNPN_GetStringIdentifiers(const nsTArray& aNam for (PRUint32 index = 0; index < count; index++) { NPIdentifier& id = ids[index]; - if (id) { nsVoidPtrHashKey* newEntry = mValidIdentifiers.PutEntry(id); - NS_ENSURE_TRUE(ok, NS_ERROR_OUT_OF_MEMORY); + if (!newEntry) { + NS_ERROR("Out of memory?"); + return false; + } } - aIds->AppendElement((NPRemoteIdentifier)id); } diff --git a/dom/plugins/PluginScriptableObjectChild.cpp b/dom/plugins/PluginScriptableObjectChild.cpp index 890b3280f553..5c1fb26eac4b 100644 --- a/dom/plugins/PluginScriptableObjectChild.cpp +++ b/dom/plugins/PluginScriptableObjectChild.cpp @@ -41,7 +41,6 @@ #include "npapi.h" #include "npruntime.h" #include "nsDebug.h" -#include "nsThreadUtils.h" #include "PluginModuleChild.h" #include "PluginInstanceChild.h" @@ -83,27 +82,27 @@ ConvertToVariant(const NPRemoteVariant& aRemoteVariant, switch (aRemoteVariant.type()) { case NPRemoteVariant::Tvoid_t: { VOID_TO_NPVARIANT(aVariant); - return true; + break; } case NPRemoteVariant::Tnull_t: { NULL_TO_NPVARIANT(aVariant); - return true; + break; } case NPRemoteVariant::Tbool: { BOOLEAN_TO_NPVARIANT(aRemoteVariant.get_bool(), aVariant); - return true; + break; } case NPRemoteVariant::Tint: { INT32_TO_NPVARIANT(aRemoteVariant.get_int(), aVariant); - return true; + break; } case NPRemoteVariant::Tdouble: { DOUBLE_TO_NPVARIANT(aRemoteVariant.get_double(), aVariant); - return true; + break; } case NPRemoteVariant::TnsCString: { @@ -114,24 +113,25 @@ ConvertToVariant(const NPRemoteVariant& aRemoteVariant, return false; } STRINGN_TO_NPVARIANT(buffer, string.Length(), aVariant); - return true; + break; } case NPRemoteVariant::TPPluginScriptableObjectChild: { NPObject* object = NPObjectFromVariant(aRemoteVariant); if (!object) { + NS_ERROR("Er, this shouldn't fail!"); return false; } OBJECT_TO_NPVARIANT(object, aVariant); - return true; + break; } - default: - break; // break to NOTREACHED + default: + NS_NOTREACHED("Shouldn't get here!"); + return false; } - NS_NOTREACHED("Shouldn't get here!"); - return false; + return true; } bool @@ -141,49 +141,40 @@ ConvertToRemoteVariant(const NPVariant& aVariant, { if (NPVARIANT_IS_VOID(aVariant)) { aRemoteVariant = mozilla::void_t(); - return true; } - - if (NPVARIANT_IS_NULL(aVariant)) { + else if (NPVARIANT_IS_NULL(aVariant)) { aRemoteVariant = mozilla::null_t(); - return true; } - - if (NPVARIANT_IS_BOOLEAN(aVariant)) { + else if (NPVARIANT_IS_BOOLEAN(aVariant)) { aRemoteVariant = NPVARIANT_TO_BOOLEAN(aVariant); - return true; } - - if (NPVARIANT_IS_INT32(aVariant)) { + else if (NPVARIANT_IS_INT32(aVariant)) { aRemoteVariant = NPVARIANT_TO_INT32(aVariant); - return true; } - - if (NPVARIANT_IS_DOUBLE(aVariant)) { + else if (NPVARIANT_IS_DOUBLE(aVariant)) { aRemoteVariant = NPVARIANT_TO_DOUBLE(aVariant); - return true; } - - if (NPVARIANT_IS_STRING(aVariant)) { + else if (NPVARIANT_IS_STRING(aVariant)) { NPString str = NPVARIANT_TO_STRING(aVariant); nsCString string(str.UTF8Characters, str.UTF8Length); aRemoteVariant = string; - return true; } - - if (NPVARIANT_IS_OBJECT(aVariant)) { + else if (NPVARIANT_IS_OBJECT(aVariant)) { NS_ASSERTION(aInstance, "Must have an instance to wrap!"); PluginScriptableObjectChild* actor = CreateActorForNPObject(aInstance, NPVARIANT_TO_OBJECT(aVariant)); if (!actor) { + NS_ERROR("Failed to create actor!"); return false; } aRemoteVariant = actor; - return true; + } + else { + NS_NOTREACHED("Shouldn't get here!"); + return false; } - NS_NOTREACHED("Shouldn't get here!"); - return false; + return true; } } // anonymous namespace @@ -205,7 +196,6 @@ void PluginScriptableObjectChild::Initialize(PluginInstanceChild* aInstance, NPObject* aObject) { - NS_ASSERTION(!NS_IsMainThread(), "Wrong thread!"); NS_ASSERTION(!(mInstance && mObject), "Calling Initialize class twice!"); mInstance = aInstance; mObject = PluginModuleChild::sBrowserFuncs.retainobject(aObject); @@ -214,21 +204,22 @@ PluginScriptableObjectChild::Initialize(PluginInstanceChild* aInstance, bool PluginScriptableObjectChild::AnswerInvalidate() { - NS_ENSURE_STATE(NS_IsMainThread()); if (mObject) { PluginModuleChild::sBrowserFuncs.releaseobject(mObject); mObject = nsnull; - return true; } - return NS_ERROR_UNEXPECTED; + return true; } bool PluginScriptableObjectChild::AnswerHasMethod(const NPRemoteIdentifier& aId, bool* aHasMethod) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aHasMethod = false; + return true; + } if (!(mObject->_class && mObject->_class->hasMethod)) { *aHasMethod = false; @@ -245,8 +236,11 @@ PluginScriptableObjectChild::AnswerInvoke(const NPRemoteIdentifier& aId, NPRemoteVariant* aResult, bool* aSuccess) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aSuccess = false; + return true; + } if (!(mObject->_class && mObject->_class->invoke)) { *aSuccess = false; @@ -293,8 +287,11 @@ PluginScriptableObjectChild::AnswerInvokeDefault(const nsTArray NPRemoteVariant* aResult, bool* aSuccess) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aSuccess = false; + return true; + } if (!(mObject->_class && mObject->_class->invokeDefault)) { *aSuccess = false; @@ -340,8 +337,11 @@ bool PluginScriptableObjectChild::AnswerHasProperty(const NPRemoteIdentifier& aId, bool* aHasProperty) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aHasProperty = false; + return true; + } if (!(mObject->_class && mObject->_class->hasProperty)) { *aHasProperty = false; @@ -357,8 +357,11 @@ PluginScriptableObjectChild::AnswerGetProperty(const NPRemoteIdentifier& aId, NPRemoteVariant* aResult, bool* aSuccess) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aSuccess = false; + return true; + } if (!(mObject->_class && mObject->_class->getProperty)) { *aSuccess = false; @@ -383,8 +386,11 @@ PluginScriptableObjectChild::AnswerSetProperty(const NPRemoteIdentifier& aId, const NPRemoteVariant& aValue, bool* aSuccess) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aSuccess = false; + return true; + } if (!(mObject->_class && mObject->_class->setProperty)) { *aSuccess = false; @@ -406,8 +412,11 @@ bool PluginScriptableObjectChild::AnswerRemoveProperty(const NPRemoteIdentifier& aId, bool* aSuccess) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aSuccess = false; + return true; + } if (!(mObject->_class && mObject->_class->removeProperty)) { *aSuccess = false; @@ -422,8 +431,11 @@ bool PluginScriptableObjectChild::AnswerEnumerate(nsTArray* aProperties, bool* aSuccess) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aSuccess = false; + return true; + } if (!(mObject->_class && mObject->_class->enumerate)) { *aSuccess = false; @@ -461,8 +473,11 @@ PluginScriptableObjectChild::AnswerConstruct(const nsTArray& aA NPRemoteVariant* aResult, bool* aSuccess) { - NS_ENSURE_STATE(NS_IsMainThread()); - NS_ENSURE_STATE(mObject); + if (!mObject) { + NS_WARNING("Calling " __FUNCTION__ "with an invalidated object!"); + *aSuccess = false; + return true; + } if (!(mObject->_class && mObject->_class->construct)) { *aSuccess = false;