如何根据方法混合手动和自动计算 ASM 中的最大局部变量、最大堆栈和帧?

问题描述 投票:0回答:1

我目前正在开发一个项目,在该项目中,我使用 ASM 库从我自己的中间表示生成 Java 字节码。对于代码中的某些方法,我已经预先计算了最大堆栈大小、局部变量和帧信息的值。然而,对于其他方法,我缺乏这些信息,并且更喜欢 ASM 为我自动计算这些值。

之所以出现挑战,是因为 ASM 的

ClassWriter
只允许在类级别指定计算选项(
COMPUTE_MAXS
COMPUTE_FRAMES
),从而影响类中的所有方法。我正在寻找一种方法来根据每个方法有选择地应用 ASM 的自动计算,这样:

  • 对于我预先计算了最大局部变量和堆栈大小的方法,我手动设置这些值。
  • 对于其余部分,ASM 自动计算最大局部变量、堆栈大小和帧。

我尝试扩展

ClassWriter
但尚未找到返回
MethodWriter
的不同实现的方法。此外,
MethodWriter
被声明为最终类,防止它被扩展。

如果我设置

COMPUTE_FRAMES
,ASM 会忽略我使用
visitMaxs
指定的值并从头开始计算它们。

我很欣赏任何见解或替代策略。

java bytecode java-bytecode-asm
1个回答
0
投票

您可以破解

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 并根据您的需要进行修改。

© www.soinside.com 2019 - 2024. All rights reserved.