[#37959] [Bug:trunk] I can modify literals — Yusuke ENDOH <mame@...>

遠藤です。

13 messages 2009/02/10

[#38005] Is URI.decode() broken? — MOROHASHI Kyosuke <moronatural@...>

もろはしです。いつもお世話になっております。

39 messages 2009/02/14
[#38006] Re: Is URI.decode() broken? — Nobuyoshi Nakada <nobu@...> 2009/02/14

なかだです。

[#38009] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/02/14

成瀬です、

[#38016] Re: Is URI.decode() broken? — Fujioka <fuj@...> 2009/02/15

xibbarこと藤岡です。

[#38017] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/02/15

成瀬です。

[#38040] Re: Is URI.decode() broken? — akira yamada / やまだあきら <akira@...> 2009/02/17

NARUSE, Yui さんは書きました:

[#38124] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/03/03

成瀬です。

[#39214] Re: Is URI.decode() broken? — akira yamada / やまだあきら <akira@...> 2009/09/02

(2009年03月03日 22:45), NARUSE, Yui さんは書きました:

[#39218] Re: Is URI.decode() broken? — "NARUSE, Yui" <naruse@...> 2009/09/02

成瀬です。

[#39236] Re: Is URI.decode() broken? — Tanaka Akira <akr@...> 2009/09/05

In article <4A9E44DD.6050706@airemix.jp>,

[#39242] Re: Is URI.decode() broken? — KOSAKI Motohiro <kosaki.motohiro@...> 2009/09/07

小崎@思いつきを適当に書いてみるテスト

[#39246] Re: Is URI.decode() broken? — Tanaka Akira <akr@...> 2009/09/07

In article <20090907091830.2C7A.A69D9226@jp.fujitsu.com>,

[#38096] 多重代入やメソッド引数の展開でto_aが呼ばれます — nagachika <nagachika00@...>

nagachika と申します。

10 messages 2009/02/26

[#38098] ブロック引数と括弧・引数なしsuper — Shugo Maeda <shugo@...>

前田です。

12 messages 2009/02/27

[ruby-dev:38035] Stack Caching を有効にした時のビルドについて

From: nagachika <nagachika00@...>
Date: 2009-02-16 17:53:01 UTC
List: ruby-dev #38035
nagachika と申します。

前回のRHGの逆襲で Stack Caching Optimization をネタにするため、
OPT_STACK_CACHING を ON にしてビルドしてみることに挑戦しました。
まだ make が最後まで通っていないのですが、miniruby で例外処理等がうまく
いかない問題について調査したので報告します。

ついでに訊いてしまいますが STACK_CACHING のオプションの扱いというのは
今後どうなっていくのでしょうか。今後有効にする可能性はあるでしょうか。
もう廃れていくオプションなののだとしたらあんまり深追いしてもなぁと
思いまして。

vm_opt.h の OPT_STACK_CACHING を 1 に変更して
 $ make opt_sc.inc
 $ make mniruby
して、以下のスクリプトを実行すると[BUG]が発生します。

$ cat test.rb
p :hoge # レジスタ状態をAXにするため

begin
 raise "err"
rescue
end
$ ./miniruby test.rb
:hoge
test.rb:4: [BUG] Stack consistency error (sp: 7, bp: 6)
ruby 1.9.2dev (2009-02-16 trunk 22360) [i386-darwin8.11.1]

-- control frame ----------
c:0003 p:0026 s:0007 b:0006 l:0012e4 d:002124 EVAL   test.rb:4
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:0012e4 d:0012e4 TOP
---------------------------
test.rb:4:in `<main>'

Stack Caching 用に生成された命令語のスタック消費量がレジスタによる
キャッシュを考慮していないために、 catch_table_entry に保存される sp が
違うためのようです。
また CATCH_TYPE_RESCUEの場合にスタックトップに積まれるべき値が
キャンセルされるために sp をデクリメントしている処理は、Stack Caching 有効時
には結果がレジスタに格納される予定になるので不要になると思います。
(BREAK, NEXTのほうはもしかしたら違うかも)

tool/instruction.rb を修正してスタック消費量にレジスタの状態遷移を考慮するように
してみました。
ただこれでもまだ make は途中で失敗してしまいます。
以下一応パッチはります。 trunk に対するパッチです。
まあデフォルトで無効なオプションなのですけど。

Index: tool/instruction.rb
===================================================================
--- tool/instruction.rb (リビジョン 22360)
+++ tool/instruction.rb (作業コピー)
@@ -8,7 +8,7 @@
   class Instruction
     def initialize name, opes, pops, rets, comm, body, tvars, sp_inc,
                    orig = self, defopes = [], type = nil,
-                   nsc = [], psc = [[], []]
+                   fsc = [], nsc = [], psc = [[], []]

       @name = name
       @opes = opes # [[type, name], ...]
@@ -22,6 +22,7 @@
       @type    = type
       @tvars   = tvars

+      @fromsc = fsc
       @nextsc = nsc
       @pushsc = psc
       @sc     = []
@@ -38,7 +39,7 @@

     attr_reader :name, :opes, :pops, :rets
     attr_reader :body, :comm
-    attr_reader :nextsc, :pushsc
+    attr_reader :fromsc, :nextsc, :pushsc
     attr_reader :orig, :defopes, :type
     attr_reader :sc
     attr_reader :unifs, :optimized
@@ -58,12 +59,16 @@
       @optimized << insn
     end

+    def sp_increase_with_sc
+      @fromsc.size - @nextsc.size
+    end
+
     def sp_increase_c_expr
       if(pops.any?{|t, v| v == '...'} ||
          rets.any?{|t, v| v == '...'})
         # user definision
         raise "no sp increase definition" if @sp_inc.nil?
-        ret = "int inc = 0;\n"
+        ret = "int inc = #{sp_increase_with_sc};\n"

         @opes.each_with_index{|(t, v), i|
           if t == 'rb_num_t' && ((re = /\b#{v}\b/n) =~ @sp_inc ||
@@ -81,7 +86,7 @@
         ret << "        return depth + inc;"
         ret
       else
-        "return depth + #{rets.size - pops.size};"
+        "return depth + #{rets.size - pops.size + sp_increase_with_sc};"
       end
     end

@@ -519,19 +524,19 @@
           name, pops, rets, pushs1, pushs2, nextsc =
           *calc_stack(insn, from, after, opops, orets)

-          make_insn_sc(insn, name, oopes, pops, rets, [pushs1, pushs2], nextsc)
+          make_insn_sc(insn, name, oopes, pops, rets, [pushs1,
pushs2], from, nextsc)
         }
       }
     end

-    def make_insn_sc orig_insn, name, opes, pops, rets, pushs, nextsc
+    def make_insn_sc orig_insn, name, opes, pops, rets, pushs, fromsc, nextsc
       comm = orig_insn.comm.dup
       comm[:c] = 'optimize(sc)'

       scinsn = Instruction.new(
         name, opes, pops, rets, comm,
         orig_insn.body, orig_insn.tvars, orig_insn.sp_inc,
-        orig_insn, orig_insn.defopes, :sc, nextsc, pushs)
+        orig_insn, orig_insn.defopes, :sc, fromsc, nextsc, pushs)

       add_insn scinsn
       orig_insn.add_sc scinsn
@@ -611,7 +616,7 @@
         exit
       end

-      ret = ["#{insn.name}_SC_#{InstructionsLoader.complement_name(ofrom)}_#{complement_name(from)}",
+      ret = ["#{insn.name}_SC_#{InstructionsLoader.complement_name(ofrom)}_#{InstructionsLoader.complement_name(from)}",
             pops, rets, pushs_before, pushs, from]
     end
   end
@@ -1176,7 +1181,11 @@
         else
           insns = Array.new(6){'SC_ERROR'}
         end
-        sc_insn_info << "  {\n#{insns.join(",\n")}}"
+        if verbose?
+          sc_insn_info << "  { /* #{insn.name} */\n#{insns.join(",\n")}}"
+        else
+          sc_insn_info << "  {\n#{insns.join(",\n")}}"
+        end
       }
       sc_insn_info = sc_insn_info.join(",\n")

Index: compile.c
===================================================================
--- compile.c   (リビジョン 22360)
+++ compile.c   (作業コピー)
@@ -1535,12 +1535,14 @@
            entry->cont = label_get_position(lobj);
            entry->sp = label_get_sp(lobj);

+#if !OPT_STACK_CACHING
            /* TODO: Dirty Hack!  Fix me */
            if (entry->type == CATCH_TYPE_RESCUE ||
                entry->type == CATCH_TYPE_BREAK ||
                entry->type == CATCH_TYPE_NEXT) {
                entry->sp--;
            }
+#endif
        }
        else {
            entry->cont = 0;

In This Thread

Prev Next