private void codeClassObjTable() { str.println("\n# Class Object Table"); str.print(CgenSupport.CLASSOBJTAB + CgenSupport.LABEL); for (Object obj : nds) { AbstractSymbol className = ((CgenNode) obj).getName(); // code prototype object reference str.print(CgenSupport.WORD); CgenSupport.emitProtObjRef(className, str); str.println(); // code initializer reference str.print(CgenSupport.WORD); CgenSupport.emitInitRef(className, str); str.println(); } }
private void codeObjInits() { str.println("\n# Object Initializers"); for (Object obj : nds) { CgenNode nd = (CgenNode) obj; // code object initailzers (constructor method) CgenSupport.emitInitRef(nd.getName(), str); str.print(CgenSupport.LABEL); nd.codeObjInit(str); } }
private void codeDispTables() { str.println("\n# Dispatch Tables"); for (Object obj : nds) { CgenNode nd = (CgenNode) obj; // code class method reference CgenSupport.emitDispTableRef(nd.getName(), str); str.print(CgenSupport.LABEL); nd.codeDispTab(str); } }
private void codeProtObjs() { str.println("\n# Prototype Objects"); for (Object obj : nds) { CgenNode nd = (CgenNode) obj; // code class attributes str.println(CgenSupport.WORD + "-1"); // GC tag CgenSupport.emitProtObjRef(nd.getName(), str); str.print(CgenSupport.LABEL); nd.codeProtObj(str); } }
/** Emits code to start the .text segment and to declare the global names. */ private void codeGlobalText() { str.println("\n# Global Text"); str.println(CgenSupport.GLOBAL + CgenSupport.HEAP_START); str.print(CgenSupport.HEAP_START + CgenSupport.LABEL); str.println(CgenSupport.WORD + 0); str.println("\t.text"); str.print(CgenSupport.GLOBAL); CgenSupport.emitInitRef(TreeConstants.Main, str); str.println(""); str.print(CgenSupport.GLOBAL); CgenSupport.emitInitRef(TreeConstants.Int, str); str.println(""); str.print(CgenSupport.GLOBAL); CgenSupport.emitInitRef(TreeConstants.Str, str); str.println(""); str.print(CgenSupport.GLOBAL); CgenSupport.emitInitRef(TreeConstants.Bool, str); str.println(""); str.print(CgenSupport.GLOBAL); CgenSupport.emitMethodRef(TreeConstants.Main, TreeConstants.main_meth, str); str.println(""); }
/** * Generates code for the string constant definition. This method is incomplete; you get to finish * it up in programming assignment 5. * * @param stringclasstag the class tag for string object * @param s the output stream */ public void codeDef(int stringclasstag, PrintStream s) { IntSymbol lensym = (IntSymbol) AbstractTable.inttable.addInt(str.length()); // Add -1 eye catcher s.println(CgenSupport.WORD + "-1"); codeRef(s); s.print(CgenSupport.LABEL); // label s.println(CgenSupport.WORD + stringclasstag); // tag s.println( CgenSupport.WORD + (CgenSupport.DEFAULT_OBJFIELDS + CgenSupport.STRING_SLOTS + (str.length() + 4) / 4)); // object size s.print(CgenSupport.WORD); /* Add code to reference the dispatch table for class String here */ CgenSupport.emitDispTableRef(TreeConstants.Str, s); s.println(""); // dispatch table s.print(CgenSupport.WORD); lensym.codeRef(s); s.println(""); // length CgenSupport.emitStringConstant(str, s); // ascii string s.print(CgenSupport.ALIGN); // align to word }
/** Emits code to start the .data segment and to declare the global names. */ private void codeGlobalData() { // The following global names must be defined first. // set FP offset to be below SP by 1 fpOffset = 0; str.println("\n# Global Data"); str.print("\t.data\n" + CgenSupport.ALIGN); str.println(CgenSupport.GLOBAL + CgenSupport.CLASSNAMETAB); str.print(CgenSupport.GLOBAL); CgenSupport.emitProtObjRef(TreeConstants.Main, str); str.println(""); str.print(CgenSupport.GLOBAL); CgenSupport.emitProtObjRef(TreeConstants.Int, str); str.println(""); str.print(CgenSupport.GLOBAL); CgenSupport.emitProtObjRef(TreeConstants.Str, str); str.println(""); str.print(CgenSupport.GLOBAL); BoolConst.falsebool.codeRef(str); str.println(""); str.print(CgenSupport.GLOBAL); BoolConst.truebool.codeRef(str); str.println(""); str.println(CgenSupport.GLOBAL + CgenSupport.INTTAG); str.println(CgenSupport.GLOBAL + CgenSupport.BOOLTAG); str.println(CgenSupport.GLOBAL + CgenSupport.STRINGTAG); // We also need to know the tag of the Int, String, and Bool classes // during code generation. str.println(CgenSupport.INTTAG + CgenSupport.LABEL + CgenSupport.WORD + intclasstag); str.println(CgenSupport.BOOLTAG + CgenSupport.LABEL + CgenSupport.WORD + boolclasstag); str.println(CgenSupport.STRINGTAG + CgenSupport.LABEL + CgenSupport.WORD + stringclasstag); }