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