Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Increase maximum supported fixed args on varargs calls from 3 to 255 #1504

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@ Features
Bug Fixes
---------
* [#1501](https://github.com/java-native-access/jna/pull/1501): `Library.OPTION_STRING_ENCODING` is ignore for string arguments function calls - [@matthiasblaesing](https://github.com/matthiasblaesing).
* [#1504](https://github.com/java-native-access/jna/pull/1504): Increase maximum supported fixed args on varargs calls from 3 to 255 - [@andrew-nowak](https://github.com/andrew-nowak).

Important Changes
-----------------
* The interfaces between Java and native code have changed, so `libjnidispatch`
must be rebuilt to be compatible with this release.

Release (5.13.0)
================
Expand Down
14 changes: 10 additions & 4 deletions build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,12 @@
<property name="jna.version" value="${jna.major}.${jna.minor}.${jna.revision}${version.suffix}"/>
<property name="osgi.version" value="${jna.major}.${jna.minor}.${jna.revision}"/>
<!-- jnidispatch library release version -->
<property name="jni.major" value="6"/>
<property name="jni.minor" value="1"/>
<property name="jni.revision" value="6"/>
<property name="jni.major" value="7"/>
<property name="jni.minor" value="0"/>
<property name="jni.revision" value="0"/>
<property name="jni.build" value="0"/> <!--${build.number}-->
<property name="jni.version" value="${jni.major}.${jni.minor}.${jni.revision}"/>
<property name="jni.md5" value="147a998f0cbc89681a1ae6c0dd121629"/>
<property name="jni.md5" value="5fb98531302accd485c534c452dd952a"/>
<property name="spec.title" value="Java Native Access (JNA)"/>
<property name="spec.vendor" value="${vendor}"/>
<property name="spec.version" value="${jna.major}"/>
Expand Down Expand Up @@ -818,6 +818,12 @@ osname=macosx;processor=aarch64
<arg value="JNIEXPORT"/>
<fileset dir="${build.headers}" includes="*.h"/>
</apply>
<apply dir="${build.headers}" executable="${grep}" parallel="true"
failonerror="${grep.required}" relative="true" output="${md5.file}"
error="${md5.file}.error" append="true">
<arg value="#define"/>
<fileset dir="${build.headers}" includes="*.h"/>
</apply>
<!-- Clean up gcj javah output to match that of Sun's javah -->
<fixcrlf file="${md5.file}" eol="unix"/>
<replaceregexp match="^((.*\.h):JNIEXPORT[^(]+)( +\(.*)"
Expand Down
Binary file modified lib/native/aix-ppc.jar
Binary file not shown.
Binary file modified lib/native/aix-ppc64.jar
Binary file not shown.
Binary file modified lib/native/android-aarch64.jar
Binary file not shown.
Binary file modified lib/native/android-arm.jar
Binary file not shown.
Binary file modified lib/native/android-armv7.jar
Binary file not shown.
Binary file modified lib/native/android-mips.jar
Binary file not shown.
Binary file modified lib/native/android-mips64.jar
Binary file not shown.
Binary file modified lib/native/android-x86-64.jar
Binary file not shown.
Binary file modified lib/native/android-x86.jar
Binary file not shown.
Binary file modified lib/native/darwin-aarch64.jar
Binary file not shown.
Binary file modified lib/native/darwin-x86-64.jar
Binary file not shown.
Binary file modified lib/native/freebsd-x86-64.jar
Binary file not shown.
Binary file modified lib/native/freebsd-x86.jar
Binary file not shown.
Binary file modified lib/native/linux-aarch64.jar
Binary file not shown.
Binary file modified lib/native/linux-arm.jar
Binary file not shown.
Binary file modified lib/native/linux-armel.jar
Binary file not shown.
Binary file modified lib/native/linux-loongarch64.jar
Binary file not shown.
Binary file modified lib/native/linux-mips64el.jar
Binary file not shown.
Binary file modified lib/native/linux-ppc.jar
Binary file not shown.
Binary file modified lib/native/linux-ppc64le.jar
Binary file not shown.
Binary file modified lib/native/linux-riscv64.jar
Binary file not shown.
Binary file modified lib/native/linux-s390x.jar
Binary file not shown.
Binary file modified lib/native/linux-x86-64.jar
Binary file not shown.
Binary file modified lib/native/linux-x86.jar
Binary file not shown.
Binary file modified lib/native/openbsd-x86-64.jar
Binary file not shown.
Binary file modified lib/native/openbsd-x86.jar
Binary file not shown.
Binary file modified lib/native/sunos-sparc.jar
Binary file not shown.
Binary file modified lib/native/sunos-sparcv9.jar
Binary file not shown.
Binary file modified lib/native/sunos-x86-64.jar
Binary file not shown.
Binary file modified lib/native/sunos-x86.jar
Binary file not shown.
Binary file modified lib/native/win32-aarch64.jar
Binary file not shown.
Binary file modified lib/native/win32-x86-64.jar
Binary file not shown.
Binary file modified lib/native/win32-x86.jar
Binary file not shown.
11 changes: 6 additions & 5 deletions native/dispatch.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
#define DEFAULT_LOAD_OPTS (RTLD_LAZY|RTLD_GLOBAL)
#define LOAD_LIBRARY(NAME,OPTS) dlopen(NAME, OPTS)
static inline char * LOAD_ERROR() {
char* message = dlerror();
const char* message = dlerror();
char* buf = (char*) malloc(strlen(message) + 1 /* null */);
strcpy(buf, message);
return buf;
Expand Down Expand Up @@ -144,9 +144,10 @@ extern "C" {
PSTART(); memset(D,C,L); PEND(ENV); \
} while(0)

#define MASK_CC com_sun_jna_Function_MASK_CC
#define THROW_LAST_ERROR com_sun_jna_Function_THROW_LAST_ERROR
#define USE_VARARGS com_sun_jna_Function_USE_VARARGS
#define MASK_CC com_sun_jna_Function_MASK_CC
#define THROW_LAST_ERROR com_sun_jna_Function_THROW_LAST_ERROR
#define USE_VARARGS com_sun_jna_Function_USE_VARARGS
#define USE_VARARGS_SHIFT com_sun_jna_Function_USE_VARARGS_SHIFT

/* Cached class, field and method IDs */
static jclass classObject;
Expand Down Expand Up @@ -480,7 +481,7 @@ dispatch(JNIEnv *env, void* func, jint flags, jobjectArray args,
callconv_t callconv = flags & MASK_CC;
const char* volatile throw_type = NULL;
const char* volatile throw_msg = NULL;
int fixed_args = (flags & USE_VARARGS) >> 7;
int fixed_args = (flags >> USE_VARARGS_SHIFT) & USE_VARARGS;

nargs = (*env)->GetArrayLength(env, args);

Expand Down
17 changes: 16 additions & 1 deletion native/testlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -908,6 +908,20 @@ addVarArgs(const char *fmt, ...) {
return sum;
}

EXPORT int32_t
addSeveralFixedArgsAndVarArgs(int a, int b, int c, int d, int n_varargs, ...) {
va_list ap;
int i;
int32_t sum = a + b + c + d;
va_start(ap, n_varargs);

for (i = 0; i < n_varargs; i++) {
sum += va_arg(ap, int32_t);
}
va_end(ap);
return sum;
}

EXPORT void
modifyStructureVarArgs(const char* fmt, ...) {
struct _ss {
Expand Down Expand Up @@ -1095,8 +1109,9 @@ EXPORT size_t copyString(char* input, char* output) {
* responsible to allocate a correctly sized buffer.
*/
EXPORT size_t copyStringArray(char** input, char* output) {
int i;
size_t len = 0;
for(int i = 0;; i++) {
for(i = 0;; i++) {
char* currInput = input[i];
if(currInput == NULL) {
break;
Expand Down
9 changes: 6 additions & 3 deletions src/com/sun/jna/Function.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,12 @@ public interface PostCallRead {
/** Whether to throw an exception if last error is non-zero after call. */
@java.lang.annotation.Native
public static final int THROW_LAST_ERROR = 0x40;
/** Mask for number of fixed args (1-3) for varargs calls. */
/** Mask for number of fixed args (max 255) for varargs calls. */
@java.lang.annotation.Native
public static final int USE_VARARGS = 0x180;
public static final int USE_VARARGS = 0xFF;
/** Offset of USE_VARARGS in call flags */
@java.lang.annotation.Native
public static final int USE_VARARGS_SHIFT = 7;

static final Integer INTEGER_TRUE = Integer.valueOf(-1);
static final Integer INTEGER_FALSE = Integer.valueOf(0);
Expand Down Expand Up @@ -410,7 +413,7 @@ Object invoke(Object[] args, Class<?> returnType, boolean allowObjects) {
/* @see NativeLibrary#NativeLibrary(String,String,long,Map) implementation */
Object invoke(Object[] args, Class<?> returnType, boolean allowObjects, int fixedArgs) {
Object result = null;
int callFlags = this.callFlags | ((fixedArgs & 0x3) << 7);
int callFlags = this.callFlags | ((fixedArgs & USE_VARARGS) << USE_VARARGS_SHIFT);
if (returnType == null || returnType==void.class || returnType==Void.class) {
Native.invokeVoid(this, this.peer, callFlags, args);
result = null;
Expand Down
17 changes: 17 additions & 0 deletions test/com/sun/jna/VarArgsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ protected List<String> getFieldOrder() {
}
}
public int addVarArgs(String fmt, Number... args);
public int addSeveralFixedArgsAndVarArgs(int a, int b, int c, int d, int nArgs, Integer... args);
public String returnStringVarArgs(String fmt, Object... args);
public void modifyStructureVarArgs(String fmt, Object... args);
public String returnStringVarArgs2(String fmt, String... args);
Expand Down Expand Up @@ -102,6 +103,22 @@ public void testStringVarArgsFull() {
lib.returnStringVarArgs2("", "Test"));
}

public void testSeveralFixedAndVarArgs() {
int fixedarg1 = 1;
int fixedarg2 = 2;
int fixedarg3 = 3;
int fixedarg4 = 4;
int vararg1 = 100;
int vararg2 = 200;

int expected = fixedarg1 + fixedarg2 + fixedarg3 + fixedarg4 + vararg1 + vararg2;
int result = lib.addSeveralFixedArgsAndVarArgs(fixedarg1, fixedarg2, fixedarg3, fixedarg4,
2, vararg1, vararg2);

assertEquals("varargs not passed correctly with multiple fixed args",
expected, result);
}

public void testAppendNullToVarargs() {
Number[] args = new Number[] { Integer.valueOf(1) };
assertEquals("No trailing NULL was appended to varargs list",
Expand Down