/** * Retrieves all superclasses for a given class * @param clazz the input IClass object * @return a list of IClass superclass objects or an empty list if there is no superclass */ public static List<IClass> getSuperClasses(IClass clazz) { ArrayList<IClass> superclasses = new ArrayList<IClass>(); while (clazz.getSuperclass() != null) { clazz = clazz.getSuperclass(); superclasses.add(clazz); } return superclasses; }
private static Set<IClass> getSuperclasses(IClass c) { HashSet<IClass> result = HashSetFactory.make(3); while (c.getSuperclass() != null) { result.add(c.getSuperclass()); c = c.getSuperclass(); } return result; }
private static Set<IClass> getSuperclasses(IClass c) { HashSet<IClass> result = HashSetFactory.make(3); while (c.getSuperclass() != null) { result.add(c.getSuperclass()); c = c.getSuperclass(); } return result; }
private boolean slowIsSubclass(IClass sub, IClass sup) { if (sub == sup) { return true; } else { IClass parent = sub.getSuperclass(); if (parent == null) { return false; } else { return slowIsSubclass(parent, sup); } } }
private boolean slowIsSubclass(IClass sub, IClass sup) { if (sub == sup) { return true; } else { IClass parent = sub.getSuperclass(); if (parent == null) { return false; } else { return slowIsSubclass(parent, sup); } } }
@Override public Collection<IField> getAllInstanceFields() { Collection<IField> result = new LinkedList<>(getDeclaredInstanceFields()); IClass s = getSuperclass(); while (s != null) { result.addAll(s.getDeclaredInstanceFields()); s = s.getSuperclass(); } return result; }
@Override public Collection<IField> getAllStaticFields() { Collection<IField> result = new LinkedList<>(getDeclaredStaticFields()); IClass s = getSuperclass(); while (s != null) { result.addAll(s.getDeclaredStaticFields()); s = s.getSuperclass(); } return result; }
@Override public Collection<IField> getAllInstanceFields() { Collection<IField> result = new LinkedList<>(getDeclaredInstanceFields()); IClass s = getSuperclass(); while (s != null) { result.addAll(s.getDeclaredInstanceFields()); s = s.getSuperclass(); } return result; }
@Override public Collection<IField> getAllStaticFields() { Collection<IField> result = new LinkedList<>(getDeclaredStaticFields()); IClass s = getSuperclass(); while (s != null) { result.addAll(s.getDeclaredStaticFields()); s = s.getSuperclass(); } return result; }
/** * Perform needed bookkeeping when a new class is discovered. */ @Override protected void updateSetsForNewClass(IClass klass, InstanceKey iKey, CGNode node, NewSiteReference n) { // set up the selector map to record each method that class implements registerImplementedMethods(klass, iKey); for (IClass c : klass.getAllImplementedInterfaces()) { registerImplementedMethods(c, iKey); } klass = klass.getSuperclass(); while (klass != null) { registerImplementedMethods(klass, iKey); klass = klass.getSuperclass(); } }
/** * Perform needed bookkeeping when a new class is discovered. */ @Override protected void updateSetsForNewClass(IClass klass, InstanceKey iKey, CGNode node, NewSiteReference n) { // set up the selector map to record each method that class implements registerImplementedMethods(klass, iKey); for (IClass c : klass.getAllImplementedInterfaces()) { registerImplementedMethods(c, iKey); } klass = klass.getSuperclass(); while (klass != null) { registerImplementedMethods(klass, iKey); klass = klass.getSuperclass(); } }
private void registerInstanceWithAllSuperclasses(int index, IClass T) { while (T != null && !T.getReference().equals(TypeReference.JavaLangObject)) { MutableIntSet set = findOrCreateSparseSetForClass(T); set.add(index); if (DEBUG) { System.err.println("dense filter for class " + T + ' ' + set); } T = T.getSuperclass(); } }
private void registerInstanceWithAllSuperclasses(int index, IClass T) { while (T != null && !T.getReference().equals(TypeReference.JavaLangObject)) { MutableIntSet set = findOrCreateSparseSetForClass(T); set.add(index); if (DEBUG) { System.err.println("dense filter for class " + T + ' ' + set); } T = T.getSuperclass(); } }
private void registerArrayInstanceWithAllSuperclassesOfElement(int index, IClass elementClass, int dim) { IClass T; // register the array with each supertype of the element class T = elementClass.getSuperclass(); while (T != null) { TypeReference tArrayRef = makeArray(T.getReference(), dim); IClass tArrayClass = null; tArrayClass = T.getClassLoader().lookupClass(tArrayRef.getName()); MutableIntSet set = findOrCreateSparseSetForClass(tArrayClass); set.add(index); if (DEBUG) { System.err.println("dense filter for class " + tArrayClass + ' ' + set); } T = T.getSuperclass(); } }
private void registerArrayInstanceWithAllSuperclassesOfElement(int index, IClass elementClass, int dim) { IClass T; // register the array with each supertype of the element class T = elementClass.getSuperclass(); while (T != null) { TypeReference tArrayRef = makeArray(T.getReference(), dim); IClass tArrayClass = null; tArrayClass = T.getClassLoader().lookupClass(tArrayRef.getName()); MutableIntSet set = findOrCreateSparseSetForClass(tArrayClass); set.add(index); if (DEBUG) { System.err.println("dense filter for class " + tArrayClass + ' ' + set); } T = T.getSuperclass(); } }
/** * Hierarchical lookup of an {@link IMethod} via {@link IClass} and {@link CallSiteReference}. * @param clazz the {@link IClass} to start with * @param csr the {@link CallSiteReference} * @return a {@link IMethod} object of the resolved method or null */ public static IMethod resolveMethod(IClass clazz, CallSiteReference csr) { IMethod targetMethod = null; while (targetMethod == null && !WalaUtils.isObjectClass(clazz)) { targetMethod = clazz.getMethod(csr.getDeclaredTarget().getSelector()); if (targetMethod != null) break; clazz = clazz.getSuperclass(); } return targetMethod; }
/** * Return the method that m overrides, or null if none */ public static IMethod getOverriden(IMethod m) { IClass c = m.getDeclaringClass(); IClass parent = c.getSuperclass(); if (parent == null) { return null; } else { MethodReference ref = MethodReference.findOrCreate(parent.getReference(), m.getSelector()); IMethod m2 = m.getClassHierarchy().resolveMethod(ref); if (m2 != null && !m2.equals(m)) { return m2; } return null; } }
/** * Return the method that m overrides, or null if none */ public static IMethod getOverriden(IMethod m) { IClass c = m.getDeclaringClass(); IClass parent = c.getSuperclass(); if (parent == null) { return null; } else { MethodReference ref = MethodReference.findOrCreate(parent.getReference(), m.getSelector()); IMethod m2 = m.getClassHierarchy().resolveMethod(ref); if (m2 != null && !m2.equals(m)) { return m2; } return null; } }
private boolean allFieldsArePrimitive(IClass c) { if (c.isArrayClass()) { TypeReference t = c.getReference().getArrayElementType(); return t.isPrimitiveType(); } else { if (c.getReference().equals(TypeReference.JavaLangObject)) { return true; } else { for (IField f : c.getDeclaredInstanceFields()) { if (f.getReference().getFieldType().isReferenceType()) { return false; } } return allFieldsArePrimitive(c.getSuperclass()); } } }
@Test public void testInheritance1() throws IllegalArgumentException, CancelException, IOException { runTest(singleTestSrc(), rtJar, simpleTestEntryPoint(), Collections.singletonList( cg -> { final String typeStr = "Derived"; final TypeReference type = findOrCreateTypeReference("Source", typeStr, cg.getClassHierarchy()); final IClass derivedClass = cg.getClassHierarchy().lookupClass(type); Assert.assertNotNull("Could not find class " + typeStr, derivedClass); final TypeReference baseType = findOrCreateTypeReference("Source", "Base", cg.getClassHierarchy()); final IClass baseClass = cg.getClassHierarchy().lookupClass(baseType); Assert.assertTrue("Expected 'Base' to be the superclass of 'Derived'", derivedClass.getSuperclass().equals(baseClass)); Collection<IClass> subclasses = cg.getClassHierarchy().computeSubClasses(baseType); Assert.assertTrue("Expected subclasses of 'Base' to be 'Base' and 'Derived'.", subclasses.contains(derivedClass) && subclasses.contains(baseClass)); }), true, null); }