protected void addFieldToList( List<FieldImpl> L, Atom name, ImmutableByteArray fieldType, int accessFlags, Collection<Annotation> annotations) { TypeName T = null; if (fieldType.get(fieldType.length() - 1) == ';') { T = TypeName.findOrCreate(fieldType, 0, fieldType.length() - 1); } else { T = TypeName.findOrCreate(fieldType); } TypeReference type = TypeReference.findOrCreate(getClassLoader().getReference(), T); FieldReference fr = FieldReference.findOrCreate(getReference(), name, type); FieldImpl f = new FieldImpl(this, fr, accessFlags, annotations); L.add(f); }
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 doIsFieldDefined(WalkContext context, int result, int ref, CAstNode f) { if (f.getKind() == CAstNode.CONSTANT && f.getValue() instanceof String) { String field = (String) f.getValue(); FieldReference fieldRef = FieldReference.findOrCreate( JavaScriptTypes.Root, Atom.findOrCreateUnicodeAtom((String) field), JavaScriptTypes.Root); context .cfg() .addInstruction( ((JSInstructionFactory) insts).IsDefinedInstruction(result, ref, fieldRef)); } else { context .cfg() .addInstruction( ((JSInstructionFactory) insts) .IsDefinedInstruction(result, ref, context.getValue(f))); } }
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); // } // } // } }