Smalltalk総合 Squeak Pharo

2013/02/16(土) 14:10:29.12
Squeak
http://www.squeak.org/
Pharo
http://www.pharo-project.org/home

商用
Cincom VisualWorks
http://smalltalk.cincom.jp/main/products/visualworks/
2015/02/12(木) 09:00:56.49ID:FbfONYzU
>>232 あ、ほんとだ。ブロックリテラルで書かないと、インライン展開されないんですね。…とのことです。>>229

true ifTrue: [3] ifFalse: [4]. thisContext method symbolic "=> '33 <71> pushConstant: true
34 <99> jumpFalse: 37
35 <21> pushConstant: 3
36 <90> jumpTo: 38
37 <20> pushConstant: 4
38 <87> pop
39 <89> pushThisContext:
40 <D3> send: method
41 <D2> send: symbolic
42 <7C> returnTop' "

true ifTrue: 3 ifFalse: 4. thisContext method symbolic "=> '33 <71> pushConstant: true
34 <21> pushConstant: 3
35 <22> pushConstant: 4
36 <F0> send: ifTrue:ifFalse:
37 <87> pop
38 <89> pushThisContext:
39 <D4> send: method
40 <D3> send: symbolic
41 <7C> returnTop' "

| block | block := [3]. true ifTrue: block. thisContext method symbolic
"=> '<略> 36 <71> pushConstant: true
37 <10> pushTemp: 0
38 <E1> send: ifTrue:
39 <87> pop
40 <89> pushThisContext:
41 <D3> send: method
42 <D2> send: symbolic
43 <7C> returnTop' "
2015/02/12(木) 09:26:20.70ID:FbfONYzU
>>232
調べてみました。なるほど。
引数がブロックかどうかをチェックしてインライン化を判断しているのですね。
(以下は Squeak の場合ですが、VisualWorks でも似たようなことをしていました。)

MessageNode >> transformIfTrue: encoder
 (self transformBoolean: encoder)
  ifTrue:
   [arguments :=
    Array
     with: ((arguments at: 1) noteOptimizedIn: self)
     with: ((BlockNode withJust: NodeNil) noteOptimizedIn: self).
   ^true]
  ifFalse:
   [^false]

MessageNode >> transformBoolean: encoder
 ^self
  checkBlock: (arguments at: 1)
  as: 'argument'
  from: encoder
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況