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

以上.