Skip to content

Commit

Permalink
Pre-filter classes for large strings
Browse files Browse the repository at this point in the history
  • Loading branch information
mrjameshamilton authored and piazzesiNiccolo-GS committed Dec 17, 2024
1 parent 2a6357d commit 933e69e
Showing 1 changed file with 43 additions and 2 deletions.
45 changes: 43 additions & 2 deletions base/src/main/java/proguard/normalize/LargeStringSplitter.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import proguard.classfile.instruction.visitor.InstructionVisitor;
import proguard.classfile.visitor.AllMethodVisitor;
import proguard.classfile.visitor.ClassVisitor;
import proguard.classfile.visitor.MultiClassVisitor;
import proguard.util.StringUtil;

/** This class visitor splits any strings longer than 65535 bytes into smaller strings. */
Expand Down Expand Up @@ -50,7 +49,7 @@ public void visitAnyClass(Clazz clazz) {}
public void visitProgramClass(ProgramClass programClass) {
classModified = false;
programClass.accept(
new MultiClassVisitor(
new LargeStringClassConstantClassFilter(
new AllMethodVisitor(
new AllAttributeVisitor(new PeepholeEditor(codeAttributeEditor, this)))));
if (classModified) {
Expand Down Expand Up @@ -154,4 +153,46 @@ private static int nextSubstringEnd(String fullString, int start) {
}
return end;
}

/**
* A {@link ClassVisitor} that delegates to the given delegate {@link ClassVisitor} if the class
* contains a string constant pool entry with size greater the 65,535 bytes.
*/
private static class LargeStringClassConstantClassFilter
implements ClassVisitor, ConstantVisitor {

private final ClassVisitor acceptedVisitor;
private boolean found;

private LargeStringClassConstantClassFilter(ClassVisitor acceptedVisitor) {
this.acceptedVisitor = acceptedVisitor;
}

// Implementations for ClassVisitor.

@Override
public void visitAnyClass(Clazz clazz) {}

@Override
public void visitProgramClass(ProgramClass programClass) {
found = false;
programClass.constantPoolEntriesAccept(this);
}

// Implementations for ConstantVisitor

@Override
public void visitAnyConstant(Clazz clazz, Constant constant) {}

@Override
public void visitStringConstant(Clazz clazz, StringConstant stringConstant) {
if (found) return; // We already found one, no need to check again.

String fullString = stringConstant.getString(clazz);
if (StringUtil.getModifiedUtf8Length(fullString) > MAX_STRING_SIZE) {
clazz.accept(acceptedVisitor);
found = true;
}
}
}
}

0 comments on commit 933e69e

Please sign in to comment.