diff -aruN shujit-0.7.4/ChangeLog shujit/ChangeLog --- shujit-0.7.4/ChangeLog Wed Sep 5 15:45:09 2001 +++ shujit/ChangeLog Fri Sep 21 22:08:48 2001 @@ -1,5 +1,50 @@ $Id$ +[20010921] + +クラスを JIT 向けに初期化する際 (initializeClassForJIT()) に、 +クラスが final だった場合にはメソッドのフラグ (access) も final に変更 +していたが、これによって java.io.ObjectStreamClass#computeSerialVersionUID() +で算出される serialVersionUID が変わってしまっていた。 +メソッドのフラグは変更しないでおいて、final かどうかのチェック時に +クラスのフラグも見るようにした。 +Forte for Java 3.0 で発覚。 +(compiler.c, compile.c) + +0.7.5 リリース。 + +[20010920] + +マクロ NULL_TEST() の定義中で、マクロ SIGNAL_ERROR0() の引数として、 +本来 EXCID_NullPointerException を与えねばならないところ、 +単に NullPointerException と書いてしまっていた。修整。 +(code.h) + +[20010917] + +computil.c にあるいくつかの関数 +(getCompilerContext(), releaseCompilerContext(), prepareCompiledCodeInfo()) +にて、排他制御のためにクラスオブジェクトを使うのを止めた。 +sysMonitorEnter(), sysMonitorExit() を使うようにした。 +Forte for Java 3.0 でデッドロックが起きてしまっていたため。 +(computil.c) + +[20010917] + +synchronized メソッドは inline しないようにした。 +inline したメソッド内で例外が throw された場合に +モニタを開放しない恐れがあるため。 +(compile.c) + +synchronized メソッドの再帰呼び出しは末尾再帰として扱わないようにした。 +呼び出しからの return 後にモニタの開放を行う必要があるため、末尾再帰ではない。 +Forte for Java 3.0 の +org.netbeans.core.MultiURLClassLoader#getResource(String, boolean) で +IllegalMonitorStateException が起きていて発覚。 +プログラムカウンタ 170 の invokespecial が invoke_recursive_3 に変換されて +しまっていたため。 +(compile.c) + [20010905] 0.7.4 リリース。 diff -aruN shujit-0.7.4/GNUmakefile shujit/GNUmakefile --- shujit-0.7.4/GNUmakefile Wed Sep 5 17:06:47 2001 +++ shujit/GNUmakefile Sat Sep 22 02:35:32 2001 @@ -154,16 +154,16 @@ # generate code.o ifeq (${GCC27}, yes) -${OBJDIR}/tmp.s: code.c ${POSTPROC} +${OBJDIR}/tmp.s: code.c compiler.h ${POSTPROC} ${CC} -S -fno-omit-frame-pointer ${NOOPTCFLAGS} -o $@ $< ${OBJDIR}/code.s: ${OBJDIR}/tmp.s ${RUBY} ${POSTPROC} < $< > $@ # ${RM} -f $< ${OBJDIR}/code.o: ${OBJDIR}/code.s else -${OBJDIR}/code.o: code.c +${OBJDIR}/code.o: code.c code.h compiler.h ${CC} -fno-omit-frame-pointer ${NOOPTCFLAGS} -c -o $@ $< -${OBJDIR}/code.s: code.c code.h +${OBJDIR}/code.s: code.c code.h compiler.h ${CC} -S -fno-omit-frame-pointer ${NOOPTCFLAGS} -o $@ $< endif diff -aruN shujit-0.7.4/GNUmakefile.in shujit/GNUmakefile.in --- shujit-0.7.4/GNUmakefile.in Mon Sep 3 21:45:14 2001 +++ shujit/GNUmakefile.in Wed Sep 19 00:06:55 2001 @@ -154,16 +154,16 @@ # generate code.o ifeq (${GCC27}, yes) -${OBJDIR}/tmp.s: code.c ${POSTPROC} +${OBJDIR}/tmp.s: code.c compiler.h ${POSTPROC} ${CC} -S -fno-omit-frame-pointer ${NOOPTCFLAGS} -o $@ $< ${OBJDIR}/code.s: ${OBJDIR}/tmp.s ${RUBY} ${POSTPROC} < $< > $@ # ${RM} -f $< ${OBJDIR}/code.o: ${OBJDIR}/code.s else -${OBJDIR}/code.o: code.c +${OBJDIR}/code.o: code.c code.h compiler.h ${CC} -fno-omit-frame-pointer ${NOOPTCFLAGS} -c -o $@ $< -${OBJDIR}/code.s: code.c code.h +${OBJDIR}/code.s: code.c code.h compiler.h ${CC} -S -fno-omit-frame-pointer ${NOOPTCFLAGS} -o $@ $< endif diff -aruN shujit-0.7.4/README shujit/README --- shujit-0.7.4/README Wed Sep 5 16:32:00 2001 +++ shujit/README Sat Sep 22 02:36:32 2001 @@ -13,14 +13,14 @@ Working on the following platforms is confirmed. - Linux - - Blackdown JDK 1.3.1 FCS, gcc 2.95.2, glibc 2.2.4 and Linux 2.4.9-ac7 - - Blackdown JDK 1.2.2 FCS, gcc 2.95.2, glibc 2.2.4 and Linux 2.4.9-ac7 - - JDK 1.1.8v3, gcc 2.95.2, glibc 2.2.4 and Linux 2.4.9-ac7 + - Blackdown JDK 1.3.1 FCS, gcc 2.95.2, glibc 2.2.4 and Linux 2.4.9-ac12 + - Blackdown JDK 1.2.2 FCS, gcc 2.95.2, glibc 2.2.4 and Linux 2.4.9-ac12 + - JDK 1.1.8v3, gcc 2.95.2, glibc 2.2.4 and Linux 2.4.9-ac12 - JDK 1.1.7v1a, egcs 1.1.2, libc 5.4.38 and Linux 2.0.35 - FreeBSD - - JDK 1.2.2 patch10, gcc 2.95.2 and FreeBSD 5.0-CURRENT - JDK 1.1.8 (ELF, V1999-11-9), gcc 2.95.2 and FreeBSD 4.3-STABLE + - JDK 1.2.2 patch10, gcc 2.95.2 and FreeBSD 5.0-CURRENT * Installation diff -aruN shujit-0.7.4/code.c shujit/code.c --- shujit-0.7.4/code.c Thu Aug 2 19:16:33 2001 +++ shujit/code.c Thu Sep 20 20:01:23 2001 @@ -544,6 +544,17 @@ CODE(opc_sync_obj_enter, sync_obj_enter, STANY, STSTA, OPC_THROW) { // monitorEnter(obj_monitor(o)); asm("movl (%esi),%eax"); // eax = the 1st argument +#ifdef RUNTIME_DEBUG + if (runtime_debug) { + DEBUG_IN; + asm("pushl %esi\n\tpushl %eax"); + PUSH_CONSTSTR(" obj: 0x%x @ 0x%x\n"); + asm("call " SYMBOL(printf) "@PLT\n\t" + "addl $12,%esp"); + FFLUSH; + DEBUG_OUT; + } +#endif #ifdef SET_FRAME_MONITOR // frame->monitor = (struct sys_mon *)o asm("movl %0,%%edi" : : "m" (ee)); // edi = ee @@ -578,6 +589,17 @@ // monitorExit(obj_monitor(o)) asm("movl (%esi),%eax"); // eax = the 1st argument +#ifdef RUNTIME_DEBUG + if (runtime_debug) { + DEBUG_IN; + asm("pushl %esi\n\tpushl %eax"); + PUSH_CONSTSTR(" obj: 0x%x @ 0x%x\n"); + asm("call " SYMBOL(printf) "@PLT\n\t" + "addl $12,%esp"); + FFLUSH; + DEBUG_OUT; + } +#endif METAVM_MONITOR(%eax, proxy_monitorexit, "sync_obj_exit", 0); OBJ_MONITOR(%eax); CALL_MONITOR(%eax, monitorExit); diff -aruN shujit-0.7.4/code.h shujit/code.h --- shujit-0.7.4/code.h Sun Mar 11 16:10:24 2001 +++ shujit/code.h Thu Sep 20 20:01:27 2001 @@ -164,6 +164,7 @@ #define STATETO30 asm("pushl %ecx") #define STATETO40 asm("pushl %ecx\n\tpushl %edx") + #define SIGNAL_ERROR_JUMP() \ bytepcoff = BYTEPCOFF;\ asm(".byte 0xe9\n\t.long " STR(ADDR_EXC)) @@ -185,7 +186,7 @@ # define NULL_TEST(REG, LABEL) \ asm("testl " #REG "," #REG "\n\t"\ "jnz " LABEL);\ - SIGNAL_ERROR0(NullPointerException);\ + SIGNAL_ERROR0(EXCID_NullPointerException);\ asm(LABEL ":") #else # define NULL_TEST(REG, LABEL) diff -aruN shujit-0.7.4/compile.c shujit/compile.c --- shujit-0.7.4/compile.c Mon Sep 3 20:08:21 2001 +++ shujit/compile.c Sat Sep 22 02:33:42 2001 @@ -219,8 +219,9 @@ #endif #ifdef METHOD_INLINING - if ((mb->exception_table_length == 0) && // don't have exc. table - (cc->may_jump == FALSE) && // don't contain any jump + if (!(mb->fb.access & ACC_SYNCHRONIZED) && // not synchronized + (mb->exception_table_length == 0) && // don't have exc. table + (cc->may_jump == FALSE) && // don't contain any jump (pctableLen(cc) <= opt_inlining_maxlen)) { size_t copysize = sizeof(pcentry) * pctableLen(cc); @@ -362,6 +363,7 @@ cbName(fieldclass(&mb->fb)), mb->fb.name, mb->fb.signature); // class name, method name, signature fprintf(sizefp, "\n"); + fflush(sizefp); } codesize_open_failed: @@ -848,9 +850,11 @@ case opc_invokevirtual: { struct methodblock *method = constant_pool[operand].mb; - char *clz_name = cbName(fieldclass(&method->fb)); + ClassClass *clz = fieldclass(&method->fb); - if (method->fb.access & (ACC_PRIVATE | ACC_FINAL)) { + if ((method->fb.access & ACC_PRIVATE) || + ((method->fb.access | cbAccess(clz)) & ACC_FINAL)) { + // the method is private and the method or the class is final #ifdef COMPILE_DEBUG if (compile_debug) { printf(" adjust invokevirtual private method to " @@ -865,7 +869,7 @@ processAnOpcode(cc, opc_stateto0, byteoff); processAnOpcode(cc, opc_inv_head, byteoff); processAnOpcode(cc, opc_inv_vir_obj, byteoff); - if (!strcmp(clz_name, "java/lang/Object")) + if (!strcmp(cbName(clz), "java/lang/Object")) processAnOpcode(cc, opc_invokevirtual, byteoff); else processAnOpcode(cc, opc_invokevirtual_obj, byteoff); @@ -927,8 +931,8 @@ #ifdef ELIMINATE_TAIL_RECURSION { struct methodblock *method = constant_pool[operand].mb; - if (cc->mb /* not mb */ == method) { - // recursive call + if ((cc->mb /* not mb */ == method) && // recursive call + (!(method->fb.access & ACC_SYNCHRONIZED))) { // not synchronized int next_bytepc = byteoff + byteinc; int next_opcode = *(methodcode + next_bytepc); while ((next_opcode == opc_goto) || (next_opcode == opc_goto_w)) { @@ -948,6 +952,8 @@ , COMPILE_DEBUG # endif ) == NULL) { + // the call is not in a try clause + // tail recursion int reccall_opcode; # ifdef COMPILE_DEBUG diff -aruN shujit-0.7.4/compiler.c shujit/compiler.c --- shujit-0.7.4/compiler.c Sun Jul 29 12:44:23 2001 +++ shujit/compiler.c Fri Sep 21 16:44:24 2001 @@ -54,6 +54,12 @@ // // Global Variables // +#if JDK_VER >= 12 +extern int _JVM_native_threads; +#endif + +sys_mon_t *global_monitor; + #ifndef IGNORE_DISABLE bool_t compiler_enabled = TRUE; #endif @@ -163,11 +169,20 @@ #ifdef COMPILE_DEBUG printf("java_lang_Compiler_start() called.\n"); - printf("ee: 0x%x\n", ee); + printf(" ee: 0x%x\n", ee); +# if JDK_VER >= 12 + printf(" _JVM_native_threads: %s\n", _JVM_native_threads ? "true":"false"); +# endif fflush(stdout); #endif + // prepare the global monitor + global_monitor = (sys_mon_t *)sysCalloc(1, sysMonitorSizeof()); + sysMonitorInit(global_monitor); + + +#if JDK_VER < 12 // prevent unloading of java.lang.Compiler class { ClassClass *compiler_cb = FindClass(ee, "java/lang/Compiler", TRUE); @@ -186,6 +201,7 @@ } CCSet(compiler_cb, Sticky); } +#endif #ifdef METAVM @@ -221,10 +237,8 @@ version = *(jitinterface->JavaVersion); #endif #ifdef COMPILE_DEBUG - { - printf("Version num. of class file format: %d.%d\n", + printf(" version num. of class file format: %d.%d\n", (version >> 16) & 0xff, version & 0xffff); - } #endif // COMPILE_DEBUG compilerVersion = version >> 24; @@ -485,18 +499,18 @@ *(char **)vector[4] = (char *)freeClass; *(char **)vector[5] = (char *)compileClass; *(char **)vector[6] = (char *)compileClasses; -#ifndef IGNORE_DISABLE +# ifndef IGNORE_DISABLE if (!OPT_SETQ(OPT_IGNDISABLE)) { *(char **)vector[7] = (char *)compilerEnable; *(char **)vector[8] = (char *)compilerDisable; } -#endif // IGNORE_DISABLE +# endif // IGNORE_DISABLE *(char **)vector[10] = (char *)pcInCompiledCode; *(char **)vector[11] = (char *)compiledCodePC; -#ifdef DIRECT_INVOCATION +# ifdef DIRECT_INVOCATION *(char **)vector[70] = (char *)framePrev; -#endif // DIRECT_INVOCATION -#ifdef COMPILE_DEBUG +# endif // DIRECT_INVOCATION +# ifdef COMPILE_DEBUG { int i; for (i = 1; i <= 8; i++) @@ -506,7 +520,7 @@ printf("*vector[70]: 0x%08x\n", i, (int)*(char **)vector[70]); fflush(stdout); } -#endif // COMPILE_DEBUG +# endif // COMPILE_DEBUG #else // JDK_VER { JITInterface6 *ji6 = (JITInterface6 *)jitinterface; @@ -661,10 +675,6 @@ JVM_Exit(1); } - // if the class is final, make the method final - if (cbAccess(cb) & ACC_FINAL) - mb->fb.access |= ACC_FINAL; - if (access & ACC_NATIVE) { #if defined(METAVM) && (JDK_VER >= 12) if (linkNative) { @@ -721,7 +731,6 @@ // initialize invoker if ((OPT_SETQ(OPT_CMPLCLINIT) || strcmp(mb->fb.name, "")) && - (mb->invoker != sym_compileAndInvokeMethod) && // not init.ed yet (mb->CompiledCode == NULL)) { // not compiled yet // assume that CompiledCode of not-yet-compiled method is NULL mb->invoker = sym_compileAndInvokeMethod; diff -aruN shujit-0.7.4/compiler.h shujit/compiler.h --- shujit-0.7.4/compiler.h Wed Sep 5 17:09:47 2001 +++ shujit/compiler.h Fri Sep 21 22:37:09 2001 @@ -455,7 +455,7 @@ #endif // specific to JIT compiled code - int32_t code_size; + uint32_t code_size; int32_t invocation_count; uint32_t exc_handler_nativeoff; @@ -477,7 +477,9 @@ // // Global variables // + // in compiler.c +extern sys_mon_t *global_monitor; #ifndef IGNORE_DISABLE extern bool_t compiler_enabled; diff -aruN shujit-0.7.4/computil.c shujit/computil.c --- shujit-0.7.4/computil.c Wed Aug 8 22:49:40 2001 +++ shujit/computil.c Thu Sep 20 20:30:49 2001 @@ -100,18 +100,25 @@ CompilerContext *getCompilerContext(struct methodblock *mb) { - ExecEnv *ee = EE(); // for monitor{Enter,Exit}2() + ExecEnv *ee = EE(); CompilerContext *cc; CodeInfo *info; - MONITOR_T key = obj_monitor((JHandle *)fieldclass(&mb->fb)); - - monitorEnter2(ee, key); +#if JDK_VER >= 12 + sys_thread_t *self = EE2SysThread(ee); +#endif + sys_mon_t *mon; // examine whether already created + SYS_MONITOR_ENTER(self, global_monitor); info = (CodeInfo *)mb->CompiledCodeInfo; if (info == NULL) { info = prepareCompiledCodeInfo(ee, mb); } + SYS_MONITOR_EXIT(self, global_monitor); + + mon = info->monitor; + + SYS_MONITOR_ENTER(self, mon); cc = info->cc; if (cc == NULL) { @@ -130,19 +137,21 @@ cc->ee = ee; // set ExecEnv cc->ref_count++; - monitorExit2(ee, key); + SYS_MONITOR_EXIT(self, mon); + return cc; } void releaseCompilerContext(CompilerContext *cc) { + CodeInfo *info; #if JDK_VER >= 12 - ExecEnv *ee = EE(); // for monitor{Enter,Exit}2() + ExecEnv *ee = EE(); + sys_thread_t *self = EE2SysThread(ee); #endif - CodeInfo *info; - MONITOR_T key = obj_monitor((JHandle *)classJavaLangThreadDeath); + sys_mon_t *mon; - monitorEnter2(ee, key); + SYS_MONITOR_ENTER(self, global_monitor); cc->ref_count--; if (cc->ref_count <= 0) { @@ -156,7 +165,7 @@ cc_pool = cc; } - monitorExit2(ee, key); + SYS_MONITOR_EXIT(self, global_monitor); } @@ -539,7 +548,10 @@ CodeInfo *prepareCompiledCodeInfo(ExecEnv *ee, struct methodblock *method) { CodeInfo *info; ClassClass *clazz; - MONITOR_T key; +#if JDK_VER >= 12 + sys_thread_t *self = EE2SysThread(ee); +#endif + sys_mon_t *mon; if ((clazz = fieldclass(&method->fb)) == NULL) { #ifdef COMPILE_DEBUG @@ -551,21 +563,31 @@ goto prepare_done; } - key = obj_monitor((JHandle *)clazz); - - monitorEnter2(ee, key); // lock + SYS_MONITOR_ENTER(self, global_monitor); info = (CodeInfo *)method->CompiledCodeInfo; if (info != NULL) { - monitorExit2(ee, key); + SYS_MONITOR_EXIT(self, global_monitor); goto prepare_done; } info = (CodeInfo *)sysCalloc(1, sizeof(CodeInfo)); method->CompiledCodeInfo = (void *)info; - monitorExit2(ee, key); // unlock + mon = info->monitor = (sys_mon_t *)sysCalloc(1, sysMonitorSizeof()); + sysMonitorInit(info->monitor); + + SYS_MONITOR_EXIT(self, global_monitor); + + + SYS_MONITOR_ENTER(self, mon); + + if (info->argsizes != NULL) { + // already initialized + SYS_MONITOR_EXIT(self, mon); + goto prepare_done; + } #ifdef EAGER_COMPILATION info->cc = NULL; @@ -576,9 +598,6 @@ info->pctable = NULL; #endif - info->monitor = (sys_mon_t *)sysCalloc(1, sysMonitorSizeof()); - sysMonitorInit(info->monitor); - #define AS_BUF_SIZE 256 { char *sig = method->fb.signature + 1; @@ -685,6 +704,9 @@ jmp *%eax (41) ff e0 */ #endif // PATCH_WITH_SIGTRAP + + + SYS_MONITOR_EXIT(self, mon); prepare_done: return info; diff -aruN shujit-0.7.4/configure shujit/configure --- shujit-0.7.4/configure Wed Sep 5 17:06:43 2001 +++ shujit/configure Thu Sep 20 20:23:50 2001 @@ -1667,10 +1667,10 @@ ac_jincdir_md=freebsd ;; linux*) - if test "$ac_jver" = "11"; then - ac_jincdir_md=genunix - else + if test -d "$ac_jincdir1/linux"; then ac_jincdir_md=linux + else + ac_jincdir_md=genunix fi ;; esac diff -aruN shujit-0.7.4/configure.in shujit/configure.in --- shujit-0.7.4/configure.in Wed Sep 5 17:06:39 2001 +++ shujit/configure.in Thu Sep 20 20:23:48 2001 @@ -214,10 +214,10 @@ ac_jincdir_md=freebsd ;; linux*) - if test "$ac_jver" = "11"; then - ac_jincdir_md=genunix - else + if test -d "$ac_jincdir1/linux"; then ac_jincdir_md=linux + else + ac_jincdir_md=genunix fi ;; esac diff -aruN shujit-0.7.4/invoker.c shujit/invoker.c --- shujit-0.7.4/invoker.c Wed Aug 1 10:50:00 2001 +++ shujit/invoker.c Sat Sep 22 02:36:23 2001 @@ -117,6 +117,12 @@ || (!compiler_enabled) // compiler is disabled #endif // IGNORE_DISABLE ) { +#ifdef COMPILE_DEBUG + if (invoker != sym_compileAndInvokeMethod) + printf(" the method is being compiled now.\n"); + else if (!compiler_enabled) + printf(" compiler disabled.\n"); +#endif SYS_MONITOR_EXIT(self, mon); goto candi_call_normal_method; } @@ -124,12 +130,20 @@ else if (!(mb->fb.access & ACC_STRICT)) { if (isSystemMethod(mb)) { // system methods if ((invocation_count < opt_systhreshold)) { +#ifdef COMPILE_DEBUG + printf(" %d < %d (sys threshold).\n", + invocation_count, opt_systhreshold); +#endif SYS_MONITOR_EXIT(self, mon); goto candi_call_normal_method; } } else { // not system methods if ((invocation_count < opt_userthreshold)) { +#ifdef COMPILE_DEBUG + printf(" %d < %d (user threshold).\n", + invocation_count, opt_userthreshold); +#endif SYS_MONITOR_EXIT(self, mon); goto candi_call_normal_method; } @@ -561,14 +575,14 @@ if (!mb) return FALSE; -#if 1 - if ((!strcmp(cbName(fieldclass(&mb->fb)), "sun/tools/java/Constants")) - && (!strcmp(mb->fb.name, ""))) +#if 0 + if ((!strcmp(cbName(fieldclass(&mb->fb)), "java/lang/Compiler"))) debugp = TRUE; - else if ((!strcmp(cbName(fieldclass(&mb->fb)), "java/lang/System")) - && (!strcmp(mb->fb.name, "getProperty"))) + else if ((!strcmp(cbName(fieldclass(&mb->fb)), "java/lang/Object")) + && (!strncmp(mb->fb.name, "notify", 6))) + debugp = TRUE; + else if ((!strcmp(cbName(fieldclass(&mb->fb)), "java/lang/Thread"))) debugp = TRUE; -#if 0 else if ((!strcmp(cbName(fieldclass(&mb->fb)), "java/lang/ThreadGroup")) && ( !strcmp(mb->fb.name, "uncaughtException") || @@ -577,7 +591,6 @@ !strcmp(mb->fb.name, "remove") )) debugp = TRUE; -#endif #if 0 else if ((!strcmp(cbName(fieldclass(&mb->fb)), "NET/shudo/metavm/Proxy"))) debugp = TRUE; diff -aruN shujit-0.7.4/signal.c shujit/signal.c --- shujit-0.7.4/signal.c Mon Jul 30 15:45:49 2001 +++ shujit/signal.c Fri Sep 21 16:53:36 2001 @@ -723,20 +723,25 @@ //int access = mb->fb.access; //if (access & (ACC_ABSTRACT | ACC_NATIVE)) continue; - if (mb == mb_in_frame) goto mb_found; + if (mb == mb_in_frame) { + printf("method by EIP (at EBP + 12)"); + goto mb_found; + } if (mb->invoker != sym_invokeJITCompiledMethod) continue; - off -= (uint32_t)mb->CompiledCode; - if (off < ((CodeInfo *)(mb->CompiledCodeInfo))->code_size) + if ((off - (uint32_t)mb->CompiledCode) < + ((CodeInfo *)(mb->CompiledCodeInfo))->code_size) { + printf("method by EIP (in native code)"); goto mb_found; + } } } mb = NULL; mb_found: if (mb != NULL) { - printf("method by EIP: %s#%s %s\n", + printf(": %s#%s %s\n", cbName(fieldclass(&mb->fb)), mb->fb.name, mb->fb.signature); } else { diff -aruN shujit-0.7.4/stack.c shujit/stack.c --- shujit-0.7.4/stack.c Sun Mar 11 16:12:29 2001 +++ shujit/stack.c Wed Sep 19 21:28:32 2001 @@ -22,7 +22,6 @@ */ #include // for debug -#include // for malloc(), free() #include // for assert() diff -aruN shujit-0.7.4/txt/memo shujit/txt/memo --- shujit-0.7.4/txt/memo Wed Sep 5 16:06:35 2001 +++ shujit/txt/memo Thu Sep 20 21:07:50 2001 @@ -1,4 +1,8 @@ Todo + - Native Threads だと Forte for Java 3.0 CE の起動中に + 様々な箇所でデッドロックする。この問題を解決する。 + TYA 1.7v3 でも同様。 + 「Loading Applet ...」でよく止まる。 - SSE2 対応の性能テスト Math.sqrt(), 四則演算 - 特定メソッドの inlining。