offsetstackframe在jvm规范中做什么

f45qwnt8  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(267)

是什么 offsetStackFrame prolog predicate 在jvm规范中是什么?
虽然我不是prologMaven,但是我可以掌握prolog中的所有其他 predicate ,但是我不能理解这个 predicate 。
以下是jvm规范第174页中该 predicate 的定义:

offsetStackFrame(Environment, Offset, StackFrame) :-
 allInstructions(Environment, Instructions),
 member(stackMap(Offset, StackFrame), Instructions).

第178页 instruction 定义为:

instruction(Offset, AnInstruction)

以下是 stackMap 第180页:

stackMap(Offset, TypeState)

TypeState 定义如下:

frame(Locals, OperandStack, Flags)

我不明白你在说什么 member(stackMap(Offset, StackFrame), Instructions) 在定义中做什么 offsetStackFrame . 我认为 Instructions 作为 [instruction(offset, AnInstruction)] 以及 stackMap(Offset, TypeState) 作为 [(Offset, frame(Locals, OperandStack, Flags))] . 那么这个 predicate 的目的是什么呢?

6tqwzwtp

6tqwzwtp1#

我稍后会回来改进这个答案。如果我没有意见,请给我发一个通知,因为我现在没有太多时间。我已经在规范中运行了prolog,所以我应该能够提供一个irl示例。
基本上,为了帮助验证过程,类文件在某些键字节码偏移量(通常在控制流合并的分支之后)包含操作数堆栈/局部变量的类型状态。这些类型的状态称为stackmap帧。prolog代码有一个 predicate ,它结合了已知的stackmap帧和指令(称为 mergeStackMapFrames 或者别的什么)。然后它对合并结果进行迭代,以验证所有状态转换是否有效/是否与所讨论的指令匹配。
上面的 predicate 如何适应这一点,是它Assert一个特定的stackmap帧存在于合并的指令/stackmap帧中。由于prolog的性质,您可以首先使用这个Assert来构造合并列表。

相关问题