public void Call(IAsm a) { Var func = a.getVar(); LibFunc lfunc; String funcsig = genDataTypeSig(a.getVar()); VarList x = func.getParams(); String paramsig = ""; if (x.Length() > 0) { int max = x.Length(); StringBuilder t = new StringBuilder(Io.MAXSTR); for (int i = 0; i < max; i++) { Var e = x.FindByIndex(i); t.Append(genDataTypeSig(e)); if (i < max - 1) { t.Append(","); } } paramsig = t.ToString(); } StringBuilder sb = new StringBuilder(Io.MAXSTR); sb.Append("\tcall "); sb.Append(funcsig); sb.Append(" "); lfunc = lib.lookup_func(a.getVar().getName()); if (lfunc != null) { sb.Append(lfunc.nameFull); } else { sb.Append(io.GetClassname()); sb.Append("::"); sb.Append(func.getName()); sb.Append("("); sb.Append(paramsig); sb.Append(")"); } sb.Append("\t\t\t\t\t//"); sb.Append(a.getICount()); sb.Append("\r\n"); io.Out(sb.ToString()); }
public void FuncBegin(IAsm a) { Var func = a.getVar(); Type funcsig = genDataTypeSig(a.getVar()); VarList paramlist = func.getParams(); Type[] paramTypes = null; if (paramlist.Length() > 0) { int max = paramlist.Length(); paramTypes = new Type[max]; for (int i = 0; i < max; i++) { Var e = paramlist.FindByIndex(i); paramTypes[i] = genDataTypeSig(e); } } emethod = eclass.DefineMethod(func.getName(), MethodAttributes.Static | MethodAttributes.Public, funcsig, paramTypes); func.setMethodBuilder(emethod); for (int i = 0; i < paramlist.Length(); i++) { emethod.DefineParameter(i + 1, 0, paramlist.FindByIndex(i).getName()); } il = emethod.GetILGenerator(); if (func.getName().ToLower().Equals("main")) { appbuild.SetEntryPoint(emethod); } // emodule.SetUserEntryPoint(emethod); labelhash = new Hashtable(); }
public void FuncBegin(IAsm a) { Var func = a.getVar(); String funcsig = genDataTypeSig(a.getVar()); VarList x = func.getParams(); String paramsig = ""; if (x.Length() > 0) { int max = x.Length(); StringBuilder t = new StringBuilder(Io.MAXSTR); for (int i = 0; i < max; i++) { Var e = x.FindByIndex(i); t.Append(genDataTypeSig(e)); if (i < max - 1) { t.Append(","); } } paramsig = t.ToString(); } StringBuilder sb = new StringBuilder(Io.MAXSTR); sb.Append("\t.method public "); sb.Append("static "); sb.Append(funcsig); sb.Append(" "); sb.Append(func.getName()); sb.Append("("); sb.Append(paramsig); sb.Append(") {\r\n"); io.Out(sb.ToString()); if (func.getName().ToLower().Equals("main")) { io.Out("\t.entrypoint\r\n"); } }
void proc_decl(VarList curtree, String label) { Var procvar = new Var(); procvar.setName(label); procvar.setType(Var.VAR_BLOCK); procvar.setTypeId(Tok.TOK_VOID); if (label == null) io.Abort("PL0116: PROC declaration needs LABEL"); io.Message(tok+"[PROC]"); tok.scan(); procvar.nodes = new VarList(); if (tok.getId() == Tok.TOK_1_LBRACKET) { param(procvar.nodes); procvar.setNodesType(Var.VAR_PARAM); } switch (tok.getId()) { case Tok.TOK_RETURNS: io.Message(tok+"[RETURNS]"); tok.scan(); if (tok.getId() != Tok.TOK_1_LBRACKET) io.Abort("PL0104: ')' expected."); io.Message(tok+"[(]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_FIXED: case Tok.TOK_FLOAT: case Tok.TOK_COMPLEX: case Tok.TOK_REAL: case Tok.TOK_BINARY: case Tok.TOK_DECIMAL: io.Message(tok+"[Type]"); procvar.setTypeId(tok.getId()); break; default: io.Abort("PL0115: type specifier expected"); break; } tok.scan(); if (tok.getId() != Tok.TOK_1_RBRACKET) io.Abort("PL0114: ')' expected"); io.Message(tok+"[)]"); tok.scan(); break; case Tok.TOK_RECURSIVE: io.Message(tok+"[RECURSIVE]"); if (label.ToUpper() == "MAIN") io.Abort("PL0146: MAIN can not be RECURSIVE"); tok.scan(); break; } null_stmt(); emit.FuncBegin(procvar); declarations(procvar.nodes); VarList prms = procvar.getParams(); if (prms != null) for (int i = 0; i < prms.Length(); i++) if (prms.FindByIndex(i).getTypeId() == 0) io.Abort("PL0117: undeclared parameter"); if (procvar.getLocals() != null) { emit.LocalVars(procvar.getLocals()); } try { curtree.add(procvar); } catch { io.Abort("PL0120: invalid procedure declaration"); } do { stmt(procvar.nodes, label, null); } while (tok.getId() != Tok.TOK_END); if (tok.getId() != Tok.TOK_END) io.Abort("PL0118: END expected"); io.Message(tok+"[END]"); tok.scan(); if (tok.getValue() != label) io.Abort("PL0119: unclosed PROC"); io.Message(tok+"[Label]"); tok.scan(); emit.Ret(); emit.FuncEnd(); if (io.getGenList()) emit.LIST(); emit.IL(); emit.Finish(); }
void proc_decl(VarList curtree, String label) { Var procvar = new Var(); procvar.setName(label); procvar.setType(Var.VAR_BLOCK); procvar.setTypeId(Tok.TOK_VOID); if (label == null) { io.Abort("PL0116: PROC declaration needs LABEL"); } io.Message(tok + "[PROC]"); tok.scan(); procvar.nodes = new VarList(); if (tok.getId() == Tok.TOK_1_LBRACKET) { param(procvar.nodes); procvar.setNodesType(Var.VAR_PARAM); } switch (tok.getId()) { case Tok.TOK_RETURNS: io.Message(tok + "[RETURNS]"); tok.scan(); if (tok.getId() != Tok.TOK_1_LBRACKET) { io.Abort("PL0104: ')' expected."); } io.Message(tok + "[(]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_FIXED: case Tok.TOK_FLOAT: case Tok.TOK_COMPLEX: case Tok.TOK_REAL: case Tok.TOK_BINARY: case Tok.TOK_DECIMAL: io.Message(tok + "[Type]"); procvar.setTypeId(tok.getId()); break; default: io.Abort("PL0115: type specifier expected"); break; } tok.scan(); if (tok.getId() != Tok.TOK_1_RBRACKET) { io.Abort("PL0114: ')' expected"); } io.Message(tok + "[)]"); tok.scan(); break; case Tok.TOK_RECURSIVE: io.Message(tok + "[RECURSIVE]"); if (label.ToUpper() == "MAIN") { io.Abort("PL0146: MAIN can not be RECURSIVE"); } tok.scan(); break; } null_stmt(); emit.FuncBegin(procvar); declarations(procvar.nodes); VarList prms = procvar.getParams(); if (prms != null) { for (int i = 0; i < prms.Length(); i++) { if (prms.FindByIndex(i).getTypeId() == 0) { io.Abort("PL0117: undeclared parameter"); } } } if (procvar.getLocals() != null) { emit.LocalVars(procvar.getLocals()); } try { curtree.add(procvar); } catch { io.Abort("PL0120: invalid procedure declaration"); } do { stmt(procvar.nodes, label, null); } while (tok.getId() != Tok.TOK_END); if (tok.getId() != Tok.TOK_END) { io.Abort("PL0118: END expected"); } io.Message(tok + "[END]"); tok.scan(); if (tok.getValue() != label) { io.Abort("PL0119: unclosed PROC"); } io.Message(tok + "[Label]"); tok.scan(); emit.Ret(); emit.FuncEnd(); if (io.getGenList()) { emit.LIST(); } emit.IL(); emit.Finish(); }