Jasmin アセンブラを使用して、Java のサブセットを Java バイトコードにコンパイルするコンパイラを作成しています。
「l2d」命令 (および関連する命令) に問題がありますが、これが機能しない理由を理解すれば、すべて機能すると思います)。
命令参照:
http://cs.au.dk/~mis/dOvs/jvmspec/ref-_l2d.html
私がコンパイルしているコードは次のとおりです。
{
double d = 10L;
}
したがって、基本的には、javac がプリミティブな数値型間で暗黙的な型変換を行う方法をミラーリングしようとしています。
出力 Jasmin アセンブリ コードは次のとおりです。
.source test3.jml
.class Test3
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 10
.limit locals 100
ldc2_w 10 ;Load constant numerical value 10
l2d ;Convert left hand side to match the type of the right
dstore 0 ;Store top of stack in 0 (d)
.end method
前の3つの重要な行.end method
。
「;」の後のテキスト コメントです。
コンパイルされたコードを実行しようとしたときに発生する正確なエラーは次のとおりです。
Exception in thread "main" java.lang.VerifyError:(class: Test3, method: main signature: ([java/lang/String;)V) Attempt to split long or double on the stack
Could not find the main class: Test3. Program will exit.
long と double がスタック上の 2 つのスロットと 2 つのローカル変数 (ここで説明) を占有するという事実と関係があるに違いないと思いますが、それでも私は困惑します。