diff options
author | Ben Gruver <bgruv@google.com> | 2020-02-03 00:09:21 -0800 |
---|---|---|
committer | Ben Gruver <bgruv@google.com> | 2020-02-03 00:09:21 -0800 |
commit | c1f2da0e0b85cf6a5eb0432f96fe4b316cfc34be (patch) | |
tree | 54946349b12d1df18bff79dfe3b077071abc76fe /dexlib2/src/main/java | |
parent | 409cf27ba9f38d1ee62092724246fd2664174539 (diff) | |
download | google-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.java | 14 |
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); } |