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 {