summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYohann Roussel <yroussel@google.com>2016-02-23 12:22:24 +0100
committerYohann Roussel <yroussel@google.com>2016-02-23 15:31:04 +0100
commit5dd3bad21e34a6819566de69d7e342e1bee4709f (patch)
treec0de694f7b6a55beb9ba2943cc1abbdc108030b1
parent0e3b9ceebc7c0a1778c502cdc750c2eb7bbcfe6f (diff)
downloaddalvik-5dd3bad21e34a6819566de69d7e342e1bee4709f.tar.gz
Consider declared member descriptors as direct ref
Declared method and field descriptors elements are direct references and those direct references must be considered directly because their only corresponding constant pool entry is a CONSTANT_Utf8_info. Bug: 27158750 (cherry picked from commit 39ac62be7b97b4504b89acdb85f9cfc515d222ad) Change-Id: I8597440f2a3044c2e893ff8488977b82d15c7b2d
-rw-r--r--dx/src/com/android/multidex/ClassReferenceListBuilder.java60
1 files changed, 36 insertions, 24 deletions
diff --git a/dx/src/com/android/multidex/ClassReferenceListBuilder.java b/dx/src/com/android/multidex/ClassReferenceListBuilder.java
index f014708d9..6901eceed 100644
--- a/dx/src/com/android/multidex/ClassReferenceListBuilder.java
+++ b/dx/src/com/android/multidex/ClassReferenceListBuilder.java
@@ -17,15 +17,14 @@
package com.android.multidex;
import com.android.dx.cf.direct.DirectClassFile;
+import com.android.dx.cf.iface.FieldList;
+import com.android.dx.cf.iface.MethodList;
import com.android.dx.rop.cst.Constant;
-import com.android.dx.rop.cst.ConstantPool;
import com.android.dx.rop.cst.CstBaseMethodRef;
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;
import java.io.FileNotFoundException;
@@ -88,8 +87,7 @@ public class ClassReferenceListBuilder {
throw new IOException("Class " + name +
" is missing form original class path " + path, e);
}
-
- addDependencies(classFile.getConstantPool());
+ addDependencies(classFile);
}
}
}
@@ -98,34 +96,48 @@ public class ClassReferenceListBuilder {
return classNames;
}
- private void addDependencies(ConstantPool pool) {
- for (Constant constant : pool.getEntries()) {
+ private void addDependencies(DirectClassFile classFile) {
+ for (Constant constant : classFile.getConstantPool().getEntries()) {
if (constant instanceof CstType) {
- checkDescriptor(((CstType) constant).getClassType());
+ checkDescriptor(((CstType) constant).getClassType().getDescriptor());
} else if (constant instanceof CstFieldRef) {
- checkDescriptor(((CstFieldRef) constant).getType());
+ checkDescriptor(((CstFieldRef) constant).getType().getDescriptor());
} else if (constant instanceof CstBaseMethodRef) {
- Prototype proto = ((CstBaseMethodRef) constant).getPrototype();
- checkDescriptor(proto.getReturnType());
- StdTypeList args = proto.getParameterTypes();
- for (int i = 0; i < args.size(); i++) {
- checkDescriptor(args.get(i));
- }
+ checkPrototype(((CstBaseMethodRef) constant).getPrototype());
}
}
+
+ FieldList fields = classFile.getFields();
+ int nbField = fields.size();
+ for (int i = 0; i < nbField; i++) {
+ checkDescriptor(fields.get(i).getDescriptor().getString());
+ }
+
+ MethodList methods = classFile.getMethods();
+ int nbMethods = methods.size();
+ for (int i = 0; i < nbMethods; i++) {
+ checkPrototype(Prototype.intern(methods.get(i).getDescriptor().getString()));
+ }
+ }
+
+ private void checkPrototype(Prototype proto) {
+ checkDescriptor(proto.getReturnType().getDescriptor());
+ StdTypeList args = proto.getParameterTypes();
+ for (int i = 0; i < args.size(); i++) {
+ checkDescriptor(args.get(i).getDescriptor());
+ }
}
- private void checkDescriptor(Type type) {
- String descriptor = type.getDescriptor();
- if (descriptor.endsWith(";")) {
- int lastBrace = descriptor.lastIndexOf('[');
+ private void checkDescriptor(String typeDescriptor) {
+ if (typeDescriptor.endsWith(";")) {
+ int lastBrace = typeDescriptor.lastIndexOf('[');
if (lastBrace < 0) {
- addClassWithHierachy(descriptor.substring(1, descriptor.length()-1));
+ addClassWithHierachy(typeDescriptor.substring(1, typeDescriptor.length()-1));
} else {
- assert descriptor.length() > lastBrace + 3
- && descriptor.charAt(lastBrace + 1) == 'L';
- addClassWithHierachy(descriptor.substring(lastBrace + 2,
- descriptor.length() - 1));
+ assert typeDescriptor.length() > lastBrace + 3
+ && typeDescriptor.charAt(lastBrace + 1) == 'L';
+ addClassWithHierachy(typeDescriptor.substring(lastBrace + 2,
+ typeDescriptor.length() - 1));
}
}
}