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