質問にリンクを追加しているときに、問題のオペコードが§4.10.1.9: Type Checking Instructionsにないことに気付きました。したがって、これは、新しい strackframe ベースの型検証スキームがそれらを処理できないことを示しており、§4.10: クラス ファイルの検証は次のように記述しています。
class
バージョン番号が 50.0 以上のファイルを検証するには、タイプ チェックによる検証を使用する必要があります。
または、 §4.10.1: 型チェックによる検証で詳しく説明します。
class
バージョン番号が 50.0 以上 ( §4.1 )のファイルは、このセクションで説明する型チェック規則を使用して検証する必要があります。
class
ファイルのバージョン番号が 50.0 である場合に限り、型チェックが失敗すると、Java 仮想マシンの実装は型推論 ( §4.10.2 ) による検証を実行することを選択できます。
したがって、バージョン 50.0 のクラスにはまだjsrとretが含まれている可能性がありますが、JVM 実装がそのクラスを検証せず、その結果、ロードに失敗するリスクがあります。
しかし、 §4.9.1: Static Constraintsで、さらに明確なルールを見つけました。
§6.5に記載されている命令のインスタンスのみがcode
配列に表示されます。予約済みオペコード ( §6.2 ) またはこの仕様に記載されていないオペコードを使用する命令のインスタンスは、code
配列に出現してはなりません。
ファイルのclass
バージョン番号が 51.0 以上の場合、jsrオペコードもjsr_wcode
オペコードも配列に表示されない場合があります。
最初の段落はこの質問には関係ありません。なぜなら、命令は §6.5 にリストされており、§6.2 に従って予約されていないからです。しかし、2 番目の段落では、バージョン 51.0 以降では禁止されていることを明示的に示しています。一方、 retオペコードは、jsrまたはjsr_wなしでは役に立ちません。これら 2 つの命令のみが、タイプのスタック要素を作成できるためreturnAddress
(および、そのタイプのローカル変数をストアすることによって) retによって使用されるためです。
私は今でも、この趣旨の通知を §6.5 に含める必要があると考えています。残念ながら、 Type: Bug、Category: Java Platform Standard Edition、Subcategory: specificationを選択すると、 Java バグ レポートの Web ページで [続行] ボタンが非表示になります。それは次のように述べています
このサブカテゴリは、Java 言語仕様および JVM 仕様のテキスト内の技術的なエラーおよびあいまいさを報告するためのものです。Java 言語や JVM の新機能を提案する場ではありません。継続的な機能開発はOpenJDKで行われます。Java 言語仕様および JVM 仕様に対する対応する拡張機能は、Java Community Processを通じて管理されます。
しかし、これら 3 つのオペコードの説明に明確なメモを追加するためだけに JCP を調べるのは、やり過ぎのように感じます。したがって、この投稿が、仕様自体で自分で答えを見つけることができない人に役立つことを願っています.