Skip to content

Commit

Permalink
Transformation stack
Browse files Browse the repository at this point in the history
  • Loading branch information
mineLdiver committed Aug 25, 2023
1 parent 4c8f43b commit d98006c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 13 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ yarn_mappings=18w49a.22
loader_version=0.14.21

# Mod Properties
mod_version=0.2
mod_version=0.2.1
maven_group=net.mine_diver
archives_base_name=SpASM
28 changes: 16 additions & 12 deletions src/main/java/net/mine_diver/spasm/impl/MixinTransformerHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
import org.spongepowered.asm.mixin.transformer.IMixinTransformer;
import org.spongepowered.asm.transformers.TreeTransformer;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Objects;

import static net.mine_diver.spasm.api.transform.TransformationResult.PASS;
import static net.mine_diver.spasm.impl.SpASM.RAW_TRANSFORMERS;
import static net.mine_diver.spasm.impl.SpASM.TRANSFORMERS;
Expand All @@ -20,24 +24,24 @@
makeFinal = true
)
class MixinTransformerHook<T extends TreeTransformer & IMixinTransformer> extends MixinTransformerDelegate<T> {
Deque<String> transformationStack = new ArrayDeque<>();

MixinTransformerHook(T delegate) {
super(delegate);
}

@Override
public byte[] transformClassBytes(String name, String transformedName, byte[] basicClass) {
if (shouldSkip(name, basicClass)) return super.transformClassBytes(name, transformedName, basicClass);
if (basicClass == null || Objects.equals(transformationStack.peek(), name)) return super.transformClassBytes(name, transformedName, basicClass);
transformationStack.push(name);
val classLoader = Thread.currentThread().getContextClassLoader();
basicClass = transform(name, basicClass, classLoader, TransformationPhase.BEFORE_MIXINS);
basicClass = super.transformClassBytes(name, transformedName, basicClass);
basicClass = transform(name, basicClass, classLoader, TransformationPhase.AFTER_MIXINS);
transformationStack.pop();
return basicClass;
}

private static boolean shouldSkip(String name, byte[] basicClass) {
return basicClass == null || name.startsWith("org.objectweb.asm.") || name.startsWith("net.mine_diver.spasm.") || name.startsWith("com.google.common.");
}

private static byte[] transform(String name, byte[] basicClass, ClassLoader classLoader, TransformationPhase phase) {
SpASM.currentPhase = phase;
for (int i = 0; i < RAW_TRANSFORMERS.size(); i++) {
Expand All @@ -48,15 +52,15 @@ private static byte[] transform(String name, byte[] basicClass, ClassLoader clas
}
val classNode = new ClassNode();
new ClassReader(basicClass).accept(classNode, 0);
switch (TRANSFORMERS.stream()
if (TRANSFORMERS
.stream()
.filter(transformer -> transformer.getPhases().contains(phase))
.map(classTransformer -> classTransformer.transform(classLoader, classNode))
.reduce(PASS, TransformationResult::choose)) {
case SUCCESS:
val classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
classNode.accept(classWriter);
basicClass = classWriter.toByteArray();
break;
.reduce(PASS, TransformationResult::choose)
== TransformationResult.SUCCESS) {
val classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
classNode.accept(classWriter);
basicClass = classWriter.toByteArray();
}
SpASM.currentPhase = null;
return basicClass;
Expand Down

0 comments on commit d98006c

Please sign in to comment.