virtualcalls=new Virtual(state);
}
+ /** The buildCode method outputs C code for all the methods. The Flat
+ * versions of the methods must already be generated and stored in
+ * the State object. */
+
public void buildCode() {
- Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
+ /* Create output streams to write to */
PrintWriter outclassdefs=null;
PrintWriter outstructs=null;
PrintWriter outmethodheader=null;
System.exit(-1);
}
+ /* Build the virtual dispatch tables */
+
buildVirtualTables(outvirtual);
+
+ /* Output includes */
outstructs.println("#include \"classdefs.h\"");
outmethodheader.println("#include \"structdefs.h\"");
// Output the C class declarations
// These could mutually reference each other
outclassdefs.println("struct "+arraytype+";");
+
+ Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
while(it.hasNext()) {
ClassDescriptor cn=(ClassDescriptor)it.next();
outclassdefs.println("struct "+cn.getSafeSymbol()+";");
outstructs.close();
outmethodheader.close();
- if (state.TASK)
+ if (state.TASK) {
+ /* Map flags to integers */
+ it=state.getClassSymbolTable().getDescriptorsIterator();
+ while(it.hasNext()) {
+ ClassDescriptor cn=(ClassDescriptor)it.next();
+ mapFlags(cn);
+ }
+ /* Generate Tasks */
generateTaskStructs(outstructs, outmethodheader);
+ }
/* Build the actual methods */
outmethod.println("#include \"methodheaders.h\"");
outmethod.println("#include \"virtualtable.h\"");
outmethod.println("#include <runtime.h>");
-
outclassdefs.println("extern int classsize[];");
+
//Store the sizes of classes & array elements
generateSizeArray(outmethod);
+ /* Generate code for methods */
Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
while(classit.hasNext()) {
ClassDescriptor cn=(ClassDescriptor)classit.next();
generateFlatMethod(fm, outmethod);
}
} else if (state.main!=null) {
- /* Compile method based program */
+ /* Generate main method */
outmethod.println("int main(int argc, const char *argv[]) {");
ClassDescriptor cd=typeutil.getClass(state.main);
Set mainset=cd.getMethodTable().getSet("main");
}
private int maxcount=0;
- /** This function outputs the virtual dispatch tables for methods. */
+
+ /** The buildVirtualTables method outputs the virtual dispatch
+ * tables for methods. */
private void buildVirtualTables(PrintWriter outvirtual) {
Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
}
}
+ /** Generate code for flatmethod fm. */
+
private void generateFlatMethod(FlatMethod fm, PrintWriter output) {
MethodDescriptor md=fm.getMethod();
TaskDescriptor task=fm.getTask();
output.println("}\n\n");
}
+ /** Generate text string that corresponds to the Temp td. */
private String generateTemp(FlatMethod fm, TempDescriptor td) {
MethodDescriptor md=fm.getMethod();
TaskDescriptor task=fm.getTask();
Analysis/Flag/FlagState.class Analysis/Flag/FlagAnalysis.class \
Analysis/CallGraph/CallGraph.class
-all: Parse/Sym.class Parse/Parser.class $(CLASSFILES)
+
+all: Parse/Sym.class Parse/Parser.class $(CLASSFILES) javadoc
Parse/Parser.java Parse/Sym.java: Parse/java14.cup
cd Parse && \
%.class: %.java
javac -cp ../cup:.:$(CLASSPATH) $<
+javadoc:
+ mkdir javadoc
+ javadoc -classpath ../cup:.:$(CLASSPATH) -sourcepath .:./ClassLibrary -private -d javadoc Lex Util ClassLibrary IR IR.Tree IR.Flat Analysis Analysis.CallGraph Analysis.Flag Main ClassLibrary/*.java
+
clean:
- rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class classdefs.h methodheaders.h methods.c structdefs.h virtualtable.h Analysis/*.class Analysis/Flag/*.class Analysis/CallGraph/*.class
+ rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class classdefs.h methodheaders.h methods.c structdefs.h virtualtable.h Analysis/*.class Analysis/Flag/*.class Analysis/CallGraph/*.class -r javadoc