Stackoverflowで 話題 だった、 a == 1 && a == 2 && a == 3
を true
にするJavaプログラムです。
Java 9から導入された Java-Level JVM Compiler Interface (JVMCI)を使って、この比較演算を行うメソッドを任意の機械語に強制的に置き換えて実現しています。
JVMCIに関しては日本オラクルさんの Java Day Tokyo 2017 で詳しく説明させていただきました。なお、 資料 および サンプルコード は公開しているので、興味がある方はぜひご覧ください。
JDK 9以降を JAVA_HOME
環境変数にセットしておいてください。
run.sh でコンパイル/実行すると true
になります。
$ ./run.sh compile
$ ./run.sh run
true
JVMCIを使って A123#comp()
を強制的に任意の機械語に置き換えます。
生成する機械語では、 AMD64向けSystem V ABI で戻り値用のレジスタとして定義されている RAX
に対して 1
を設定して、そのままリターンさせます。
なお、機械語生成にはOpenJDK 9のJVMCIテストコードである TestAssembler.java 、 TestHotSpotVMConfig.java 、 AMD64TestAssembler.java を流用しています。
JVMCIのクラスやメソッド、機械語生成方法に関する詳細については Java Day Tokyo 2017発表資料 および サンプルコード をご覧ください。