用asm4重新生成标签

pgx2nnw8  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(333)

我正在使用asm4进行一些java字节码操作。我想把一些代码从一个方法复制到另一个方法。后者有一些额外的代码,因此每个 LabelNode 从第一个方法开始必须重新Map。
当需要插入局部变量时,问题就出现了。我遵循这个模式:从第一个方法获取局部变量,创建一个副本,修改索引和开始标签以及结束标签节点。用于获取局部变量的访问者具有以下形式:

public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index)

插入新局部变量的代码如下所示:

localVariableList.add(new LocalVariableNode((String name, String desc, String signature, LabelNode start, LabelNode end, int index)))

问题是 info 字段自 Label 对象为空,因此无法获取旧对象的引用 LabelNode 这样我就可以重新Map我的新标签节点。
我还试着用 label.getOffset() 然后将偏移量重新Map到与我的新偏移量列表关联的偏移量列表 LabelNode 但我有个例外:

java.lang.IllegalStateException: Label offset position has not been resolved yet
at org.objectweb.asm.Label.getOffset(Unknown Source)

如果你们中有人知道我如何得到相应的 LabelNodeLabel 非常感谢。或者有更好的方法将代码从一个方法复制到另一个方法,并用标签、标签节点和localvariables解决问题。
大多数时候我使用treeapi是因为它很简单。
谢谢你的帮助。

6yt4nkrj

6yt4nkrj1#

在我的aosd'07论文的“内联方法”一节中有一个类似转换的例子。

相关问题