From: Kazuhiro HIWADA Date: 1999-01-19T03:14:15+09:00 Subject: [ruby-dev:4242] Re: call/cc ひわだです。 From: EGUCHI Osamu Subject: [ruby-dev:4235] Re: call/cc > えぐち@エスアンドイー です。 > まえから気にはなっていたのですが、PUSH_SCOPE()って > _scope->flag = 0; > ですが、(0 => SCOPE_ALLOCA) > alloca() でなく NEWOBJ() なので malloc() な記憶クラスでないかと思うです。 オブジェクト自体はそうなんですが、オブジェクトから指されているテーブル が alloca() になっていると思います。(だから rb_gc_force_recycle する 前に ruby_scope->local_vars = 0 とかしている?) From: shugo@aianet.ne.jp (Shugo Maeda) Subject: [ruby-dev:4206] Re: callcc > 前田です。 > callccを使わない場合には効率がほとんど落ちないようにしました。 > とりあえず試した範囲ではうまく行っているようです。 お、なるほど。たしかに。 でも scope_dup は無駄なので(Continuation が復元されるときには alloca された領域も復元されるので)、scope_dup せずに gc.c を変更する手も一応 あります(しつこい>俺 ^^;)。 --- gc.c.orig Mon Jan 18 09:38:30 1999 +++ gc.c Tue Jan 19 02:36:56 1999 @@ -592,3 +592,4 @@ rb_gc_mark(ptr) case T_SCOPE: - if (obj->as.scope.local_vars) { + if (obj->as.scope.local_vars && + obj->as.scope.flag != SCOPE_ALLOCA) { int n = obj->as.scope.local_tbl[0]+1; @@ -773,3 +774,4 @@ obj_free(obj) case T_SCOPE: - if (RANY(obj)->as.scope.local_vars) { + if (RANY(obj)->as.scope.local_vars && + RANY(obj)->as.scope.flag != SCOPE_ALLOCA) { VALUE *vars = RANY(obj)->as.scope.local_vars-1; 1.3 からのです。scope_dup でいいんですが、僕の書いた先の gc.c へのパッ チが間違えてたので、一応 ^^;。(スタック内は別途 mark されるんだった) From: shugo@aianet.ne.jp (Shugo Maeda) Subject: [ruby-dev:4224] Re: call/cc > > おもしろそうなので1.3に取り込みます.あくまでも実験というス > > タンスですけどね.で,1.3.1のリリースを考えないと. > > ありがとうございます。 > # 時限爆弾みたいで恐いですね(^^; > 使い道を考えなきゃ...。 ~~~~~~~~~~~~~~~~~~ 頑張ってください ^^;;;。 -- 檜田 和浩 ( hiwada@kuee.kyoto-u.ac.jp )