/*******************************************************************************
* Copyright (c) 2002 - 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.demandpa.alg.refinepolicy;
import com.ibm.wala.classLoader.IField;
import com.ibm.wala.demandpa.alg.statemachine.StateMachine;
import com.ibm.wala.demandpa.flowgraph.IFlowLabel;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
/**
* A field refine policy that first checks with A, then delegates to B
*/
public class DelegatingFieldRefinePolicy implements FieldRefinePolicy {
private final FieldRefinePolicy A;
private final FieldRefinePolicy B;
public DelegatingFieldRefinePolicy(FieldRefinePolicy a, FieldRefinePolicy b) {
if (a == null) {
throw new IllegalArgumentException("null A");
}
if (b == null) {
throw new IllegalArgumentException("null B");
}
A = a;
B = b;
}
@Override
public boolean nextPass() {
// careful not to short-circuit here, since nextPass() can have side-effects
boolean AnextPass = A.nextPass();
boolean BnextPass = B.nextPass();
return AnextPass || BnextPass;
}
/**
* returns <code>true</code> if
* <code>A.shouldRefine(field) || B.shouldRefine(field)</code>. Note that
* if <code>A.shouldRefine(field)</code> is <code>true</code>,
* <code>B.shouldRefine(field)</code> is <em>not</em> called.
*/
@Override
public boolean shouldRefine(IField field, PointerKey basePtr, PointerKey val, IFlowLabel label, StateMachine.State state) {
// make code explicit to avoid subtle reliance on short-circuiting
boolean AshouldRefine = A.shouldRefine(field, basePtr, val, label, state);
if (AshouldRefine) {
return true;
} else {
return B.shouldRefine(field, basePtr, val, label, state);
}
}
}