Java バイトコードに invokedynamic 命令を追加?

RubyPythonJava VM でネイティブ(?)にサポートしようと Javaバイトコード仕様の変更の提案がなされた。
動的に型付けされた言語を JVM 上で動かすための invokedynamic 命令を追加しようという。

私の理解としては、

  • invokedynamic 命令は呼び出したいメソッド名、(オプションで)引数リスト、戻り値の型を渡す。コンパイル時やベリファイヤは型チェックしない。実行時にインスタンスにメソッドがあるかどうかをチェックして、あれば呼び出す。
  • 同一名でシグネチャが異なる複数のメソッドがあり、呼び出し先を決定できない場合には(ユーザーが定義する)トラップハンドラに処理を移す。おそらく java.lang.reflect.Proxy のように呼び出し時の引数リストが渡ってくると思われる。
  • invokedynamic 命令は呼び出される実際の型に合わせて引数の型変換を試みる。

いろいろ疑問が残る。

  • Gosling Property をどうやって維持するのか? invokedynamic の中でスタックトップの調整値を埋め込むのか?
  • Ruby だとクラスやインスタンスにメソッドを貼り付けてオーバーライドすることができるわけだが、それはどうやってやるのだろう。