From 7d18c78edc19a76a70e46de3c75ef408055fc08b Mon Sep 17 00:00:00 2001 From: "pedemont%us.ibm.com" Date: Tue, 26 Oct 2004 20:30:01 +0000 Subject: [PATCH] Properly handle [inout] string params when calling a Java method from XPCOM. Allocate enough space for PRUnichar string when returning to XPCOM. git-svn-id: svn://10.0.0.236/trunk@164448 18797224-902f-48f8-a5cc-f745e15eee43 --- .../extensions/java/xpcom/nsJavaWrapper.cpp | 2 -- .../extensions/java/xpcom/nsJavaXPTCStub.cpp | 28 ++++++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp b/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp index 64a99c0fcc3..5d2e71effb2 100644 --- a/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp @@ -926,8 +926,6 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, LOG("\t Param %d: ", i); const nsXPTParamInfo ¶mInfo = methodInfo->GetParam(i); - NS_ASSERTION(!paramInfo.IsDipper(), "Dipper!"); - if (!paramInfo.IsRetval() && !paramInfo.IsDipper()) { rv = SetupParams(env, env->GetObjectArrayElement(aParams, i), paramInfo, methodInfo, iinfo, aMethodIndex, params, params[i]); diff --git a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp index 8f91fbd09ed..c41ab1244ea 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp @@ -297,6 +297,7 @@ 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); @@ -582,16 +583,25 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, case nsXPTType::T_CHAR_STR: case nsXPTType::T_WCHAR_STR: { - jobject str; - if (aVariant.val.p) { + void* ptr = nsnull; + if (!aParamInfo.IsOut()) { + ptr = aVariant.val.p; + } else if (aVariant.val.p) { + void** variant = NS_REINTERPRET_CAST(void**, aVariant.val.p); + ptr = *variant; + } + + jobject str = nsnull; + if (ptr) { if (tag == nsXPTType::T_CHAR_STR) { - str = mJavaEnv->NewStringUTF((const char*) aVariant.val.p); + str = mJavaEnv->NewStringUTF((const char*) ptr); } else { - const PRUnichar* buf = (const PRUnichar*) aVariant.val.p; + const PRUnichar* buf = (const PRUnichar*) ptr; str = mJavaEnv->NewString(buf, nsCRT::strlen(buf)); } - } else { - str = nsnull; + } + if (str == nsnull) { + str = mJavaEnv->NewStringUTF((const char*)""); } if (!aParamInfo.IsOut()) { @@ -1012,7 +1022,6 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, case nsXPTType::T_CHAR_STR: { - // XXX not sure how this should be handled if (aParamInfo.IsOut()) { jstring str = nsnull; if (aParamInfo.IsRetval()) { @@ -1025,7 +1034,6 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, if (str) { jboolean isCopy; const char* char_ptr = mJavaEnv->GetStringUTFChars(str, &isCopy); - // XXX is this strdup right? *((char **) aVariant.val.p) = strdup(char_ptr); if (isCopy) { mJavaEnv->ReleaseStringUTFChars(str, char_ptr); @@ -1039,7 +1047,6 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, case nsXPTType::T_WCHAR_STR: { - // XXX not sure how this should be handled if (aParamInfo.IsOut()) { jstring str = nsnull; if (aParamInfo.IsRetval()) { @@ -1054,7 +1061,8 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, const jchar* wchar_ptr = mJavaEnv->GetStringChars(str, &isCopy); PRUint32 length = nsCRT::strlen(wchar_ptr); - PRUnichar* string = (PRUnichar*) malloc(length + 1); // add one for null + PRUnichar* string = (PRUnichar*) + nsMemory::Alloc((length + 1) * sizeof(PRUnichar)); memcpy(string, wchar_ptr, length * sizeof(PRUnichar)); string[length] = 0; *((PRUnichar **) aVariant.val.p) = string;