Skip to content

Latest commit

 

History

History

java

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

概要

Stackoverflowで 話題 だった、 a == 1 && a == 2 && a == 3true にする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.javaTestHotSpotVMConfig.javaAMD64TestAssembler.java を流用しています。 JVMCIのクラスやメソッド、機械語生成方法に関する詳細については Java Day Tokyo 2017発表資料 および サンプルコード をご覧ください。