@Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { return delegate.getPointerKeyForInstanceField(I, field); }
@Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { return delegate.getPointerKeyForInstanceField(I, field); }
@Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { if (field == null) { throw new IllegalArgumentException("field is null"); } return h.getPointerKeyForInstanceField(I, field); }
@Override public PointerKey getPointerKeyForInstanceField(InstanceKey I, IField field) { if (field == null) { throw new IllegalArgumentException("field is null"); } return h.getPointerKeyForInstanceField(I, field); }
@Override public Collection<MemoryAccess> getFieldReads(PointerKey baseRef, IField field) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { PointerKey ifk = heapModel.getPointerKeyForInstanceField(ik, field); convertStmtsToMemoryAccess(invRef.get(ifk), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getFieldReads(PointerKey baseRef, IField field) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { PointerKey ifk = heapModel.getPointerKeyForInstanceField(ik, field); convertStmtsToMemoryAccess(invRef.get(ifk), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getFieldWrites(PointerKey baseRef, IField field) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { PointerKey ifk = heapModel.getPointerKeyForInstanceField(ik, field); convertStmtsToMemoryAccess(invMod.get(ifk), memAccesses); } return memAccesses; }
@Override public Collection<MemoryAccess> getFieldWrites(PointerKey baseRef, IField field) { Collection<MemoryAccess> memAccesses = new ArrayList<>(); for (InstanceKey ik : pa.getPointsToSet(baseRef)) { PointerKey ifk = heapModel.getPointerKeyForInstanceField(ik, field); convertStmtsToMemoryAccess(invMod.get(ifk), memAccesses); } return memAccesses; }
continue; } else if (fieldTypeRef.isArrayType()) { PointerKey pk = pa.getHeapModel().getPointerKeyForInstanceField(ik, field); final OrdinalSet<InstanceKey> pointsToSet = pa.getPointsToSet(pk); if (pointsToSet.isEmpty()) { PointerKey pk = pa.getHeapModel().getPointerKeyForInstanceField(ik, field); final OrdinalSet<InstanceKey> pointsToSet = pa.getPointsToSet(pk); if (pointsToSet.isEmpty() && !analysisContext.getClassHierarchy().isInterface(fieldTypeRef)) {
@Override public void visitAstGlobalRead(AstGlobalRead instruction) { JSPointerAnalysisImpl jsAnalysis = (JSPointerAnalysisImpl) analysis; FieldReference field = makeNonGlobalFieldReference(instruction.getDeclaredField()); assert !directGlobalObjectRef(field); IField f = jsAnalysis.builder.getCallGraph().getClassHierarchy().resolveField(field); assert f != null; MutableSparseIntSet S = MutableSparseIntSet.makeEmpty(); InstanceKey globalObj = ((AstSSAPropagationCallGraphBuilder) jsAnalysis.builder).getGlobalObject(JavaScriptTypes.jsName); PointerKey fkey = analysis.getHeapModel().getPointerKeyForInstanceField(globalObj, f); if (fkey != null) { OrdinalSet<InstanceKey> pointees = analysis.getPointsToSet(fkey); IntSet set = pointees.getBackingSet(); if (set != null) { S.addAll(set); } } pointsToSet = new OrdinalSet<>(S, analysis.getInstanceKeyMapping()); }
@Override public void visitAstGlobalRead(AstGlobalRead instruction) { JSPointerAnalysisImpl jsAnalysis = (JSPointerAnalysisImpl) analysis; FieldReference field = makeNonGlobalFieldReference(instruction.getDeclaredField()); assert !directGlobalObjectRef(field); IField f = jsAnalysis.builder.getCallGraph().getClassHierarchy().resolveField(field); assert f != null; MutableSparseIntSet S = MutableSparseIntSet.makeEmpty(); InstanceKey globalObj = ((AstSSAPropagationCallGraphBuilder) jsAnalysis.builder).getGlobalObject(JavaScriptTypes.jsName); PointerKey fkey = analysis.getHeapModel().getPointerKeyForInstanceField(globalObj, f); if (fkey != null) { OrdinalSet<InstanceKey> pointees = analysis.getPointsToSet(fkey); IntSet set = pointees.getBackingSet(); if (set != null) { S.addAll(set); } } pointsToSet = new OrdinalSet<>(S, analysis.getInstanceKeyMapping()); }
for (IField f : klass.getAllInstanceFields()) { if (!f.getReference().getFieldType().isPrimitiveType()) { PointerKey p = getHeapModel().getPointerKeyForInstanceField(I, f); if (p != null && nodeManager.containsNode(p)) { result.add(nodeManager.getNumber(p));
for (IField f : klass.getAllInstanceFields()) { if (!f.getReference().getFieldType().isPrimitiveType()) { PointerKey p = getHeapModel().getPointerKeyForInstanceField(I, f); if (p != null && nodeManager.containsNode(p)) { result.add(nodeManager.getNumber(p));
OrdinalSet<ObjectVertex> objPtrs = fbPA.getPointsToSet(objKey); for(ObjectVertex o : objPtrs) { PointerKey propKey = fbPA.getHeapModel().getPointerKeyForInstanceField(o, new AstDynamicField(false, o.getConcreteType(), Atom.findOrCreateUnicodeAtom(p), JavaScriptTypes.Root)); Assert.assertTrue("object " + o + " should have field " + propKey, hg.hasEdge(o, propKey)); String propName = ((AstGlobalWrite) inst).getGlobalName(); propName = propName.substring("global ".length()); PointerKey propKey = fbPA.getHeapModel().getPointerKeyForInstanceField(null, new AstDynamicField(false, null, Atom.findOrCreateUnicodeAtom(propName), JavaScriptTypes.Root)); Assert.assertTrue("global " + propName + " should exist", hg.hasEdge(GlobalVertex.instance(), propKey)); for(String f : new String[]{ "__proto__", "prototype" }) { boolean dump = false; PointerKey pointerKeyForInstanceField = fbPA.getHeapModel().getPointerKeyForInstanceField(k, new AstDynamicField(false, k.getConcreteType(), Atom.findOrCreateUnicodeAtom(f), JavaScriptTypes.Root)); if (! hg.containsNode(pointerKeyForInstanceField)) { dump = true;
for (IField f : fields) { if (f.getFieldTypeReference().isReferenceType()) { PointerKey fk = heapModel.getPointerKeyForInstanceField(key, f); OrdinalSet<? extends InstanceKey> fobjects = pa.getPointsToSet(fk); for (InstanceKey fobj : fobjects) {