WIP: #704 (java directorargout + java/typemaps.i fixes)
- avoid JCALL calls in generated code
- avoid redundant blocks in generated code
diff --git a/Lib/java/java.swg b/Lib/java/java.swg
index 9ed375c..a329411 100644
--- a/Lib/java/java.swg
+++ b/Lib/java/java.swg
@@ -368,7 +368,7 @@
}
/* Convert to BigInteger (see out typemap) */
-%typemap(directorin, descriptor="Ljava/math/BigInteger;") unsigned long long, const unsigned long long & %{
+%typemap(directorin, descriptor="Ljava/math/BigInteger;", noblock=1) unsigned long long, const unsigned long long & {
{
jbyteArray ba = JCALL1(NewByteArray, jenv, 9);
jbyte* bae = JCALL2(GetByteArrayElements, jenv, ba, 0);
@@ -387,7 +387,7 @@
JCALL1(DeleteLocalRef, jenv, ba);
$input = bigint;
}
-Swig::LocalRefGuard $1_refguard(jenv, $input); %}
+Swig::LocalRefGuard $1_refguard(jenv, $input); }
%typemap(javadirectorin) unsigned long long "$jniinput"
%typemap(javadirectorout) unsigned long long "$javacall"
@@ -409,14 +409,14 @@
}
}
-%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * %{
+%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
$input = 0;
if ($1) {
$input = JCALL1(NewStringUTF, jenv, (const char *)$1);
if (!$input) return $null;
}
Swig::LocalRefGuard $1_refguard(jenv, $input);
-%}
+}
%typemap(freearg, noblock=1) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); }
%typemap(out, noblock=1) char * { if ($1) $result = JCALL1(NewStringUTF, jenv, (const char *)$1); }
@@ -743,14 +743,14 @@
}
}
-%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char[ANY], char[] %{
+%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char[ANY], char[] {
$input = 0;
if ($1) {
$input = JCALL1(NewStringUTF, jenv, (const char *)$1);
if (!$input) return $null;
}
Swig::LocalRefGuard $1_refguard(jenv, $input);
-%}
+}
%typemap(argout) char[ANY], char[] ""
%typemap(freearg, noblock=1) char[ANY], char[] { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); }
@@ -1357,12 +1357,15 @@
%typemap(argout) (char *STRING, size_t LENGTH) {
if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0);
}
-%typemap(directorin, descriptor="[B") (char *STRING, size_t LENGTH) %{
- jbyteArray $1_jb = (jenv)->NewByteArray((jsize)$2);
- (jenv)->SetByteArrayRegion($1_jb, 0, (jsize)$2, (jbyte *)$1);
- $input = $1_jb;
- Swig::LocalRefGuard $1_refguard(jenv, $input);
-%}
+%typemap(directorin, descriptor="[B", noblock=1) (char *STRING, size_t LENGTH) {
+ $input = 0;
+ if ($1) {
+ $input = JCALL1(NewByteArray, jenv, (jsize)$2);
+ if (!$input) return $null;
+ JCALL4(SetByteArrayRegion, jenv, $input, 0, (jsize)$2, (jbyte *)$1);
+ }
+ Swig::LocalRefGuard $refguard(jenv, $input);
+}
%typemap(directorargout) (char *STRING, size_t LENGTH)
%{(jenv)->GetByteArrayRegion($input, 0, (jsize)$2, (jbyte *)$1);
(jenv)->DeleteLocalRef($input);%}
diff --git a/Lib/java/typemaps.i b/Lib/java/typemaps.i
index db7dd06..846875f 100644
--- a/Lib/java/typemaps.i
+++ b/Lib/java/typemaps.i
@@ -216,18 +216,18 @@
$input = JCALL1(New##JAVATYPE##Array, jenv, 1);
Swig::LocalRefGuard $1_refguard(jenv, $input); %}
-%typemap(directorargout) TYPE &OUTPUT
+%typemap(directorargout, noblock=1) TYPE &OUTPUT
{
- JNITYPE jvalue;
- JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue);
- $result = jvalue;
+ JNITYPE $1_jvalue;
+ JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
+ $result = $1_jvalue;
}
-%typemap(directorargout) TYPE *OUTPUT
+%typemap(directorargout, noblock=1) TYPE *OUTPUT
{
- JNITYPE jvalue;
- JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue);
- *$result = jvalue;
+ JNITYPE $1_jvalue;
+ JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
+ *$result = $1_jvalue;
}
%typemap(typecheck) TYPE *OUTPUT = TYPECHECKTYPE;
@@ -373,28 +373,26 @@
%typemap(directorin,descriptor=JNIDESC) TYPE &INOUT %{
$input = JCALL1(New##JAVATYPE##Array, jenv, 1);
- const JNITYPE $1_jvalue = (JNITYPE)$1;
+ JNITYPE $1_jvalue = (JNITYPE)$1;
JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
Swig::LocalRefGuard $1_refguard(jenv, $input); %}
%typemap(directorin,descriptor=JNIDESC) TYPE *INOUT %{
$input = JCALL1(New##JAVATYPE##Array, jenv, 1);
- const JNITYPE $1_jvalue = (JNITYPE)*$1;
+ JNITYPE $1_jvalue = (JNITYPE)*$1;
JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
Swig::LocalRefGuard $1_refguard(jenv, $input); %}
-%typemap(directorargout) TYPE &INOUT
+%typemap(directorargout, noblock=1) TYPE &INOUT
{
- JNITYPE jvalue;
- JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue);
- $result = jvalue;
+ JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
+ $result = $1_jvalue;
}
-%typemap(directorargout) TYPE *INOUT
+%typemap(directorargout, noblock=1) TYPE *INOUT
{
- JNITYPE jvalue;
- JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue);
- *$result = jvalue;
+ JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
+ *$result = $1_jvalue;
}
%typemap(typecheck) TYPE *INOUT = TYPECHECKTYPE;