From 7f10374f40d6c78a71777e0814806812a0a3d72b Mon Sep 17 00:00:00 2001 From: Izzat Bahadirov Date: Mon, 11 Feb 2013 14:13:26 -0500 Subject: [PATCH 1/4] Sorting items in encoded_array to match the order of fields. --- .../java/org/jf/dexlib2/writer/EncodedArrayPool.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java index 60afc609..9f1194c3 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java @@ -113,6 +113,13 @@ public class EncodedArrayPool { public static class Key implements Comparable { private final Set fields; private final int size; + + private static class FieldComparator implements Comparator { + @Override + public int compare(Field o1, Field o2) { + return o1.compareTo(o2); + } + } private static final Function GET_INITIAL_VALUE = new Function() { @@ -133,9 +140,9 @@ public class EncodedArrayPool { @Nullable public static Key of(@Nonnull ClassDef classDef) { - Set fields = classDef.getFields(); + Set fields = FluentIterable.from(classDef.getFields()).toImmutableSortedSet(new FieldComparator()); - Iterable staticFields = FluentIterable.from(classDef.getFields()).filter(IS_STATIC_FIELD); + Iterable staticFields = FluentIterable.from(fields).filter(IS_STATIC_FIELD); int lastIndex = CollectionUtils.lastIndexOf(staticFields, HAS_INITIALIZER); if (lastIndex > -1) { From 0e56199557edffba8ce7360589fb61d7168daf1f Mon Sep 17 00:00:00 2001 From: Izzat Bahadirov Date: Wed, 20 Feb 2013 22:52:16 -0500 Subject: [PATCH 2/4] Fixing spacing. --- .../java/org/jf/dexlib2/writer/EncodedArrayPool.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java index 9f1194c3..39c7547c 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java @@ -113,12 +113,12 @@ public class EncodedArrayPool { public static class Key implements Comparable { private final Set fields; private final int size; - + private static class FieldComparator implements Comparator { - @Override - public int compare(Field o1, Field o2) { - return o1.compareTo(o2); - } + @Override + public int compare(Field o1, Field o2) { + return o1.compareTo(o2); + } } private static final Function GET_INITIAL_VALUE = From 1d4b31a11cc0943bf33018c51f36441c7bad47e3 Mon Sep 17 00:00:00 2001 From: Izzat Bahadirov Date: Fri, 29 Mar 2013 20:14:27 -0400 Subject: [PATCH 3/4] First filtering for static fields, then sorting them. Using filtered list in a Key. Removed deprecated guava methods. --- .../java/org/jf/dexlib2/writer/EncodedArrayPool.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java index 39c7547c..ae6d4ebb 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java @@ -140,13 +140,12 @@ public class EncodedArrayPool { @Nullable public static Key of(@Nonnull ClassDef classDef) { - Set fields = FluentIterable.from(classDef.getFields()).toImmutableSortedSet(new FieldComparator()); - - Iterable staticFields = FluentIterable.from(fields).filter(IS_STATIC_FIELD); - int lastIndex = CollectionUtils.lastIndexOf(staticFields, HAS_INITIALIZER); + Set staticFields = FluentIterable.from(classDef.getFields()).filter(IS_STATIC_FIELD).toSet(); + Iterable staticFieldsSorted = FluentIterable.from(staticFields).toSortedSet(new FieldComparator()); + int lastIndex = CollectionUtils.lastIndexOf(staticFieldsSorted, HAS_INITIALIZER); if (lastIndex > -1) { - return new Key(fields, lastIndex+1); + return new Key(staticFields, lastIndex+1); } return null; } @@ -158,7 +157,6 @@ public class EncodedArrayPool { @Nonnull public Iterable getElements() { return FluentIterable.from(fields) - .filter(IS_STATIC_FIELD) .limit(size) .transform(GET_INITIAL_VALUE); } From 8191cd9a7aacbb9b01b3795d217cfcb5de95dce6 Mon Sep 17 00:00:00 2001 From: Izzat Bahadirov Date: Sun, 31 Mar 2013 01:53:57 -0400 Subject: [PATCH 4/4] Using sorted static field set in EncodedArrayPool Key. --- .../main/java/org/jf/dexlib2/writer/EncodedArrayPool.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java index ae6d4ebb..badbd081 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/EncodedArrayPool.java @@ -140,12 +140,13 @@ public class EncodedArrayPool { @Nullable public static Key of(@Nonnull ClassDef classDef) { - Set staticFields = FluentIterable.from(classDef.getFields()).filter(IS_STATIC_FIELD).toSet(); - Iterable staticFieldsSorted = FluentIterable.from(staticFields).toSortedSet(new FieldComparator()); + Set staticFieldsSorted = FluentIterable.from(classDef.getFields()) + .filter(IS_STATIC_FIELD) + .toSortedSet(new FieldComparator()); int lastIndex = CollectionUtils.lastIndexOf(staticFieldsSorted, HAS_INITIALIZER); if (lastIndex > -1) { - return new Key(staticFields, lastIndex+1); + return new Key(staticFieldsSorted, lastIndex+1); } return null; }