ΨΨΨ Smalltalk/ Squeak 教えろゴルァ ΨΨΨ
■ このスレッドは過去ログ倉庫に格納されています
0363358
NGNG358で書いたとおり、BlockContext>>whileTrue:の
[self value] whileTrue: [aBlock value]
がインライン展開されて
5 <70> self
6 <C9> send: value
7 <9C> jumpFalse: 13
8 <10> pushTemp: 0
9 <C9> send: value
10 <87> pop
11 <A3 F8> jumpTo: 5
13 <73> pushConstant: nil
14 <7C> returnTop
となってるから。
なんでこんな実装になってるかというと、
whileTrue:を使うと通常はインライン展開されるけど、
[ x > 0] perform: #whileTrue: with: [x _ x - 1]
みたく強制的にメッセージ送信を発生させてる場合についても
whileTrue:自体が上に書いたバイトコードにインライン展開されていて
効率よく実行できるから。
whileTrue: aBlock
self value ifTrue: [aBlock value. self whileTrue: aBlock]
って感じにしても動くけど、毎回メッセージ送信が発生して、遅くなっちゃうでしょ。
■ このスレッドは過去ログ倉庫に格納されています