EOJ: fix bug with null strings in arrays 36/14136/2
Calixte DENIZET [Wed, 26 Mar 2014 13:07:42 +0000 (14:07 +0100)]
Change-Id: I1d0ad4ce1bd0bfbe797a43ddef0a807f1beee6dd

scilab/modules/external_objects_java/src/cpp/ScilabJavaEnvironmentWrapper.cpp
scilab/modules/external_objects_java/src/java/org/scilab/modules/external_objects_java/ScilabJavaObject.java
scilab/modules/external_objects_java/tests/unit_tests/jarray.dia.ref
scilab/modules/external_objects_java/tests/unit_tests/jarray.tst

index 8dfdf2d..b96e83e 100644 (file)
@@ -645,19 +645,30 @@ void ScilabJavaEnvironmentWrapper::unwraprowstring(int id, const ScilabStringSta
     jboolean isCopy = JNI_FALSE;
     char ** addr = new char*[lenRow];
     jstring * resString = new jstring[lenRow];
+    char * empty = "";
 
     for (jsize i = 0; i < lenRow; i++)
     {
         resString[i] = reinterpret_cast<jstring>(curEnv->GetObjectArrayElement(res, i));
-        addr[i] = const_cast<char *>(curEnv->GetStringUTFChars(resString[i], &isCopy));
+        if (resString[i])
+        {
+            addr[i] = const_cast<char *>(curEnv->GetStringUTFChars(resString[i], &isCopy));
+        }
+        else
+        {
+            addr[i] = empty;
+        }
     }
 
     allocator.allocate(1, lenRow, addr);
 
     for (jsize i = 0; i < lenRow; i++)
     {
-        curEnv->ReleaseStringUTFChars(resString[i], addr[i]);
-        curEnv->DeleteLocalRef(resString[i]);
+        if (resString[i])
+        {
+            curEnv->ReleaseStringUTFChars(resString[i], addr[i]);
+            curEnv->DeleteLocalRef(resString[i]);
+        }
     }
     delete[] addr;
     delete[] resString;
@@ -687,6 +698,7 @@ void ScilabJavaEnvironmentWrapper::unwrapmatstring(int id, const ScilabStringSta
     jint lenCol = curEnv->GetArrayLength(oneDim);
     char ** addr = new char*[lenRow * lenCol];
     jstring * resString = new jstring[lenRow * lenCol];
+    char * empty = "";
 
     for (int i = 0; i < lenRow; i++)
     {
@@ -695,16 +707,32 @@ void ScilabJavaEnvironmentWrapper::unwrapmatstring(int id, const ScilabStringSta
         {
             for (int j = 0; j < lenCol; j++)
             {
-                resString[j * lenRow + i] = reinterpret_cast<jstring>(curEnv->GetObjectArrayElement(oneDim, j));
-                addr[j * lenRow + i] = const_cast<char *>(curEnv->GetStringUTFChars(resString[j * lenRow + i], &isCopy));
+                const unsigned int pos = j * lenRow + i;
+                resString[pos] = reinterpret_cast<jstring>(curEnv->GetObjectArrayElement(oneDim, j));
+                if (resString[pos])
+                {
+                    addr[pos] = const_cast<char *>(curEnv->GetStringUTFChars(resString[pos], &isCopy));
+                }
+                else
+                {
+                    addr[pos] = empty;
+                }
             }
         }
         else
         {
             for (int j = 0; j < lenCol; j++)
             {
-                resString[i * lenCol + j] = reinterpret_cast<jstring>(curEnv->GetObjectArrayElement(oneDim, j));
-                addr[i * lenCol + j] = const_cast<char *>(curEnv->GetStringUTFChars(resString[i * lenCol + j], &isCopy));
+                const unsigned int pos = i * lenCol + j;
+                resString[pos] = reinterpret_cast<jstring>(curEnv->GetObjectArrayElement(oneDim, j));
+                if (resString[pos])
+                {
+                    addr[pos] = const_cast<char *>(curEnv->GetStringUTFChars(resString[pos], &isCopy));
+                }
+                else
+                {
+                    addr[pos] = empty;
+                }
             }
         }
         curEnv->DeleteLocalRef(oneDim);
@@ -721,8 +749,11 @@ void ScilabJavaEnvironmentWrapper::unwrapmatstring(int id, const ScilabStringSta
 
     for (int i = 0; i < lenRow * lenCol; i++)
     {
-        curEnv->ReleaseStringUTFChars(resString[i], addr[i]);
-        curEnv->DeleteLocalRef(resString[i]);
+        if (resString[i])
+        {
+            curEnv->ReleaseStringUTFChars(resString[i], addr[i]);
+            curEnv->DeleteLocalRef(resString[i]);
+        }
     }
     delete[] addr;
     delete[] resString;
index 413c299..dc15991 100644 (file)
@@ -1789,7 +1789,7 @@ public class ScilabJavaObject {
      */
     public static final int isUnwrappable(final int id) {
         if (id == 0) {
-            System.out.println("unwrappable=0");
+            //System.out.println("unwrappable=0");
             // Null object
             return 1;
         }
index 2f679ac..f5b8987 100644 (file)
@@ -14,3 +14,4 @@ a(1, 1, 3) = "Hi Jims !";
 a(2, 1, 3) = str;
 assert_checkequal(length(str), length(a(2, 1, 3)));
 assert_checkequal(str, a(2, 1, 3));
+assert_checkequal(a(1), ["" ""; "" ""; "Hi Jims !" ""]);
index 4f69d8b..1050bb1 100644 (file)
@@ -13,3 +13,4 @@ a(2, 1, 3) = str;
 
 assert_checkequal(length(str), length(a(2, 1, 3)));
 assert_checkequal(str, a(2, 1, 3));
+assert_checkequal(a(1), ["" ""; "" ""; "Hi Jims !" ""]);
\ No newline at end of file