[#44014] Re: [ruby-core:37707] [Ruby 1.9 - Bug #3781] FIBER_USE_NATIVE が有効だと落ちるスクリプトがある — Narihiro Nakamura <authornari@...>

nariです。

14 messages 2011/07/02
[#44019] Re: [ruby-core:37707] [Ruby 1.9 - Bug #3781] FIBER_USE_NATIVE が有効だと落ちるスクリプトがある — KOSAKI Motohiro <kosaki.motohiro@...> 2011/07/02

> 本当はgc_mark()の際に毎回stack_check()するのがいいと思うのですが、

[#44027] [RubyKaigi] Next version of Ruby 1.8 and 1.9 — "Yuki Sonoda (Yugui)" <yugui@...>

-----BEGIN PGP SIGNED MESSAGE-----

16 messages 2011/07/03

[#44156] [Ruby 1.9 - Feature #5053][Open] ruby コマンドと libruby の食い違いチェック — Makoto Kishimoto <redmine@...>

20 messages 2011/07/19

[#44185] [Ruby 1.9 - Bug #5074][Open] "[BUG] cfp consistency error - send" on TestEnumerator#test_feed_yielder (test/ruby/test_enumerator.rb) — Shota Fukumori <sorah@...>

10 messages 2011/07/22

[#44189] [Ruby 1.9 - Bug #5075][Assigned] invalid *fdp in Mac OS X and FreeBSD over recvmsg with SCM_RIGHTS — Yui NARUSE <naruse@...>

12 messages 2011/07/22

[#44210] 1.9.3 (以降) の BigDecimal について — Tadayoshi Funaba <tadf@...>

BigDecimal() で整数、浮動小数点数、有理数などを受けとれるようになって、

14 messages 2011/07/23
[#44275] Re: 1.9.3 (以降) の BigDecimal について — Tadayoshi Funaba <tadf@...> 2011/07/30

変換には明示的なものとそうでないものがありますが、

[#44223] [Ruby 1.9 - Bug #5094][Assigned] Supported platforms of Ruby 1.9.3 — Yui NARUSE <naruse@...>

21 messages 2011/07/25
[#44229] Re: [Ruby 1.9 - Bug #5094][Assigned] Supported platforms of Ruby 1.9.3 — KOSAKI Motohiro <kosaki.motohiro@...> 2011/07/25

> == 成瀬の提案

[#44230] Re: [Ruby 1.9 - Bug #5094][Assigned] Supported platforms of Ruby 1.9.3 — Urabe Shyouhei <shyouhei@...> 2011/07/26

卜部です

[#44236] Re: [Ruby 1.9 - Bug #5094][Assigned] Supported platforms of Ruby 1.9.3 — Yusuke ENDOH <mame@...> 2011/07/26

遠藤です。

[#44254] [Ruby 1.8 - Bug #5105][Open] CGI::Session#session_id の生成方法について — Masahiro Tomita <tommy@...>

14 messages 2011/07/27
[#44256] [Ruby 1.8 - Bug #5105] CGI::Session#session_id の生成方法について — Yui NARUSE <naruse@...> 2011/07/27

[#44258] Re: [Ruby 1.8 - Bug #5105] CGI::Session#session_id の生成方法について — とみたまさひろ <tommy@...> 2011/07/27

とみたです。

[#44262] Re: [Ruby 1.8 - Bug #5105] CGI::Session#session_id の生成方法について — "NARUSE, Yui" <naruse@...> 2011/07/27

(2011/07/27 19:47), とみたまさひろ wrote:

[#44263] Re: [Ruby 1.8 - Bug #5105] CGI::Session#session_id の生成方法について — とみたまさひろ <tommy@...> 2011/07/27

とみたです。

[#44270] Re: [Ruby 1.8 - Bug #5105] CGI::Session#session_id の生成方法について — とみたまさひろ <tommy@...> 2011/07/29

とみたです。

[#44271] Re: [Ruby 1.8 - Bug #5105] CGI::Session#session_id の生成方法について — Tanaka Akira <akr@...> 2011/07/29

2011年7月29日20:04 とみたまさひろ <tommy@tmtm.org>:

[ruby-dev:44024] 呼び出し元コンテキストでのselfを取得したい(binding(n = 0)について)

From: 青柳政聡 <masaakiaoyagi@...>
Date: 2011-07-03 03:32:09 UTC
List: ruby-dev #44024
青柳と申します。

こちらに直接投稿していいのか分かりませんが、教えてください。
例えば、以下のObserverパターンのようにコールバックさせるケースでselfを渡すことが多かったので、
これを省略できるように、呼び出し元コンテキストでのselfを取得したいと思っています。

class AObservable
  include Observable
end
class AObserver
  def initialize
    obj = AObservable.new
    obj.add_observer(self)  # このselfを省略できるようにしたい
  end
  def update(arg)
  end
end

色々考えた結果、Bindingを取得できると他にも便利そうと思い、以下でも話題に上がっている
binding(n = 0)が実装されると嬉しいのですが、結論がちょっとよく分かりませんでした。

[ruby-dev:3065] [REQ] caller binding
[ruby-dev:15990] binding(n = 0)
[ruby-dev:32622] binding of caller

binding(n = 0)が実装されることはないのでしょうか?
もし、実装する予定がない場合、拡張ライブラリで対応しようと考えているので
binding_allocを外部から参照可能にして頂きたいのですが、可能でしょうか?

ちなみに、ほとんど中田さんのコードから抜き出しただけですが、以下のような実装をしています。

static int
caller_level(int argc, VALUE *argv, int minimum) {
    VALUE v;
    int level;

    if (!argc) return minimum;
    rb_scan_args(argc, argv, "1", &v);
    level = NUM2INT(v);
    if (level < 0) {
        rb_raise(rb_eArgError, "negative caller level: %d", level);
    }
    if (level < minimum) {
        rb_raise(rb_eArgError, "caller level out of range: %d", level);
    }

    return level;
}

static VALUE
rb_f_ybinding(int argc, VALUE *argv) {
    rb_thread_t *th = GET_THREAD();
    rb_control_frame_t *cfp = th->cfp;
    rb_binding_t *bind;
    VALUE bindval;
    int level = caller_level(argc, argv, 0);

    do {
        cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
        cfp = rb_vm_get_ruby_level_next_cfp(th, cfp);
        if (!cfp) return Qnil;
    } while (level-- > 0);

    bindval = binding_alloc(rb_cBinding);
    GetBindingPtr(bindval, bind);
    bind->env = rb_vm_make_env_object(th, cfp);
    bind->filename = cfp->iseq->filename;
    bind->line_no = rb_vm_get_sourceline(cfp);

    return bindval;
}

void Init_yagi_binding(void) {
    rb_define_global_function("ybinding", rb_f_ybinding, -1);
}

お忙しい時期かと思いますが、よろしくお願いいたします。

In This Thread

Prev Next