Skip to content

Commit 53fee23

Browse files
committed
feat(incision): 新增字节码织入模块与 Accessor API
Ray_Hughes
1 parent 716e043 commit 53fee23

128 files changed

Lines changed: 14660 additions & 2 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ bin
55
.settings
66
.classpath
77
.project
8-
doc
8+
doc
9+
.claude/
10+
nul

‎common/src/main/java/taboolib/common/PrimitiveLoader.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ static List<String[]> deps() {
5656
deps.add(new String[]{"!org.ow2.asm".substring(1), "asm", "9.8"});
5757
deps.add(new String[]{"!org.ow2.asm".substring(1), "asm-util", "9.8"});
5858
deps.add(new String[]{"!org.ow2.asm".substring(1), "asm-commons", "9.8"});
59+
// 都是必要的 incision 强制依赖
60+
deps.add(new String[]{"!org.ow2.asm".substring(1), "asm-tree", "9.8"});
61+
deps.add(new String[]{"!org.ow2.asm".substring(1), "asm-analysis", "9.8"});
5962
return deps;
6063
}
6164

‎module/bukkit-nms/src/main/kotlin/taboolib/module/nms/AsmClassTranslation.kt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ class AsmClassTranslation(val source: String) {
8585
newBytes = remapper.applyRequireTransform(newBytes)
8686
// 应用 dynamic 转换(检测并替换 dynamic() 调用为直接 JVM 指令)
8787
newBytes = remapper.applyDynamicTransform(newBytes)
88+
// 应用额外 transformer(incision 等模块在此织入)
89+
newBytes = remapper.applyExtraTransforms(source, newBytes)
8890
// 缓存
8991
BinaryCache.save("remap/$source", combinedVersion) { newBytes }
9092
// 保存字节码用于调试

‎module/bukkit-nms/src/main/kotlin/taboolib/module/nms/remap/RemapTranslation.kt‎

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.objectweb.asm.ClassWriter
66
import org.objectweb.asm.Opcodes
77
import taboolib.common.reflect.ClassHelper
88
import taboolib.module.nms.MinecraftVersion
9+
import java.util.concurrent.CopyOnWriteArrayList
910

1011
/**
1112
* 插件内部的类
@@ -29,6 +30,36 @@ open class RemapTranslation : Remapper() {
2930
val obc2 = "org/bukkit/craftbukkit/${MinecraftVersion.minecraftVersion}/"
3031
val obc3 = "org/bukkit/craftbukkit/"
3132

33+
companion object {
34+
35+
/**
36+
* 额外的字节码变换器 —— 在 remap + require + dynamic 三步之后执行。
37+
*
38+
* 供 [taboolib.module.incision] 等模块在 NMSProxy 管线末端注入自定义织入逻辑。
39+
* 每个 transformer 的签名:`(className, bytes) -> ByteArray?`;
40+
* 返回 null 表示不修改,返回非 null 则替换当前字节码继续传递下一个 transformer。
41+
*
42+
* 线程安全:使用 [java.util.concurrent.CopyOnWriteArrayList]。
43+
*/
44+
@JvmStatic
45+
val extraTransformers: MutableList<(String, ByteArray) -> ByteArray?> = CopyOnWriteArrayList()
46+
}
47+
48+
/** 运行 [extraTransformers] 管线;供 [taboolib.module.nms.AsmClassTranslation] 调用。 */
49+
fun applyExtraTransforms(className: String, classBytes: ByteArray): ByteArray {
50+
if (extraTransformers.isEmpty()) return classBytes
51+
var cur = classBytes
52+
for (t in extraTransformers) {
53+
try {
54+
val out = t(className, cur)
55+
if (out != null) cur = out
56+
} catch (e: Throwable) {
57+
e.printStackTrace()
58+
}
59+
}
60+
return cur
61+
}
62+
3263
override fun map(internalName: String): String {
3364
return translate(internalName)
3465
}
@@ -143,4 +174,4 @@ open class RemapTranslation : Remapper() {
143174
classBytes
144175
}
145176
}
146-
}
177+
}

0 commit comments

Comments
 (0)