Skip to content

Commit 2d18e61

Browse files
authored
feat: EmptyArrayLengthTransformer (#121)
* feat: EmptyArrayLengthTransformer * use contexts and frame matches in empty-array-length-transformer and mark changes when made
1 parent b7c4579 commit 2d18e61

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/UniversalNumberTransformer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import uwu.narumi.deobfuscator.api.transformer.ComposedTransformer;
44
import uwu.narumi.deobfuscator.core.other.impl.clean.peephole.UselessPopCleanTransformer;
5-
import uwu.narumi.deobfuscator.core.other.impl.universal.number.InlineConstantValuesTransformer;
5+
import uwu.narumi.deobfuscator.core.other.impl.universal.number.*;
66

77
/**
88
* Simplifies number operations on constant values.
@@ -11,6 +11,7 @@ public class UniversalNumberTransformer extends ComposedTransformer {
1111
public UniversalNumberTransformer() {
1212
super(
1313
InlineConstantValuesTransformer::new,
14+
EmptyArrayLengthTransformer::new,
1415

1516
UselessPopCleanTransformer::new
1617
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package uwu.narumi.deobfuscator.core.other.impl.universal.number;
2+
3+
import uwu.narumi.deobfuscator.api.asm.MethodContext;
4+
import uwu.narumi.deobfuscator.api.asm.matcher.impl.*;
5+
import uwu.narumi.deobfuscator.api.transformer.Transformer;
6+
7+
public class EmptyArrayLengthTransformer extends Transformer {
8+
@Override protected void transform() throws Exception {
9+
scopedClasses().forEach(classWrapper -> classWrapper.methods().forEach(methodNode -> {
10+
MethodContext methodContext = MethodContext.of(classWrapper, methodNode);
11+
OpcodeMatch.of(ARRAYLENGTH)
12+
.and(FrameMatch.stack(0,
13+
OpcodeMatch.of(NEWARRAY).and(FrameMatch.stack(0, NumberMatch.numInteger().capture("array-length")))))
14+
.findAllMatches(methodContext)
15+
.forEach(matchContext -> {
16+
methodNode.instructions.insert(matchContext.insn(),
17+
numberInsn(matchContext.captures().get("array-length").insn().asInteger()));
18+
matchContext.removeAll();
19+
markChange();
20+
});
21+
}));
22+
}
23+
}

0 commit comments

Comments
 (0)