diff -aruN shujit-0.4.0/ChangeLog shujit/ChangeLog --- shujit-0.4.0/ChangeLog Tue Dec 28 19:56:26 1999 +++ shujit/ChangeLog Sun Feb 6 18:35:21 2000 @@ -1,5 +1,21 @@ $Id$ +[20000206] + +JNI のネイティブメソッドを直接呼び出す際に(see [19990827])、 +synchronized メソッドかどうかの判定法を誤っていた。 +access & ACC_SYNCHRONIZED と書くべきところを access & ACC_STATIC と…修整。 +(runtime.c) + +マクロ EXPAND_JAVASTACK{,_FOR_NATIVE}, CREATE_JAVAFRAME{,_FOR_NATIVE} を +書き換えた。 +(compiler.h) + +[20000130] + +`fstp %st(0)' を `ffreep %st(0)' と `fcompp' に置き換えた。 +(code.c) + [20000101] 0.4.0 リリース。 @@ -93,7 +109,7 @@ JIT の初期化関数 java_lang_Compiler_start が java.lang.Compiler クラスが再ロードによって複数回呼ばれてしまう問題への 対処法を変更。フラグで検出していたところ、Compiler クラスに sticky 属性を -付与することにした (CCSet(..., Sticky))。(see [990514]) +付与することにした (CCSet(..., Sticky))。(see [19990514]) (compiler.c) [19991209] diff -aruN shujit-0.4.0/README shujit/README --- shujit-0.4.0/README Tue Dec 28 19:03:20 1999 +++ shujit/README Thu Feb 10 15:43:48 2000 @@ -13,9 +13,8 @@ Working on the following platforms is confirmed. - Linux - - Blackdown JDK 1.2.2 RC3, gcc 2.95.2, glibc2.1.2 and Linux 2.2.14pre16 + - Blackdown JDK 1.2.2 RC4, gcc 2.95.2, glibc2.1.2 and Linux 2.2.15pre5 - JDK 1.2 pre-release 2, egcs 1.0.3, glibc2.0.7 and Linux 2.2.13pre7 - - JDK 1.1.8v1, gcc 2.95.2, glibc2.1.2 and Linux 2.2.14pre16 - JDK 1.1.7v1a, egcs 1.1.2, libc5.4.38 and Linux 2.0.35 - FreeBSD diff -aruN shujit-0.4.0/code.c shujit/code.c --- shujit-0.4.0/code.c Tue Dec 28 18:15:34 1999 +++ shujit/code.c Sun Jan 30 16:05:21 2000 @@ -504,7 +504,7 @@ asm("movl %eax," FRAME_MONITOR(%edi)); #endif METAVM_MONITOR(%eax, proxy_monitorenter, "syncenter", 0); - OBJ_MONITOR(%eax, %eax); + OBJ_MONITOR(%eax); #if JDK_VER >= 12 CALL_MONITOR(%eax, monitorEnter2); #else @@ -518,7 +518,7 @@ /* monitorExit(obj_monitor(o)); */ asm("movl %0,%%eax" : : "m" (o)); METAVM_MONITOR(%eax, proxy_monitorexit, "syncexit", 0); - OBJ_MONITOR(%eax, %eax); + OBJ_MONITOR(%eax); #if JDK_VER >= 12 CALL_MONITOR(%eax, monitorExit2); #else @@ -550,9 +550,9 @@ #ifdef STRICT_PRELOAD /* pop scales from FPU register */ # ifdef STRICT_USE_FSCALE - asm("fstp %st(0)\n\tfstp %st(0)"); + asm("fcompp"); /* is equal to ffreep %st(0) x 2 */ # else - asm("fstp %st(0)\n\tfstp %st(0)\n\tfstp %st(0)\n\tfstp %st(0)"); + asm("fcompp\n\tfcompp"); # endif /* STRICT_USE_FSCALE */ #endif /* STRICT_PRELOAD */ } @@ -2345,7 +2345,7 @@ "fchs\n\t"\ "fxch\n\t"\ "fscale") -# define ARITH_FLOAT_SCALE_SETTLE asm("fstp %st(0)") +# define ARITH_FLOAT_SCALE_SETTLE asm("ffreep %st(0)") #else # define ARITH_FLOAT_SCALE_PREPARE # ifdef STRICT_PRELOAD @@ -2465,7 +2465,7 @@ "fchs\n\t"\ "fxch\n\t"\ "fscale") -# define ARITH_DOUBLE_SCALE_SETTLE asm("fstp %st(0)") +# define ARITH_DOUBLE_SCALE_SETTLE asm("ffreep %st(0)") #else # define ARITH_DOUBLE_SCALE_PREPARE # ifdef STRICT_PRELOAD @@ -5012,7 +5012,7 @@ BIPUSH_DEBUG1(OPTOP1_REG);\ NULL_TEST_CANT_BE_ELIMINATED(OPTOP1_REG, LABEL "_1", STATE);\ METAVM_MONITOR(OPTOP1_REG, METAVM_FUNCNAME, LABEL, STATE);\ - OBJ_MONITOR(OPTOP1_REG, OPTOP1_REG);\ + OBJ_MONITOR(OPTOP1_REG);\ CALL_MONITOR(OPTOP1_REG, FUNCNAME);\ asm(LABEL "_done:");\ MONITOR_DEBUG; @@ -5256,7 +5256,7 @@ #define JMATH_SQRT_ST0 JMATH_SIMPLE_FUNC_ST0("fsqrt") #define JMATH_SIN_ST0 JMATH_SIMPLE_FUNC_ST0("fsin") #define JMATH_COS_ST0 JMATH_SIMPLE_FUNC_ST0("fcos") -#define JMATH_TAN_ST0 JMATH_SIMPLE_FUNC_ST0("fptan\n\tfstp %st(0)") +#define JMATH_TAN_ST0 JMATH_SIMPLE_FUNC_ST0("fptan\n\tffreep %st(0)") #define JMATH_ATAN2_ST0 \ asm("fldl 8(%esp)\n\tfldl (%esp)\n\t"\ "addl $8,%esp\n\t"\ @@ -5276,7 +5276,7 @@ "faddp %st,%st(1)\n\t"\ "fscale\n\t"\ "fstpl (%esp)\n\t"\ - "fstp %st(0)") + "ffreep %st(0)") #define JMATH_LOG_ST0 JMATH_SIMPLE_FUNC_ST0("fldln2\n\tfxch %st(1)\n\tfyl2x") #define JMATH_FLOOR_CEIL_ST0(ROP) \ asm("fldl (%esp)\n\t"\ diff -aruN shujit-0.4.0/code.h shujit/code.h --- shujit-0.4.0/code.h Tue Dec 28 19:52:03 1999 +++ shujit/code.h Wed Jan 12 10:16:32 2000 @@ -243,7 +243,7 @@ #define UNHAND(HANDLE, DST) asm("movl (" #HANDLE ")," #DST) -#define OBJ_MONITOR(HANDLE, DST) +#define OBJ_MONITOR(HANDLE) #define OBJ_LENGTH(HANDLE, DST) \ asm("movl 4(" #HANDLE ")," #DST "\n\t"\ "shrl $5," #DST) diff -aruN shujit-0.4.0/compiler.h shujit/compiler.h --- shujit-0.4.0/compiler.h Tue Dec 28 16:24:53 1999 +++ shujit/compiler.h Sun Feb 6 18:44:15 2000 @@ -721,10 +721,11 @@ extern char *showObjectBody(char *sig, JHandle *obj); #endif + #if JDK_VER >= 12 # define EXPAND_JAVASTACK(EE, STACK, FRAME, OPTOP,\ ARGS_SIZE, NLOCAL, CAPACITY) \ - if (FRAME->ostack + CAPACITY >= stack->end_data) {\ + if (FRAME->ostack + CAPACITY >= STACK->end_data) {\ JavaStack *tmp_stack = STACK;\ JavaFrame *tmp_frame = FRAME;\ stack_item *tmp_optop = OPTOP;\ @@ -735,6 +736,17 @@ FRAME = tmp_frame;\ OPTOP = tmp_optop;\ } +# define EXPAND_JAVASTACK_FOR_NATIVE(EE, STACK, FRAME) \ + if (FRAME->ostack + JNI_REF_INFO_SIZE + JNI_DEFAULT_LOCAL_CAPACITY >=\ + STACK->end_data) {\ + JavaStack *tmp_stack = stack;\ + JavaFrame *tmp_frame = frame;\ + if (!ExpandJavaStackForJNI(EE, &tmp_stack, &tmp_frame,\ + JNI_REF_INFO_SIZE + JNI_DEFAULT_LOCAL_CAPACITY))\ + return FALSE;\ + STACK = tmp_stack;\ + FRAME = tmp_frame;\ + } #else # define EXPAND_JAVASTACK(EE, STACK, FRAME, OPTOP,\ ARGS_SIZE, NLOCAL, CAPACITY) \ @@ -754,16 +766,21 @@ frame = (JavaFrame *)(STACK->data + NLOCAL);\ /* needless to copy args to a frame on new stack chunk */\ } +# define EXPAND_JAVASTACK_FOR_NATIVE(EE, STACK, FRAME) \ + EXPAND_JAVASTACK(EE, STACK, FRAME, 0, 0, 0, 0) #endif /* JDK_VER */ -#define CREATE_JAVAFRAME(EE, MB, OLD_FRAME, NEW_FRAME, TENTATIVE_FRAME_OFFSET,\ - ARGS_SIZE, NLOCAL, CAPACITY) {\ + +#define CREATE_JAVAFRAME_0(EE, MB, OLD_FRAME, NEW_FRAME,\ + TENTATIVE_FRAME_OFFSET /* Java method: nlocal, Native method: args_size*/,\ + ARGS_SIZE, NLOCAL)\ + {\ JavaStack *stack = OLD_FRAME->javastack;\ stack_item *optop = OLD_FRAME->optop;\ \ - NEW_FRAME = (JavaFrame *)(optop + (TENTATIVE_FRAME_OFFSET));\ - EXPAND_JAVASTACK(EE, stack, NEW_FRAME, optop,\ - ARGS_SIZE, NLOCAL, CAPACITY);\ + NEW_FRAME = (JavaFrame *)(optop + (TENTATIVE_FRAME_OFFSET)) + +#define CREATE_JAVAFRAME_1(EE, MB, OLD_FRAME, NEW_FRAME) \ NEW_FRAME->javastack = stack;\ NEW_FRAME->prev = OLD_FRAME;\ NEW_FRAME->vars = optop;\ @@ -776,19 +793,29 @@ EE->current_frame = NEW_FRAME;\ } /* create a new frame */ + +#define CREATE_JAVAFRAME(EE, MB, OLD_FRAME, NEW_FRAME,\ + ARGS_SIZE, NLOCAL, CAPACITY) \ + CREATE_JAVAFRAME_0(EE, MB, OLD_FRAME, NEW_FRAME, NLOCAL, ARGS_SIZE, NLOCAL);\ + EXPAND_JAVASTACK(EE, stack, NEW_FRAME, optop, ARGS_SIZE, NLOCAL, CAPACITY);\ + CREATE_JAVAFRAME_1(EE, MB, OLD_FRAME, NEW_FRAME) + #if JDK_VER >= 12 -# define CREATE_JAVAFRAME_FOR_NATIVE(EE, MB, OLD_FRAME, NEW_FRAME,\ - TENTATIVE_FRAME_OFFSET) \ - CREATE_JAVAFRAME(ee, method, old_frame, frame, args_size, 0, 0,\ - JNI_REF_INFO_SIZE + JNI_DEFAULT_LOCAL_CAPACITY);\ - frame->optop += JNI_REF_INFO_SIZE;\ - JNI_REFS_FREELIST(frame) = NULL;\ - JNI_N_REFS_IN_USE(frame) = 0;\ - JNI_REFS_CAPACITY(frame) = JNI_DEFAULT_LOCAL_CAPACITY +# define CREATE_JAVAFRAME_FOR_NATIVE(EE, MB, OLD_FRAME, NEW_FRAME, ARGS_SIZE)\ + CREATE_JAVAFRAME_0(EE, MB, OLD_FRAME, NEW_FRAME, ARGS_SIZE, ARGS_SIZE, 0);\ + EXPAND_JAVASTACK_FOR_NATIVE(EE, stack, NEW_FRAME);\ + CREATE_JAVAFRAME_1(EE, MB, OLD_FRAME, NEW_FRAME);\ + \ + NEW_FRAME->optop += JNI_REF_INFO_SIZE;\ + JNI_REFS_FREELIST(NEW_FRAME) = NULL;\ + JNI_N_REFS_IN_USE(NEW_FRAME) = 0;\ + JNI_REFS_CAPACITY(NEW_FRAME) = JNI_DEFAULT_LOCAL_CAPACITY #else -# define CREATE_JAVAFRAME_FOR_NATIVE(EE, MB, OLD_FRAME, NEW_FRAME,\ - TENTATIVE_FRAME_OFFSET) \ - CREATE_JAVAFRAME(ee, method, old_frame, frame, args_size, 0, 0, 0) +# define CREATE_JAVAFRAME_FOR_NATIVE(EE, MB, OLD_FRAME, NEW_FRAME, ARGS_SIZE)\ + CREATE_JAVAFRAME_0(EE, MB, OLD_FRAME, NEW_FRAME, ARGS_SIZE, ARGS_SIZE, 0);\ + EXPAND_JAVASTACK_FOR_NATIVE(EE, stack, NEW_FRAME);\ + CREATE_JAVAFRAME_1(EE, MB, OLD_FRAME, NEW_FRAME) #endif /* JDK_VER */ + #endif /* _COMPILER_H_ */ diff -aruN shujit-0.4.0/invoker.c shujit/invoker.c --- shujit-0.4.0/invoker.c Tue Dec 28 18:51:50 1999 +++ shujit/invoker.c Sun Feb 6 18:45:33 2000 @@ -358,8 +358,8 @@ ee->current_frame = frame; } /* create a new frame */ #else - CREATE_JAVAFRAME(ee, mb, old_frame, frame, mb->nlocals, - args_size, mb->nlocals, mb->maxstack); + CREATE_JAVAFRAME(ee, mb, old_frame, frame, + args_size, mb->nlocals, mb->maxstack); #endif /* call */ diff -aruN shujit-0.4.0/runtime.c shujit/runtime.c --- shujit-0.4.0/runtime.c Mon Dec 27 18:58:44 1999 +++ shujit/runtime.c Sun Feb 6 18:30:30 2000 @@ -203,12 +203,12 @@ old_frame = ee->current_frame; optop = old_frame->optop; /* create a new frame */ - CREATE_JAVAFRAME_FOR_NATIVE(ee, method, old_frame, new_frame, args_size); + CREATE_JAVAFRAME_FOR_NATIVE(ee, method, old_frame, frame, args_size); env = EE2JNIEnv(ee); access = method->fb.access; - is_sync = (access & ACC_STATIC); + is_sync = access & ACC_SYNCHRONIZED; is_static = ((access & ACC_STATIC) ? (ClassClass **)&obj : NULL); terse_sig = ((CodeInfo *)method->CompiledCodeInfo)->terse_sig; @@ -218,8 +218,9 @@ if (is_static) argsize++; argsize <<= 2; - if (is_sync) + if (is_sync) { monitorEnter2(ee, obj_monitor(obj)); + } #ifdef RUNTIME_DEBUG # define PUSH_CONSTSTR(STR) asm("pushl %0" : : "m" (STR) : "esi") @@ -402,7 +403,7 @@ if (runtime_debug) { asm("subl $200,%esp\n\tpushal\n\t" "pushl %ecx"); - PUSH_CONSTSTR(" terse ret: %x\n"); + PUSH_CONSTSTR(" terse ret: %d\n"); asm("call printf@PLT\n\t" "addl $8,%esp"); asm("popal\n\taddl $200,%esp"); @@ -510,8 +511,9 @@ } ee->current_frame = old_frame; - if (is_sync) + if (is_sync) { monitorExit2(ee, obj_monitor(obj)); + } return !(exceptionOccurred(ee)); } @@ -563,7 +565,7 @@ optop = old_frame->optop; #if 0 /* create a new frame */ - CREATE_JAVAFRAME_FOR_NATIVE(ee, method, old_frame, new_frame, args_size); + CREATE_JAVAFRAME_FOR_NATIVE(ee, method, old_frame, frame, args_size); #endif access = method->fb.access; @@ -576,8 +578,9 @@ if (is_static) argsize++; argsize <<= 2; - if (is_sync) + if (is_sync) { monitorEnter2(ee, obj_monitor(obj)); + } /* esi: src addr., edi: dst addr. */ asm("movl %0,%%edx\n\t" @@ -697,8 +700,9 @@ ee->current_frame = old_frame; #endif - if (is_sync) + if (is_sync) { monitorExit2(ee, obj_monitor(obj)); + } #ifdef RUNTIME_DEBUG if (runtime_debug) { @@ -709,7 +713,7 @@ #endif return !(exceptionOccurred(ee)); } -#endif /* DIRECT_INV_OF_NATIVE */ +#endif /* DIRECT_INV_NATIVE */ else { /* normal Java or native method or call compileAndInvokeMethod() */