diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/UniversalNumberTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/UniversalNumberTransformer.java index 5386fe3f..589d4d1c 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/UniversalNumberTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/UniversalNumberTransformer.java @@ -2,7 +2,7 @@ import uwu.narumi.deobfuscator.api.transformer.ComposedTransformer; import uwu.narumi.deobfuscator.core.other.impl.clean.peephole.UselessPopCleanTransformer; -import uwu.narumi.deobfuscator.core.other.impl.universal.number.InlineConstantValuesTransformer; +import uwu.narumi.deobfuscator.core.other.impl.universal.number.*; /** * Simplifies number operations on constant values. @@ -11,6 +11,7 @@ public class UniversalNumberTransformer extends ComposedTransformer { public UniversalNumberTransformer() { super( InlineConstantValuesTransformer::new, + EmptyArrayLengthTransformer::new, UselessPopCleanTransformer::new ); diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/number/EmptyArrayLengthTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/number/EmptyArrayLengthTransformer.java new file mode 100644 index 00000000..a71125b4 --- /dev/null +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/universal/number/EmptyArrayLengthTransformer.java @@ -0,0 +1,23 @@ +package uwu.narumi.deobfuscator.core.other.impl.universal.number; + +import uwu.narumi.deobfuscator.api.asm.MethodContext; +import uwu.narumi.deobfuscator.api.asm.matcher.impl.*; +import uwu.narumi.deobfuscator.api.transformer.Transformer; + +public class EmptyArrayLengthTransformer extends Transformer { + @Override protected void transform() throws Exception { + scopedClasses().forEach(classWrapper -> classWrapper.methods().forEach(methodNode -> { + MethodContext methodContext = MethodContext.of(classWrapper, methodNode); + OpcodeMatch.of(ARRAYLENGTH) + .and(FrameMatch.stack(0, + OpcodeMatch.of(NEWARRAY).and(FrameMatch.stack(0, NumberMatch.numInteger().capture("array-length"))))) + .findAllMatches(methodContext) + .forEach(matchContext -> { + methodNode.instructions.insert(matchContext.insn(), + numberInsn(matchContext.captures().get("array-length").insn().asInteger())); + matchContext.removeAll(); + markChange(); + }); + })); + } +}