static boolean specialInvokePerformsLookupIn(InvokeExpr ie, SootClass containerClass) { // If all of the conditions are true, a lookup is performed. SootMethod m = ie.getMethod(); if (m.getName().equals("<init>")) { return false; } if (m.isPrivate()) { return false; } Hierarchy h = Scene.v().getActiveHierarchy(); if (!h.isClassSuperclassOf(m.getDeclaringClass(), containerClass)) { return false; } // ACC_SUPER must always be set, eh? return true; } }
parameterType = target.getDeclaringClass(); if (localType.isInterface() || hierarchy.isClassSuperclassOf(localType, parameterType)) { Local castee = Jimple.v().newLocal("__castee", parameterType.getType()); b.getLocals().add(castee);
parameterType = inlinee.getDeclaringClass(); if (localType.isInterface() || hierarchy.isClassSuperclassOf(localType, parameterType)) { Local castee = Jimple.v().newLocal("__castee", parameterType.getType()); containerB.getLocals().add(castee);
@Override public int compare(final SootClass a, final SootClass b) { if (a == b) return 0; if (hierarchy.isClassSubclassOf(a, b)) return 1; if (hierarchy.isClassSuperclassOf(a, b)) return -1; return 0; } });
haveCommonFields = hierarchy.isClassSubclassOf(sootClass1, sootClass2) || hierarchy.isClassSuperclassOf(sootClass1, sootClass2); if (logger.isDebugEnabled()) { logger.debug("4: " + haveCommonFields);
@Override public int compare(final SootMethod a, final SootMethod b) { if (a == b || a.getDeclaringClass() == b.getDeclaringClass()) return 0; if (hierarchy.isClassSubclassOf(a.getDeclaringClass(), b.getDeclaringClass())) return -1; if (hierarchy.isClassSuperclassOf(a.getDeclaringClass(), b.getDeclaringClass())) return 1; return 0; } });