我使用ASM API进行Java字节码指令,我希望能够在每次访问任何数组时确定访问哪个数组(通过数组的名称)。
我有两个问题: - 让我们以iastore指令为例。 arrayref被置于操作数堆栈中的另外两个变量 - 值和索引。如何在不破坏堆栈的情况下获取arrayref(我不能在堆栈中复制两个以上的顶级变量)? 我想到了堆栈中的pop索引和值并将它们保存在某处然后获取arrayref并最终将索引和值推回到堆栈但我真的不知道如何执行此操作...
提前感谢。
答案 0 :(得分:0)
dup2_x1, pop2, dup_x2
你现在在堆栈的顶部有arrayref。但总的来说,使用局部变量更简单,JIT之后的最终结果应该没有区别。
正如其他人评论的那样,问题的第二部分没有多大意义。变量中不需要对象,您可以分配和使用数组,而无需将其存储到任何变量中。
但我怀疑你的目的是跟踪x[0]=1
之类的访问并将其归因于x,这可以通过数据流分析来实现。你将跟踪aload以及这些值的使用位置,如果你的arrayref直接来自aload,你知道该数组来自一个变量。