90 lines
2.4 KiB
Java
90 lines
2.4 KiB
Java
/******************************************************************************
|
|
* Copyright (c) 2002 - 2014 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.dataflow.graph;
|
|
|
|
import com.ibm.wala.fixpoint.BitVectorVariable;
|
|
import com.ibm.wala.util.intset.IntSet;
|
|
import com.ibm.wala.util.intset.IntSetAction;
|
|
|
|
/**
|
|
* Operator U(n) = U(n) n U(j)
|
|
*/
|
|
public final class BitVectorIntersection extends AbstractMeetOperator<BitVectorVariable> {
|
|
|
|
private static final BitVectorIntersection INSTANCE = new BitVectorIntersection();
|
|
|
|
public static BitVectorIntersection instance() {
|
|
return INSTANCE;
|
|
}
|
|
|
|
private BitVectorIntersection() {
|
|
}
|
|
|
|
@Override
|
|
public byte evaluate(final BitVectorVariable lhs, final BitVectorVariable[] rhs) {
|
|
// as null is the initial value, we treat null as the neutral element to intersection
|
|
// which is a set of all possible elements.
|
|
IntSet intersect = lhs.getValue();
|
|
if (intersect == null) {
|
|
for (BitVectorVariable r : rhs) {
|
|
intersect = r.getValue();
|
|
if (intersect != null) { break; }
|
|
}
|
|
|
|
if (intersect == null) {
|
|
// still null - so all rhs is null -> no change
|
|
return NOT_CHANGED;
|
|
}
|
|
} else if (intersect.isEmpty()) {
|
|
return NOT_CHANGED_AND_FIXED;
|
|
}
|
|
|
|
for (final BitVectorVariable bv : rhs) {
|
|
final IntSet vlhs = bv.getValue();
|
|
if (vlhs != null) {
|
|
intersect = intersect.intersection(vlhs);
|
|
}
|
|
}
|
|
|
|
if (lhs.getValue() != null && intersect.sameValue(lhs.getValue())) {
|
|
return NOT_CHANGED;
|
|
} else {
|
|
final BitVectorVariable bvv = new BitVectorVariable();
|
|
intersect.foreach(new IntSetAction() {
|
|
@Override
|
|
public void act(final int x) {
|
|
bvv.set(x);
|
|
}
|
|
});
|
|
lhs.copyState(bvv);
|
|
|
|
return CHANGED;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return 9903;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(final Object o) {
|
|
return o instanceof BitVectorIntersection;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "INTERSECTION";
|
|
}
|
|
|
|
}
|