public void Emit(StreamWriter w) { w.WriteLine("/*"); w.WriteLine("* GENERATED FILE, DON'T EDIT"); w.WriteLine("* Generated by wasm-tuner.exe --gen-interp-to-native"); w.WriteLine("*/"); var added = new HashSet <string> (); var l = new List <string> (); foreach (var c in cookies) { l.Add(c); added.Add(c); } foreach (var c in extra_signatures) { if (!added.Contains(c)) { l.Add(c); added.Add(c); } } var signatures = l.ToArray(); foreach (var c in signatures) { w.WriteLine("static void"); w.WriteLine($"wasm_invoke_{c.ToLower ()} (void *target_func, InterpMethodArguments *margs)"); w.WriteLine("{"); w.Write($"\ttypedef {TypeToSigType (c [0])} (*T)("); for (int i = 1; i < c.Length; ++i) { char p = c [i]; if (i > 1) { w.Write(", "); } w.Write($"{TypeToSigType (p)} arg_{i - 1}"); } if (c.Length == 1) { w.Write("void"); } w.WriteLine(");\n\tT func = (T)target_func;"); var ctx = new EmitCtx(); w.Write("\t"); if (c [0] != 'V') { w.Write($"{TypeToSigType (c [0])} res = "); } w.Write("func ("); for (int i = 1; i < c.Length; ++i) { char p = c [i]; if (i > 1) { w.Write(", "); } w.Write(ctx.Emit(p)); } w.WriteLine(");"); if (c [0] != 'V') { w.WriteLine($"\t*({TypeToSigType (c [0])}*)margs->retval = res;"); } w.WriteLine("\n}\n"); } Array.Sort(signatures); w.WriteLine("static const char* interp_to_native_signatures [] = {"); foreach (var sig in signatures) { w.WriteLine($"\"{sig}\","); } w.WriteLine("};"); w.WriteLine("static void* interp_to_native_invokes [] = {"); foreach (var sig in signatures) { var lsig = sig.ToLower(); w.WriteLine($"wasm_invoke_{lsig},"); } w.WriteLine("};"); }
static void Main() { Console.WriteLine("/*"); Console.WriteLine("* DON'T EDIT THIS FILE"); Console.WriteLine("* This file was generated by m2n-gen.cs - use it instead."); Console.WriteLine("*/"); foreach (var c in cookies) { Console.WriteLine("static void"); Console.WriteLine($"wasm_invoke_{c.ToLower ()} (void *target_func, InterpMethodArguments *margs)"); Console.WriteLine("{"); Console.Write($"\t{TypeToSigType (c [0])} (*func)("); for (int i = 1; i < c.Length; ++i) { char p = c [i]; if (i > 1) { Console.Write(", "); } Console.Write($"{TypeToSigType (p)} arg_{i - 1}"); } if (c.Length == 1) { Console.Write("void"); } Console.WriteLine(") = target_func;\n"); var ctx = new EmitCtx(); Console.Write("\t"); if (c [0] != 'V') { Console.Write($"{TypeToSigType (c [0])} res = "); } Console.Write("func ("); for (int i = 1; i < c.Length; ++i) { char p = c [i]; if (i > 1) { Console.Write(", "); } Console.Write(ctx.Emit(p)); } Console.WriteLine(");"); if (c [0] != 'V') { Console.WriteLine($"\t*({TypeToSigType (c [0])}*)margs->retval = res;"); } Console.WriteLine("\n}\n"); } Console.WriteLine("static void\nicall_trampoline_dispatch (const char *cookie, void *target_func, InterpMethodArguments *margs)"); Console.WriteLine("{"); for (int i = 0; i < cookies.Length; ++i) { var c = cookies [i]; Console.Write("\t"); if (i > 0) { Console.Write("else "); } Console.WriteLine($"if (!strcmp (\"{c}\", cookie))"); Console.WriteLine($"\t\twasm_invoke_{c.ToLower ()} (target_func, margs);"); } Console.WriteLine("\telse {"); Console.WriteLine("\t\tprintf (\"CANNOT HANDLE COOKIE %s\\n\", cookie);"); Console.WriteLine("\t\tg_assert (0);"); Console.WriteLine("\t}"); Console.WriteLine("}"); }
public void Emit(StreamWriter w) { w.WriteLine("/*"); w.WriteLine("* GENERATED FILE, DON'T EDIT"); w.WriteLine("* Generated by wasm-tuner.exe --gen-interp-to-native"); w.WriteLine("*/"); var added = new HashSet <string> (); var l = new List <string> (); foreach (var c in cookies) { l.Add(c); added.Add(c); } foreach (var c in extra_signatures) { if (!added.Contains(c)) { l.Add(c); added.Add(c); } } var signatures = l.ToArray(); foreach (var c in signatures) { w.WriteLine("static void"); w.WriteLine($"wasm_invoke_{c.ToLower ()} (void *target_func, InterpMethodArguments *margs)"); w.WriteLine("{"); w.Write($"\ttypedef {TypeToSigType (c [0])} (*T)("); for (int i = 1; i < c.Length; ++i) { char p = c [i]; if (i > 1) { w.Write(", "); } w.Write($"{TypeToSigType (p)} arg_{i - 1}"); } if (c.Length == 1) { w.Write("void"); } w.WriteLine(");\n\tT func = (T)target_func;"); var ctx = new EmitCtx(); w.Write("\t"); if (c [0] != 'V') { w.Write($"{TypeToSigType (c [0])} res = "); } w.Write("func ("); for (int i = 1; i < c.Length; ++i) { char p = c [i]; if (i > 1) { w.Write(", "); } w.Write(ctx.Emit(p)); } w.WriteLine(");"); if (c [0] != 'V') { w.WriteLine($"\t*({TypeToSigType (c [0])}*)margs->retval = res;"); } w.WriteLine("\n}\n"); } w.WriteLine("static void\nicall_trampoline_dispatch (const char *cookie, void *target_func, InterpMethodArguments *margs)"); w.WriteLine("{"); /* * if (args.Any(a => a == "--flat")) { * for (int i = 0; i < cookies.Length; ++i) { * var c = cookies [i]; * w.Write ("\t"); * if (i > 0) * w.Write ("else "); * w.WriteLine ($"if (!strcmp (\"{c}\", cookie))"); * w.WriteLine ($"\t\twasm_invoke_{c.ToLower ()} (target_func, margs);"); * } * w.WriteLine ("\telse {"); * w.WriteLine ("\t\tg_error (\"CANNOT HANDLE COOKIE %s\\n\", cookie);"); * w.WriteLine ("\t}"); * } else { */ Array.Sort(signatures); WritePartition(w, signatures, 0); w.WriteLine("\tg_error (\"CANNOT HANDLE COOKIE %s\\n\", cookie);"); w.WriteLine("}"); }