Gcd(12,15)のトレース
便宜的に,作成されたインスタンスの名前を
それそれ以下のようにする.
作成命令 |
new Gcd(12,15) | new Gcd(15,12) | new Gcd(12,3) | new Gcd(3,0) |
インスタンス名 |
i1215 | i1512 | i123 | i30 |
new Gcd(12,15)内の処理,実際には i1215.<init> 呼び出し後
local=[this, 12, 15, ] stack=[] ; this=i1215 引数a 引数b 変数g
aload_0
local=[this, 12, 15, ] stack=[this]
invokespecial java/lang/Object/()V
local=[this, 12, 15, ] stack=[]
aload_0
iconst_0
local=[this, 12, 15, ] stack=[this, 0]
putfield Gcd/r I
local=[this, 12, 15, ] stack=[] ; i1215.r=0 となった
iload_2
local=[this, 12, 15, ] stack=[15]
ifne Label1 ;スタック積値が0以外ならLabel1にジャンプ,この場合ジャンプ
local=[this, 12, 15, ] stack=[]
new Gcd
local=[this, 12, 15, ] stack=[i1512] ; Gcd(15,12)に対応するインスタンスi1512を生成,ただし未初期化
dup
local=[this, 12, 15, ] stack=[i1512, i1512]
iload_2
iload_1
iload_2
local=[this, 12, 15, ] stack=[i1512, i1512, 15, 12, 15]
irem ; %算
local=[this, 12, 15, ] stack=[i1512, i1512, 15, 12]
invokespecial Gcd/(II)V ; i1512.<init>を呼ぶ
local=[this, 12, 15, ] stack=[i1512]
astore_3
local=[this, 12, 15, i1512] stack=[]
aload_0
aload_3
local=[this, 12, 15, i1512] stack=[this, i1512]
invokevirtual Gcd/result()I ; i1512.result() の結果を得る.この場合,以下のフレーム計算結果より 3
local=[this, 12, 15, i1512] stack=[this, 3]
putfield Gcd/r I ; this.r=i1215.r=3
local=[this, 12, 15, i1512] stack=[]
return
new Gcd(15,12)内の処理,実際には i1512.<init> 呼び出し後
local=[this, 15, 12, ] stack=[] ; this=i1512 引数a 引数b 変数g
aload_0
local=[this, 15, 12, ] stack=[this]
invokespecial java/lang/Object/()V
local=[this, 15, 12, ] stack=[]
aload_0
iconst_0
local=[this, 15, 12, ] stack=[this, 0]
putfield Gcd/r I
local=[this, 15, 12, ] stack=[] ; i1512.r=0 となった
iload_2
local=[this, 15, 12, ] stack=[12]
ifne Label1 ;スタック積値が0以外ならLabel1にジャンプ,この場合ジャンプ
local=[this, 15, 12, ] stack=[]
new Gcd
local=[this, 15, 12, ] stack=[i123] ; Gcd(12,3)に対応するインスタンスi123を生成,ただし未初期化
dup
local=[this, 15, 12, ] stack=[i123, i123]
iload_2
iload_1
iload_2
local=[this, 15, 12, ] stack=[i123, i123, 12, 15, 12]
irem ; %算, 15 % 12 = 3
local=[this, 15, 12, ] stack=[i123, i123, 12, 3]
invokespecial Gcd/(II)V ; i123.<init>を呼ぶ
local=[this, 15, 12, ] stack=[i123]
astore_3
local=[this, 15, 12, i123] stack=[]
aload_0
aload_3
local=[this, 15, 12, i123] stack=[this, i123]
invokevirtual Gcd/result()I ; i123.result() の結果を得る.この場合,以下のフレーム計算結果より 3
local=[this, 15, 12, i123] stack=[this, 3]
putfield Gcd/r I ; this.r=i1512.r=3
local=[this, 15, 12, i123] stack=[]
return
new Gcd(12,3)内の処理,実際には i123.<init> 呼び出し後
local=[this, 12, 3, ] stack=[] ; this=i123 引数a 引数b 変数g
aload_0
local=[this, 12, 3, ] stack=[this]
invokespecial java/lang/Object/()V
local=[this, 12, 3, ] stack=[]
aload_0
iconst_0
local=[this, 12, 3, ] stack=[this, 0]
putfield Gcd/r I
local=[this, 12, 3, ] stack=[] ; i123.r=0 となった
iload_2
local=[this, 12, 3, ] stack=[3]
ifne Label1 ;スタック積値が0以外ならLabel1にジャンプ,この場合ジャンプ
local=[this, 12, 3, ] stack=[]
new Gcd
local=[this, 12, 3, ] stack=[i30] ; Gcd(3,0)に対応するインスタンスi30を生成,ただし未初期化
dup
local=[this, 12, 3, ] stack=[i30, i30]
iload_2
iload_1
iload_2
local=[this, 12, 3, ] stack=[i30, i30, 3, 12, 3]
irem ; %算, 12 % 3 = 0
local=[this, 12, 3, ] stack=[i30, i30, 3, 0]
invokespecial Gcd/(II)V ; i30.<init>を呼ぶ
local=[this, 12, 3, ] stack=[i30]
astore_3
local=[this, 12, 3, i30] stack=[]
aload_0
aload_3
local=[this, 12, 3, i30] stack=[this, i30]
invokevirtual Gcd/result()I ; i30.result() の結果を得る.この場合,以下のフレーム計算結果より 3
local=[this, 12, 3, i30] stack=[this, 3]
putfield Gcd/r I ; this.r=i123.r=3
local=[this, 12, 3, i30] stack=[]
return
new Gcd(3,0)内の処理,実際には i30.<init> 呼び出し後
local=[this, 3, 0, ] stack=[] ; this=i30 引数a 引数b 変数g
aload_0
local=[this, 3, 0, ] stack=[this]
invokespecial java/lang/Object/()V
local=[this, 3, 0, ] stack=[]
aload_0
iconst_0
local=[this, 3, 0, ] stack=[this, 0]
putfield Gcd/r I
local=[this, 3, 0, ] stack=[] ; i30.r=0 となった
iload_2
local=[this, 3, 0, ] stack=[0]
ifne Label1 ;スタック積値が0以外ならLabel1にジャンプ,この場合ジャンプしない
local=[this, 3, 0, ] stack=[]
aload_0
iload_1
local=[this, 3, 0, ] stack=[this, 3]
putfield Gcd/r I ; this.r=i30.r=3
local=[this, 3, 0, ] stack=[]
goto Label2
return
i30.result()の呼び出し
local=[this] stack=[] ; this=i30
aload_0
local=[this] stack=[this]
getfield Gcd/r I
local=[this] stack=[3]
ireturn
i123.result()の呼び出し
local=[this] stack=[] ; this=i123
aload_0
local=[this] stack=[this]
getfield Gcd/r I
local=[this] stack=[3]
ireturn
i1512.result()の呼び出し
local=[this] stack=[] ; this=i1512
aload_0
local=[this] stack=[this]
getfield Gcd/r I
local=[this] stack=[3]
ireturn
以上.