[#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:31864] Re: meta programming might dump core
From:
Nobuyoshi Nakada <nobu@...>
Date:
2007-09-25 20:04:20 UTC
List:
ruby-dev #31864
なかだです。
At Tue, 25 Sep 2007 02:49:24 +0900,
Yusuke ENDOH wrote in [ruby-dev:31850]:
> 約 100 万エントリのハッシュリテラル:
key=>valueの値を先にVMスタックにすべて積んでからnewhashを実行す
るので、そこでオーバーフローしています。一組ずつ追加していくとい
うのは、速度的な問題からささださんが気に入らないようで。
思い付くのはこのあたり。
(a) 速度は少々あきらめて、一組ずつ追加
(b) VMスタックを確保できるか確認する命令を追加
> 約 100 万変数の多重代入:
これもexpandarrayで100万個に展開するときにオーバーフローしていま
す。expandarrayはサイズがわかっているので、チェックを入れればい
いのではないかと。
> 約 100 万引数のメソッド呼び出し:
これも引数を一度スタックに全部積むので以下同文。
> false が || で 25000 個連なった式:
>
> $ time ./ruby -ve 'eval("false||" * 25000 + "true")'
> ruby 1.9.0 (2007-09-24 patchlevel 0) [i686-linux]
> セグメンテーション違反です
こっちはbytecodeにコンパイルするところでマシンスタックオーバーフ
ローしています。
この例については回避するのは簡単ですが、もっと複雑にネストしてい
たりするとお手上げでしょう。
Index: compile.c
===================================================================
--- compile.c (revision 13509)
+++ compile.c (working copy)
@@ -1795,9 +1795,14 @@ compile_branch_condition(rb_iseq_t *iseq
LABEL *then_label, LABEL *else_label)
{
+ again:
switch (nd_type(cond)) {
case NODE_NOT:
- compile_branch_condition(iseq, ret, cond->nd_body, else_label,
- then_label);
- break;
+ {
+ LABEL *tmp = else_label;
+ else_label = then_label;
+ then_label = tmp;
+ cond = cond->nd_body;
+ goto again;
+ }
case NODE_AND:
@@ -1807,7 +1812,6 @@ compile_branch_condition(rb_iseq_t *iseq
else_label);
ADD_LABEL(ret, label);
- compile_branch_condition(iseq, ret, cond->nd_2nd, then_label,
- else_label);
- break;
+ cond = cond->nd_2nd;
+ goto again;
}
case NODE_OR:
@@ -1817,7 +1821,6 @@ compile_branch_condition(rb_iseq_t *iseq
label);
ADD_LABEL(ret, label);
- compile_branch_condition(iseq, ret, cond->nd_2nd, then_label,
- else_label);
- break;
+ cond = cond->nd_2nd;
+ goto again;
}
case NODE_LIT: /* NODE_LIT is always not true */
@@ -3187,18 +3190,20 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_
case NODE_OR:{
LABEL *end_label = NEW_LABEL(nd_line(node));
- COMPILE(ret, "nd_1st", node->nd_1st);
- if (!poped) {
- ADD_INSN(ret, nd_line(node), dup);
- }
- if (type == NODE_AND) {
- ADD_INSNL(ret, nd_line(node), branchunless, end_label);
- }
- else {
- ADD_INSNL(ret, nd_line(node), branchif, end_label);
- }
- if (!poped) {
- ADD_INSN(ret, nd_line(node), pop);
- }
- COMPILE_(ret, "nd_2nd", node->nd_2nd, poped);
+ do {
+ COMPILE(ret, "nd_1st", node->nd_1st);
+ if (!poped) {
+ ADD_INSN(ret, nd_line(node), dup);
+ }
+ if (type == NODE_AND) {
+ ADD_INSNL(ret, nd_line(node), branchunless, end_label);
+ }
+ else {
+ ADD_INSNL(ret, nd_line(node), branchif, end_label);
+ }
+ if (!poped) {
+ ADD_INSN(ret, nd_line(node), pop);
+ }
+ } while ((node = node->nd_2nd) != 0 && nd_type(node) == type);
+ COMPILE_(ret, "nd_2nd", node, poped);
ADD_LABEL(ret, end_label);
break;
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦