methodLineTables データ・ストリング・フォーマット

methodLineTables データ・ストリングは、クラス内の各実行可能ユニットごとに 1 つの項目を持つテーブルをエンコードします。

methodLineTables テーブル内の各エントリーの値は、対応する実行可能ユニットの (classSourceFile データ・ストリングによって命名されるソース・ファイル内の) 行番号です。例えば、テーブル内のエントリー番号 5 は、実行可能ユニット番号 5 の行番号です。

methodLineTables ストリングの例を、以下に示します。
#51+1201#75+11,41
ストリングの解釈方法を、以下に示します。
  • 番号記号 (「#」) のすぐ後の数字は、クラスのソース・コードの完全 (相対でない) 行番号を表します。例では、クラス内の最初のメソッドの最初の実行可能ユニットは行 51 にあります。
  • プラス記号 (「+」) の後の各数字 (1 桁ずつ) は、次の実行可能ユニットの行番号を生成するために前の行番号に加える行数を表します。例では、プラス記号の後の数字 (+1201) を使用して、2 番目から 5 番目までの実行可能ユニットの行番号が計算されます。
    1. 51 + 1 = 2 番目の実行可能ユニットの行番号: 52
    2. 52 + 2 = 3 番目の実行可能ユニットの行番号: 54
    3. 54 + 0 = 4 番目の実行可能ユニットの行番号: 54 (1 つのソース行に 2 つの実行可能ユニットがある)
    4. 54 + 1 = 5 番目の実行可能ユニットの行番号: 55
  • 行番号の増加が負であったり、10 以上であったりする場合は、その実行可能ユニットの完全行番号が指定されます。例では、6 番目の実行可能ユニットは行 75 にあり、前の行番号 55 より 20 大きくなります。この場合、6 番目の実行可能ユニットに完全行番号が指定され、そこから相対行番号の計算が再び始まります (#75+11):
    1. 75 = 6 番目の実行可能ユニットの行番号
    2. 75 + 1 = 7 番目の実行可能ユニットの行番号: 76
    3. 76 + 1 = 8 番目の実行可能ユニットの行番号: 77
  • コンマ (「,」) は、あるメソッドが終わり、次のメソッドが始まることを示します。コンマの後の数字と記号は、コンマの前と同じように解釈されます。例では、2 番目のメソッドの最初の実行可能ユニットの行番号は、前のメソッドで計算された最後の行番号より 4 だけ大きくなります。つまり、相対行番号の計算は、次のようにコンマの後も続きます (,41)。
    1. 77 + 4 = 2 番目のメソッドの最初の実行可能ユニットの行番号: 81
    2. 81 + 1 = 2 番目のメソッドの 2 番目の実行可能ユニット行番号: 82
注: すべての実行可能ユニットが、 それに関連したソース情報を持つわけではありません。 中には、Java 言語のセマンティクスをインプリメントするために、コンパイラーによって作成されるものもあります (例えば、例外処理、初期化、または同期など)。 このように生成された実行可能ユニットでは、methodLineTables ストリングに完全行番号 0 が入っています。完全行番号 0 は、行番号情報が使用可能になっていないことを示します。メソッド全体にソース情報がない場合、行番号 0 に対応する実行可能ユニットを 1 つ持つものとして表されます。
methodLineTables ストリングおよびその意味について、さらに別の例を以下に示します。
methodLineTables ストリング 意味
+5 最初のメソッドの最初の実行可能ユニットの行番号が 10 より小さい場合、ストリング全体がプラス記号で始まり、行 0 から増加を始めます。この例では、最初のメソッドの最初の実行可能ユニットは行 5 から始まります。
+0 最初のメソッドにソース情報がない場合、ストリングは +0 で始まります。そのようなメソッドに適用する executableUnit プローブ・フラグメントは、メソッドの最初に 1 度だけ挿入されます。
...#437,#457+123... あるメソッドの最初の実行可能ユニットがその直前のメソッドの最後の実行可能ユニットより 10 行以上後で始まる場合、新しいメソッドの最初の実行可能ユニットのストリングのパターンは、コンマ、番号記号、および行番号になります。この一部分の例では、新しいメソッドの最初の実行可能ユニットは、前のメソッドの最後の実行可能ユニットの 20 行後から始まります。
...#437,+2... メソッドの最後の実行可能ユニットで「#」の表記が必要で、かつ次のメソッドの最初の実行可能ユニットがそこからあまり離れていないこともあります。この一部分の例では、あるメソッドの最後の実行可能ユニットが行 437 で始まり、次のメソッドの最初の実行可能ユニットは行 439 で始まります。
関連参照
プローブ・フラグメント