diff --git a/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java b/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java index d03ba84..09f933f 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java @@ -16,7 +16,7 @@ import java.lang.reflect.Field; import java.util.Map; /** - * 为单个 {@link IRFunction} 生成对应的虚拟机指令序列。 + * VMCodeGenerator为单个 {@link IRFunction} 生成对应的虚拟机指令序列。 *
* 本类依据中间表示函数的指令列表,调用 {@link VMProgramBuilder} 输出相应的 VM 操作码, * 包括常量加载、算术运算、函数调用和返回等指令生成逻辑。 diff --git a/src/main/java/org/jcnc/snow/compiler/backend/VMProgramBuilder.java b/src/main/java/org/jcnc/snow/compiler/backend/VMProgramBuilder.java index b1d6fb0..11d83d4 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/VMProgramBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/VMProgramBuilder.java @@ -5,64 +5,125 @@ import org.jcnc.snow.vm.engine.VMOpCode; import java.util.*; /** - * Builds a linear VM program, resolving CALL addresses even if the - * target function appears later. Now emits “CALL <addr> <nArgs>”. + * 构建线性 VM 程序,支持对函数调用地址的延迟解析与修补。 + *
+ * 本类在生成程序时按顺序追加指令,并在定义函数入口时修补之前遇到的对该函数的调用。 + * 最终可产出完整的指令列表,用于 VM 执行。 + *
*/ public final class VMProgramBuilder { + /** + * 记录待修补的调用信息,包括指令索引、目标函数名称及参数个数。 + */ private record Fix(int index, String target, int nArgs) {} + /** + * 用于在目标地址未知时的占位符。 + */ private static final String PLACEHOLDER = "-1"; + /** + * 存储生成的指令行,按追加顺序对应程序计数器地址。 + */ private final List+ * 若标签包含包名(以 '.' 分隔),则尝试匹配简单名称后缀。 + *
+ * + * @param label 函数标签或全限定名称 + * @return 已知地址,或 {@code null} 表示尚未定义 + */ private Integer resolve(String label) { - Integer a = labelAddr.get(label); - if (a == null && label.contains(".")) { - a = labelAddr.get(label.substring(label.lastIndexOf('.')+1)); + Integer addr = labelAddr.get(label); + if (addr == null && label.contains(".")) { + String simpleName = label.substring(label.lastIndexOf('.') + 1); + addr = labelAddr.get(simpleName); } - return a; + return addr; } + /** + * 修补指定函数名称对应的所有延迟调用,将占位符替换为实际地址。 + * + * @param name 函数名称 + */ private void patchFixesFor(String name) { - for (Iterator