[#31692] cannot run test-all — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
9 messages
2007/09/01
[#31697] Re: [ruby-list:43970] 次の1.8.6 — Tadayoshi Funaba <tadf@...>
> * [ruby-dev:31379]がペンディング
10 messages
2007/09/01
[#31699] Re: [ruby-list:43970] 次の1.8.6
— Urabe Shyouhei <shyouhei@...>
2007/09/01
Tadayoshi Funaba wrote:
[#31700] Re: [ruby-list:43970] 次の1.8.6
— Tadayoshi Funaba <tadf@...>
2007/09/01
> > WIN32OLE も Time も担当でないし、この報告が何をいいたいのかもよくわか
[#31703] Re: [ruby-list:43970] 次の1.8.6
— Urabe Shyouhei <shyouhei@...>
2007/09/01
Tadayoshi Funaba wrote:
[#31706] Re: [ruby-list:43970] 次の1.8.6
— Tadayoshi Funaba <tadf@...>
2007/09/01
> 今後サポートを続けるべきかはご判断にお任せします。OLEで使われてるん
[#31709] [BUG] non-initialized struct — Tanaka Akira <akr@...>
以下のようにすると [BUG] が出ます。
6 messages
2007/09/02
[#31715] string literal encoding — Nobuyoshi Nakada <nobu@...>
なかだです。
12 messages
2007/09/02
[#31716] Re: string literal encoding
— Yukihiro Matsumoto <matz@...>
2007/09/02
まつもと ゆきひろです
[#31729] packed st_table — Nobuyoshi Nakada <nobu@...>
なかだです。
8 messages
2007/09/04
[#31734] [m17n] String#chop & String#succ — Nobuyoshi Nakada <nobu@...>
なかだです。
2 messages
2007/09/05
[#31744] [m17n] String#encode — Nobuyoshi Nakada <nobu@...>
なかだです。
7 messages
2007/09/06
[#31768] shellescape — "Akinori MUSHA" <knu@...>
shellwords.rb に shellescape() 等を追加しようと思います。
5 messages
2007/09/10
[#31774] RSTRING(value)->ptr == NULL ? — Tietew <tietew+ruby-dev@...>
Tietew です。
7 messages
2007/09/11
[#31778] Re: RSTRING(value)->ptr == NULL ?
— Yukihiro Matsumoto <matz@...>
2007/09/12
まつもと ゆきひろです
[#31781] `scan': character encodings differ (ArgumentError) — Kouhei Sutou <kou@...>
須藤です。
5 messages
2007/09/15
[#31787] 文字列のinspect — eklerni <eklerni@...>
eklerniといいます。
5 messages
2007/09/15
[#31798] generator from Enumerable#map — "Yusuke ENDOH" <mame@...>
遠藤と申します。
7 messages
2007/09/19
[#31810] rb_obj_is_kind_of — Tanaka Akira <akr@...>
rb_obj_is_kind_of の TYPE(cl) ですが、[ruby-dev:31805] の例
5 messages
2007/09/21
[#31815] 文字列の式展開 — eklerni <eklerni@...>
eklerniといいます。
6 messages
2007/09/22
[#31835] Kernel#` is blocked with Ruby/GLib2 on Intel Mac — Kouhei Sutou <kou@...>
須藤です。
5 messages
2007/09/24
[#31842] 拡張ライブラリ内での SIGVTALRM — とみたまさひろ <tommy@...>
とみたです。
10 messages
2007/09/24
[#31848] huge `if' dumps core — "Yusuke ENDOH" <mame@...>
遠藤と申します。
5 messages
2007/09/24
[#31850] meta programming might dump core — "Yusuke ENDOH" <mame@...>
遠藤と申します。
2 messages
2007/09/24
[#31853] optimize T_OBJECT space — Tanaka Akira <akr@...>
T_OBJECT なインスタンスで、インスタンス変数の名前をクラス側
7 messages
2007/09/25
[#31880] Re: optimize T_OBJECT space
— Tanaka Akira <akr@...>
2007/09/28
In article <87r6kne799.fsf@fsij.org>,
[ruby-dev:31844] Re: SEGV by attr
From:
Nobuyoshi Nakada <nobu@...>
Date:
2007-09-24 15:04:11 UTC
List:
ruby-dev #31844
なかだです。
At Sun, 23 Sep 2007 00:52:42 +0900,
Tanaka Akira wrote in [ruby-dev:31818]:
> Program terminated with signal 11, Segmentation fault.
> #0 0x08058f4b in rb_attr (klass=3084222700, id=8776, read=2, write=0, ex=2) at eval_method.ci:441
> 441 snprintf(buf, len, "@%s", name);
ふと、ID_ATTRSETのようにID_INSTANCEなどもID_LOCALと対応関係があ
れば、わざわざあらためて文字列を作る必要もないんじゃないか、と思
いました。
Index: parse.y
===================================================================
--- parse.y (revision 13508)
+++ parse.y (working copy)
@@ -7375,4 +7375,28 @@ rb_id_attrset(ID id)
}
+ID
+rb_id_ivar(ID id)
+{
+ id &= ~ID_SCOPE_MASK;
+ id |= ID_INSTANCE;
+ return id;
+}
+
+ID
+rb_id_cvar(ID id)
+{
+ id &= ~ID_SCOPE_MASK;
+ id |= ID_CLASS;
+ return id;
+}
+
+ID
+rb_id_gvar(ID id)
+{
+ id &= ~ID_SCOPE_MASK;
+ id |= ID_GLOBAL;
+ return id;
+}
+
static NODE *
attrset_gen(struct parser_params *parser, NODE *recv, ID id)
@@ -8504,8 +8528,20 @@ rb_intern3(const char *name, long len, r
}
if (m - name < len) id = ID_JUNK;
+ m = name;
+ switch (id) {
+ case ID_CLASS:
+ m++;
+ case ID_GLOBAL:
+ case ID_INSTANCE:
+ m++;
+ id |= rb_intern3(m, len-(m-name), enc) & ~ID_SCOPE_MASK;
+ goto id_register;
+ default:
+ break;
+ }
new_id:
id |= ++global_symbols.last_id << ID_SCOPE_SHIFT;
@@ -8534,4 +8570,17 @@ rb_intern_str(VALUE str)
}
+static VALUE
+id2string(ID id)
+{
+ ID id2 = (id & ~ID_SCOPE_MASK) | ID_LOCAL;
+ VALUE str;
+
+ while (!(str = rb_id2str(id2))) {
+ if ((id2 & ID_SCOPE_MASK) == ID_CONST) return 0;
+ id2 = (id & ~ID_SCOPE_MASK) | ID_CONST;
+ }
+ return str;
+}
+
VALUE
rb_id2str(ID id)
@@ -8558,19 +8607,27 @@ rb_id2str(ID id)
return (VALUE)data;
- if (is_attrset_id(id)) {
- ID id2 = (id & ~ID_SCOPE_MASK) | ID_LOCAL;
- VALUE str;
-
- while (!(str = rb_id2str(id2))) {
- if (!is_local_id(id2)) return 0;
- id2 = (id & ~ID_SCOPE_MASK) | ID_CONST;
- }
+ switch (id & ID_SCOPE_MASK) {
+ case ID_CLASS:
+ if (!(str = id2string(id))) return 0;
+ str = rb_str_append(rb_str_new2("@@"), str);
+ break;
+ case ID_GLOBAL:
+ if (!(str = id2string(id))) return 0;
+ str = rb_str_append(rb_str_new2("$"), str);
+ break;
+ case ID_INSTANCE:
+ if (!(str = id2string(id))) return 0;
+ str = rb_str_append(rb_str_new2("@"), str);
+ break;
+ case ID_ATTRSET:
+ if (!(str = id2string(id))) return 0;
str = rb_str_dup(str);
rb_str_cat(str, "=", 1);
- rb_intern_str(str);
- if (st_lookup(global_symbols.id_str, id, &data))
- return (VALUE)data;
+ break;
}
- return 0;
+ OBJ_FREEZE(str);
+ st_add_direct(global_symbols.sym_id, (st_data_t)str, id);
+ st_add_direct(global_symbols.id_str, id, (st_data_t)str);
+ return str;
}
Index: eval_method.ci
===================================================================
--- eval_method.ci (revision 13508)
+++ eval_method.ci (working copy)
@@ -406,4 +406,5 @@ rb_method_boundp(VALUE klass, ID id, int
}
+extern ID rb_id_ivar(ID);
void
rb_attr(VALUE klass, ID id, int read, int write, int ex)
@@ -438,5 +439,5 @@ rb_attr(VALUE klass, ID id, int read, in
rb_raise(rb_eArgError, "argument needs to be symbol or string");
}
- attriv = rb_intern_str(rb_sprintf("@%s", name));
+ attriv = rb_id_ivar(id);
if (read) {
rb_add_method(klass, id, NEW_IVAR(attriv), noex);
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦