1

編集:解決策は、アイテムをintsの配列に格納したかったため、 iastore を使用する必要があったときに aastore を使用していたのに対し、 aastore はObjectsの配列専用です。

バイトコードでコンストラクターとして生成している次のメソッドがあります

aload_0
invokespecial java/lang/Object/<init>()V
aload_0
new java/lang/StringBuilder
dup
invokespecial java/lang/StringBuilder/<init>()V
putfield com/js/interpreter/custom_types/1e9ebd0/s Ljava/lang/StringBuilder;
aload_0
iconst_0
putfield com/js/interpreter/custom_types/1e9ebd0/l I
aload_0
iconst_0
multianewarray [I 1
astore_1
iconst_0
istore_2
goto 23
18:aload_1
iload_2
iconst_0
aastore
iinc 2 1
23:iload_2
iconst_0
if_icmplt 18
aload_1
putfield com/js/interpreter/custom_types/1e9ebd0/a [I
return

ただし、メソッドを指定すると検証に失敗します:署名: ()V) スタック上でオブジェクト/配列を見つけることを期待しています

ただし、スタック上のアイテムの数を常に正確に把握できます。

    aload_0
1
    invokespecial java/lang/Object/<init>()V
0
    aload_0
1
    new java/lang/StringBuilder
2
    dup
3
    invokespecial java/lang/StringBuilder/<init>()V
2
    putfield com/js/interpreter/custom_types/1e9ebd0/s Ljava/lang/StringBuilder;
0
    aload_0
1
    iconst_0
2
    putfield com/js/interpreter/custom_types/1e9ebd0/l I
0
    aload_0
1
    iconst_0
2
    multianewarray [I 1
2
    astore_1
1
    iconst_0
2
    istore_2
1
    goto 23
    18:aload_1
2
    iload_2
3
    iconst_0
4
    aastore
1
    iinc 2 1
1
    23:iload_2
2
    iconst_0
3
    if_icmplt 18
1
    aload_1
2
    putfield com/js/interpreter/custom_types/1e9ebd0/a [I
0
    return

Justice ベリファイアを実行しても、有用なメッセージは表示されません (さらに、javac によって生成されたクラスの検証にも失敗します)。

ここで何が起こっているのでしょうか?どうしたの?

4

2 に答える 2

1

問題はわかりませんが、バイトコードのデバッグ地獄にハマったときの対処法は次のとおりです。

  • 不要なコードを省略します。現在、ループは nop のようです (ローカル変数 2 をゼロで初期化するため、body ループに入ることはありませんよね?)。したがって、ループの本体を空にして、検証のバグが続くかどうかを確認します。
  • 次に、バグがなくなるまで、他の部分の削除 (さまざまなフィールドの初期化) を開始します。
于 2011-04-29T07:22:02.997 に答える
1

おそらく私は混乱しているが、あなたはそうする

1
jsr 23

...

23: iload_2
2

しかし、23 の後、スタックには 3 があると思います

A0
<return address>
I2
于 2011-04-29T06:55:04.303 に答える