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("};");
    }
Exemple #2
0
    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("}");
    }
Exemple #3
0
    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("}");
    }