- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
JVM 规范的某些部分建议操作 JSR (Jump SubRoutine) , JSR_W (Jump SubRoutine Wide)和 RET (RETurn from subroutine)最多只能使用类文件版本 50.0 (JDK 1.6):
(This section assumes a compiler generates class files with version number 50.0 or below, so that the jsr instruction may be used. See also §4.10.2.5.)
之后:
4.10.2.5. Exceptions and
finally
To implement the
try
-finally
construct, a compiler for the Java programming language that generatesclass
files with version number 50.0 or below may use the exception-handling facilities together with two special instructions: jsr ("jump to subroutine") and ret ("return from subroutine").
另一方面,操作码描述本身并未提及弃用这些功能。引用的文本只说明了 50.0 之前的版本,但没有明确说明之后的情况。
This comment (对于询问此弃用或删除背后的动机的问题)表示类似程度的混淆,所以显然我不是唯一一个在寻找这个的人。
最佳答案
在向我的问题添加链接时,我注意到 §4.10.1.9: Type Checking Instructions 中没有相关操作码。所以这表明新的基于 strackframe 的类型验证方案无法处理它们,§4.10: Verification of class Files 写道:
Verification by type checking must be used to verify
class
files whose version number is greater than or equal to 50.0.
或在 §4.10.1: Verification by Type Checking 中更详细地说明:
A
class
file whose version number is 50.0 or above (§4.1) must be verified using the type checking rules given in this section.If, and only if, a
class
file's version number equals 50.0, then if the type checking fails, a Java Virtual Machine implementation may choose to attempt to perform verification by type inference (§4.10.2).
所以我想说 50.0 版本的类可能仍然包含jsr和ret,但存在 JVM 实现无法实现的风险' t 验证所述类,因此将无法加载它。
但后来我在 §4.9.1: Static Constraints 中发现了一个更明确的规则:
Only instances of the instructions documented in §6.5 may appear in the
code
array. Instances of instructions using the reserved opcodes (§6.2) or any opcodes not documented in this specification must not appear in thecode
array.If the
class
file version number is 51.0 or above, then neither the jsr opcode or the jsr_w opcode may appear in thecode
array.
第一段与这个问题无关,因为说明在 §6.5 中列出,并且根据 §6.2 没有保留。但第二段明确将它们标记为在 51.0 及更高版本中禁止使用。另一方面,ret 操作码在没有 jsr 或 jsr_w 的情况下是无用的,因为只有这两条指令可以创建类型为 returnAddress
的堆栈元素(并通过一些 astore 该类型的局部变量)由 ret 使用。
我仍然认为应该在 §6.5 中包含一些与此相关的通知。不幸的是,如果选择类型:错误,类别:Java 平台标准版,子类别:规范<,Java bug report webpage 会隐藏继续按钮/em>。它指出
This subcategory is for reporting technical errors and ambiguities in the text of the Java Language Specification and the JVM Specification. It is not the venue to propose new features in the Java language or JVM. Ongoing feature development is carried out in OpenJDK; corresponding enhancements to the Java Language Specification and the JVM Specification are managed through the Java Community Process.
但是通过 JCP 只是为了在这三个操作码的描述中添加一些澄清说明感觉就像是大材小用。所以我希望这篇文章能帮助那些无法在规范本身中找到答案的人。
关于java - JVM 规范中 JSR/RET 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013761/
有什么区别: 1) !ret 2) ret != 0 ? if (ret != 0 || stack[fd] == NULL || stack[fd][0] == '\0') { if (!ret
我正在使用 java 客户端 (jrets) 来查询 RETS 服务器。此 rets 服务器不支持 OFFSET 功能。 服务器管理员告诉我使用 MODIFIED 字段作为翻阅记录的一种方式。但是,我
我想从 RETS 服务器下载所有属性(property) list ,包括所有照片 URL。我正在使用 DMQL2 和 PHRETS 库。属性和照片对象存储在 RETS 服务器的不同表中。 要获取所有
各位, 我将使用 RETS 进行真实项目。我有一份文件,说明我的经理实际上在寻找什么。但我真的不知道如何开始使用 RETS MLS,因为它有很多这样的文档。 通过一些研发,我几乎没有想出任何有值(va
我正在尝试在 Microsoft visual studio 2013 on C++ 上编译一个为 linux 编写的程序(是 C 和 C++ 的混合体 (#include .h),我将全部转换为 C
当我尝试像这样编写自己的decay_t时: #include template struct auto_decay { auto operator () () noexcept {
我经常看到通过测试小于零而不是显式定义来检查 POSIX 函数错误的代码,通常唯一的错误代码使用 -1。也就是 ret = function(); if (ret < 0) { ... } 对
考虑以下空 C 程序(标准保证编译器执行隐式 return 0): int main(int argc, char* argv[]) {} 您可以将任何逻辑添加到此函数中来操作 argc 和 argv
我在 ubuntu 12.04 和 auctex 11.86 上运行 emacs 23.3.1。每当我去编译 latex 文档(使用 C-c C-c)时,如果没有错误,一切都编译得很好。但是,如果有任
我有 RETS 元数据文件,我想将其转换为数据库模式,这样我就可以查询我的数据库而不是 RETS 服务器。 有谁知道可以使用 xml 并将其转换为数据库模式的工具?或者可能是数据库模式本身? 一切都包
由于 ret 指令是一个间接调用,x86 上的 ret 指令会停止流水线,还是以某种方式优化为更直接的调用? 最佳答案 根据英特尔优化引用手册,分支预测单元包含一个 Return Stack Buff
我有以下头文件: #include #include #include #include #include #include /** **/ // size: 1B typedef en
我目前正在开发一个网站并从 RETS(房地产交易标准)API 中提取列表。我的一切工作正常,但我的问题是在尝试深入挖掘查询时出现的。作为引用,我正在使用 Node RETS Client但我不确定它与
if(isset($_POST['update'])) { $rets_login_url = $Fetch['rets_url']; $rets_username = $Fetch['rets_us
我有这个函数,它主要由内联汇编码成。 long *toarrayl(int members, ...){ __asm{ push esp mov eax, me
int suma(int* array, int len) { asm(" xor %eax, %eax # resultado = 0 \n"
我对汇编很陌生,我不明白在 proc 结束时你用 ret 写一个数字的确切含义是什么。陈述。 像这样: Function Proc push ax cx . ...body... . pop cx a
我正在尝试使用 PHRETS 从 rets 服务器在 WordPress 中添加帖子。不幸的是,正在添加重复的帖子。我已使用 WP 查询使用元键和值检查现有帖子。当我尝试添加 10 或 50 个帖子时
我有以下程序: SECTION .text main: mov ebx, 10 mov ecx, 50 repeat: inc ebx loop repeat
假设我正在 x86 汇编中编写一个例程,例如“add”,它将两个作为参数传递的数字相加。 在大多数情况下,这是一个非常简单的方法: push ebp mov ebp, esp mov eax, [eb
我是一名优秀的程序员,十分优秀!