第1回JVM ソースコードリーディングの会に参加しました

ちょっと準備不足感は否めなかったかな的な、でも楽しかったです。

途中少し出てきた話のまとめ。

http://www.google.com/codesearch#sDZn6PDCLEM/src/share/vm/oops/cpCacheOop.cpp&q=cpCacheOop.cpp&type=cs&l=178

というのがあって、

m:~/src/java % cat Hoge.java
public class Hoge {
  private interface Huga {
  }

  private Hoge() {
  }

  public static String f(Huga huga) {
    return huga.toString();
  }
}

m:~/src/java % javac Hoge.java
m:~/src/java % javap -c Hoge
Compiled from "Hoge.java"
public class Hoge extends java.lang.Object{
public static java.lang.String f(Hoge$Huga);
  Code:
   0:   aload_0
   1:   invokevirtual   #2; //Method java/lang/Object.toString:()Ljava/lang/String;
   4:   areturn

}

この invokevirtual が invokeinterface でも、仕様上は恐らく問題ないだろうということなのです。えええ…!
javac はそういうバイトコードは出力しないけれど、他のコンパイラでどうなっているかは分からないので、invokevirtual の実装は java.lang.Object の virtual method のために、少々面倒なことになっている、という話。

仕様に詳しい方がいたら、どの辺からそういうことがいえるのか、教えていただきたいですね!

おしまい。