private void fixParents() { if (rep != this) { ecr().fixParents(); } BitVector invalid = new BitVector(); invalid.or(parents); invalid.and(resolver.invalidIds()); for (BitSetIterator i = invalid.iterator(); i.hasNext();) { parents.set(resolver.typeVariableForId(i.next()).id()); } parents.clear(this.id); parents.clear(this.id()); parents.andNot(invalid); }
private void acquire() { if (own) { return; } own = true; value = (BitVector) value.clone(); }
public void removeIndirectRelations() { if (rep != this) { ecr().removeIndirectRelations(); return; } if (indirectAncestors == null) { fixAncestors(); } BitVector parentsToRemove = new BitVector(); for (BitSetIterator parentIt = parents.iterator(); parentIt.hasNext();) { final int parent = parentIt.next(); if (indirectAncestors.get(parent)) { parentsToRemove.set(parent); } } for (BitSetIterator i = parentsToRemove.iterator(); i.hasNext();) { removeParent(resolver.typeVariableForId(i.next())); } }
single_soft_parent = new BitVector(); single_hard_parent = new BitVector(); multiple_parents = new BitVector(); single_child_not_null = new BitVector(); single_null_child = new BitVector(); multiple_children = new BitVector(); for (BitSetIterator i = unsolved.iterator(); i.hasNext();) { TypeVariableBV var = typeVariableForId(i.next()); int size = parents.length(); single_soft_parent.set(var.id()); } else if (size == 1) { TypeVariableBV parent = typeVariableForId(parents.iterator().next()); single_soft_parent.set(var.id()); } else { single_hard_parent.set(var.id()); multiple_parents.set(var.id()); int size = children.size(); single_null_child.set(var.id()); } else if (size == 1) { TypeVariableBV child = typeVariableForId(children.iterator().next()); single_null_child.set(var.id());
private void remove_transitive_constraints() throws TypeException { refresh_solved(); BitVector list = new BitVector(); list.or(solved); list.or(unsolved); for (BitSetIterator varIt = list.iterator(); varIt.hasNext();) { final TypeVariableBV var = typeVariableForId(varIt.next()); var.removeIndirectRelations(); } }
private void fixAncestors() { BitVector ancestors = new BitVector(0); BitVector indirectAncestors = new BitVector(0); for (TypeVariable typeVariable : parents) { TypeVariable parent = typeVariable.ecr(); if (parent.ancestors == null) { parent.fixAncestors(); } ancestors.set(parent.id); ancestors.or(parent.ancestors); indirectAncestors.or(parent.ancestors); } this.ancestors = ancestors; this.indirectAncestors = indirectAncestors; }
private void fixAncestors() { BitVector ancestors = new BitVector(0); BitVector indirectAncestors = new BitVector(0); fixParents(); for (BitSetIterator i = parents.iterator(); i.hasNext();) { TypeVariableBV parent = resolver.typeVariableForId(i.next()).ecr(); if (parent.ancestors == null) { parent.fixAncestors(); } ancestors.set(parent.id); ancestors.or(parent.ancestors); indirectAncestors.or(parent.ancestors); } this.ancestors = ancestors; this.indirectAncestors = indirectAncestors; }
public boolean hasAncestorOrSelf(TypeNode typeNode) { if (typeNode == this) { return true; } return ancestors.get(typeNode.id); }
public void clear(int bit) { acquire(); value.clear(bit); }
private void merge(TypeVariableBV var) throws TypeException { if (depth != 0 || var.depth != 0) { throw new InternalTypingException(); } // Merge types if (type == null) { type = var.type; } else if (var.type != null) { error("Type Error(1): Attempt to merge two types."); } parents.or(var.parents); parents.clear(var.ownId()); parents.clear(this.ownId()); children.or(var.children); children.clear(var.ownId()); children.clear(this.ownId()); }
private void refresh_solved() throws TypeException { unsolved = new BitVector(); // solved stays the same for (BitSetIterator varIt = unsolved.iterator(); varIt.hasNext();) { final TypeVariableBV var = typeVariableForId(varIt.next()); if (var.depth() == 0) { if (var.type() == null) { unsolved.set(var.id()); } else { solved.set(var.id()); } } } // validate(); }
BitVector visitedTypes = new BitVector(); visitedTypes.set(t.getNumber()); makeMaskOfInterface(sc); if (!visitedTypes.get(t.getNumber()) && !rt.getSootClass().isPhantom()) { makeClassTypeMask(rt.getSootClass()); BitVector mask = new BitVector(allocNodes.size()); for (Node n : allocNodes) { if (castNeverFails(n.getType(), t)) { mask.set(n.getNumber());
public void xor(BitVector other) { if (this == other) { return; } long[] otherBits = other.bits; int j; for (j = otherBits.length - 1; j >= 0; j--) { if (otherBits[j] != 0L) { break; } } expand(j << 6); for (; j >= 0; j--) { bits[j] ^= otherBits[j]; } }
/** Adds the given node to the list of descendants of this node and its ancestors. **/ private void fixDescendants(int id) { if (descendants.get(id)) { return; } for (Iterator<TypeNode> parentIt = parents.iterator(); parentIt.hasNext();) { final TypeNode parent = parentIt.next(); parent.fixDescendants(id); } descendants.set(id); }
public static BitVector and(BitVector set1, BitVector set2) { int min = set1.size(); { int max = set2.size(); if (min > max) { min = max; } // max is not necessarily correct at this point, so let it go // out of scope } BitVector ret = new BitVector(min); long[] retbits = ret.bits; long[] bits1 = set1.bits; long[] bits2 = set2.bits; min >>= 6; for (int i = 0; i < min; i++) { retbits[i] = bits1[i] & bits2[i]; } return ret; }