IsbrhTessellatorAbuseTransformer

基本信息

属性 值
类 com.gtnewhorizons.angelica.loading.fml.transformers.IsbrhTessellatorAbuseTransformer
路径 src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/IsbrhTessellatorAbuseTransformer.java
行数 31
类型 public class ... implements IClassTransformer(:12),Javadoc :11
内部实现 IsbrhTessellatorAbuseTransform(73 行,shared/)

它是什么

3 个共享变换逻辑的 FML 侧包装里最独立的一个:只用一个内部对象,没有排除列表,没有多步编排。

// :14
private final IsbrhTessellatorAbuseTransform inner = new IsbrhTessellatorAbuseTransform();

注意它不接受 isObf 参数(对比 CeleritasBlockTransformer :21),而是在 transform 里现问 AngelicaClientTweaker.isObfEnv()(:23)。

挂在哪个阶段

唯一被 getASMTransformerClass() 无条件按类名追加的 transformer(有 RFB 条件),见 AngelicaClientTweaker :123-125:

if (!rfbLoaded) {
    transformers.add("com.gtnewhorizons.angelica.loading.fml.transformers.IsbrhTessellatorAbuseTransformer");
}

即:RFB 加载时不注册(改由 RFBIsbrhTessellatorAbuseTransformer 承担),且不受任何 CompatConfig / AngelicaConfig 开关控制。

transform 的 3 个早退(:16-30)

行 条件 行为
:18 !inner.shouldTransform(basicClass) 返回 basicClass
:23 !inner.transformClassNode(cn, isObf) 返回 basicClass
:25 变更成功 ClassWriter(COMPUTE_MAXS) 写出 + dump

与其他 transformer 的差异:本类不检查 basicClass == null(:17 直接传给 shouldTransform),而 CeleritasBlockTransformer :32 与两个 specific/ transformer :32/:44 都显式判空。这依赖 ClassConstantPoolParser.find() 对 null 的容忍度。

预筛选机制

shouldTransform 走 IsbrhTessellatorAbuseTransform 的常量池解析器,匹配常量 ISBRH = "cpw/mods/fml/client/registry/ISimpleBlockRenderingHandler"(:15)。只处理实现了 ISimpleBlockRenderingHandler 的类——这是本 transformer 的作用范围界定,也是 RFB 侧用 metadata.binaryInterfaceNames.contains(...) 做同一判断的原因。

已知问题

  1. basicClass 未判空(:17):ClassConstantPoolParser.find(null) 的行为依赖 gtnhlib 实现。三个同目录 transformer 都判空,本类不判,属于不一致而非必然崩溃。
  2. ClassWriter(COMPUTE_MAXS)(:25):IsbrhTessellatorAbuseTransform 会在 draw() 前后插入 POP 与 ICONST_*(见该类 :48 起的 popOp 逻辑),可能改变栈深度。只重算 maxs 依赖这些插入的净栈效应为 0——源码未加断言。
  3. 无排除前缀:不像 CeleritasBlockTransformer 有 exclusions 早退,本类对每个 ISBRH 实现类都进 ClassReader。这是预筛选常量池扫描的成本。
  4. 注册路径的 RFB 分叉写在调用方(AngelicaClientTweaker :123),本类自身不含任何 RFB 感知——与 RFBCeleritasBlockTransformer 那样显式实现 RfbClassTransformer 的风格相反。

相关条目