diff --git a/CHANGES.current b/CHANGES.current index 503abf732..7295ec8e5 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -4,6 +4,9 @@ See the RELEASENOTES file for a summary of changes in each release. Version 2.0.9 (in progress) =========================== +2012-09-06: wsfulton + [Java] Fix (char *STRING, size_t LENGTH) typemaps to accept NULL string. + 2012-08-26: drjoe [R] make ExternalReference slot ref to contain reference diff --git a/Examples/test-suite/director_binary_string.i b/Examples/test-suite/director_binary_string.i index 96c835959..f842dc2c7 100644 --- a/Examples/test-suite/director_binary_string.i +++ b/Examples/test-suite/director_binary_string.i @@ -15,8 +15,10 @@ class Callback { public: virtual ~Callback() {} virtual void run(char* dataBufferAA, int sizeAA, char* dataBufferBB, int sizeBB) { - memset(dataBufferAA, -1, sizeAA); - memset(dataBufferBB, -1, sizeBB); + if (dataBufferAA) + memset(dataBufferAA, -1, sizeAA); + if (dataBufferBB) + memset(dataBufferBB, -1, sizeBB); } }; @@ -45,6 +47,9 @@ public: } return sum; } + void call_null() { + _callback->run(NULL, 0, NULL, 0); + } }; %} diff --git a/Examples/test-suite/java/director_binary_string_runme.java b/Examples/test-suite/java/director_binary_string_runme.java index e2bf4da40..962073367 100644 --- a/Examples/test-suite/java/director_binary_string_runme.java +++ b/Examples/test-suite/java/director_binary_string_runme.java @@ -21,6 +21,11 @@ public class director_binary_string_runme { if (sum != 9*2*8 + 13*3*5) throw new RuntimeException("Unexpected sum: " + sum); + + new Callback().run(null, null); + callback = new DirectorBinaryStringCallback(); + caller.setCallback(callback); + caller.call_null(); } } @@ -32,11 +37,13 @@ class DirectorBinaryStringCallback extends Callback { @Override public void run(byte[] dataBufferAA, byte[] dataBufferBB) { - for (int i = 0; i < dataBufferAA.length; i++) - dataBufferAA[i] = (byte)(dataBufferAA[i] * 2); + if (dataBufferAA != null) + for (int i = 0; i < dataBufferAA.length; i++) + dataBufferAA[i] = (byte)(dataBufferAA[i] * 2); - for (int i = 0; i < dataBufferBB.length; i++) - dataBufferBB[i] = (byte)(dataBufferBB[i] * 3); + if (dataBufferBB != null) + for (int i = 0; i < dataBufferBB.length; i++) + dataBufferBB[i] = (byte)(dataBufferBB[i] * 3); } } diff --git a/Lib/java/java.swg b/Lib/java/java.swg index 794b58d88..6126a55e5 100644 --- a/Lib/java/java.swg +++ b/Lib/java/java.swg @@ -1301,11 +1301,16 @@ SWIG_PROXY_CONSTRUCTOR(true, true, SWIGTYPE) %typemap(javain) (char *STRING, size_t LENGTH) "$javainput" %typemap(freearg) (char *STRING, size_t LENGTH) "" %typemap(in) (char *STRING, size_t LENGTH) { + if ($input) { $1 = (char *) JCALL2(GetByteArrayElements, jenv, $input, 0); - $2 = (size_t) JCALL1(GetArrayLength, jenv, $input); + $2 = (size_t) JCALL1(GetArrayLength, jenv, $input); + } else { + $1 = 0; + $2 = 0; + } } %typemap(argout) (char *STRING, size_t LENGTH) { - JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0); + if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0); } %typemap(directorin, descriptor="[B") (char *STRING, size_t LENGTH) { jbyteArray jb = (jenv)->NewByteArray($2);