From: nobu.nakada@... Date: 2002-02-17T00:27:06+09:00 Subject: [ruby-dev:15902] Re: GC after load なかだです。 At Fri, 15 Feb 2002 19:50:39 +0900, Nobuyoshi-Nakada wrote: > 激しく使い物にならなかったので、parse.yだけ再度。byaccでmake > testとrubiconまでは一応確認済み。 やっぱりいろいろ間違ってました。なんでエラーにならんかなぁ。 Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.153.1.1 diff -u -2 -p -r1.153.1.1 parse.y --- parse.y 2002/02/15 10:29:44 1.153.1.1 +++ parse.y 2002/02/15 12:42:39 @@ -152,17 +152,17 @@ static void top_local_setup(); static struct { - void **ptr; + VALUE **ptr; int count; } stacks; -static void ** +static VALUE ** stack_holder(ptr) - void *ptr; + VALUE *ptr; { int i; if (!stacks.ptr) { stacks.count = 4; - stacks.ptr = ALLOC_N(void*, stacks.count); - MEMZERO(stacks.ptr, void*, stacks.count); + stacks.ptr = ALLOC_N(VALUE*, stacks.count); + MEMZERO(stacks.ptr, VALUE*, stacks.count); return stacks.ptr; } @@ -176,6 +176,6 @@ stack_holder(ptr) } i = stacks.count << 1; - REALLOC_N(stacks.ptr, void*, i); - MEMZERO(stacks.ptr + stacks.count, void*, i - stacks.count); + REALLOC_N(stacks.ptr, VALUE*, i); + MEMZERO(stacks.ptr + stacks.count, VALUE*, i - stacks.count); stacks.count = i; return &stacks.ptr[i]; @@ -189,6 +189,6 @@ parser_malloc(size) return xmalloc(size); #else - void **holder = stack_holder(0); - VALUE *p = (VALUE *)xmalloc(size + sizeof(VALUE)); + VALUE **holder = stack_holder(0); + VALUE *p = xmalloc(size + sizeof(VALUE)); memset(p + 1, 0, size); *holder = p; @@ -206,7 +206,8 @@ parser_realloc(ptr, size) return xrealloc(ptr, size); #else - void **holder = stack_holder(ptr); - VALUE oldsize = *holder ? *(VALUE *)*holder : 0; - VALUE *p = (VALUE *)xrealloc(ptr, size + sizeof(VALUE)); + VALUE *p = (VALUE *)ptr - 1; + VALUE **holder = stack_holder(p); + VALUE oldsize = *holder ? **holder : 0; + p = xrealloc(p, size + sizeof(VALUE)); if (size > oldsize) memset(p + 1 + oldsize, 0, size - oldsize); *holder = p; @@ -220,12 +221,15 @@ parser_free(ptr) void *ptr; { -#if !(defined YYBISON && defined YYSTACK_USE_ALLOCA) - *stack_holder(ptr) = 0; -#endif +#if defined YYBISON && defined YYSTACK_USE_ALLOCA xfree(ptr); +#else + VALUE *p = (VALUE *)ptr - 1; + *stack_holder(p) = 0; + xfree(p); +#endif } #define malloc(size) parser_malloc(size) -#define calloc(size) parser_calloc(size) +#define calloc(size) parser_malloc(size) #define realloc(ptr, size) parser_realloc(ptr, size) #define free(ptr) parser_free(ptr) -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦