K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please add long comment :).

_5(Mon)

while
  begin
    break
  ensure
    break
  end
end

が動かない。うーむ。


begin
  while true
    begin
      break
    ensure
      p :ensure
      raise
    end
  end
rescue
end

今度はこれが動かない。理由はわかったんだけど、どうしたもんかな。

while cond
  begin
    BODY
    break
  ensure
    ENSURE
    raise
  end
end

とやると、

  jump WHILE_NEXT
WHILE_REDO:
  eval BODY      # begin 部
  eavl ENSURE    # # ensure 部
  send raise     # #
  put nil        #
  jump WHILE_END #
  eval ENSURE      # ensure 部
  send raise       #
WHILE_NEXT:
  eval cond
  if WHILE_REDO
WHILE_END:
----
ENSURE:
  ENSURE
  raise

とコンパイルされる。つまり ENSURE の部分を while の BODY の後ろにコピーしてるんだけど、そうすると、ENSURE の部分が begin 部に含まれてしまって、ensure 部の中で raise したものが、ensure で捉えられる(ややこしい)ことになる。さて、こいつをなんとかするにはコピーする場所を変えるか、キャッチするアドレスをいじるかしないといけないのだけれど、さてどうしたものかな。

ensure 部の中から脱出するのを真面目に考えてないからいけないんだけれども。やれやれ。


■案1

  jump WHILE_NEXT
WHILE_REDO:
  eval BODY      # begin 部
  eavl ENSURE      # ensure 部
  send raise       #
  put nil        #
  jump WHILE_END #
  eval ENSURE      # ensure 部
  send raise       #
WHILE_NEXT:
  eval cond
  if WHILE_REDO
WHILE_END:
----
ENSURE:
  ENSURE
  raise

■案2

  jump WHILE_NEXT
WHILE_REDO:
  eval BODY      # begin 部
  jump ENSURE1
ENSURE_RET:
  put nil        #
  jump WHILE_END #
  eval ENSURE      # ensure 部
  send raise       #
WHILE_NEXT:
  eval cond
  if WHILE_REDO
WHILE_END:
...
  end
ENSURE1:
  eavl ENSURE      # ensure 部
  send raise       #
  jump ENSURE_RET

----
ENSURE:
  ENSURE
  raise

どう考えても案1が綺麗だよなぁ。でも、テーブルいじるの面倒だし。

もう一案。この領域はスルー、って教えてあげるのはどうだろうか。うーむ、無理かな。


この辺は、ensure がネストしてたりとかbreakが何個もあったりすると泥沼。どうしたもんかね。


というわけで、案1、コンパイラで頑張る、を選択。

なんというか、無駄に break の対応にコンパイラの行数が。

while true
  begin
    p 1
    break
    p 2
    break
  ensure
    p :ensure
  end
end

は、次のようになる。

== disasm: <ISeq:<main>@../yarv/test.rb>================================
== catch table
|type: en, st: 0000, ed: 0010, sp: 0000, cont: 0054
== disasm: <ISeq:ensure@../yarv/test.rb>================================
local scope table (size: 1, argc: 0)
[ 1] __$!
0000 putself                                                          (   9)
0001 putobject        :ensure
0003 send             :p, 1, nil, 0, <ic>
0009 pop
0010 getdynamic       1, 0
0013 throw            0
|type: en, st: 0020, ed: 0032, sp: 0000, cont: 0054
== disasm: <ISeq:ensure@../yarv/test.rb>================================
local scope table (size: 1, argc: 0)
[ 1] __$!
0000 putself                                                          (   9)
0001 putobject        :ensure
0003 send             :p, 1, nil, 0, <ic>
0009 pop
0010 getdynamic       1, 0
0013 throw            0
|type: en, st: 0042, ed: 0044, sp: 0000, cont: 0054
== disasm: <ISeq:ensure@../yarv/test.rb>================================
local scope table (size: 1, argc: 0)
[ 1] __$!
0000 putself                                                          (   9)
0001 putobject        :ensure
0003 send             :p, 1, nil, 0, <ic>
0009 pop
0010 getdynamic       1, 0
0013 throw            0
|type: br, st: 0000, ed: 0057, sp: 0000, cont: 0057
|type: nx, st: 0000, ed: 0057, sp: 0000, cont: 0054
|type: rd, st: 0000, ed: 0057, sp: 0000, cont: 0000
|------------------------------------------------------------------------
local scope table (size: 1, argc: 0)

0000 putself                                                          (   4)
0001 putobject        1
0003 send             :p, 1, nil, 0, <ic>
0009 pop
0010 putself                                                          (   9)
0011 putobject        :ensure
0013 send             :p, 1, nil, 0, <ic>
0019 pop
0020 putnil
0021 end                                                              (   5)
0022 putself                                                          (   6)
0023 putobject        2
0025 send             :p, 1, nil, 0, <ic>
0031 pop
0032 putself                                                          (   9)
0033 putobject        :ensure
0035 send             :p, 1, nil, 0, <ic>
0041 pop
0042 putnil
0043 end                                                              (   7)
0044 putself                                                          (   9)
0045 putobject        :ensure
0047 send             :p, 1, nil, 0, <ic>
0053 pop
0054 jump             0                                               (   2)
0056 putnil
0057 end                                                              (   9)

手で dead code eliminationするとこうなる。

== catch table
|type: en, st: 0000, ed: 0010, sp: 0000, cont: 0054
|type: en, st: 0020, ed: 0032, sp: 0000, cont: 0054
|type: en, st: 0042, ed: 0044, sp: 0000, cont: 0054
|type: br, st: 0000, ed: 0057, sp: 0000, cont: 0057
|type: nx, st: 0000, ed: 0057, sp: 0000, cont: 0054
|type: rd, st: 0000, ed: 0057, sp: 0000, cont: 0000
|------------------------------------------------------------------------
local scope table (size: 1, argc: 0)

0000 putself                                                          (   4)
0001 putobject        1
0003 send             :p, 1, nil, 0, <ic>
0009 pop
0010 putself                                                          (   9)
0011 putobject        :ensure
0013 send             :p, 1, nil, 0, <ic>
0019 pop
0020 putnil
0021 end                                                              (   5)
...

さて、Array#each、Integer#times、Range#each だけ を高速化したんだけれど、他に高速化しないといけないような、よく使うものってあるかな。

まぁ、フレームワークみたいなものは作ったんだから、どうしても、ってところをちょいちょい追加できるってことでよしとしとこう(拡張ライブラリのようになっている)。

ちなみに、Hash#each は Ruby レベルで書くことは不可能なのでやらない。こればっかりはなぁ。


さて、あとは visibilityなんだが...。


ちなみに、今回のblock inlining は現状のRubyでも十分通用する話。でも、速くはならない。


ところで、

begin
  BLOCK
rescue
  RESCUE_BLOCK
ensure
  ENSURE_BLOCK
end

というコードがあったとき、RESCUE_BLOCK を rescue 部、ENSURE_BLOCK を ensure 部と呼ぶのは問題ないと思うんだけど、BLOCK をなんというか、いつも戸惑う。YARV の説明などで、とくに戸惑う。

候補:

なんというのがいいんでしょうかねぇ。


goooo(ry)ooogleをYahooで検索 に爆笑してしまったので自分もやってみた。google で yahoo

["yah", 249000]
["yaho", 60700]
["yahoo", 35800000]
["yahooo", 35300]
["yahoooo", 10800]
["yahooooo", 3590]
["yahoooooo", 1820]
["yahooooooo", 1610]
["yahoooooooo", 2230]
["yahooooooooo", 954]
["yahoooooooooo", 1310]
["yahooooooooooo", 636]
["yahoooooooooooo", 488]
["yahooooooooooooo", 472]
["yahoooooooooooooo", 400]
["yahooooooooooooooo", 374]
["yahoooooooooooooooo", 462]
["yahooooooooooooooooo", 215]
["yahoooooooooooooooooo", 191]
["yahooooooooooooooooooo", 127]
["yahoooooooooooooooooooo", 160]
["yahooooooooooooooooooooo", 141]
["yahoooooooooooooooooooooo", 382]
["yahooooooooooooooooooooooo", 330]
["yahoooooooooooooooooooooooo", 298]
["yahooooooooooooooooooooooooo", 355]
["yahoooooooooooooooooooooooooo", 291]
["yahooooooooooooooooooooooooooo", 266]
["yahoooooooooooooooooooooooooooo", 176]
["yahooooooooooooooooooooooooooooo", 206]
["yahoooooooooooooooooooooooooooooo", 216]
["yahooooooooooooooooooooooooooooooo", 405]
["yahoooooooooooooooooooooooooooooooo", 197]
["yahooooooooooooooooooooooooooooooooo", 171]
["yahoooooooooooooooooooooooooooooooooo", 104]
["yahooooooooooooooooooooooooooooooooooo", 130]
["yahoooooooooooooooooooooooooooooooooooo", 124]
["yahooooooooooooooooooooooooooooooooooooo", 99]
["yahoooooooooooooooooooooooooooooooooooooo", 128]
["yahooooooooooooooooooooooooooooooooooooooo", 110]
["yahoooooooooooooooooooooooooooooooooooooooo", 78]
["yahooooooooooooooooooooooooooooooooooooooooo", 67]
["yahoooooooooooooooooooooooooooooooooooooooooo", 99]
["yahooooooooooooooooooooooooooooooooooooooooooo", 54]
["yahoooooooooooooooooooooooooooooooooooooooooooo", 44]
["yahooooooooooooooooooooooooooooooooooooooooooooo", 43]
["yahoooooooooooooooooooooooooooooooooooooooooooooo", 36]
["yahooooooooooooooooooooooooooooooooooooooooooooooo", 185]
["yahoooooooooooooooooooooooooooooooooooooooooooooooo", 27]
["yahooooooooooooooooooooooooooooooooooooooooooooooooo", 28]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooo", 21]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooo", 40]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooo", 81]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooo", 48]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooo", 26]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 39]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 17]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 21]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 11]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 12]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 11]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 10]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 30]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 9]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 3]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 7]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 8]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 8]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 4]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 4]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 5]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 3]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 8]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 5]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 4]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 4]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 5]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 3]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 3]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1]
["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]

0 になったかと思えばまた復活する。


IRC でも昔ツンデレshellの話はあったんだけれど、ツンデレは基本的に stateful なので、stateless な shell はあわないだろう、と思った。

(そこでログイン回数とか history の長さとか、時間とか...)


今のままだと caller binding 出来ないことに気づく。参ったな。

_まつもと(Mon Dec 05 20:29:26 JST 2005)

 本体とかbody部とか呼んでます

_ささだ(Tue Dec 06 11:47:24 JST 2005)

 私もそう呼びますかね。


好きなだけ長いコメントをどうぞ。

お名前


back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $