summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYohann Roussel <yroussel@google.com>2015-04-07 14:04:26 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-04-07 14:04:26 +0000
commitefc6bf1716b0383ef1c05638f007e8b06e54456d (patch)
tree9f954d1838fee56625603f09cd0e93c011c32d4c
parentd1a3d9ef35a786bc66caaa8f8bb9674cef2432dc (diff)
parent2d13966cfe568cb428f257a6992d013cfb5353e6 (diff)
downloadandroid_dalvik-efc6bf1716b0383ef1c05638f007e8b06e54456d.tar.gz
android_dalvik-efc6bf1716b0383ef1c05638f007e8b06e54456d.tar.bz2
android_dalvik-efc6bf1716b0383ef1c05638f007e8b06e54456d.zip
am 2d13966c: am cc367043: Merge "Descriptor references are direct references"
* commit '2d13966cfe568cb428f257a6992d013cfb5353e6': Descriptor references are direct references
-rw-r--r--dx/src/com/android/multidex/ClassReferenceListBuilder.java44
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;