TC4 Transformer

基本信息

net.glease.tc4tweak.asm.TC4Transformer —— 本 mod 唯一的 ASM 变换入口, 实现 IClassTransformer。所有字节码改动集中在一个 ImmutableMap 里。

注册真源:63 条目标类映射

transformers 字段(第 43-117 行)是一个 ImmutableMap<String, TransformerFactory>, 63 条 .put(...),覆盖 53 个不同 Visitor 类 (多数 Visitor 作用于多个类,如 TESRGetBlockTypeNullSafetyVisitor 用于 6 个 TESR)。

⚠️ 「63 条映射」与「53 个 Visitor」与「55 个 *Visitor.java 文件」是三个不同数字。 差额来源:少数 Visitor 只被引用未落文件(如 HashCodeVisitor 用于 3 个类), 另有非 Visitor 的 TransformerFactory(ReadMarkerNoCastVisitor.createFactory(...))。

分派逻辑

TransformerFactory factory = transformers.get(name);      // 用 name 而非 transformedName
if (factory == null || factory.isInactive()) return basicClass;
  • 未命中或 isInactive() → 原样返回,零开销;
  • 命中则 new ClassReader(basicClass) + factory.apply(ASM5, cw)。

ClassWriter 策略

ClassWriter cw = new ClassWriter(factory.isExpandFrames() ? ClassWriter.COMPUTE_FRAMES : 0);

需要扩帧的变换器用 COMPUTE_FRAMES,其余用 0(不重算)—— 控制启动期开销。

调试输出

isDebug()(系统属性 glease.debugasm)为真时,向 <mcHome>/.asm/ 写 <类名>[_N]_orig.txt / _tran.txt 两份 TraceClassVisitor 输出。 重复变换时加 _1、_2 后缀(transformCounts 计数器)。 调试路径失败会降级重试:Unable to transform with debug output on. Now retrying without debug output.

条件失活:ScanManager 的 GT6 兼容

thaumcraft.common.lib.research.ScanManager 用匿名子类覆写 isInactive():

if (LoadingPlugin.gt6) {
    log.warn("generateItemHash patch disabled for GT6 compat.");
    return true;
}

即检测到 Greg-ASM(GT6)时禁用 generateItemHash 补丁。

失败处理

catching(Exception) 打 log.fatal("Something went very wrong with class transforming! Aborting!!!"),优先构造 ReportedException(CrashReport); 若那步本身失败(通常因发生太早)则退回 RuntimeException,两者都抛出—— 即变换失败即崩溃,不静默降级。

相关条目

源码

  • src/main/java/net/glease/tc4tweak/asm/TC4Transformer.java