aboutsummaryrefslogtreecommitdiff
path: root/dexlib2/src/main/java
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2020-02-03 00:09:21 -0800
committerBen Gruver <bgruv@google.com>2020-02-03 00:09:21 -0800
commitc1f2da0e0b85cf6a5eb0432f96fe4b316cfc34be (patch)
tree54946349b12d1df18bff79dfe3b077071abc76fe /dexlib2/src/main/java
parent409cf27ba9f38d1ee62092724246fd2664174539 (diff)
downloadgoogle-smali-c1f2da0e0b85cf6a5eb0432f96fe4b316cfc34be.tar.gz
Improve the performance of the TypeRewriter.rewrite method
Diffstat (limited to 'dexlib2/src/main/java')
-rw-r--r--dexlib2/src/main/java/org/jf/dexlib2/rewriter/TypeRewriter.java14
1 files changed, 11 insertions, 3 deletions
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TypeRewriter.java b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TypeRewriter.java
index 862111fc..252003c5 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TypeRewriter.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/rewriter/TypeRewriter.java
@@ -36,12 +36,20 @@ import javax.annotation.Nonnull;
public class TypeRewriter implements Rewriter<String> {
@Nonnull @Override public String rewrite(@Nonnull String value) {
if (value.length() > 0 && value.charAt(0) == '[') {
- int dimensions = value.lastIndexOf("[") + 1;
+ int dimensions = 0;
+ while (value.charAt(dimensions) == '[') {
+ dimensions++;
+ }
- String arraySpecifiers = value.substring(0, dimensions);
String unwrappedType = value.substring(dimensions);
String rewrittenType = rewriteUnwrappedType(unwrappedType);
- return arraySpecifiers + rewrittenType;
+
+ // instance equality, to avoid a value comparison in the common case of the type being unmodified
+ if (unwrappedType != rewrittenType) {
+ return new StringBuilder(dimensions + rewrittenType.length())
+ .append(value, 0, dimensions).append(rewrittenType).toString();
+ }
+ return value;
} else {
return rewriteUnwrappedType(value);
}