[#44448] [Ruby 1.9 - Bug #5258][Open] SizedQueueにBug #5195と同様のバグ — Masaki Matsushita <glass.saga@...>
8 messages
2011/09/01
[#44469] [Ruby 1.9 - Bug #5279][Open] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Shota Fukumori <sorah@...>
21 messages
2011/09/06
[#44471] [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— Shota Fukumori <sorah@...>
2011/09/06
[#44472] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— "NARUSE, Yui" <naruse@...>
2011/09/06
2011年9月6日11:02 Shota Fukumori <[email protected]>:
[#44473] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— "Shota Fukumori (sora_h)" <sorah@...>
2011/09/06
じゃぁ,大丈夫かな.
[#44474] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— Kazuhiko <kazuhiko@...>
2011/09/06
On 06/09/2011 06:10, Shota Fukumori (sora_h) wrote:
[#44475] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— "Shota Fukumori (sora_h)" <sorah@...>
2011/09/06
sora_h です。
[#44478] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— KOSAKI Motohiro <kosaki.motohiro@...>
2011/09/06
2011年9月6日19:14 Shota Fukumori (sora_h) <[email protected]>:
[#44480] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— "Shota Fukumori (sora_h)" <sorah@...>
2011/09/06
あれれ,ほんとだ.失礼.
[#44541] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— Kazuhiko <kazuhiko@...>
2011/09/24
かずひこです。
[#44549] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— KOSAKI Motohiro <kosaki.motohiro@...>
2011/09/26
> かずひこです。
[#44554] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— Shugo Maeda <shugo@...>
2011/09/26
前田です。
[#44560] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— Kazuhiko <kazuhiko@...>
2011/09/28
かずひこです。
[#44575] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある
— Kazuhiko <kazuhiko@...>
2011/10/04
On 28/09/2011 14:15, Kazuhiko wrote:
[#44491] [Ruby 1.9 - Feature #5314][Open] パッケージマネージャをコアリリースに含めて欲しい — Taro MURAOKA <koron.kaoriya@...>
13 messages
2011/09/13
[#44500] [Ruby 1.9 - Feature #5315][Open] config.hからコンパイラのバージョンチェックを外して欲しい — Taro MURAOKA <koron.kaoriya@...>
6 messages
2011/09/13
[#44520] [Ruby 1.9 - Bug #5350][Open] WeakRef で謎の NoMethodError — Makoto Kishimoto <redmine@...>
20 messages
2011/09/21
[#44532] [Ruby 1.9 - Bug #5350] WeakRef で謎の NoMethodError
— Shota Fukumori <sorah@...>
2011/09/24
[#44534] Re: [ruby-dev:44532] [Ruby 1.9 - Bug #5350] WeakRef で謎の NoMethodError
— SASADA Koichi <ko1@...>
2011/09/24
(2011/09/23 17:44), Shota Fukumori wrote:
[#44535] Re: [ruby-dev:44534] Re: [ruby-dev:44532] [Ruby 1.9 - Bug #5350] WeakRef で謎の NoMethodError
— "Shota Fukumori (sora_h)" <sorah@...>
2011/09/24
ふむ.やはりダメか.そうだよなぁ.
[#44536] Re: [ruby-dev:44535] Re: [ruby-dev:44534] Re: [ruby-dev:44532] [Ruby 1.9 - Bug #5350] WeakRef で謎の NoMethodError
— SASADA Koichi <ko1@...>
2011/09/24
ささだです.
[#44537] Re: [ruby-dev:44536] Re: [ruby-dev:44535] Re: [ruby-dev:44534] Re: [ruby-dev:44532] [Ruby 1.9 - Bug #5350] WeakRef で謎の NoMethodError
— SASADA Koichi <ko1@...>
2011/09/24
(2011/09/23 18:58), SASADA Koichi wrote:
[#44542] [Ruby 1.9 - Bug #5363][Open] OpenSSL::ASN1.decode_all の引数に PEM 形式の証明書を指定すると Segmentation fault が発生する — Hiroshi Yoshida <hexa.diary@...>
8 messages
2011/09/25
[#44553] [Ruby 1.9 - Bug #5363] OpenSSL::ASN1.decode_all の引数に PEM 形式の証明書を指定すると Segmentation fault が発生する
— Hiroshi Yoshida <hexa.diary@...>
2011/09/26
[#44556] Re: [Ruby 1.9 - Bug #5363] OpenSSL::ASN1.decode_all の引数に PEM 形式の証明書を指定すると Segmentation fault が発生する
— Martin Bo煬et <martin.bosslet@...>
2011/09/27
2011/9/26 Hiroshi Yoshida <[email protected]>:
[#44546] [Ruby 1.9 - Bug #5368][Open] ensure節でsleepするようなThreadがあるとインタプリタが終了しない — Masaki Matsushita <glass.saga@...>
22 messages
2011/09/26
[#44547] Re: [ruby-dev:44546] [Ruby 1.9 - Bug #5368][Open] ensure節でsleepするようなThreadがあるとインタプリタが終了しない
— SASADA Koichi <ko1@...>
2011/09/26
(2011/09/25 21:51), Masaki Matsushita wrote:
[#44551] Re: [Ruby 1.9 - Bug #5368][Open] ensure節でsleepするようなThreadがあるとインタプリタが終了しない
— m_takao <threewayhandshake@...>
2011/09/26
高尾と申します。
[ruby-dev:44477] クラスオブジェクトの clone に関する質問
From:
Satoshi Shiba <shiba@...>
Date:
2011-09-06 13:02:37 UTC
List:
ruby-dev #44477
芝と申します。
クラスオブジェクトを clone したときの挙動について質問させてください。
# サンプルコード
String.class_eval do
def self.singleton_method_added(mid)
puts("singleton_method_added: self = #{self}, mid = #{mid}")
end
end
puts("start clone")
StrClone = String.clone
puts("finish clone")
# サンプルコードの実行結果
singleton_method_added: self = String, mid = singleton_method_added
start clone
singleton_method_added: self = String, mid = try_convert
singleton_method_added: self = String, mid = singleton_method_added
finish clone
上記のサンプルコードを実行すると、String クラスを clone し、メソッドテー
ブルを StrClone にコピーしているときに、String クラスに対して
singleton_method_added が呼び出され、実行結果のように出力されます。
質問なんですが、クラスオブジェクトの clone 時に clone 元のクラスオブジェ
クトの singleton_method_added が呼び出されるのは仕様なのでしょうか。
上記のサンプルコードの場合、StrClone の singleton_method_added が呼び出
されるか、もしくは singleton_method_added が呼び出されないことを期待して
singleton_method_added を使用していました。
上記のサンプルコードで String クラスの singleton_method_added が呼び出さ
れる原因は、rb_singleton_class_clone(class.c) にあります。
rb_singleton_class_clone では、以下のように特異クラスのインスタンス変数
をコピーするのですが、このとき、"__attached__" というインスタンス変数を
コピーしています。
VALUE
rb_singleton_class_clone(VALUE obj)
{
...
if (RCLASS_IV_TBL(klass)) {
/* インスタンス変数のコピー */
RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(klass));
}
...
RCLASS_M_TBL(clone) = st_init_numtable();
data.tbl = RCLASS_M_TBL(clone);
data.klass = (VALUE)clone;
/* メソッドテーブルのコピー、method_added の呼び出し */
st_foreach(RCLASS_M_TBL(klass), clone_method,
(st_data_t)&data);
...
}
今回の例の場合、この、"__attached__" は、クラスのコピー元である String
クラスを指しています。singleton_method_added を呼び出す CALL_METHOD_HOOK
では、以下のように、レシーバを特異クラスの "__attached__" によって決定す
るので、メソッドテーブルをコピーするときに呼び出す
singleton_method_added のレシーバが、String になっています。
#define CALL_METHOD_HOOK(klass, hook, mid) do { \
const VALUE arg = ID2SYM(mid); \
VALUE recv_class = (klass); \
ID hook_id = (hook); \
if (FL_TEST((klass), FL_SINGLETON)) { \
recv_class = rb_ivar_get((klass), attached);\
hook_id = singleton_##hook; \
} \
rb_funcall2(recv_class, hook_id, 1, &arg); \
} while (0)
このようになるのが仕様として定まっているのかどうかが分からないのですが、
singleton_method_added のレシーバをクローン先のクラスに変更するようにし
たパッチを作成したので、本メールの末尾に張っておきます。
rb_obj_clone での
RBASIC(clone)->klass = rb_singleton_class_clone_and_attach(obj, clone);
の位置をずらしていいのかどうかが不安なんですが、参考にしていただければ幸
いです。
以上、よろしくお願いいたします。
# パッチ
Index: object.c
===================================================================
--- object.c (revision 33202)
+++ object.c (working copy)
@@ -268,6 +268,7 @@
* the class.
*/
+VALUE rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach);
VALUE
rb_obj_clone(VALUE obj)
{
@@ -277,9 +278,9 @@
rb_raise(rb_eTypeError, "can't clone %s", rb_obj_classname(obj));
}
clone = rb_obj_alloc(rb_obj_class(obj));
- RBASIC(clone)->klass = rb_singleton_class_clone(obj);
RBASIC(clone)->flags = (RBASIC(obj)->flags | FL_TEST(clone,
FL_TAINT) | FL_TEST(clone, FL_UNTRUSTED)) &
~(FL_FREEZE|FL_FINALIZE|FL_MARK);
init_copy(clone, obj);
+ RBASIC(clone)->klass = rb_singleton_class_clone_and_attach(obj, clone);
rb_funcall(clone, id_init_clone, 1, obj);
RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE;
Index: class.c
===================================================================
--- class.c (revision 33202)
+++ class.c (working copy)
@@ -219,9 +219,17 @@
return rb_mod_init_copy(clone, orig);
}
+VALUE rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach);
+
VALUE
rb_singleton_class_clone(VALUE obj)
{
+ return rb_singleton_class_clone_and_attach(obj, Qundef);
+}
+
+VALUE
+rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach)
+{
VALUE klass = RBASIC(obj)->klass;
if (!FL_TEST(klass, FL_SINGLETON))
@@ -246,6 +254,10 @@
RCLASS_CONST_TBL(clone) = st_init_numtable();
st_foreach(RCLASS_CONST_TBL(klass), clone_const_i,
(st_data_t)RCLASS_CONST_TBL(clone));
}
+ if (attach != Qundef) {
+ rb_singleton_class_attached(clone, attach);
+ }
RCLASS_M_TBL(clone) = st_init_numtable();
data.tbl = RCLASS_M_TBL(clone);
data.klass = (VALUE)clone;