[#12164] patch for ext/gdbm — Koji Arai <JCA02266@...>

新井です。

24 messages 2001/02/04
[#12168] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/05

まつもと ゆきひろです

[#12176] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/05

新井です。

[#12179] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/06

まつもと ゆきひろです

[#12219] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12220] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12256] set_trace_func — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

15 messages 2001/02/17

[#12293] crash on proc without a block — Kenichi Komiya <kom@...1.accsnet.ne.jp>

15 messages 2001/02/25

[#12323] Re: [ruby-list:28364] class definition extension — "K.Kosako" <kosako@...>

ruby-listから移動しました。

13 messages 2001/02/28
[#12324] Re: [ruby-list:28364] class definition extension — matz@... (Yukihiro Matsumoto) 2001/02/28

まつもと ゆきひろです

[ruby-dev:12181] Re: FRAME argv

From: Toyofuku <toyofuku@...>
Date: 2001-02-06 07:00:31 UTC
List: ruby-dev #12181
  豊福です。

まつもとさん
>|  alloca はスタックに取られるものとばかり思ってました。
>|スタックに取らない方式ってどうやってるんですか。
> 
> 世の中にはC_ALLOCAというものがあり、それが使われる場合があり
> えます。実装は missing/alloca.c を参照してください。

  スタックの増減を横目に見ながらそれにあわせて malloc,
free を使うってかんじですか。

>|  他に、argv[] の領域を SCOPE の local_vars の最後に
>|とるというの考えたんですがややっこしくなるだけでよく
>|ないですね。
> 
> そうですね。しかも、evalでローカル変数が追加されたときに破綻
> しますね。

  そうか、eval かー。かといって local_vars の最初
にはとれないし。

>|  ところで blk_copy_prev() と frame_dup() の argv の
>|コピーは共通化できませんか。ささやかな節約ですけど。
> 
> ブロック中のフレームそのものがコピーですからねえ。オリジナル
> との対応関係を持たないので、共通化は難しいかも。

  下のコードのような意図なんですが。
境界条件は適当なので気持ちだけ汲んでください。

    while (block->prev) {
      btmp = ALLOC_N(struct BLOCK, 1);
      MEMCPY(btmp, block->prev, struct BLOCK, 1);
      if (btmp->frame.argc > 0) {
        for ( ; ; frame = frame->prev) {
          orig_argv = frame->argv;
          if (frame->argc > 0) {
            argv = ALLOC_N(VALUE, frame->argc);
            MEMCPY(argv, frame->argv, VALUE, frame->argc);
            frame->argv = argv;
            frame->flags = FRAME_MALLOC;
          }
          frame->tmp = 0;
          ftmp = ALLOC(struct FRAME);
          *ftmp = *frame->prev;
          frame->prev = ftmp;
          frame = ftmp;
          if (orig_argv == block->prev->frame.argv)
            break;
        }
        btmp->frame.argv = frame->argv;
        frame = frame->prev;
      }
      scope_dup(btmp->scope);
      block->prev = btmp;
      block = btmp;
    }
    for (;;) {
      if (frame->argc > 0) {
        argv = ALLOC_N(VALUE, frame->argc);
        MEMCPY(argv, frame->argv, VALUE, frame->argc);
        frame->argv = argv;
        frame->flags = FRAME_MALLOC;
      }
      frame->tmp = 0;
      ftmp = ALLOC(struct FRAME);
      *ftmp = *frame->prev;
      frame->prev = ftmp;
      frame = ftmp;
    }
---
                        豊福
                        toyofuku@juice.or.jp

In This Thread