[#45085] [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC — Narihiro Nakamura <authorNari@...>
11 messages
2012/01/04
[#45086] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— SASADA Koichi <ko1@...>
2012/01/04
ささだです.
[#45087] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— Yukihiro Matsumoto <matz@...>
2012/01/04
まつもと ゆきひろです
[#45088] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— SASADA Koichi <ko1@...>
2012/01/04
ささだです.
[#45089] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— Narihiro Nakamura <authornari@...>
2012/01/05
nariです。
[#45090] Re: [ruby-trunk - Feature #5839][Open] Proposal: Bitmap Marking GC
— SASADA Koichi <ko1@...>
2012/01/05
ささだです.
[#45110] [ruby-trunk - Feature #5861][Assigned] String#version_compare — Yui NARUSE <naruse@...>
5 messages
2012/01/07
[#45135] [ruby-trunk - Bug #5896][Open] object representaion in rb_enc_vsprintf() — Nobuyoshi Nakada <nobu@...>
6 messages
2012/01/15
[ruby-dev:45135] [ruby-trunk - Bug #5896][Open] object representaion in rb_enc_vsprintf()
From:
Nobuyoshi Nakada <nobu@...>
Date:
2012-01-15 07:46:29 UTC
List:
ruby-dev #45135
Issue #5896 has been reported by Nobuyoshi Nakada.
----------------------------------------
Bug #5896: object representaion in rb_enc_vsprintf()
https://bugs.ruby-lang.org/issues/5896
Author: Nobuyoshi Nakada
Status: Open
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: core
Target version: 2.0.0
ruby -v: trunk
=begin
rb_enc_vsprintf()でVALUEを受け付けるようにする拡張です。
文字列化したオブジェクトを含むメッセージを組み立てる場合、
StringValueCStr()やRSTRING_PTR()で得られるポインタをsnprintf()などに渡
すというのが定番ですが、これはエンコーディングが保存されない、最適化に
よって元のVALUEが消されてしまいdangling pointerになってしまう危険性があ
る、などの問題があります。後者は、とくにrb_raise()のようにNORETURNな関
数に渡すときには、tail-call最適化のためにRB_GC_GUARDがあっても安全とは
限りません。前者については今のところほとんど無視されている状態です。
これらの問題を解消するため、rb_enc_vsprintf(およびこれを使う関数全般)を
VALUE自体を受けつけるように拡張すべきだと考えています。具体的な指定方法
としては、新しい変換指定子(%vなど)を追加することも考えましたが、gccは割
りと小賢しくチェックを入れてくれるので、警告がジャマになります。
小崎さんによると、Linux Kernelでもprintk()に対する似たような要望は多かっ
たらしく、%pで始まる複数文字の変換指定子というものが導入されているそう
で、ソース[1]を見ると今ではが20個近くもあるようです。
[1] http://lxr.free-electrons.com/source/lib/vsprintf.c#L1116
Rubyではオブジェクト自身が文字列化メソッドを持っているため、それを使っ
て変換するもの一つあれば充分です。なるべく被りそうにないものということ
で、"%lo\v"あたりでよいのではないかと思っています。
以下のコードは、例としてerror.cにあるrb_invalid_str()を変更したものです。
void
rb_invalid_str(const char *str, const char *type)
{
VALUE s = rb_str_inspect(rb_str_new2(str));
rb_raise(rb_eArgError, "invalid value for %s: %"PRIsVALUE, type, s);
}
=end
--
http://bugs.ruby-lang.org/