From: Kazuhiro HIWADA Date: 1999-01-18T11:16:32+09:00 Subject: [ruby-dev:4198] Re: call/cc ひわだです。たびたびすいません。 From: EGUCHI Osamu Subject: [ruby-dev:4195] Re: call/cc > えぐち@エスアンドイー です。 > shugo> ところで、ひわださんのパッチをあてると落ちるのですが...。 > shugo> > shugo> $ ./ruby irb.rb > shugo> /home/shugo/ruby/irb/input-method.rb:97: [BUG] rb_gc_mark(): unknown data type 0x70(0xbfff2c98) non object > shugo> Aborted > > 同じではないですが、これと似たようなのが出ます。 > > triton2.eguchi:49% ./ruby irb/irb.rb > irb(main):001:0> callcc {|c| $cc=c} > (irb):1: [BUG] rb_gc_mark(): unknown data type 0x14(0xefbf9e04) non object > Abort (core dumped) なにを血迷ったか 1.1c0 でテストしてました(アホ>俺)。1.3 のつもりで テストしてたんですが…(何故だ ^^;)。 で、eval.c の POP_SCOPE の所を、 #define POP_SCOPE() \ if (ruby_scope->flag == SCOPE_ALLOCA) {\ scope_dup(ruby_scope);\ }\ else {\ のようにすれば、とりあえず間違いなく動くと思います。これだと gc.c への パッチは必要ありません。 でも dup はさすがに無駄なはずなので、もう少し粘るなら、前の gc.c への パッチに加えて… --- gc.c.orig Mon Jan 18 09:38:30 1999 +++ gc.c Mon Jan 18 10:59:07 1999 @@ -593,8 +593,11 @@ rb_gc_mark(ptr) if (obj->as.scope.local_vars) { + VALUE v; int n = obj->as.scope.local_tbl[0]+1; VALUE *vars = &obj->as.scope.local_vars[-1]; - - while (n--) { - rb_gc_mark(*vars); - vars++; + if (!((obj->as.scope.flag == 0) && + (rb_gc_stack_start < &v ? &v > vars+n : &v < vars))){ + while (n--) { + rb_gc_mark(*vars); + vars++; + } } とか(妖し ^^;)。あと、T_SCOPE で flag が SCOPE_ALLOCA のとき free し ないのは、ALLOCA でスタック上にメモリが確保されているからのつもりです。 しかし、やっぱ、もっとうまい方法が欲しい気がしますね…。