diff options
author | Yohann Roussel <yroussel@google.com> | 2016-02-23 12:22:24 +0100 |
---|---|---|
committer | Yohann Roussel <yroussel@google.com> | 2016-02-23 15:31:04 +0100 |
commit | 5dd3bad21e34a6819566de69d7e342e1bee4709f (patch) | |
tree | c0de694f7b6a55beb9ba2943cc1abbdc108030b1 | |
parent | 0e3b9ceebc7c0a1778c502cdc750c2eb7bbcfe6f (diff) | |
download | dalvik-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.java | 60 |
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)); } } } |