Skip to content

Commit d445444

Browse files
authored
fix registry
1 parent 50eafc8 commit d445444

File tree

2 files changed

+100
-3
lines changed

2 files changed

+100
-3
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package mods.Hileb.shotaasm.api;
2+
3+
4+
import top.outlands.foundation.TransformerDelegate;
5+
6+
import net.minecraft.launchwrapper.IClassNameTransformer;
7+
import net.minecraft.launchwrapper.IClassTransformer;
8+
import top.outlands.foundation.boot.TransformerHolder;
9+
10+
import java.util.*;
11+
12+
import static net.minecraft.launchwrapper.Launch.classLoader;
13+
import static top.outlands.foundation.boot.Foundation.LOGGER;
14+
import static top.outlands.foundation.boot.TransformerHolder.*;
15+
16+
import org.objectweb.asm.ClassReader;
17+
import org.objectweb.asm.ClassWriter;
18+
import org.objectweb.asm.tree.ClassNode;
19+
import top.outlands.foundation.IExplicitTransformer;
20+
21+
public class TransformerRegistry {
22+
23+
public static void registerRenameTransformer(IClassNameTransformer transformer) {
24+
TransformerDelegate.registerRenameTransformer(transformer);
25+
}
26+
27+
public static void registerExplicitTransformer(final int priorty, final IExplicitTransformer transformer, String... targets) {
28+
TransformerDelegate.registerExplicitTransformer(new IExplicitTransformer() {
29+
30+
@Override
31+
public byte[] transform(byte[] basicClass) {
32+
return transformer.transform(basicClass);
33+
}
34+
35+
@Override
36+
public int getPriority() {
37+
return priorty;
38+
}
39+
}, targets);
40+
}
41+
42+
public static void registerASMExplicitTransformer(final Consumer<ClassNode> transformer, String... targets) {
43+
TransformerDelegate.registerExplicitTransformer(new IExplicitTransformer() {
44+
45+
@Override
46+
public byte[] transform(byte[] basicClass) {
47+
ClassReader classReader = new ClassReader(bytes);
48+
ClassNode classNode = new ClassNode();
49+
classReader.accept(classNode, 0);
50+
transformer.apply(classNode);
51+
ClassWriter classWriter = new ClassWriter(classNode);
52+
classNode.accept(classWriter);
53+
return classWriter.toByteArray();
54+
}
55+
56+
@Override
57+
public int getPriority() {
58+
return priorty;
59+
}
60+
}, targets);
61+
}
62+
63+
public static void registerASMExplicitTransformer(final int priorty, final Consumer<ClassNode> transformer, String... targets) {
64+
TransformerDelegate.registerExplicitTransformer(new IExplicitTransformer() {
65+
@Override
66+
public byte[] transform(byte[] basicClass) {
67+
ClassReader classReader = new ClassReader(bytes);
68+
ClassNode classNode = new ClassNode();
69+
classReader.accept(classNode, 0);
70+
transformer.apply(classNode);
71+
ClassWriter classWriter = new ClassWriter(classNode);
72+
classNode.accept(classWriter);
73+
return classWriter.toByteArray();
74+
}
75+
}, targets);
76+
}
77+
78+
public static void registerExplicitTransformer(IExplicitTransformer transformer, String... targets) {
79+
TransformerDelegate.registerExplicitTransformer(transformer, targets);
80+
}
81+
82+
public static void registerClassTransformer(IClassTransformer transformer) {
83+
TransformerDelegate.registerClassTransformer(transformer);
84+
}
85+
86+
public static void unregisterClassTransformer(IClassTransformer transformer) {
87+
TransformerDelegate.unRegisterTransformer(transformer);
88+
}
89+
}

src/main/java/mods/Hileb/shotaasm/impl/ShotaCompiler.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public Runnable compile(ScriptFile file) {
2222
builder.append("import ").append(s).append(";\n");
2323
}
2424
builder
25-
.append("import top.outlands.foundation.TransformerDelegate;")
25+
.append("import mods.Hileb.shotaasm.api.TransformerRegistry;")
2626
.append("import org.objectweb.asm.*;")
2727
.append("import org.objectweb.asm.tree.*;")
2828
.append("import org.objectweb.asm.util.*;")
@@ -34,8 +34,16 @@ public Runnable compile(ScriptFile file) {
3434
.append(file.text())
3535
.append("}}");
3636
try {
37-
return (Runnable) Launch.classLoader.defineClass(name, Compiler.compileSingle(name, builder.toString()))
38-
.getConstructor().newInstance();
37+
Compiler compiler = new Compiler();
38+
compiler.addSource(name, builder.toString());
39+
CompileError error = compiler.compile();
40+
if (error != null) throw new RuntimeException(error);
41+
else {
42+
for (Map.Entry<String, byte[]> entry : compiler.getClasses().entrySet()) {
43+
Launch.classLoader.defineClass(entry.getKey(), entry.getValue());
44+
}
45+
return (Runnable) Class.forName(name, true, Launch.classLoader).getConstructor().newInstance();
46+
}
3947
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
4048
throw new RuntimeException(e);
4149
}

0 commit comments

Comments
 (0)