diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java index 8b6ca68fc..9178c6fa8 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/AlwaysRefineCGPolicy.java @@ -50,7 +50,7 @@ public class AlwaysRefineCGPolicy implements CallGraphRefinePolicy { return true; } - public boolean startNewPass() { + public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/CallGraphRefinePolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/CallGraphRefinePolicy.java index 64ef5a5a1..23e928fef 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/CallGraphRefinePolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/CallGraphRefinePolicy.java @@ -61,6 +61,6 @@ public interface CallGraphRefinePolicy { * @return true if more refinement can be done, and hence * another pass can be attempted; false otherwise */ - public boolean startNewPass(); + public boolean nextPass(); } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java index 757ebbf8a..e98a1e1a3 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualCGRefinePolicy.java @@ -60,7 +60,7 @@ public class ManualCGRefinePolicy implements CallGraphRefinePolicy { return true; } - public boolean startNewPass() { + public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java index 695fd5a4e..4c1446e46 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/ManualRefinementPolicy.java @@ -44,42 +44,26 @@ import com.ibm.wala.ipa.cha.ClassHierarchy; * @author Manu Sridharan * */ -public class ManualRefinementPolicy implements RefinementPolicy { +public class ManualRefinementPolicy extends AbstractRefinementPolicy { private static final int PASS_BUDGET = 12000; private static final int NUM_PASSES = 1; - private final FieldRefinePolicy fieldRefinePolicy; - - private final CallGraphRefinePolicy callGraphRefinePolicy; - private ManualRefinementPolicy(ClassHierarchy cha) { - fieldRefinePolicy = new ManualFieldPolicy(cha); - callGraphRefinePolicy = new AlwaysRefineCGPolicy(); + super(new ManualFieldPolicy(cha), new AlwaysRefineCGPolicy()); } + + @Override public int getBudgetForPass(int passNum) { return PASS_BUDGET; } - public CallGraphRefinePolicy getCallGraphRefinePolicy() { - return callGraphRefinePolicy; - } - - public FieldRefinePolicy getFieldRefinePolicy() { - return fieldRefinePolicy; - } - + @Override public int getNumPasses() { return NUM_PASSES; } - public boolean nextPass() { - boolean moreFieldRefine = fieldRefinePolicy.nextPass(); - boolean moreCallRefine = callGraphRefinePolicy.startNewPass(); - return moreFieldRefine || moreCallRefine; - } - public static class Factory implements RefinementPolicyFactory { private final ClassHierarchy cha; diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java index dfc87c459..16f864cf1 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/NeverRefineCGPolicy.java @@ -45,7 +45,7 @@ public class NeverRefineCGPolicy implements CallGraphRefinePolicy { return false; } - public boolean startNewPass() { + public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java index 31f34bba8..e240de5d7 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/SinglePassRefinementPolicy.java @@ -43,43 +43,32 @@ package com.ibm.wala.demandpa.alg.refinepolicy; * @author Manu Sridharan * */ -public class SinglePassRefinementPolicy implements RefinementPolicy { - - private final FieldRefinePolicy fieldRefinePolicy; - - private final CallGraphRefinePolicy cgRefinePolicy; +public class SinglePassRefinementPolicy extends AbstractRefinementPolicy { private final int budget; private SinglePassRefinementPolicy(FieldRefinePolicy fieldRefinePolicy, CallGraphRefinePolicy cgRefinePolicy, int budget) { - this.fieldRefinePolicy = fieldRefinePolicy; - this.cgRefinePolicy = cgRefinePolicy; + super(fieldRefinePolicy, cgRefinePolicy); this.budget = budget; } - /** * @return traversal budget */ + @Override public int getBudgetForPass(int passNum) { return budget; } - public CallGraphRefinePolicy getCallGraphRefinePolicy() { - return cgRefinePolicy; - } - - public FieldRefinePolicy getFieldRefinePolicy() { - return fieldRefinePolicy; - } - /** * @return 1, since we only want a single pass */ + @Override public int getNumPasses() { return 1; } + @Override public boolean nextPass() { return false; } diff --git a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java index dfa644974..62dcc3b1a 100644 --- a/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java +++ b/com.ibm.wala.core/src/com/ibm/wala/demandpa/alg/refinepolicy/TunedRefinementPolicy.java @@ -37,118 +37,19 @@ */ package com.ibm.wala.demandpa.alg.refinepolicy; -import java.util.Collection; - -import com.ibm.wala.classLoader.IClass; -import com.ibm.wala.classLoader.IField; -import com.ibm.wala.demandpa.util.ArrayContents; import com.ibm.wala.ipa.cha.ClassHierarchy; -import com.ibm.wala.types.ClassLoaderReference; -import com.ibm.wala.types.TypeReference; -import com.ibm.wala.util.collections.HashSetFactory; /** - * A refinement policy that iteratively adds more types to refine, based on - * which type was encountered first in each analysis pass. + * A refinement policy that iteratively adds more types to refine, based on which type was encountered first in each + * analysis pass. * * @author Manu Sridharan * */ -public class TunedRefinementPolicy implements RefinementPolicy { - - private final ClassHierarchy cha; - - private class TunedFieldRefinementPolicy implements FieldRefinePolicy { - - private final Collection typesToRefine = HashSetFactory.make(); - - private IClass firstSkippedClass = null; - - public boolean nextPass() { - if (firstSkippedClass != null) { - typesToRefine.add(firstSkippedClass); - firstSkippedClass = null; - return true; - } else { - return false; - } - } - - public boolean shouldRefine(IField field) { - if (field == ArrayContents.v()) { - return true; - } - IClass classToCheck = removeInner(field.getDeclaringClass()); - if (superOfAnyEncountered(classToCheck)) { - return true; - } else { - if (firstSkippedClass == null) { - firstSkippedClass = classToCheck; - } - return false; - } - } - - private boolean superOfAnyEncountered(IClass klass) { - for (IClass toRefine : typesToRefine) { - if (cha.isAssignableFrom(klass, toRefine)) { - return true; - } - } - return false; - } - - /** - * - * @param klass - * @return the top-level {@link IClass} where klass is declared, or klass - * itself if klass is top-level or if top-level class not loaded - */ - private IClass removeInner(IClass klass) { - ClassLoaderReference cl = klass.getClassLoader().getReference(); - String klassStr = klass.getName().toString(); - int dollarIndex = klassStr.indexOf('$'); - if (dollarIndex == -1) { - return klass; - } else { - String topMostName = klassStr.substring(0, dollarIndex); - IClass topMostClass = cha.lookupClass(TypeReference.findOrCreate(cl, topMostName)); - return (topMostClass != null) ? topMostClass : klass; - } - } - - } - - private final CallGraphRefinePolicy cgRefinePolicy = new AlwaysRefineCGPolicy(); - - private final FieldRefinePolicy fieldRefinePolicy = new TunedFieldRefinementPolicy(); - - private static final int NUM_PASSES = 3; - - private static final int[] BUDGET_PER_PASS = { 1000, 12000, 12000 }; +public class TunedRefinementPolicy extends AbstractRefinementPolicy { public TunedRefinementPolicy(ClassHierarchy cha) { - this.cha = cha; - } - - public int getBudgetForPass(int passNum) { - return BUDGET_PER_PASS[passNum]; - } - - public CallGraphRefinePolicy getCallGraphRefinePolicy() { - return cgRefinePolicy; - } - - public FieldRefinePolicy getFieldRefinePolicy() { - return fieldRefinePolicy; - } - - public int getNumPasses() { - return NUM_PASSES; - } - - public boolean nextPass() { - return fieldRefinePolicy.nextPass(); + super(new TunedFieldRefinementPolicy(cha), new AlwaysRefineCGPolicy()); } public static class Factory implements RefinementPolicyFactory {