Open-source multiplayer game server compatible with the RuneScape client
https://www.openrs2.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.3 KiB
80 lines
2.3 KiB
package dev.openrs2.asm.transform;
|
|
|
|
import dev.openrs2.asm.classpath.ClassPath;
|
|
import dev.openrs2.asm.classpath.Library;
|
|
import org.objectweb.asm.Opcodes;
|
|
import org.objectweb.asm.tree.ClassNode;
|
|
import org.objectweb.asm.tree.FieldNode;
|
|
import org.objectweb.asm.tree.MethodNode;
|
|
import org.objectweb.asm.tree.analysis.AnalyzerException;
|
|
|
|
public abstract class Transformer {
|
|
public final void transform(ClassPath classPath) throws AnalyzerException {
|
|
preTransform(classPath);
|
|
|
|
boolean changed;
|
|
do {
|
|
changed = false;
|
|
|
|
prePass(classPath);
|
|
for (var library : classPath.getLibraries()) {
|
|
for (var clazz : library) {
|
|
changed |= transformClass(classPath, library, clazz);
|
|
|
|
for (var field : clazz.fields) {
|
|
changed |= transformField(classPath, library, clazz, field);
|
|
}
|
|
|
|
for (var method : clazz.methods) {
|
|
changed |= preTransformMethod(classPath, library, clazz, method);
|
|
|
|
if ((method.access & (Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT)) == 0) {
|
|
changed |= transformCode(classPath, library, clazz, method);
|
|
}
|
|
|
|
changed |= postTransformMethod(classPath, library, clazz, method);
|
|
}
|
|
}
|
|
}
|
|
postPass(classPath);
|
|
} while (changed);
|
|
|
|
postTransform(classPath);
|
|
}
|
|
|
|
protected void preTransform(ClassPath classPath) throws AnalyzerException {
|
|
/* empty */
|
|
}
|
|
|
|
protected void prePass(ClassPath classPath) throws AnalyzerException {
|
|
/* empty */
|
|
}
|
|
|
|
protected boolean transformClass(ClassPath classPath, Library library, ClassNode clazz) throws AnalyzerException {
|
|
return false;
|
|
}
|
|
|
|
protected boolean transformField(ClassPath classPath, Library library, ClassNode clazz, FieldNode field) throws AnalyzerException {
|
|
return false;
|
|
}
|
|
|
|
protected boolean preTransformMethod(ClassPath classPath, Library library, ClassNode clazz, MethodNode method) throws AnalyzerException {
|
|
return false;
|
|
}
|
|
|
|
protected boolean transformCode(ClassPath classPath, Library library, ClassNode clazz, MethodNode method) throws AnalyzerException {
|
|
return false;
|
|
}
|
|
|
|
protected boolean postTransformMethod(ClassPath classPath, Library library, ClassNode clazz, MethodNode method) throws AnalyzerException {
|
|
return false;
|
|
}
|
|
|
|
protected void postPass(ClassPath classPath) throws AnalyzerException {
|
|
/* empty */
|
|
}
|
|
|
|
protected void postTransform(ClassPath classPath) throws AnalyzerException {
|
|
/* empty */
|
|
}
|
|
}
|
|
|