public class BCXallocsiteObjectField implements BuildCodeExtension {
protected BuildCode buildCode;
+ protected TypeUtil typeUtil;
protected HeapAnalysis heapAnalysis;
public BCXallocsiteObjectField( BuildCode buildCode,
+ TypeUtil typeUtil,
HeapAnalysis heapAnalysis ) {
this.buildCode = buildCode;
+ this.typeUtil = typeUtil;
this.heapAnalysis = heapAnalysis;
}
}
public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) {
+
+ ClassDescriptor cdString = typeUtil.getClass( typeUtil.StringClass );
+ assert cdString != null;
+
+ FieldDescriptor argBytes = null;
+ Iterator sFieldsItr = cdString.getFields();
+ while( sFieldsItr.hasNext() ) {
+ FieldDescriptor fd = (FieldDescriptor) sFieldsItr.next();
+ if( fd.getSymbol().equals( typeUtil.StringClassValueField ) ) {
+ argBytes = fd;
+ break;
+ }
+ }
+ assert argBytes != null;
+
+ String argsAccess = "((struct "+cdString.getSafeSymbol()+
+ " **)(((char *)& "+argsVar+"->___length___)+sizeof(int)))";
+
outmethod.println(argsVar+"->allocsite = "+
heapAnalysis.getCmdLineArgsAlloc().getUniqueAllocSiteID()+
";"
);
+ outmethod.println("{");
+ outmethod.println(" int i;" );
+ outmethod.println(" for( i = 0; i < "+argsVar+"->___length___; ++i ) {");
+ outmethod.println(" "+argsAccess+"[i]->allocsite = "+
+ heapAnalysis.getCmdLineArgAlloc().getUniqueAllocSiteID()+
+ ";"
+ );
+ outmethod.println(" "+argsAccess+"[i]->"+
+ argBytes.getSafeSymbol()+
+ "->allocsite = "+
+ heapAnalysis.getCmdLineArgBytesAlloc().getUniqueAllocSiteID()+
+ ";"
+ );
+ outmethod.println(" }");
+ outmethod.println("}");
+ outmethod.println("");
}
public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {