diff options
author | Yohann Roussel <yroussel@google.com> | 2015-04-07 13:44:43 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-04-07 13:44:43 +0000 |
commit | 2d13966cfe568cb428f257a6992d013cfb5353e6 (patch) | |
tree | 9f954d1838fee56625603f09cd0e93c011c32d4c | |
parent | 14d81e140687fb6302ece09649ed07adb14d9b09 (diff) | |
parent | cc367043000190bff471c5a7a0a9e61b0212a1c9 (diff) | |
download | android_dalvik-2d13966cfe568cb428f257a6992d013cfb5353e6.tar.gz android_dalvik-2d13966cfe568cb428f257a6992d013cfb5353e6.tar.bz2 android_dalvik-2d13966cfe568cb428f257a6992d013cfb5353e6.zip |
am cc367043: Merge "Descriptor references are direct references"
* commit 'cc367043000190bff471c5a7a0a9e61b0212a1c9':
Descriptor references are direct references
-rw-r--r-- | dx/src/com/android/multidex/ClassReferenceListBuilder.java | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/dx/src/com/android/multidex/ClassReferenceListBuilder.java b/dx/src/com/android/multidex/ClassReferenceListBuilder.java index 0434cad98..8218693c9 100644 --- a/dx/src/com/android/multidex/ClassReferenceListBuilder.java +++ b/dx/src/com/android/multidex/ClassReferenceListBuilder.java @@ -19,7 +19,11 @@ package com.android.multidex; import com.android.dx.cf.direct.DirectClassFile; import com.android.dx.rop.cst.Constant; import com.android.dx.rop.cst.ConstantPool; +import com.android.dx.rop.cst.CstFieldRef; +import com.android.dx.rop.cst.CstMethodRef; import com.android.dx.rop.cst.CstType; +import com.android.dx.rop.type.Prototype; +import com.android.dx.rop.type.StdTypeList; import com.android.dx.rop.type.Type; import com.android.dx.rop.type.TypeList; @@ -37,8 +41,8 @@ import java.util.zip.ZipFile; public class ClassReferenceListBuilder { private static final String CLASS_EXTENSION = ".class"; - private Path path; - private Set<String> classNames = new HashSet<String>(); + private final Path path; + private final Set<String> classNames = new HashSet<String>(); public ClassReferenceListBuilder(Path path) { this.path = path; @@ -96,23 +100,35 @@ public class ClassReferenceListBuilder { private void addDependencies(ConstantPool pool) { for (Constant constant : pool.getEntries()) { if (constant instanceof CstType) { - Type type = ((CstType) constant).getClassType(); - String descriptor = type.getDescriptor(); - if (descriptor.endsWith(";")) { - int lastBrace = descriptor.lastIndexOf('['); - if (lastBrace < 0) { - addClassWithHierachy(descriptor.substring(1, descriptor.length()-1)); - } else { - assert descriptor.length() > lastBrace + 3 - && descriptor.charAt(lastBrace + 1) == 'L'; - addClassWithHierachy(descriptor.substring(lastBrace + 2, - descriptor.length() - 1)); - } + checkDescriptor(((CstType) constant).getClassType()); + } else if (constant instanceof CstFieldRef) { + checkDescriptor(((CstFieldRef) constant).getType()); + } else if (constant instanceof CstMethodRef) { + Prototype proto = ((CstMethodRef) constant).getPrototype(); + checkDescriptor(proto.getReturnType()); + StdTypeList args = proto.getParameterTypes(); + for (int i = 0; i < args.size(); i++) { + checkDescriptor(args.get(i)); } } } } + private void checkDescriptor(Type type) { + String descriptor = type.getDescriptor(); + if (descriptor.endsWith(";")) { + int lastBrace = descriptor.lastIndexOf('['); + if (lastBrace < 0) { + addClassWithHierachy(descriptor.substring(1, descriptor.length()-1)); + } else { + assert descriptor.length() > lastBrace + 3 + && descriptor.charAt(lastBrace + 1) == 'L'; + addClassWithHierachy(descriptor.substring(lastBrace + 2, + descriptor.length() - 1)); + } + } + } + private void addClassWithHierachy(String classBinaryName) { if (classNames.contains(classBinaryName)) { return; |