Bug 13055 fixed: Array indexing did not follow Scilab convention 13/13113/2
Calixte DENIZET [Fri, 8 Nov 2013 11:20:15 +0000 (12:20 +0100)]
Change-Id: I1bffe4880cf0c79bf94c4ccee0b678cbe1007c07

scilab/CHANGES_5.5.X
scilab/modules/external_objects_java/help/en_US/jarray.xml
scilab/modules/external_objects_java/src/cpp/JavaOptionsHelper.hxx
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
scilab/modules/external_objects_java/tests/unit_tests/list.dia.ref [new file with mode: 0644]
scilab/modules/external_objects_java/tests/unit_tests/list.tst [new file with mode: 0644]

index d4de880..6711174 100644 (file)
@@ -151,6 +151,8 @@ Scilab Bug Fixes
 
 * Bug #13053 fixed - datatipCreate did not return datatip handle.
 
+* Bug #13055 fixed - Array indexing did not follow Scilab convention in JIMS.
+
 
 Xcos Bug Fixes
 ==============
index 58c8644..abae38e 100644 (file)
@@ -43,7 +43,7 @@
     <refsection>
         <title>Description</title>
         <para>
-            Creates a multidimensional array n_1x...xn_p of elements with type className. An array element can be accessed in using classical Scilab notations but take care that the index must stay between 0 and n_i (like in Java).
+            Creates a multidimensional array n_1x...xn_p of elements with type className. An array element can be accessed in using classical Scilab notations, the indexing follows Scilab convention: it start at 1.
         </para>
         <para>
             The className can be one of the primitive datatypes: double, int, boolean, short, long, float, char and byte.
         <programlisting role="example"><![CDATA[
                a = jarray("java.lang.String", 2, 2, 3);
                // array insertion
-               a(0, 0, 2) = "Hi Jims !";
-               a(1, 0, 2) = "Hi Jims again !!"
+               a(1, 1, 3) = "Hi Jims !";
+               a(2, 1, 3) = "Hi Jims again !!"
 
                // array extraction
-               length(a(1, 0, 2));
-               a(1, 0, 2)
+               length(a(2, 1, 3));
+               a(2, 1, 3)
       ]]></programlisting>
     </refsection>
     <refsection>
index d9f7296..666925c 100644 (file)
@@ -33,7 +33,7 @@ public :
 
     JavaOptionsHelper () : OptionsHelper(), showPrivate(false)
     {
-
+        setUseScilabIndex(true);
     }
 
     ~JavaOptionsHelper() { }
index b08fdc5..8035cee 100644 (file)
@@ -825,15 +825,15 @@ public class ScilabJavaObject {
             }
 
             if (arraySJO[id] != null) {
-               Object ret = ScilabJavaMethod.invoke(methName, arraySJO[id].clazz, arraySJO[id].object, returnType, args);
-               if (ret == null && returnType[0] == Void.TYPE) {
-                   return -1;
-               } else {
-                   return new ScilabJavaObject(ret, returnType[0]).id;
-               }
+                Object ret = ScilabJavaMethod.invoke(methName, arraySJO[id].clazz, arraySJO[id].object, returnType, args);
+                if (ret == null && returnType[0] == Void.TYPE) {
+                    return -1;
+                } else {
+                    return new ScilabJavaObject(ret, returnType[0]).id;
+                }
             } else {
-               throw new ScilabJavaException("Invalid Java object");
-           }
+                throw new ScilabJavaException("Invalid Java object");
+            }
         } else {
             throw new ScilabJavaException("null is not an object");
         }
@@ -877,9 +877,10 @@ public class ScilabJavaObject {
                         List l = (List) o;
                         int pos = -1;
                         if (a instanceof Double) {
-                            pos = ((Double) a).intValue();
+                            // Scilab index begins at 1
+                            pos = ((Double) a).intValue() - 1;
                         } else if (a instanceof Integer) {
-                            pos = ((Integer) a).intValue();
+                            pos = ((Integer) a).intValue() - 1;
                         } else {
                             pos = l.indexOf(a);
                         }
@@ -896,7 +897,7 @@ public class ScilabJavaObject {
                             pos = ((Integer) a).intValue();
                         }
 
-                        o = ScilabJavaArray.get(o, new int[] {pos});
+                        o = ScilabJavaArray.get(o, new int[] {pos - 1});
                     } else {
                         throw new ScilabJavaException("Invalid field " + (a == null ? "null" : a.toString()));
                     }
@@ -946,9 +947,10 @@ public class ScilabJavaObject {
                         List l = (List) o;
                         int pos = -1;
                         if (a instanceof Double) {
-                            pos = ((Double) a).intValue();
+                            // Scilab index begins at 1
+                            pos = ((Double) a).intValue() - 1;
                         } else if (a instanceof Integer) {
-                            pos = ((Integer) a).intValue();
+                            pos = ((Integer) a).intValue() - 1;
                         } else {
                             pos = l.indexOf(a);
                         }
@@ -965,7 +967,7 @@ public class ScilabJavaObject {
                             pos = ((Integer) a).intValue();
                         }
 
-                        o = ScilabJavaArray.get(o, new int[] {pos});
+                        o = ScilabJavaArray.get(o, new int[] {pos - 1});
                     } else {
                         throw new ScilabJavaException("Invalid field " + (a == null ? "null" : a.toString()));
                     }
@@ -983,9 +985,10 @@ public class ScilabJavaObject {
                     List l = (List) o;
                     int pos = -1;
                     if (a instanceof Double) {
-                        pos = ((Double) a).intValue();
+                        // Scilab index begins at 1
+                        pos = ((Double) a).intValue() - 1;
                     } else if (a instanceof Integer) {
-                        pos = ((Integer) a).intValue();
+                        pos = ((Integer) a).intValue() - 1;
                     } else {
                         pos = l.indexOf(a);
                     }
@@ -1004,7 +1007,7 @@ public class ScilabJavaObject {
                         pos = ((Integer) a).intValue();
                     }
 
-                    ScilabJavaArray.set(o, new int[] {pos}, arraySJO[value].object);
+                    ScilabJavaArray.set(o, new int[] {pos - 1}, arraySJO[value].object);
                 } else {
                     throw new ScilabJavaException("Invalid field " + (a == null ? "null" : a.toString()));
                 }
index 20f52dd..2f679ac 100644 (file)
@@ -10,7 +10,7 @@ str = "Hi Jims again !!"
  
  Hi Jims again !!   
 // array insertion
-a(0, 0, 2) = "Hi Jims !";
-a(1, 0, 2) = str;
-assert_checkequal(length(str), length(a(1, 0, 2)));
-assert_checkequal(str, a(1, 0, 2));
+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));
index 750e8b4..4f69d8b 100644 (file)
@@ -8,8 +8,8 @@
 a = jarray("java.lang.String", 2, 2, 3);
 str = "Hi Jims again !!"
 // array insertion
-a(0, 0, 2) = "Hi Jims !";
-a(1, 0, 2) = str;
+a(1, 1, 3) = "Hi Jims !";
+a(2, 1, 3) = str;
 
-assert_checkequal(length(str), length(a(1, 0, 2)));
-assert_checkequal(str, a(1, 0, 2));
+assert_checkequal(length(str), length(a(2, 1, 3)));
+assert_checkequal(str, a(2, 1, 3));
diff --git a/scilab/modules/external_objects_java/tests/unit_tests/list.dia.ref b/scilab/modules/external_objects_java/tests/unit_tests/list.dia.ref
new file mode 100644 (file)
index 0000000..99a2d90
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+jimport("java.util.LinkedList");
+l = LinkedList.new(jvoid);
+l.add("hello");
+l.add(123);
+l.add(%t);
+ll = LinkedList.new(jvoid);
+ll.add("world")
+ ans  =
+  T  
+l.add(ll)
+ ans  =
+  T  
+assert_checkequal(l(1), "hello");
+assert_checkequal(l(2), 123);
+assert_checkequal(l(3), %t);
+assert_checkequal(l(4, 1), "world");
+l(4, 1) = "scilab";
+assert_checkequal(l(4, 1), "scilab");
diff --git a/scilab/modules/external_objects_java/tests/unit_tests/list.tst b/scilab/modules/external_objects_java/tests/unit_tests/list.tst
new file mode 100644 (file)
index 0000000..751c2a0
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Calixte DENIZET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+jimport("java.util.LinkedList");
+
+l = LinkedList.new(jvoid);
+l.add("hello");
+l.add(123);
+l.add(%t);
+ll = LinkedList.new(jvoid);
+ll.add("world")
+l.add(ll)
+
+assert_checkequal(l(1), "hello");
+assert_checkequal(l(2), 123);
+assert_checkequal(l(3), %t);
+assert_checkequal(l(4, 1), "world");
+
+l(4, 1) = "scilab";
+
+assert_checkequal(l(4, 1), "scilab");
\ No newline at end of file