summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/analysis/InterpreterPair.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/analysis/InterpreterPair.java')
-rw-r--r--src/main/java/cuchaz/enigma/analysis/InterpreterPair.java131
1 files changed, 0 insertions, 131 deletions
diff --git a/src/main/java/cuchaz/enigma/analysis/InterpreterPair.java b/src/main/java/cuchaz/enigma/analysis/InterpreterPair.java
deleted file mode 100644
index 8a1c238..0000000
--- a/src/main/java/cuchaz/enigma/analysis/InterpreterPair.java
+++ /dev/null
@@ -1,131 +0,0 @@
1package cuchaz.enigma.analysis;
2
3import cuchaz.enigma.utils.Utils;
4import org.objectweb.asm.Opcodes;
5import org.objectweb.asm.Type;
6import org.objectweb.asm.tree.AbstractInsnNode;
7import org.objectweb.asm.tree.analysis.AnalyzerException;
8import org.objectweb.asm.tree.analysis.Interpreter;
9import org.objectweb.asm.tree.analysis.Value;
10
11import java.util.List;
12import java.util.Objects;
13import java.util.stream.Collectors;
14
15public class InterpreterPair<V extends Value, W extends Value> extends Interpreter<InterpreterPair.PairValue<V, W>> {
16 private final Interpreter<V> left;
17 private final Interpreter<W> right;
18
19 public InterpreterPair(Interpreter<V> left, Interpreter<W> right) {
20 super(Utils.ASM_VERSION);
21 this.left = left;
22 this.right = right;
23 }
24
25 @Override
26 public PairValue<V, W> newValue(Type type) {
27 return pair(
28 left.newValue(type),
29 right.newValue(type)
30 );
31 }
32
33 @Override
34 public PairValue<V, W> newOperation(AbstractInsnNode insn) throws AnalyzerException {
35 return pair(
36 left.newOperation(insn),
37 right.newOperation(insn)
38 );
39 }
40
41 @Override
42 public PairValue<V, W> copyOperation(AbstractInsnNode insn, PairValue<V, W> value) throws AnalyzerException {
43 return pair(
44 left.copyOperation(insn, value.left),
45 right.copyOperation(insn, value.right)
46 );
47 }
48
49 @Override
50 public PairValue<V, W> unaryOperation(AbstractInsnNode insn, PairValue<V, W> value) throws AnalyzerException {
51 return pair(
52 left.unaryOperation(insn, value.left),
53 right.unaryOperation(insn, value.right)
54 );
55 }
56
57 @Override
58 public PairValue<V, W> binaryOperation(AbstractInsnNode insn, PairValue<V, W> value1, PairValue<V, W> value2) throws AnalyzerException {
59 return pair(
60 left.binaryOperation(insn, value1.left, value2.left),
61 right.binaryOperation(insn, value1.right, value2.right)
62 );
63 }
64
65 @Override
66 public PairValue<V, W> ternaryOperation(AbstractInsnNode insn, PairValue<V, W> value1, PairValue<V, W> value2, PairValue<V, W> value3) throws AnalyzerException {
67 return pair(
68 left.ternaryOperation(insn, value1.left, value2.left, value3.left),
69 right.ternaryOperation(insn, value1.right, value2.right, value3.right)
70 );
71 }
72
73 @Override
74 public PairValue<V, W> naryOperation(AbstractInsnNode insn, List<? extends PairValue<V, W>> values) throws AnalyzerException {
75 return pair(
76 left.naryOperation(insn, values.stream().map(v -> v.left).collect(Collectors.toList())),
77 right.naryOperation(insn, values.stream().map(v -> v.right).collect(Collectors.toList()))
78 );
79 }
80
81 @Override
82 public void returnOperation(AbstractInsnNode insn, PairValue<V, W> value, PairValue<V, W> expected) throws AnalyzerException {
83 left.returnOperation(insn, value.left, expected.left);
84 right.returnOperation(insn, value.right, expected.right);
85 }
86
87 @Override
88 public PairValue<V, W> merge(PairValue<V, W> value1, PairValue<V, W> value2) {
89 return pair(
90 left.merge(value1.left, value2.left),
91 right.merge(value1.right, value2.right)
92 );
93 }
94
95 private PairValue<V, W> pair(V left, W right) {
96 if (left == null && right == null) {
97 return null;
98 }
99
100 return new PairValue<>(left, right);
101 }
102
103 public static final class PairValue<V extends Value, W extends Value> implements Value {
104 public final V left;
105 public final W right;
106
107 public PairValue(V left, W right) {
108 if (left == null && right == null) {
109 throw new IllegalArgumentException("should use null rather than pair of nulls");
110 }
111
112 this.left = left;
113 this.right = right;
114 }
115
116 @Override
117 public boolean equals(Object o) {
118 return o instanceof InterpreterPair.PairValue && Objects.equals(left, ((PairValue) o).left) && Objects.equals(right, ((PairValue) o).right);
119 }
120
121 @Override
122 public int hashCode() {
123 return left.hashCode() * 31 + right.hashCode();
124 }
125
126 @Override
127 public int getSize() {
128 return (left == null ? right : left).getSize();
129 }
130 }
131}