diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2016-03-31 18:42:08 +0100 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2016-03-31 18:56:32 +0100 |
commit | a15bbbaee5f55c4341b9c657e2c338c3bf9a1fce (patch) | |
tree | 72611448f3728cd4d8b4e6ce15e2032cefff62d9 /Lib/java/java.swg | |
parent | 8322686e84c31c3245c48f995367fabd84dde6c0 (diff) | |
download | swig-a15bbbaee5f55c4341b9c657e2c338c3bf9a1fce.tar.gz |
Java - unsigned long long marshalling improvements for negative numbers
Affects marshalling of negative numbers from Java to C only.
A cast to signed long long in the C layer will now result in the expected value.
Closes #623.
Diffstat (limited to 'Lib/java/java.swg')
-rw-r--r-- | Lib/java/java.swg | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/Lib/java/java.swg b/Lib/java/java.swg index f25a86605..96ca562b6 100644 --- a/Lib/java/java.swg +++ b/Lib/java/java.swg @@ -310,8 +310,11 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); $1 = 0; - for(i=0; i<sz; i++) { - $1 = ($1 << 8) | ($1_type)(unsigned char)bae[i]; + if (sz > 0) { + $1 = ($1_type)(signed char)bae[0]; + for(i=1; i<sz; i++) { + $1 = ($1 << 8) | ($1_type)(unsigned char)bae[i]; + } } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); } @@ -334,8 +337,11 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); $result = 0; - for(i=0; i<sz; i++) { - $result = ($result << 8) | ($1_type)(unsigned char)bae[i]; + if (sz > 0) { + $result = ($1_type)(signed char)bae[0]; + for(i=1; i<sz; i++) { + $result = ($result << 8) | ($1_type)(unsigned char)bae[i]; + } } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); } @@ -552,8 +558,11 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { sz = JCALL1(GetArrayLength, jenv, ba); $1 = &temp; temp = 0; - for(i=0; i<sz; i++) { - temp = (temp << 8) | ($*1_ltype)(unsigned char)bae[i]; + if (sz > 0) { + temp = ($*1_ltype)(signed char)bae[0]; + for(i=1; i<sz; i++) { + temp = (temp << 8) | ($*1_ltype)(unsigned char)bae[i]; + } } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); } @@ -578,8 +587,11 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { sz = JCALL1(GetArrayLength, jenv, ba); $result = &temp; temp = 0; - for(i=0; i<sz; i++) { - temp = (temp << 8) | ($*1_ltype)(unsigned char)bae[i]; + if (sz > 0) { + temp = ($*1_ltype)(signed char)bae[0]; + for(i=1; i<sz; i++) { + temp = (temp << 8) | ($*1_ltype)(unsigned char)bae[i]; + } } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); } |