Skip to content

Commit

Permalink
Test varargs
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiasblaesing committed Feb 19, 2023
1 parent 54fc662 commit dfa9fff
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 7 deletions.
11 changes: 6 additions & 5 deletions native/dispatch.c
Original file line number Diff line number Diff line change
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,8 +481,8 @@ 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;
printf("Fixed args: %d\n", fixed_args);
nargs = (*env)->GetArrayLength(env, args);

if (nargs > MAX_NARGS) {
Expand Down
45 changes: 45 additions & 0 deletions native/testlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -949,6 +949,51 @@ returnStringVarArgs2(const char *fmt, ...) {
return cp;
}

EXPORT char *
returnStringVarArgs4(const int arg1, const double arg2, const int arg3, const double arg4, const char* fmt, ...) {
int written;
int remainingSpace = 4096;
char* result = malloc(4096);
char* writeResult = result;
written = snprintf(writeResult, remainingSpace, "Arg1:%d#", arg1);
writeResult += written;
written = snprintf(writeResult, remainingSpace, "Arg2:%.0f#", arg2);
writeResult += written;
written = snprintf(writeResult, remainingSpace, "Arg3:%d#", arg3);
writeResult += written;
written = snprintf(writeResult, remainingSpace, "Arg4:%.0f#", arg4);
writeResult += written;
written = snprintf(writeResult, remainingSpace, "Fmt:%s#", fmt);
writeResult += written;
va_list ap;
va_start(ap, fmt);
char* param;
while (*fmt) {
switch (*fmt++) {
case 's':
param = va_arg(ap, char*);
printf("X1: %s\n", param);
written = snprintf(writeResult, remainingSpace, "%s#", param);
writeResult += written;
break;
case 'd':
printf("X2\n");
written = snprintf(writeResult, remainingSpace, "%d#", va_arg(ap, int));
writeResult += written;
break;
case 'f':
printf("X3\n");
written = snprintf(writeResult, remainingSpace, "%.0f#", va_arg(ap, double));
writeResult += written;
break;
default:
break;
}
}
va_end(ap);
return result;
}

typedef union _MixedUnion1 {
int intValue;
double doubleValue;
Expand Down
6 changes: 4 additions & 2 deletions src/com/sun/jna/Function.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,9 @@ public interface PostCallRead {
public static final int THROW_LAST_ERROR = 0x40;
/** Mask for number of fixed args (1-3) for varargs calls. */
@java.lang.annotation.Native
public static final int USE_VARARGS = 0x180;
public static final int USE_VARARGS = 0x3;
@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 +412,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
8 changes: 8 additions & 0 deletions test/com/sun/jna/VarArgsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ protected List<String> getFieldOrder() {
public String returnStringVarArgs(String fmt, Object... args);
public void modifyStructureVarArgs(String fmt, Object... args);
public String returnStringVarArgs2(String fmt, String... args);
public Pointer returnStringVarArgs4(int arg1, double arg2, int arg3, double arg4, String format, Object... args);
}
TestLibrary lib;
@Override
Expand Down Expand Up @@ -119,6 +120,13 @@ public void testModifyStructureInVarargs() {

}

public void testLongVarargs() {
assertEquals("Arg1:1#Arg2:2#Arg3:3#Arg4:4#Fmt:#",
lib.returnStringVarArgs4(1, 2d, 3, 4d, "").getString(0));
assertEquals("Arg1:1#Arg2:2#Arg3:3#Arg4:4#Fmt:fdsfd#1#2#3#4#5#",
lib.returnStringVarArgs4(1, 2d, 3, 4d, "fdsfd", 1d, 2, "3", 4d, 5).getString(0));
}

public static void main(String[] args) {
junit.textui.TestRunner.run(VarArgsTest.class);
}
Expand Down

0 comments on commit dfa9fff

Please sign in to comment.