diff --git a/src/modules/Java/jvm.c b/src/modules/Java/jvm.c index 14c3895c9b93a04f93980fe0d79f65cb28292518..35b9beefe2514e1aaa4a617cbf6ca364589f2a1b 100644 --- a/src/modules/Java/jvm.c +++ b/src/modules/Java/jvm.c @@ -1,5 +1,5 @@ /* - * $Id: jvm.c,v 1.26 2000/07/28 07:13:18 hubbe Exp $ + * $Id: jvm.c,v 1.27 2000/09/05 16:32:33 grubba Exp $ * * Pike interface to Java Virtual Machine * @@ -17,7 +17,7 @@ #endif /* HAVE_CONFIG_H */ #include "global.h" -RCSID("$Id: jvm.c,v 1.26 2000/07/28 07:13:18 hubbe Exp $"); +RCSID("$Id: jvm.c,v 1.27 2000/09/05 16:32:33 grubba Exp $"); #include "program.h" #include "interpret.h" #include "stralloc.h" @@ -1571,12 +1571,11 @@ static void make_java_exception(struct object *jvm, JNIEnv *env, #define GET_NATIVE_ARG(ty) (((args)=((ty *)(args))+1),(((ty *)(args))[-1])) static void do_native_dispatch(struct native_method_context *ctx, - JNIEnv *env, jclass cls, void *args, + JNIEnv *env, jclass cls, void *args_, jvalue *rc) { JMP_BUF recovery; struct svalue *osp = Pike_sp; - int nargs = 0; char *p; if (SETJMP(recovery)) { @@ -1586,66 +1585,71 @@ static void do_native_dispatch(struct native_method_context *ctx, return; } - if(!cls) { - push_java_anyobj(GET_NATIVE_ARG(jobject), ctx->nat->jvm, env); - nargs++; - } + { + int nargs = 0; + void *args = args_; - p = ctx->sig->str; + if(!cls) { + push_java_anyobj(GET_NATIVE_ARG(jobject), ctx->nat->jvm, env); + nargs++; + } - if(*p == '(') - p++; + p = ctx->sig->str; - while(*p && *p!=')') { - switch(*p++) { - case 'Z': - case 'B': - case 'C': - case 'S': - case 'I': - default: - push_int(GET_NATIVE_ARG(jint)); - break; - - case 'J': - push_int(GET_NATIVE_ARG(jlong)); - break; + if(*p == '(') + p++; + + while(*p && *p!=')') { + switch(*p++) { + case 'Z': + case 'B': + case 'C': + case 'S': + case 'I': + default: + push_int(GET_NATIVE_ARG(jint)); + break; - case 'F': - push_float(GET_NATIVE_ARG(jfloat)); - break; + case 'J': + push_int(GET_NATIVE_ARG(jlong)); + break; - case 'D': - push_float(GET_NATIVE_ARG(jdouble)); - break; + case 'F': + push_float(GET_NATIVE_ARG(jfloat)); + break; - case 'L': - push_java_anyobj(GET_NATIVE_ARG(jobject), ctx->nat->jvm, env); - while(*p && *p++!=';') ; - break; + case 'D': + push_float(GET_NATIVE_ARG(jdouble)); + break; - case '[': - push_java_array(GET_NATIVE_ARG(jarray), ctx->nat->jvm, env, *p); - while(*p == '[') - p++; - if(*p++ == 'L') + case 'L': + push_java_anyobj(GET_NATIVE_ARG(jobject), ctx->nat->jvm, env); while(*p && *p++!=';') ; - break; + break; + + case '[': + push_java_array(GET_NATIVE_ARG(jarray), ctx->nat->jvm, env, *p); + while(*p == '[') + p++; + if(*p++ == 'L') + while(*p && *p++!=';') ; + break; + } + nargs ++; } - nargs ++; - } - if(*p == ')') - p++; + if(*p == ')') + p++; - apply_svalue(&ctx->callback, nargs); + apply_svalue(&ctx->callback, nargs); - memset(rc, 0, sizeof(*rc)); + memset(rc, 0, sizeof(*rc)); - if(*p != 'V') { - make_jargs(rc, -1, p, ctx->nat->jvm, env); - if((*p == 'L' || *p == '[') && rc->l != NULL) - rc->l = (*env)->NewGlobalRef(env, rc->l); + if(*p != 'V') { + make_jargs(rc, -1, p, ctx->nat->jvm, env); + if((*p == 'L' || *p == '[') && rc->l != NULL) + rc->l = (*env)->NewGlobalRef(env, rc->l); + } } pop_n_elems(Pike_sp-osp);