/** * @return TypeReference */ public TypeReference getConcreteType() { return site.getDeclaredType(); }
@Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, result) + " = new " + site.getDeclaredType() + '@' + site.getProgramCounter() + (params == null ? "" : array2String(params, symbolTable)); }
public static NewSiteReference make(int programCounter, TypeReference declaredType) { return new NewSiteReference(programCounter, declaredType); }
@Override public Iterator<Pair<CGNode, NewSiteReference>> getCreationSites(CallGraph CG) { CGNode cgn = CG.getNode(node, Everywhere.EVERYWHERE); assert cgn != null : node; return NonNullSingletonIterator.make(Pair.make(cgn, NewSiteReference.make(instructionIndex, createdType))); }
private static Pair<CGNode, NewSiteReference> map(CallGraph CG, Pair<CGNode, NewSiteReference> ptr) { CGNode n = ptr.fst; if (! (n.getMethod() instanceof JavaScriptConstructor)) { return ptr; } Iterator<CGNode> preds = CG.getPredNodes(n); if (! preds.hasNext()) { return ptr; } CGNode caller = preds.next(); assert !preds.hasNext() : n; Iterator<CallSiteReference> sites = CG.getPossibleSites(caller, n); CallSiteReference site = sites.next(); assert ! sites.hasNext(); return Pair.make(caller, new NewSiteReference(site.getProgramCounter(), ptr.snd.getDeclaredType())); }
@Override public String toString() { return "NEW " + declaredType + '@' + getProgramCounter(); } }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final AllocationSite other = (AllocationSite) obj; if (method == null) { if (other.method != null) return false; } else if (!method.equals(other.method)) return false; if (site == null) { if (other.site != null) return false; } else if (!site.equals(other.site)) return false; return true; }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((method == null) ? 0 : method.hashCode()); result = prime * result + ((site == null) ? 0 : site.hashCode()); return result; }
@Override public Iterator<Pair<CGNode, NewSiteReference>> getCreationSites(CallGraph CG) { CGNode cgn = CG.getNode(node, Everywhere.EVERYWHERE); assert cgn != null : node; return NonNullSingletonIterator.make(Pair.make(cgn, NewSiteReference.make(instructionIndex, createdType))); }
@Override public String toString() { return "NEW " + declaredType + '@' + getProgramCounter(); } }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final AllocationSite other = (AllocationSite) obj; if (method == null) { if (other.method != null) return false; } else if (!method.equals(other.method)) return false; if (site == null) { if (other.site != null) return false; } else if (!site.equals(other.site)) return false; return true; }
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((method == null) ? 0 : method.hashCode()); result = prime * result + ((site == null) ? 0 : site.hashCode()); return result; }
/** * Add a New statement of the given array type and length */ public SSANewInstruction add1DArrayAllocation(TypeReference T, int length) { int instance = nextLocal++; NewSiteReference ref = NewSiteReference.make(statements.size(), T); assert T.isArrayType(); assert ((ArrayClass)cha.lookupClass(T)).getDimensionality() == 1; int[] sizes = new int[1]; Arrays.fill(sizes, getValueNumberForIntConstant(length)); SSANewInstruction result = insts.NewInstruction(statements.size(), instance, ref, sizes); statements.add(result); cache.invalidate(this, Everywhere.EVERYWHERE); return result; }
/** * @return TypeReference */ public TypeReference getConcreteType() { return site.getDeclaredType(); }
@Override public String toString(SymbolTable symbolTable) { return getValueString(symbolTable, result) + " = new " + site.getDeclaredType() + '@' + site.getProgramCounter() + (params == null ? "" : array2String(params, symbolTable)); }
/** * @param n a call graph node * @param allocPC a bytecode index corresponding to an allocation * @return the NewSiteReference for the allocation */ static NewSiteReference findAlloc(CGNode n, int allocPC) throws WalaException { if (n == null) { throw new IllegalArgumentException("null n"); } for (NewSiteReference site : Iterator2Iterable.make(n.iterateNewSites())) { if (site.getProgramCounter() == allocPC) { return site; } } throw new WalaException("Failed to find an allocation at pc " + allocPC + " in node " + n); }
public static NewSiteReference make(int programCounter, TypeReference declaredType) { return new NewSiteReference(programCounter, declaredType); }
@Override public boolean equals(Object obj) { // instanceof is OK because this class is final if (obj instanceof NormalAllocationInNode) { AllocationSiteInNode other = (AllocationSiteInNode) obj; return getNode().equals(other.getNode()) && getSite().equals(other.getSite()); } else { return false; } }
@Override public int hashCode() { return getNode().hashCode() * 8647 + getSite().hashCode(); }
/** * Add a New statement of the given array type and length */ public SSANewInstruction add1DArrayAllocation(TypeReference T, int length) { int instance = nextLocal++; NewSiteReference ref = NewSiteReference.make(statements.size(), T); assert T.isArrayType(); assert ((ArrayClass)cha.lookupClass(T)).getDimensionality() == 1; int[] sizes = new int[1]; Arrays.fill(sizes, getValueNumberForIntConstant(length)); SSANewInstruction result = insts.NewInstruction(statements.size(), instance, ref, sizes); statements.add(result); cache.invalidate(this, Everywhere.EVERYWHERE); return result; }