JIMS: fix bug with [] uses as null argument 51/13951/3
Calixte DENIZET [Fri, 7 Mar 2014 11:14:18 +0000 (12:14 +0100)]
Change-Id: I57f7b1841e72351060dbbdc28002f3da179b981b

scilab/modules/external_objects_java/src/java/org/scilab/modules/external_objects_java/FunctionArguments.java

index 1922ee9..581b2c1 100644 (file)
@@ -228,19 +228,19 @@ public final class FunctionArguments {
                     better = f;
                     isVarArgs = refBools[0];
                     toConvert = toConv;
+                    if (d == 0) {
+                        break;
+                    }
+
                     toConv = new HashMap<Integer, Converter>();
                 } else {
                     toConv.clear();
                 }
-
-                if (d == 0) {
-                    break;
-                }
             }
         }
 
         if (better != null) {
-            if (toConvert != null && !toConvert.isEmpty()) {
+            if (!toConvert.isEmpty()) {
                 // Contains int.class arguments and we passed double.class args
                 Class[] types = better.getParameterTypes();
                 Class base = types[types.length - 1].getComponentType();
@@ -259,12 +259,17 @@ public final class FunctionArguments {
             if (isVarArgs) {
                 // Variable arguments
                 Class[] types = better.getParameterTypes();
-                Class base = types[types.length - 1].getComponentType();
-                Object o = Array.newInstance(base, args.length - types.length + 1);
+                Object o;
+                if (args.length == 1 && types.length == 1 && args[0] == null) {
+                    o = null;
+                } else {
+                    Class base = types[types.length - 1].getComponentType();
+                    o = Array.newInstance(base, args.length - types.length + 1);
 
-                // Don't use System.arraycopy since it does not handle unboxing
-                for (int i = 0; i < args.length - types.length + 1; i++) {
-                    Array.set(o, i, args[i + types.length - 1]);
+                    // Don't use System.arraycopy since it does not handle unboxing
+                    for (int i = 0; i < args.length - types.length + 1; i++) {
+                        Array.set(o, i, args[i + types.length - 1]);
+                    }
                 }
 
                 Object[] newArgs = new Object[types.length];
@@ -307,19 +312,19 @@ public final class FunctionArguments {
                     better = f;
                     isVarArgs = refBools[0];
                     toConvert = toConv;
+                    if (d == 0) {
+                        break;
+                    }
+
                     toConv = new HashMap<Integer, Converter>();
                 } else {
                     toConv.clear();
                 }
-
-                if (d == 0) {
-                    break;
-                }
             }
         }
 
         if (better != null) {
-            if (toConvert != null && !toConvert.isEmpty()) {
+            if (!toConvert.isEmpty()) {
                 // Contains int.class arguments and we passed double.class args
                 Class[] types = better.getParameterTypes();
                 Class base = types[types.length - 1].getComponentType();
@@ -337,12 +342,16 @@ public final class FunctionArguments {
             if (isVarArgs) {
                 // Variable arguments
                 Class[] types = better.getParameterTypes();
-                Class base = types[types.length - 1].getComponentType();
-                Object o = Array.newInstance(base, args.length - types.length + 1);
-
-                // Don't use System.arraycopy since it does not handle unboxing
-                for (int i = 0; i < args.length - types.length + 1; i++) {
-                    Array.set(o, i, args[i + types.length - 1]);
+                Object o;
+                if (args.length == 1 && types.length == 1 && args[0] == null) {
+                    o = null;
+                } else {
+                    Class base = types[types.length - 1].getComponentType();
+                    o = Array.newInstance(base, args.length - types.length + 1);
+                    // Don't use System.arraycopy since it does not handle unboxing
+                    for (int i = 0; i < args.length - types.length + 1; i++) {
+                        Array.set(o, i, args[i + types.length - 1]);
+                    }
                 }
 
                 Object[] newArgs = new Object[types.length];
@@ -359,7 +368,7 @@ public final class FunctionArguments {
     }
 
     /**
-     * This function calculates the distance between thes method signatures
+     * This function calculates the distance between the method signatures
      * @param A the method signature
      * @param B the class of the passed arguments
      * @param arr array of arguments (used to transform double in int)
@@ -373,7 +382,7 @@ public final class FunctionArguments {
 
         long s = 0;
         int end = A.length;
-        if (A.length > 0 && A[A.length - 1].isArray() && (A.length < B.length || (A.length == 1 && B.length == 1 && !B[0].isArray()))) {
+        if (A.length > 0 && A[A.length - 1].isArray() && (A.length < B.length || (A.length == 1 && B.length == 1 && (B[0] == null || !B[0].isArray())))) {
             Class base = A[A.length - 1].getComponentType();
             // this is a variable arguments method
             bools[0] = true;