diff options
| author | 2018-05-19 17:02:46 +0200 | |
|---|---|---|
| committer | 2018-05-19 17:02:46 +0200 | |
| commit | 2b2249e873c4adfd2dd6e8f1f2489ccd9f6aa021 (patch) | |
| tree | 14c8b1e806449ace1641a1dbafae162855f79670 /src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java | |
| parent | Fix build (diff) | |
| download | enigma-fork-2b2249e873c4adfd2dd6e8f1f2489ccd9f6aa021.tar.gz enigma-fork-2b2249e873c4adfd2dd6e8f1f2489ccd9f6aa021.tar.xz enigma-fork-2b2249e873c4adfd2dd6e8f1f2489ccd9f6aa021.zip | |
Initial port to ASM
Diffstat (limited to 'src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java b/src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java index d627fe9..64de788 100644 --- a/src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java +++ b/src/main/java/cuchaz/enigma/bytecode/ClassPublifier.java | |||
| @@ -11,41 +11,45 @@ | |||
| 11 | 11 | ||
| 12 | package cuchaz.enigma.bytecode; | 12 | package cuchaz.enigma.bytecode; |
| 13 | 13 | ||
| 14 | import javassist.CtBehavior; | 14 | import org.objectweb.asm.ClassVisitor; |
| 15 | import javassist.CtClass; | 15 | import org.objectweb.asm.FieldVisitor; |
| 16 | import javassist.CtField; | 16 | import org.objectweb.asm.MethodVisitor; |
| 17 | import javassist.bytecode.AccessFlag; | ||
| 18 | import javassist.bytecode.InnerClassesAttribute; | ||
| 19 | 17 | ||
| 20 | public class ClassPublifier { | 18 | public class ClassPublifier extends ClassVisitor { |
| 21 | 19 | ||
| 22 | public static CtClass publify(CtClass c) { | 20 | public ClassPublifier(int api, ClassVisitor cv) { |
| 21 | super(api, cv); | ||
| 22 | } | ||
| 23 | 23 | ||
| 24 | // publify all the fields | 24 | @Override |
| 25 | for (CtField field : c.getDeclaredFields()) { | 25 | public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { |
| 26 | field.setModifiers(publify(field.getModifiers())); | 26 | access = publify(access); |
| 27 | } | 27 | super.visit(version, access, name, signature, superName, interfaces); |
| 28 | } | ||
| 28 | 29 | ||
| 29 | // publify all the methods and constructors | 30 | @Override |
| 30 | for (CtBehavior behavior : c.getDeclaredBehaviors()) { | 31 | public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { |
| 31 | behavior.setModifiers(publify(behavior.getModifiers())); | 32 | access = publify(access); |
| 32 | } | 33 | return super.visitField(access, name, desc, signature, value); |
| 34 | } | ||
| 33 | 35 | ||
| 34 | // publify all the inner classes | 36 | @Override |
| 35 | InnerClassesAttribute attr = (InnerClassesAttribute) c.getClassFile().getAttribute(InnerClassesAttribute.tag); | 37 | public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { |
| 36 | if (attr != null) { | 38 | access = publify(access); |
| 37 | for (int i = 0; i < attr.tableLength(); i++) { | 39 | return super.visitMethod(access, name, desc, signature, exceptions); |
| 38 | attr.setAccessFlags(i, publify(attr.accessFlags(i))); | 40 | } |
| 39 | } | ||
| 40 | } | ||
| 41 | 41 | ||
| 42 | return c; | 42 | @Override |
| 43 | public void visitInnerClass(String name, String outerName, String innerName, int access) { | ||
| 44 | access = publify(access); | ||
| 45 | super.visitInnerClass(name, outerName, innerName, access); | ||
| 43 | } | 46 | } |
| 44 | 47 | ||
| 45 | private static int publify(int flags) { | 48 | private static int publify(int access) { |
| 46 | if (!AccessFlag.isPublic(flags)) { | 49 | AccessFlags accessFlags = new AccessFlags(access); |
| 47 | flags = AccessFlag.setPublic(flags); | 50 | if (!accessFlags.isPublic()) { |
| 51 | accessFlags.setPublic(); | ||
| 48 | } | 52 | } |
| 49 | return flags; | 53 | return accessFlags.getFlags(); |
| 50 | } | 54 | } |
| 51 | } | 55 | } |