From a0c24f1c9f19f3c7e1d270cbbca0d8a7c780e2f7 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Mon, 8 Apr 2013 23:08:02 -0700 Subject: [PATCH] Fix issue with how the set of interfaces a class implements is calculated --- .../jf/dexlib/Code/Analysis/ClassPath.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/ClassPath.java b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/ClassPath.java index 2c641be2..87166967 100644 --- a/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/ClassPath.java +++ b/dexlib/src/main/java/org/jf/dexlib/Code/Analysis/ClassPath.java @@ -865,6 +865,14 @@ public class ClassPath { } } + private static void addInterfaceToSet(Set interfaces, ClassDef iface) { + if (interfaces.add(iface)) { + for (ClassDef subiface: iface.implementedInterfaces) { + addInterfaceToSet(interfaces, subiface); + } + } + } + private TreeSet loadAllImplementedInterfaces(UnresolvedClassInfo classInfo) { assert classType != null; assert classType.equals("Ljava/lang/Object;") || superclass != null; @@ -874,11 +882,10 @@ public class ClassPath { if (superclass != null) { for (ClassDef interfaceDef: superclass.implementedInterfaces) { - implementedInterfaceSet.add(interfaceDef); + addInterfaceToSet(implementedInterfaceSet, interfaceDef); } } - if (classInfo.interfaces != null) { for (String interfaceType: classInfo.interfaces) { ClassDef interfaceDef; @@ -889,14 +896,7 @@ public class ClassPath { String.format("Could not find interface %s", interfaceType)); } assert interfaceDef.isInterface(); - implementedInterfaceSet.add(interfaceDef); - - interfaceDef = interfaceDef.getSuperclass(); - while (!interfaceDef.getClassType().equals("Ljava/lang/Object;")) { - assert interfaceDef.isInterface(); - implementedInterfaceSet.add(interfaceDef); - interfaceDef = interfaceDef.getSuperclass(); - } + addInterfaceToSet(implementedInterfaceSet, interfaceDef); } }