// special field descriptors for array elements
private Hashtable<TypeDescriptor, FieldDescriptor> mapTypeToArrayField;
+ // special field descriptors for variables with type, no field name
+ private Hashtable<TypeDescriptor, FieldDescriptor> mapTypeToVarField;
+
// a special temp descriptor for setting more than one parameter label
// to the all-aliased-parameters heap region node
mapTypeToArrayField =
new Hashtable<TypeDescriptor, FieldDescriptor>();
+ mapTypeToVarField =
+ new Hashtable<TypeDescriptor, FieldDescriptor>();
+
if( writeAllDOTs ) {
mapMethodContextToNumUpdates = new Hashtable<MethodContext, Integer>();
}
}
break;
+ case FKind.FlatCastNode:
+ FlatCastNode fcn = (FlatCastNode) fn;
+ lhs = fcn.getDst();
+ rhs = fcn.getSrc();
+ TypeDescriptor td = fcn.getType();
+ assert td != null;
+
+ FieldDescriptor fd = mapTypeToVarField.get( td );
+ if( fd == null ) {
+ fd = new FieldDescriptor(new Modifiers(Modifiers.PUBLIC),
+ td,
+ "",
+ null,
+ false);
+ mapTypeToVarField.put( td, fd );
+ }
+
+ og.assignTypedTempXEqualToTempY(lhs, rhs, fd);
+ break;
+
case FKind.FlatFieldNode:
FlatFieldNode ffn = (FlatFieldNode) fn;
lhs = ffn.getDst();
assert lhs.getType().isArray();
TypeDescriptor tdElement = lhs.getType().dereference();
-
- System.out.println( "lhs.Type = "+lhs.getType().toPrettyString() );
- System.out.println( "tdElement = "+tdElement.toPrettyString() );
-
FieldDescriptor fdElement = mapTypeToArrayField.get( tdElement );
if( fdElement == null ) {
fdElement = new FieldDescriptor(new Modifiers(Modifiers.PUBLIC),
}
+ public void assignTypedTempXEqualToTempY(TempDescriptor x,
+ TempDescriptor y,
+ FieldDescriptor f) {
+
+ LabelNode lnX = getLabelNodeFromTemp(x);
+ LabelNode lnY = getLabelNodeFromTemp(y);
+
+ clearReferenceEdgesFrom(lnX, null, true);
+
+ Iterator<ReferenceEdge> itrYhrn = lnY.iteratorToReferencees();
+ while( itrYhrn.hasNext() ) {
+ ReferenceEdge edgeY = itrYhrn.next();
+ HeapRegionNode referencee = edgeY.getDst();
+ ReferenceEdge edgeNew = edgeY.copy();
+ edgeNew.setSrc(lnX);
+ edgeNew.setFieldDesc(f);
+
+ addReferenceEdge(lnX, referencee, edgeNew);
+ }
+ }
+
+
public void assignTempXEqualToTempYFieldF(TempDescriptor x,
TempDescriptor y,
FieldDescriptor f) {
// if the type is not a class don't match because
// primitives are copied, no memory aliases
ClassDescriptor cdDst = tdDst.getClassDesc();
- if( cdDst == null ) {
+ if( cdDst == null && !tdDst.isArray() ) {
return false;
}