Skip to content

Commit dfa9fff

Browse files
Test varargs
1 parent 54fc662 commit dfa9fff

File tree

4 files changed

+63
-7
lines changed

4 files changed

+63
-7
lines changed

native/dispatch.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,10 @@ extern "C" {
144144
PSTART(); memset(D,C,L); PEND(ENV); \
145145
} while(0)
146146

147-
#define MASK_CC com_sun_jna_Function_MASK_CC
148-
#define THROW_LAST_ERROR com_sun_jna_Function_THROW_LAST_ERROR
149-
#define USE_VARARGS com_sun_jna_Function_USE_VARARGS
147+
#define MASK_CC com_sun_jna_Function_MASK_CC
148+
#define THROW_LAST_ERROR com_sun_jna_Function_THROW_LAST_ERROR
149+
#define USE_VARARGS com_sun_jna_Function_USE_VARARGS
150+
#define USE_VARARGS_SHIFT com_sun_jna_Function_USE_VARARGS_SHIFT
150151

151152
/* Cached class, field and method IDs */
152153
static jclass classObject;
@@ -480,8 +481,8 @@ dispatch(JNIEnv *env, void* func, jint flags, jobjectArray args,
480481
callconv_t callconv = flags & MASK_CC;
481482
const char* volatile throw_type = NULL;
482483
const char* volatile throw_msg = NULL;
483-
int fixed_args = (flags & USE_VARARGS) >> 7;
484-
484+
int fixed_args = (flags >> USE_VARARGS_SHIFT) & USE_VARARGS;
485+
printf("Fixed args: %d\n", fixed_args);
485486
nargs = (*env)->GetArrayLength(env, args);
486487

487488
if (nargs > MAX_NARGS) {

native/testlib.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,51 @@ returnStringVarArgs2(const char *fmt, ...) {
949949
return cp;
950950
}
951951

952+
EXPORT char *
953+
returnStringVarArgs4(const int arg1, const double arg2, const int arg3, const double arg4, const char* fmt, ...) {
954+
int written;
955+
int remainingSpace = 4096;
956+
char* result = malloc(4096);
957+
char* writeResult = result;
958+
written = snprintf(writeResult, remainingSpace, "Arg1:%d#", arg1);
959+
writeResult += written;
960+
written = snprintf(writeResult, remainingSpace, "Arg2:%.0f#", arg2);
961+
writeResult += written;
962+
written = snprintf(writeResult, remainingSpace, "Arg3:%d#", arg3);
963+
writeResult += written;
964+
written = snprintf(writeResult, remainingSpace, "Arg4:%.0f#", arg4);
965+
writeResult += written;
966+
written = snprintf(writeResult, remainingSpace, "Fmt:%s#", fmt);
967+
writeResult += written;
968+
va_list ap;
969+
va_start(ap, fmt);
970+
char* param;
971+
while (*fmt) {
972+
switch (*fmt++) {
973+
case 's':
974+
param = va_arg(ap, char*);
975+
printf("X1: %s\n", param);
976+
written = snprintf(writeResult, remainingSpace, "%s#", param);
977+
writeResult += written;
978+
break;
979+
case 'd':
980+
printf("X2\n");
981+
written = snprintf(writeResult, remainingSpace, "%d#", va_arg(ap, int));
982+
writeResult += written;
983+
break;
984+
case 'f':
985+
printf("X3\n");
986+
written = snprintf(writeResult, remainingSpace, "%.0f#", va_arg(ap, double));
987+
writeResult += written;
988+
break;
989+
default:
990+
break;
991+
}
992+
}
993+
va_end(ap);
994+
return result;
995+
}
996+
952997
typedef union _MixedUnion1 {
953998
int intValue;
954999
double doubleValue;

src/com/sun/jna/Function.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ public interface PostCallRead {
7878
public static final int THROW_LAST_ERROR = 0x40;
7979
/** Mask for number of fixed args (1-3) for varargs calls. */
8080
@java.lang.annotation.Native
81-
public static final int USE_VARARGS = 0x180;
81+
public static final int USE_VARARGS = 0x3;
82+
@java.lang.annotation.Native
83+
public static final int USE_VARARGS_SHIFT = 7;
8284

8385
static final Integer INTEGER_TRUE = Integer.valueOf(-1);
8486
static final Integer INTEGER_FALSE = Integer.valueOf(0);
@@ -410,7 +412,7 @@ Object invoke(Object[] args, Class<?> returnType, boolean allowObjects) {
410412
/* @see NativeLibrary#NativeLibrary(String,String,long,Map) implementation */
411413
Object invoke(Object[] args, Class<?> returnType, boolean allowObjects, int fixedArgs) {
412414
Object result = null;
413-
int callFlags = this.callFlags | ((fixedArgs & 0x3) << 7);
415+
int callFlags = this.callFlags | ((fixedArgs & USE_VARARGS) << USE_VARARGS_SHIFT);
414416
if (returnType == null || returnType==void.class || returnType==Void.class) {
415417
Native.invokeVoid(this, this.peer, callFlags, args);
416418
result = null;

test/com/sun/jna/VarArgsTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ protected List<String> getFieldOrder() {
4444
public String returnStringVarArgs(String fmt, Object... args);
4545
public void modifyStructureVarArgs(String fmt, Object... args);
4646
public String returnStringVarArgs2(String fmt, String... args);
47+
public Pointer returnStringVarArgs4(int arg1, double arg2, int arg3, double arg4, String format, Object... args);
4748
}
4849
TestLibrary lib;
4950
@Override
@@ -119,6 +120,13 @@ public void testModifyStructureInVarargs() {
119120

120121
}
121122

123+
public void testLongVarargs() {
124+
assertEquals("Arg1:1#Arg2:2#Arg3:3#Arg4:4#Fmt:#",
125+
lib.returnStringVarArgs4(1, 2d, 3, 4d, "").getString(0));
126+
assertEquals("Arg1:1#Arg2:2#Arg3:3#Arg4:4#Fmt:fdsfd#1#2#3#4#5#",
127+
lib.returnStringVarArgs4(1, 2d, 3, 4d, "fdsfd", 1d, 2, "3", 4d, 5).getString(0));
128+
}
129+
122130
public static void main(String[] args) {
123131
junit.textui.TestRunner.run(VarArgsTest.class);
124132
}

0 commit comments

Comments
 (0)