我目前正在开发一个项目,在该项目中,我使用 ASM 库从我自己的中间表示生成 Java 字节码。对于代码中的某些方法,我已经预先计算了最大堆栈大小、局部变量和帧信息的值。然而,对于其他方法,我缺乏这些信息,并且更喜欢 ASM 为我自动计算这些值。
之所以出现挑战,是因为 ASM 的
ClassWriter
只允许在类级别指定计算选项(COMPUTE_MAXS
和 COMPUTE_FRAMES
),从而影响类中的所有方法。我正在寻找一种方法来根据每个方法有选择地应用 ASM 的自动计算,这样:
我尝试扩展
ClassWriter
但尚未找到返回 MethodWriter
的不同实现的方法。此外,MethodWriter
被声明为最终类,防止它被扩展。
如果我设置
COMPUTE_FRAMES
,ASM 会忽略我使用 visitMaxs
指定的值并从头开始计算它们。
我很欣赏任何见解或替代策略。
您可以破解
MethodWriter
并写入其 compute
字段:
/**
* Indicates what must be computed. Must be one of {@link #COMPUTE_ALL_FRAMES}, {@link
* #COMPUTE_INSERTED_FRAMES}, {@link COMPUTE_MAX_STACK_AND_LOCAL_FROM_FRAMES}, {@link
* #COMPUTE_MAX_STACK_AND_LOCAL} or {@link #COMPUTE_NOTHING}.
*/
private final int compute;
我建议您分叉 ASM 并根据您的需要进行修改。