$OpenBSD: patch-j2sdk1_3_1_src_share_javavm_runtime_jni_c,v 1.1 2005/06/03 17:27:54 kurt Exp $
--- j2sdk1.3.1/src/share/javavm/runtime/jni.c.orig	Sun May  6 08:18:43 2001
+++ j2sdk1.3.1/src/share/javavm/runtime/jni.c	Mon May 23 23:50:35 2005
@@ -570,20 +570,17 @@ jni_FindMethodBlock(JNIEnv *env, jclass 
 
 typedef char*
 (*JNI_PushArguments_t)(JNIEnv *env, char *terse_signature,
-                       JavaFrame *current_frame, void *args);
+                       JavaFrame *current_frame, void *orig_args);
 
 static char*
 jni_PushArgumentsVararg(JNIEnv *env, char *terse_signature,
-			JavaFrame *current_frame, void *a)
+			JavaFrame *current_frame, void *orig_args)
 {
     char *p = terse_signature;
     jvalue tdub;
     va_list args;
 
-    /* Assignment to va_list does not work on certain platforms:
-     * args = *(va_list *)a;
-     */
-    memcpy(&args, a, sizeof(va_list));
+    va_copy(args, *(va_list *)orig_args);
 
     while (1) {
         switch (*p++) {
@@ -592,7 +589,7 @@ jni_PushArgumentsVararg(JNIEnv *env, cha
 	case TERSE_SIG_BYTE:
 	case TERSE_SIG_CHAR:
 	case TERSE_SIG_INT:
-            (current_frame->optop++)->i = va_arg(args, long);
+            (current_frame->optop++)->i = va_arg(args, int);
             continue;
 	case TERSE_SIG_FLOAT:
 	    (current_frame->optop++)->f = (float)va_arg(args, double);
@@ -621,49 +618,45 @@ jni_PushArgumentsVararg(JNIEnv *env, cha
 
 static char*
 jni_PushArgumentsArray(JNIEnv *env, char *terse_signature,
-                       JavaFrame *current_frame, void *a)
+                       JavaFrame *current_frame, void *orig_args)
 {
     char *p = terse_signature;
     jvalue tdub;
-    jvalue *args = *(jvalue **)a;
+    va_list args;
 
+    va_copy(args, *(va_list *)orig_args);
+
     /*CONSTCOND*/
     while (1) {
         switch (*p++) {
 	case TERSE_SIG_BOOLEAN:
-            (current_frame->optop++)->i = (*args++).z;
-            continue;
 	case TERSE_SIG_SHORT:
-            (current_frame->optop++)->i = (*args++).s;
-            continue;
 	case TERSE_SIG_BYTE:
-            (current_frame->optop++)->i = (*args++).b;
-            continue;
 	case TERSE_SIG_CHAR:
-            (current_frame->optop++)->i = (*args++).c;
-            continue;
 	case TERSE_SIG_INT:
-            (current_frame->optop++)->i = (*args++).i;
+            (current_frame->optop++)->i = va_arg(args, int);
             continue;
 	case TERSE_SIG_FLOAT:
-	    (current_frame->optop++)->f = (*args++).f;
+	    (current_frame->optop++)->f = (float)va_arg(args,double);
             continue;
 	case TERSE_SIG_OBJECT: {
-	    jobject obj = (*args++).l;
+	    jobject obj = va_arg(args,jobject);
 	    (current_frame->optop++)->h = (JHandle *)DeRef(env, obj);
 	    continue;
 	}
 	case TERSE_SIG_LONG:
-            SET_INT64(tdub, current_frame->optop, (*args++).j);
+            SET_INT64(tdub, current_frame->optop, va_arg(args,int64_t));
             current_frame->optop += 2;
             continue;
 	case TERSE_SIG_DOUBLE:
-            SET_DOUBLE(tdub, current_frame->optop, (*args++).d);
+            SET_DOUBLE(tdub, current_frame->optop, va_arg(args,double));
             current_frame->optop += 2;
             continue;
         case TERSE_SIG_ENDFUNC:
+            va_end(args);
 	    return p;
 	default:
+            va_end(args);
             sysAssert(FALSE);
 	    return NULL;
         }
