diff --git a/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp b/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp
index 3dbdbe5bec6..51be6095301 100644
--- a/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp
+++ b/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp
@@ -782,35 +782,22 @@ SetupParams(JNIEnv *env, const jobject aParam, PRUint8 aType, PRBool aIsOut,
case nsXPTType::T_DOMSTRING:
{
LOG(("String\n"));
- jstring data = nsnull;
- if (!aIsOut && !aIsArrayElement) { // 'in'
- data = (jstring) aParam;
- } else if (aParam) { // 'inout' & 'array'
- data = (jstring) env->GetObjectArrayElement((jobjectArray) aParam,
- aIndex);
+ // Expecting only 'in' and 'in dipper'
+ NS_PRECONDITION(!aIsOut, "unexpected param descriptor");
+ if (aIsOut) {
+ rv = NS_ERROR_UNEXPECTED;
+ break;
}
- nsAString* str;
- if (data) {
- str = jstring_to_nsAString(env, data);
- if (!str) {
- rv = NS_ERROR_OUT_OF_MEMORY;
- break;
- }
- } else {
- str = nsnull;
+ jstring jstr = NS_STATIC_CAST(jstring, aParam);
+ nsAString* str = jstring_to_nsAString(env, jstr);
+ if (!str) {
+ rv = NS_ERROR_OUT_OF_MEMORY;
+ break;
}
- if (!aIsArrayElement) { // 'in' & 'inout'
- aVariant.val.p = str;
- aVariant.SetValIsDOMString();
- if (aIsOut) { // 'inout'
- aVariant.ptr = &aVariant.val;
- aVariant.SetPtrIsData();
- }
- } else { // 'array'
- NS_STATIC_CAST(nsAString**, aVariant.val.p)[aIndex] = str;
- }
+ aVariant.val.p = str;
+ aVariant.SetValIsDOMString();
break;
}
@@ -818,38 +805,25 @@ SetupParams(JNIEnv *env, const jobject aParam, PRUint8 aType, PRBool aIsOut,
case nsXPTType::T_CSTRING:
{
LOG(("StringUTF\n"));
- jstring data = nsnull;
- if (!aIsOut && !aIsArrayElement) { // 'in'
- data = (jstring) aParam;
- } else if (aParam) { // 'inout' & 'array'
- data = (jstring) env->GetObjectArrayElement((jobjectArray) aParam,
- aIndex);
+ // Expecting only 'in' and 'in dipper'
+ NS_PRECONDITION(!aIsOut, "unexpected param descriptor");
+ if (aIsOut) {
+ rv = NS_ERROR_UNEXPECTED;
+ break;
}
- nsACString* str;
- if (data) {
- str = jstring_to_nsACString(env, data);
- if (!str) {
- rv = NS_ERROR_OUT_OF_MEMORY;
- break;
- }
+ jstring jstr = NS_STATIC_CAST(jstring, aParam);
+ nsACString* str = jstring_to_nsACString(env, jstr);
+ if (!str) {
+ rv = NS_ERROR_OUT_OF_MEMORY;
+ break;
+ }
+
+ aVariant.val.p = str;
+ if (aType == nsXPTType::T_CSTRING) {
+ aVariant.SetValIsCString();
} else {
- str = nsnull;
- }
-
- if (!aIsArrayElement) { // 'in' & 'inout'
- aVariant.val.p = str;
- if (aType == nsXPTType::T_CSTRING) {
- aVariant.SetValIsCString();
- } else {
- aVariant.SetValIsUTF8String();
- }
- if (aIsOut) { // 'inout'
- aVariant.ptr = &aVariant.val;
- aVariant.SetPtrIsData();
- }
- } else { // 'array'
- NS_STATIC_CAST(nsACString**, aVariant.val.p)[aIndex] = str;
+ aVariant.SetValIsUTF8String();
}
break;
}
@@ -1157,14 +1131,17 @@ FinalizeParams(JNIEnv *env, const nsXPTParamInfo &aParamInfo, PRUint8 aType,
case nsXPTType::T_ASTRING:
case nsXPTType::T_DOMSTRING:
{
- nsString* str = NS_STATIC_CAST(nsString*, aVariant.val.p);
+ NS_PRECONDITION(aParamInfo.IsIn(), "unexpected param descriptor");
+ if (!aParamInfo.IsIn()) {
+ rv = NS_ERROR_UNEXPECTED;
+ break;
+ }
- if ((aParamInfo.IsOut() || aParamInfo.IsDipper() || aIsArrayElement) &&
- NS_SUCCEEDED(aInvokeResult))
- {
+ nsString* str = NS_STATIC_CAST(nsString*, aVariant.val.p);
+ if (NS_SUCCEEDED(aInvokeResult) && aParamInfo.IsDipper()) {
// Create Java string from returned nsString
jstring jstr = nsnull;
- if (str) {
+ if (str && !str->IsVoid()) {
jstr = env->NewString((const jchar*) str->get(), str->Length());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
@@ -1172,12 +1149,7 @@ FinalizeParams(JNIEnv *env, const nsXPTParamInfo &aParamInfo, PRUint8 aType,
}
}
- if (aParamInfo.IsRetval() && !aIsArrayElement) {
- *aParam = jstr;
- } else if (*aParam) {
- // put new Java string into output array
- env->SetObjectArrayElement((jobjectArray) *aParam, aIndex, jstr);
- }
+ *aParam = jstr;
}
// cleanup
@@ -1190,14 +1162,17 @@ FinalizeParams(JNIEnv *env, const nsXPTParamInfo &aParamInfo, PRUint8 aType,
case nsXPTType::T_UTF8STRING:
case nsXPTType::T_CSTRING:
{
- nsCString* str = NS_STATIC_CAST(nsCString*, aVariant.val.p);
+ NS_PRECONDITION(aParamInfo.IsIn(), "unexpected param descriptor");
+ if (!aParamInfo.IsIn()) {
+ rv = NS_ERROR_UNEXPECTED;
+ break;
+ }
- if ((aParamInfo.IsOut() || aParamInfo.IsDipper() || aIsArrayElement) &&
- NS_SUCCEEDED(aInvokeResult))
- {
+ nsCString* str = NS_STATIC_CAST(nsCString*, aVariant.val.p);
+ if (NS_SUCCEEDED(aInvokeResult) && aParamInfo.IsDipper()) {
// Create Java string from returned nsString
jstring jstr = nsnull;
- if (str) {
+ if (str && !str->IsVoid()) {
jstr = env->NewStringUTF((const char*) str->get());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
@@ -1205,12 +1180,7 @@ FinalizeParams(JNIEnv *env, const nsXPTParamInfo &aParamInfo, PRUint8 aType,
}
}
- if (aParamInfo.IsRetval() && !aIsArrayElement) {
- *aParam = jstr;
- } else if (*aParam) {
- // put new Java string into output array
- env->SetObjectArrayElement((jobjectArray) *aParam, aIndex, jstr);
- }
+ *aParam = jstr;
}
// cleanup
@@ -1441,7 +1411,7 @@ JAVAPROXY_NATIVE(callXPCOMMethod) (JNIEnv *env, jclass that, jobject aJavaProxy,
const nsXPTParamInfo ¶mInfo = methodInfo->GetParam(i);
params[i].type = paramInfo.GetType();
- if (paramInfo.IsIn() && !paramInfo.IsDipper()) {
+ if (paramInfo.IsIn()) {
PRUint8 type = params[i].type.TagPart();
// is paramater an array?
@@ -1478,41 +1448,12 @@ JAVAPROXY_NATIVE(callXPCOMMethod) (JNIEnv *env, jclass that, jobject aJavaProxy,
}
if (NS_SUCCEEDED(rv)) {
- rv = SetupParams(env, env->GetObjectArrayElement(aParams, i), type,
- paramInfo.IsOut(), iid, arrayType, arraySize,
- PR_FALSE, 0, params[i]);
- }
- } else if (paramInfo.IsDipper()) {
- LOG(("dipper\n"));
- switch (params[i].type.TagPart())
- {
- case nsXPTType::T_ASTRING:
- case nsXPTType::T_DOMSTRING:
- {
- params[i].val.p = new nsString();
- if (params[i].val.p == nsnull) {
- rv = NS_ERROR_OUT_OF_MEMORY;
- break;
- }
- params[i].SetValIsDOMString();
- break;
+ jobject param = nsnull;
+ if (aParams && !paramInfo.IsRetval()) {
+ param = env->GetObjectArrayElement(aParams, i);
}
-
- case nsXPTType::T_UTF8STRING:
- case nsXPTType::T_CSTRING:
- {
- params[i].val.p = new nsCString();
- if (params[i].val.p == nsnull) {
- rv = NS_ERROR_OUT_OF_MEMORY;
- break;
- }
- params[i].SetValIsCString();
- break;
- }
-
- default:
- LOG(("unhandled dipper type\n"));
- rv = NS_ERROR_UNEXPECTED;
+ rv = SetupParams(env, param, type, paramInfo.IsOut(), iid, arrayType,
+ arraySize, PR_FALSE, 0, params[i]);
}
} else {
LOG(("out/retval\n"));
diff --git a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp
index 34512157100..28ba75a9e87 100644
--- a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp
+++ b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp
@@ -1054,7 +1054,12 @@ jstring_to_nsAString(JNIEnv* env, jstring aString)
}
nsString* str = new nsString(buf);
- env->ReleaseStringChars(aString, buf);
+
+ if (aString) {
+ env->ReleaseStringChars(aString, buf);
+ } else {
+ str->SetIsVoid(PR_TRUE);
+ }
// returns string, or nsnull if 'new' failed
return str;
@@ -1071,7 +1076,12 @@ jstring_to_nsACString(JNIEnv* env, jstring aString)
}
nsCString* str = new nsCString(buf);
- env->ReleaseStringUTFChars(aString, buf);
+
+ if (aString) {
+ env->ReleaseStringUTFChars(aString, buf);
+ } else {
+ str->SetIsVoid(PR_TRUE);
+ }
// returns string, or nsnull if 'new' failed
return str;
diff --git a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h
index afcadc97e64..d1d845a9b70 100644
--- a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h
+++ b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h
@@ -371,8 +371,9 @@ void ThrowException(JNIEnv* env, const nsresult aErrorCode,
* @param env Java environment pointer
* @param aString Java string to convert
*
- * @return nsAString/nsACString with same content as given Java string; or
- * nsnull if out of memory
+ * @return nsAString/nsACString with same content as given Java string;
+ * a 'void' nsAString/nsACString object if aString is
+ * null; or nsnull if out of memory
*/
nsAString* jstring_to_nsAString(JNIEnv* env, jstring aString);
nsACString* jstring_to_nsACString(JNIEnv* env, jstring aString);
diff --git a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp
index ccd43edaec5..c12118f8204 100644
--- a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp
+++ b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp
@@ -412,7 +412,6 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
for (PRUint8 i = 0; i < paramCount && NS_SUCCEEDED(rv); i++)
{
const nsXPTParamInfo ¶mInfo = aMethodInfo->GetParam(i);
- NS_ASSERTION(!paramInfo.IsDipper(), "Dipper!");
if (!paramInfo.IsRetval()) {
rv = SetupJavaParams(paramInfo, aMethodInfo, aMethodIndex, aParams,
aParams[i], java_params[i], methodSig);
@@ -558,7 +557,7 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
for (PRUint8 i = 0; i < paramCount; i++)
{
const nsXPTParamInfo ¶mInfo = aMethodInfo->GetParam(i);
- if (paramInfo.IsIn() && !paramInfo.IsOut()) // 'in'
+ if (paramInfo.IsIn() && !paramInfo.IsOut() && !paramInfo.IsDipper()) // 'in'
continue;
// If param is null, then caller is not expecting an output value.
@@ -955,80 +954,62 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
case nsXPTType::T_ASTRING:
case nsXPTType::T_DOMSTRING:
{
- nsString* str = nsnull;
- if (!aParamInfo.IsOut()) { // 'in'
- str = NS_STATIC_CAST(nsString*, aVariant.val.p);
- } else if (aVariant.val.p) { // 'inout' & 'out'
- nsString** variant = NS_STATIC_CAST(nsString**, aVariant.val.p);
- str = *variant;
+ // This only handle 'in' or 'in dipper' params. In XPIDL, the 'out'
+ // descriptor is mapped to 'in dipper'.
+ NS_PRECONDITION(aParamInfo.IsIn(), "unexpected param descriptor");
+ if (!aParamInfo.IsIn()) {
+ rv = NS_ERROR_UNEXPECTED;
+ break;
}
- jstring jstr;
- if (str) {
+ nsString* str = NS_STATIC_CAST(nsString*, aVariant.val.p);
+ if (!str) {
+ rv = NS_ERROR_FAILURE;
+ break;
+ }
+
+ jstring jstr = nsnull;
+ if (!str->IsVoid()) {
jstr = env->NewString(str->get(), str->Length());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
- } else {
- jstr = nsnull;
}
- if (!aParamInfo.IsOut()) { // 'in'
- aJValue.l = jstr;
- aMethodSig.AppendLiteral("Ljava/lang/String;");
- } else { // 'inout' & 'out'
- if (aVariant.val.p) {
- aJValue.l = env->NewObjectArray(1, stringClass, jstr);
- if (aJValue.l == nsnull) {
- rv = NS_ERROR_OUT_OF_MEMORY;
- break;
- }
- } else {
- aJValue.l = nsnull;
- }
- aMethodSig.AppendLiteral("[Ljava/lang/String;");
- }
+ aJValue.l = jstr;
+ aMethodSig.AppendLiteral("Ljava/lang/String;");
}
break;
case nsXPTType::T_UTF8STRING:
case nsXPTType::T_CSTRING:
{
- nsCString* str = nsnull;
- if (!aParamInfo.IsOut()) { // 'in'
- str = NS_STATIC_CAST(nsCString*, aVariant.val.p);
- } else if (aVariant.val.p) { // 'inout' & 'out'
- nsCString** variant = NS_STATIC_CAST(nsCString**, aVariant.val.p);
- str = *variant;
+ // This only handle 'in' or 'in dipper' params. In XPIDL, the 'out'
+ // descriptor is mapped to 'in dipper'.
+ NS_PRECONDITION(aParamInfo.IsIn(), "unexpected param descriptor");
+ if (!aParamInfo.IsIn()) {
+ rv = NS_ERROR_UNEXPECTED;
+ break;
}
- jstring jstr;
- if (str) {
+ nsCString* str = NS_STATIC_CAST(nsCString*, aVariant.val.p);
+ if (!str) {
+ rv = NS_ERROR_FAILURE;
+ break;
+ }
+
+ jstring jstr = nsnull;
+ if (!str->IsVoid()) {
jstr = env->NewStringUTF(str->get());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
- } else {
- jstr = nsnull;
}
- if (!aParamInfo.IsOut()) { // 'in'
- aJValue.l = jstr;
- aMethodSig.AppendLiteral("Ljava/lang/String;");
- } else { // 'inout' & 'out'
- if (aVariant.val.p) {
- aJValue.l = env->NewObjectArray(1, stringClass, jstr);
- if (aJValue.l == nsnull) {
- rv = NS_ERROR_OUT_OF_MEMORY;
- break;
- }
- } else {
- aJValue.l = nsnull;
- }
- aMethodSig.AppendLiteral("[Ljava/lang/String;");
- }
+ aJValue.l = jstr;
+ aMethodSig.AppendLiteral("Ljava/lang/String;");
}
break;
@@ -1544,47 +1525,29 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
case nsXPTType::T_ASTRING:
case nsXPTType::T_DOMSTRING:
{
- jstring str = nsnull;
- if (aParamInfo.IsRetval()) { // 'retval'
- str = (jstring) aJValue.l;
- } else { // 'inout' & 'out'
- str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
+ NS_PRECONDITION(aParamInfo.IsDipper(), "string argument is not dipper");
+ if (!aParamInfo.IsDipper()) {
+ rv = NS_ERROR_UNEXPECTED;
+ break;
}
- nsString** variant = NS_STATIC_CAST(nsString**, aVariant.val.p);
- if (str) {
+ jstring jstr = (jstring) aJValue.l;
+ nsString* variant = NS_STATIC_CAST(nsString*, aVariant.val.p);
+
+ if (jstr) {
// Get string buffer
- const jchar* wchar_ptr = env->GetStringChars(str, nsnull);
+ const jchar* wchar_ptr = env->GetStringChars(jstr, nsnull);
if (!wchar_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
- if (!aParamInfo.IsRetval() && *variant) {
- // If we were given an nsString, set it to the new string
- nsString* string = *variant;
- string->Assign(wchar_ptr);
- } else {
- // If the argument that was passed in was null, then we need to
- // create a new string.
- nsString* embedStr = new nsString(wchar_ptr);
- if (embedStr) {
- *variant = embedStr;
- } else {
- rv = NS_ERROR_OUT_OF_MEMORY;
- // don't 'break'; fall through to release chars
- }
- }
+ variant->Assign(wchar_ptr);
// release String buffer
- env->ReleaseStringChars(str, wchar_ptr);
+ env->ReleaseStringChars(jstr, wchar_ptr);
} else {
- // If we were passed in a string, delete it now, and set to null.
- // (Free only 'inout' & 'out' params)
- if (*variant && !aParamInfo.IsRetval()) {
- delete *variant;
- }
- *variant = nsnull;
+ variant->SetIsVoid(PR_TRUE);
}
}
break;
@@ -1592,47 +1555,29 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
case nsXPTType::T_UTF8STRING:
case nsXPTType::T_CSTRING:
{
- jstring str = nsnull;
- if (aParamInfo.IsRetval()) { // 'retval'
- str = (jstring) aJValue.l;
- } else { // 'inout' & 'out'
- str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
+ NS_PRECONDITION(aParamInfo.IsDipper(), "string argument is not dipper");
+ if (!aParamInfo.IsDipper()) {
+ rv = NS_ERROR_UNEXPECTED;
+ break;
}
- nsCString** variant = NS_STATIC_CAST(nsCString**, aVariant.val.p);
- if (str) {
+ jstring jstr = (jstring) aJValue.l;
+ nsCString* variant = NS_STATIC_CAST(nsCString*, aVariant.val.p);
+
+ if (jstr) {
// Get string buffer
- const char* char_ptr = env->GetStringUTFChars(str, nsnull);
+ const char* char_ptr = env->GetStringUTFChars(jstr, nsnull);
if (!char_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
- if (!aParamInfo.IsRetval() && *variant) {
- // If we were given an nsString, set it to the new string
- nsCString* string = *variant;
- string->Assign(char_ptr);
- } else {
- // If the argument that was passed in was null, then we need to
- // create a new nsID.
- nsCString* embedStr = new nsCString(char_ptr);
- if (embedStr) {
- *variant = embedStr;
- } else {
- rv = NS_ERROR_OUT_OF_MEMORY;
- // don't 'break'; fall through to release chars
- }
- }
+ variant->Assign(char_ptr);
// release String buffer
- env->ReleaseStringUTFChars(str, char_ptr);
+ env->ReleaseStringUTFChars(jstr, char_ptr);
} else {
- // If we were passed in a string, delete it now, and set to null.
- // (Free only 'inout' & 'out' params)
- if (*variant && !aParamInfo.IsRetval()) {
- delete *variant;
- }
- *variant = nsnull;
+ variant->SetIsVoid(PR_TRUE);
}
}
break;