summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar YanisBft2023-09-25 23:33:29 +0200
committerGravatar GitHub2023-09-25 22:33:29 +0100
commit936aafbe7ac9e48d312f47dd66f05c011a16e0bf (patch)
treea714f713a8e6e9d2d4619fa26a17bcc1f2eaea86
parentAdd `Original name` field to identifier panel (#472) (diff)
downloadenigma-936aafbe7ac9e48d312f47dd66f05c011a16e0bf.tar.gz
enigma-936aafbe7ac9e48d312f47dd66f05c011a16e0bf.tar.xz
enigma-936aafbe7ac9e48d312f47dd66f05c011a16e0bf.zip
Index more class references (#531)
* Index more class references * fix checkstyle * index checkcast as well
-rw-r--r--enigma/src/main/java/cuchaz/enigma/analysis/index/IndexReferenceVisitor.java24
-rw-r--r--enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java9
-rw-r--r--enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndexer.java4
-rw-r--r--enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java5
-rw-r--r--enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java4
5 files changed, 45 insertions, 1 deletions
diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/IndexReferenceVisitor.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/IndexReferenceVisitor.java
index 97fec47b..cb71275a 100644
--- a/enigma/src/main/java/cuchaz/enigma/analysis/index/IndexReferenceVisitor.java
+++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/IndexReferenceVisitor.java
@@ -10,7 +10,9 @@ import org.objectweb.asm.Type;
10import org.objectweb.asm.tree.AbstractInsnNode; 10import org.objectweb.asm.tree.AbstractInsnNode;
11import org.objectweb.asm.tree.FieldInsnNode; 11import org.objectweb.asm.tree.FieldInsnNode;
12import org.objectweb.asm.tree.InvokeDynamicInsnNode; 12import org.objectweb.asm.tree.InvokeDynamicInsnNode;
13import org.objectweb.asm.tree.LdcInsnNode;
13import org.objectweb.asm.tree.MethodInsnNode; 14import org.objectweb.asm.tree.MethodInsnNode;
15import org.objectweb.asm.tree.TypeInsnNode;
14import org.objectweb.asm.tree.analysis.Analyzer; 16import org.objectweb.asm.tree.analysis.Analyzer;
15import org.objectweb.asm.tree.analysis.AnalyzerException; 17import org.objectweb.asm.tree.analysis.AnalyzerException;
16import org.objectweb.asm.tree.analysis.BasicValue; 18import org.objectweb.asm.tree.analysis.BasicValue;
@@ -65,7 +67,7 @@ public class IndexReferenceVisitor extends ClassVisitor {
65 67
66 private static class MethodInterpreter extends InterpreterPair<BasicValue, SourceValue> { 68 private static class MethodInterpreter extends InterpreterPair<BasicValue, SourceValue> {
67 private final MethodDefEntry callerEntry; 69 private final MethodDefEntry callerEntry;
68 private JarIndexer indexer; 70 private final JarIndexer indexer;
69 71
70 MethodInterpreter(MethodDefEntry callerEntry, JarIndexer indexer, EntryIndex entryIndex, InheritanceIndex inheritanceIndex) { 72 MethodInterpreter(MethodDefEntry callerEntry, JarIndexer indexer, EntryIndex entryIndex, InheritanceIndex inheritanceIndex) {
71 super(new IndexSimpleVerifier(entryIndex, inheritanceIndex), new SourceInterpreter()); 73 super(new IndexSimpleVerifier(entryIndex, inheritanceIndex), new SourceInterpreter());
@@ -80,6 +82,15 @@ public class IndexReferenceVisitor extends ClassVisitor {
80 indexer.indexFieldReference(callerEntry, FieldEntry.parse(field.owner, field.name, field.desc), ReferenceTargetType.none()); 82 indexer.indexFieldReference(callerEntry, FieldEntry.parse(field.owner, field.name, field.desc), ReferenceTargetType.none());
81 } 83 }
82 84
85 if (insn.getOpcode() == Opcodes.LDC) {
86 LdcInsnNode ldc = (LdcInsnNode) insn;
87
88 if (ldc.getType() == Type.ARRAY && ldc.cst instanceof Type type) {
89 String className = type.getClassName().replace(".", "/");
90 indexer.indexClassReference(callerEntry, ClassEntry.parse(className), ReferenceTargetType.none());
91 }
92 }
93
83 return super.newOperation(insn); 94 return super.newOperation(insn);
84 } 95 }
85 96
@@ -95,6 +106,17 @@ public class IndexReferenceVisitor extends ClassVisitor {
95 indexer.indexFieldReference(callerEntry, FieldEntry.parse(field.owner, field.name, field.desc), getReferenceTargetType(value, insn)); 106 indexer.indexFieldReference(callerEntry, FieldEntry.parse(field.owner, field.name, field.desc), getReferenceTargetType(value, insn));
96 } 107 }
97 108
109 if (insn.getOpcode() == Opcodes.INSTANCEOF) {
110 TypeInsnNode type = (TypeInsnNode) insn;
111 // Note: type.desc is actually the name
112 indexer.indexClassReference(callerEntry, ClassEntry.parse(type.desc), ReferenceTargetType.none());
113 }
114
115 if (insn.getOpcode() == Opcodes.CHECKCAST) {
116 TypeInsnNode type = (TypeInsnNode) insn;
117 indexer.indexClassReference(callerEntry, ClassEntry.parse(type.desc), ReferenceTargetType.none());
118 }
119
98 return super.unaryOperation(insn, value); 120 return super.unaryOperation(insn, value);
99 } 121 }
100 122
diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java
index 336ad58c..967983a8 100644
--- a/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java
+++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndex.java
@@ -153,6 +153,15 @@ public class JarIndex implements JarIndexer {
153 } 153 }
154 154
155 @Override 155 @Override
156 public void indexClassReference(MethodDefEntry callerEntry, ClassEntry referencedEntry, ReferenceTargetType targetType) {
157 if (callerEntry.getParent().isJre()) {
158 return;
159 }
160
161 indexers.forEach(indexer -> indexer.indexClassReference(callerEntry, referencedEntry, targetType));
162 }
163
164 @Override
156 public void indexMethodReference(MethodDefEntry callerEntry, MethodEntry referencedEntry, ReferenceTargetType targetType) { 165 public void indexMethodReference(MethodDefEntry callerEntry, MethodEntry referencedEntry, ReferenceTargetType targetType) {
157 if (callerEntry.getParent().isJre()) { 166 if (callerEntry.getParent().isJre()) {
158 return; 167 return;
diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndexer.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndexer.java
index 8726fb56..066000d0 100644
--- a/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndexer.java
+++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/JarIndexer.java
@@ -3,6 +3,7 @@ package cuchaz.enigma.analysis.index;
3import cuchaz.enigma.analysis.ReferenceTargetType; 3import cuchaz.enigma.analysis.ReferenceTargetType;
4import cuchaz.enigma.translation.representation.Lambda; 4import cuchaz.enigma.translation.representation.Lambda;
5import cuchaz.enigma.translation.representation.entry.ClassDefEntry; 5import cuchaz.enigma.translation.representation.entry.ClassDefEntry;
6import cuchaz.enigma.translation.representation.entry.ClassEntry;
6import cuchaz.enigma.translation.representation.entry.FieldDefEntry; 7import cuchaz.enigma.translation.representation.entry.FieldDefEntry;
7import cuchaz.enigma.translation.representation.entry.FieldEntry; 8import cuchaz.enigma.translation.representation.entry.FieldEntry;
8import cuchaz.enigma.translation.representation.entry.MethodDefEntry; 9import cuchaz.enigma.translation.representation.entry.MethodDefEntry;
@@ -18,6 +19,9 @@ public interface JarIndexer {
18 default void indexMethod(MethodDefEntry methodEntry) { 19 default void indexMethod(MethodDefEntry methodEntry) {
19 } 20 }
20 21
22 default void indexClassReference(MethodDefEntry callerEntry, ClassEntry referencedEntry, ReferenceTargetType targetType) {
23 }
24
21 default void indexMethodReference(MethodDefEntry callerEntry, MethodEntry referencedEntry, ReferenceTargetType targetType) { 25 default void indexMethodReference(MethodDefEntry callerEntry, MethodEntry referencedEntry, ReferenceTargetType targetType) {
22 } 26 }
23 27
diff --git a/enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java b/enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java
index 332a9674..c55d36ad 100644
--- a/enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java
+++ b/enigma/src/main/java/cuchaz/enigma/analysis/index/ReferenceIndex.java
@@ -65,6 +65,11 @@ public class ReferenceIndex implements JarIndexer {
65 } 65 }
66 66
67 @Override 67 @Override
68 public void indexClassReference(MethodDefEntry callerEntry, ClassEntry referencedEntry, ReferenceTargetType targetType) {
69 referencesToClasses.put(referencedEntry, new EntryReference<>(referencedEntry, referencedEntry.getName(), callerEntry, targetType));
70 }
71
72 @Override
68 public void indexMethodReference(MethodDefEntry callerEntry, MethodEntry referencedEntry, ReferenceTargetType targetType) { 73 public void indexMethodReference(MethodDefEntry callerEntry, MethodEntry referencedEntry, ReferenceTargetType targetType) {
69 referencesToMethods.put(referencedEntry, new EntryReference<>(referencedEntry, referencedEntry.getName(), callerEntry, targetType)); 74 referencesToMethods.put(referencedEntry, new EntryReference<>(referencedEntry, referencedEntry.getName(), callerEntry, targetType));
70 methodReferences.put(callerEntry, referencedEntry); 75 methodReferences.put(callerEntry, referencedEntry);
diff --git a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java
index 8659b402..0e179d7f 100644
--- a/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java
+++ b/enigma/src/main/java/cuchaz/enigma/translation/representation/entry/ClassEntry.java
@@ -50,6 +50,10 @@ public class ClassEntry extends ParentedEntry<ClassEntry> implements Comparable<
50 } 50 }
51 } 51 }
52 52
53 public static ClassEntry parse(String name) {
54 return new ClassEntry(name);
55 }
56
53 @Override 57 @Override
54 public Class<ClassEntry> getParentType() { 58 public Class<ClassEntry> getParentType() {
55 return ClassEntry.class; 59 return ClassEntry.class;