[#30232] [patch] rb_type(): シンボル型に対する型判定が怪しい — "Yoshinori Sano" <yoshinori.sano@...>
さの よしのり です。
6 messages
2007/02/01
[#30241] 質問: 関数風メソッド呼び出しのYARV命令列について — "Yoshinori Sano" <yoshinori.sano@...>
さの よしのり です
7 messages
2007/02/01
[#30259] getinstancevariable2 — SASADA Koichi <ko1@...>
ささだです。
5 messages
2007/02/05
[#30263] exception on Singleton — SASADA Koichi <ko1@...>
ささだです。
10 messages
2007/02/05
[#30273] Re: exception on Singleton
— SASADA Koichi <ko1@...>
2007/02/05
ささだです.
[#30332] Re: exception on Singleton
— SASADA Koichi <ko1@...>
2007/02/14
ささだです。
[#30284] Re: 1.8.5 release on 3/3 — Urabe Shyouhei <shyouhei@...>
卜部です。1.8.5も3/3に同時リリースするといいと思いました。
14 messages
2007/02/06
[#30293] Re: 1.8.5 release on 3/3
— Shugo Maeda <shugo@...>
2007/02/06
前田です。
[#30307] Re: [ruby-cvs:18927] Ruby:r11679: * ext/thread: Make style fixes (mostly de-K&R'ism) to match the — Nobuyoshi Nakada <nobu@...>
なかだです。
8 messages
2007/02/09
[#30312] Re: [ruby-cvs:18927] Ruby:r11679: * ext/thread: Make style fixes (mostly de-K&R'ism) to match the
— "Akinori MUSHA" <knu@...>
2007/02/10
At Sat, 10 Feb 2007 00:00:44 +0900,
[#30321] [ruby_1_8] can't grub Digest::SHAxxx on powerpc-darwin — Tadashi Saito <shiba@...2.accsnet.ne.jp>
こんばんは。斎藤と申します。
5 messages
2007/02/11
[#30328] Re: [ruby-cvs:18955] Ruby:r11707: * ext/win32ole/win32ole.c (ole_variant2val): support VT_I8, VT_UI8. — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
3 messages
2007/02/13
[#30338] backporting URI to ruby_1_8 — "Akinori MUSHA" <knu@...>
lib/uri を trunk から ruby_1_8 にマージします。
7 messages
2007/02/14
[#30362] Re: class local instance variable — "Park Ji-In" <tisphie@...>
44GT44KT44Gw44KT44Gv44CC5py0IOiKneWNsCDjgajnlLPjgZfjgb7jgZnjgIIKCuWIneOCgeOB
5 messages
2007/02/16
[#30373] Ruby 1.8.6 preview1 has been released — "Akinori MUSHA" <knu@...>
Ruby 1.8.6 preview1 をリリースしました。
5 messages
2007/02/17
[#30396] unsupported: th_call0 in 1.9 — "KUBO Takehiro" <kubo@...>
久保です。
5 messages
2007/02/21
[#30404] ruby-1.8 で SEGV — Tomoyuki Chikanaga <chikanag@...>
日本コントロールシステム(株)の近永と申します。
6 messages
2007/02/24
[#30433] Re: ruby-1.8 で SEGV
— Chikanaga Tomoyuki <chikanag@...>
2007/02/26
日本コントロールシステム(株)の近永と申します。
[#30407] Arrayのメソッド増強について — Minero Aoki <aamine@...>
青木です。
7 messages
2007/02/24
[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>
Ruby 1.8.6 preview2 をリリースしました。
20 messages
2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released)
— Hidetoshi NAGAI <nagai@...>
2007/02/25
永井@知能.九工大です.
[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released)
— Nobuyoshi Nakada <nobu@...>
2007/02/25
なかだです。
[#30419] Re: fail to autoload at $SAFE==4
— Hidetoshi NAGAI <nagai@...>
2007/02/25
永井@知能.九工大です.
[#30434] Re: fail to autoload at $SAFE==4
— Nobuyoshi Nakada <nobu@...>
2007/02/27
なかだです。
[#30435] Re: fail to autoload at $SAFE==4
— Hidetoshi NAGAI <nagai@...>
2007/02/27
永井@知能.九工大です.
[#30437] Re: fail to autoload at $SAFE==4
— "Nobuyoshi Nakada" <nobu@...>
2007/02/27
なかだです。
[#30412] fastthreadについて — Shugo Maeda <shugo@...>
前田です。
9 messages
2007/02/25
[#30439] Re: MIME decoding confused by non-MIME characters — Urabe Shyouhei <shyouhei@...>
-devに振ってみる。
9 messages
2007/02/27
[#30440] Re: MIME decoding confused by non-MIME characters
— "H.Holon" <holon@...>
2007/02/27
はじめてこちらには postします。相馬と申します。
[#30441] Re: MIME decoding confused by non-MIME characters
— "H.Holon" <holon@...>
2007/02/27
相馬です。
[#30445] Re: MIME decoding confused by non-MIME characters
— "H.Holon" <holon@...>
2007/02/27
相馬です。
[ruby-dev:30420] Re: unsupported: th_call0 in 1.9
From:
Nobuyoshi Nakada <nobu@...>
Date:
2007-02-25 17:07:47 UTC
List:
ruby-dev #30420
なかだです。
At Wed, 21 Feb 2007 22:33:56 +0900,
KUBO Takehiro wrote in [ruby-dev:30396]:
> ruby 1.9 で以下の条件のとき、[BUG] unsupported: th_call0 となりました。
>
> 1. private なメソッドをサブクラスで public にする。
> 2. 拡張ライブラリからサブクラスで public にしたメソッドを rb_funcall
> で呼び出す。
これでどうでしょうか。
Index: eval.c
===================================================================
--- eval.c (revision 11883)
+++ eval.c (working copy)
@@ -1550,6 +1550,6 @@ rb_method_missing(int argc, const VALUE
}
-static VALUE
-method_missing(VALUE obj, ID id, int argc, const VALUE *argv, int call_status)
+VALUE
+rb_call_method_missing(VALUE obj, ID id, int argc, const VALUE *argv, int call_status)
{
VALUE *nargv;
@@ -1588,6 +1588,6 @@ rb_call(VALUE klass, VALUE recv, ID mid,
if (ent->mid == mid && ent->klass == klass) {
if (!ent->method)
- return method_missing(recv, mid, argc, argv,
- scope == 2 ? NOEX_VCALL : 0);
+ return rb_call_method_missing(recv, mid, argc, argv,
+ scope == 2 ? NOEX_VCALL : 0);
id = ent->mid0;
noex = ent->method->nd_noex;
@@ -1602,13 +1602,13 @@ rb_call(VALUE klass, VALUE recv, ID mid,
else {
if (scope == 3) {
- return method_missing(recv, mid, argc, argv, NOEX_SUPER);
+ return rb_call_method_missing(recv, mid, argc, argv, NOEX_SUPER);
}
- return method_missing(recv, mid, argc, argv,
- scope == 2 ? NOEX_VCALL : 0);
+ return rb_call_method_missing(recv, mid, argc, argv,
+ scope == 2 ? NOEX_VCALL : 0);
}
if (mid != missing) {
/* receiver specified form for private method */
if (((noex & NOEX_MASK) & NOEX_PRIVATE) && scope == 0) {
- return method_missing(recv, mid, argc, argv, NOEX_PRIVATE);
+ return rb_call_method_missing(recv, mid, argc, argv, NOEX_PRIVATE);
}
@@ -1623,5 +1623,5 @@ rb_call(VALUE klass, VALUE recv, ID mid,
if (!rb_obj_is_kind_of(rb_frame_self(),
rb_class_real(defined_class))) {
- return method_missing(recv, mid, argc, argv, NOEX_PROTECTED);
+ return rb_call_method_missing(recv, mid, argc, argv, NOEX_PROTECTED);
}
}
Index: intern.h
===================================================================
--- intern.h (revision 11883)
+++ intern.h (working copy)
@@ -250,4 +250,5 @@ VALUE rb_binding_new(void);
VALUE rb_obj_method(VALUE, VALUE);
VALUE rb_method_call(int, VALUE*, VALUE);
+VALUE rb_call_method_missing(VALUE, ID, int, const VALUE *, int);
int rb_mod_method_arity(VALUE, ID);
int rb_obj_method_arity(VALUE, ID);
Index: vm.c
===================================================================
--- vm.c (revision 11883)
+++ vm.c (working copy)
@@ -502,4 +502,6 @@ th_invoke_bmethod(rb_thread_t *th, ID id
}
+static VALUE th_call_super(rb_thread_t *, int, const VALUE *);
+
VALUE
th_call0(rb_thread_t *th, VALUE klass, VALUE recv,
@@ -521,63 +523,67 @@ th_call0(rb_thread_t *th, VALUE klass, V
switch (nd_type(body)) {
case RUBY_VM_METHOD_NODE:{
- rb_control_frame_t *reg_cfp;
- int i;
- const int flag = 0;
-
- th_set_finish_env(th);
- reg_cfp = th->cfp;
- for (i = 0; i < argc; i++) {
- *reg_cfp->sp++ = argv[i];
- }
- macro_eval_invoke_func(body->nd_body, recv, klass, blockptr,
- argc);
- val = th_eval_body(th);
- break;
+ rb_control_frame_t *reg_cfp;
+ int i;
+ const int flag = 0;
+
+ th_set_finish_env(th);
+ reg_cfp = th->cfp;
+ for (i = 0; i < argc; i++) {
+ *reg_cfp->sp++ = argv[i];
+ }
+ macro_eval_invoke_func(body->nd_body, recv, klass, blockptr,
+ argc);
+ val = th_eval_body(th);
+ break;
}
- case NODE_CFUNC: {
- rb_control_frame_t *reg_cfp = th->cfp;
- rb_control_frame_t *cfp =
+ case NODE_CFUNC:{
+ rb_control_frame_t *reg_cfp = th->cfp;
+ rb_control_frame_t *cfp =
push_frame(th, 0, FRAME_MAGIC_CFUNC,
recv, (VALUE)blockptr, 0, reg_cfp->sp, 0, 1);
- cfp->callee_id = oid;
- cfp->method_id = id;
- cfp->method_klass = klass;
-
- val = call_cfunc(body->nd_cfnc, recv, body->nd_argc, argc, argv);
-
- if (reg_cfp != th->cfp + 1) {
- SDR2(reg_cfp);
- SDR2(th->cfp-5);
- rb_bug("cfp consistency error - call0");
- th->cfp = reg_cfp;
- }
- pop_frame(th);
+ cfp->callee_id = oid;
+ cfp->method_id = id;
+ cfp->method_klass = klass;
+
+ val = call_cfunc(body->nd_cfnc, recv, body->nd_argc, argc, argv);
+
+ if (reg_cfp != th->cfp + 1) {
+ SDR2(reg_cfp);
+ SDR2(th->cfp-5);
+ rb_bug("cfp consistency error - call0");
+ th->cfp = reg_cfp;
+ }
+ pop_frame(th);
- break;
+ break;
}
case NODE_ATTRSET:{
- if (argc != 1) {
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
- argc);
- }
- val = rb_ivar_set(recv, body->nd_vid, argv[0]);
- break;
+ if (argc != 1) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)",
+ argc);
+ }
+ val = rb_ivar_set(recv, body->nd_vid, argv[0]);
+ break;
+ }
+ case NODE_IVAR:{
+ if (argc != 0) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)",
+ argc);
+ }
+ val = rb_attr_get(recv, body->nd_vid);
+ break;
}
- case NODE_IVAR: {
- if (argc != 0) {
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)",
- argc);
- }
- val = rb_attr_get(recv, body->nd_vid);
- break;
+ case NODE_ZSUPER:{
+ val = th_call_super(th, argc, argv);
+ break;
}
case NODE_BMETHOD:{
- val = th_invoke_bmethod(th, id, body->nd_cval,
- recv, klass, argc, (VALUE *)argv);
- break;
+ val = th_invoke_bmethod(th, id, body->nd_cval,
+ recv, klass, argc, (VALUE *)argv);
+ break;
}
default:
- rb_bug("unsupported: th_call0");
+ rb_bug("unsupported: th_call0(%s)", ruby_node_name(nd_type(body)));
}
RUBY_VM_CHECK_INTS();
@@ -614,5 +620,5 @@ th_call_super(rb_thread_t *th, int argc,
rb_control_frame_t *cfp = th->cfp;
- if (!th->cfp->iseq) {
+ if (!cfp->iseq) {
klass = cfp->method_klass;
klass = RCLASS(klass)->super;
@@ -634,4 +640,5 @@ th_call_super(rb_thread_t *th, int argc,
}
else {
+ rb_call_method_missing(recv, id, argc, (VALUE *)argv, NOEX_SUPER);
dp(recv);
dp(klass);
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦