public void visitPutInternal(int rval, boolean isStatic, FieldReference field) { // skip putfields of primitive type (optimisation) if (field.getFieldType().isPrimitiveType()) { return; } IField f = cg.getClassHierarchy().resolveField(field); if (f == null) { return; } PointerKey use = heapModel.getPointerKeyForLocal(node, rval); assert use != null; if (isStatic) { PointerKey fKey = heapModel.getPointerKeyForStaticField(f); addNode(use); addNode(fKey); addEdge(fKey, use); } else { addNode(use); } }
protected void visitGetInternal(int lval, boolean isStatic, FieldReference field) { // skip getfields of primitive type (optimisation) if (field.getFieldType().isPrimitiveType()) { return; } IField f = cg.getClassHierarchy().resolveField(field); if (f == null) { return; } PointerKey def = heapModel.getPointerKeyForLocal(node, lval); assert def != null; if (isStatic) { PointerKey fKey = heapModel.getPointerKeyForStaticField(f); addNode(def); addNode(fKey); addEdge(def, fKey); } else { addNode(def); getFieldDefs.put(def, f); } // system.newConstraint(def, assignOperator, fKey); // IClass klass = getClassHierarchy().lookupClass(field.getType()); // if (klass == null) { // getWarnings().add(ResolutionFailure.create(node, field.getType())); // } else { // // side effect of getstatic: may call class initializer // if (DEBUG) { // Trace.guardedPrintln("getstatic call class init " + klass, // DEBUG_METHOD_SUBSTRING); // } // // if (hasNoInterestingUses(lval, du)) { // system.recordImplicitPointsToSet(def); // } else { // if (isStatic) { // PointerKey fKey = getPointerKeyForStaticField(f); // system.newConstraint(def, assignOperator, fKey); // IClass klass = getClassHierarchy().lookupClass(field.getType()); // if (klass == null) { // getWarnings().add(ResolutionFailure.create(node, field.getType())); // } else { // // side effect of getstatic: may call class initializer // if (DEBUG) { // Trace.guardedPrintln("getstatic call class init " + klass, // DEBUG_METHOD_SUBSTRING); // } // processClassInitializer(klass); // } // } else { // PointerKey refKey = getPointerKeyForLocal(node, ref); // // if (!supportFullPointerFlowGraph && // // contentsAreInvariant(ref)) { // if (contentsAreInvariant(symbolTable, du, ref)) { // system.recordImplicitPointsToSet(refKey); // InstanceKey[] ik = getInvariantContents(symbolTable, du, node, ref, // SSAPropagationCallGraphBuilder.this); // for (int i = 0; i < ik.length; i++) { // system.findOrCreateIndexForInstanceKey(ik[i]); // PointerKey p = getPointerKeyForInstanceField(ik[i], f); // system.newConstraint(def, assignOperator, p); // } // } else { // system.newSideEffect(new GetFieldOperator(f, // system.findOrCreatePointsToSet(def)), refKey); // } // } // } }