コード例 #1
0
 def test_autogen_ctx_call_i(self):
     api = self.parse("""
         typedef HPy (*HPyFunc_foo)(HPyContext ctx, HPy arg, int xy);
         typedef int (*HPyFunc_bar)(HPyContext ctx);
         typedef int (*HPyFunc_baz)(HPyContext ctx, HPy, int);
         typedef void (*HPyFunc_proc)(HPyContext ctx, int x);
     """)
     got = autogen_ctx_call_i(api).generate()
     exp = r"""
         case HPyFunc_FOO: {
             HPyFunc_foo f = (HPyFunc_foo)func;
             _HPyFunc_args_FOO *a = (_HPyFunc_args_FOO*)args;
             a->result = _h2py(f(ctx, _py2h(a->arg), a->xy));
             return;
         }
         case HPyFunc_BAR: {
             HPyFunc_bar f = (HPyFunc_bar)func;
             _HPyFunc_args_BAR *a = (_HPyFunc_args_BAR*)args;
             a->result = f(ctx);
             return;
         }
         case HPyFunc_BAZ: {
             HPyFunc_baz f = (HPyFunc_baz)func;
             _HPyFunc_args_BAZ *a = (_HPyFunc_args_BAZ*)args;
             a->result = f(ctx, _py2h(a->arg0), a->arg1);
             return;
         }
         case HPyFunc_PROC: {
             HPyFunc_proc f = (HPyFunc_proc)func;
             _HPyFunc_args_PROC *a = (_HPyFunc_args_PROC*)args;
             f(ctx, a->x);
             return;
         }
     """
     assert src_equal(got, exp)
コード例 #2
0
    def test_autogen_hpyfunc_trampoline_h(self):
        api = self.parse("""
            typedef HPy (*HPyFunc_foo)(HPyContext ctx, HPy arg, int xy);
            typedef HPy (*HPyFunc_bar)(HPyContext, HPy, int);
            typedef void (*HPyFunc_proc)(HPyContext ctx, int x);
        """)
        got = autogen_hpyfunc_trampoline_h(api).generate()
        exp = r"""
            typedef struct {
                cpy_PyObject *arg;
                int xy;
                cpy_PyObject * result;
            } _HPyFunc_args_FOO;

            #define _HPyFunc_TRAMPOLINE_HPyFunc_FOO(SYM, IMPL) \
                static cpy_PyObject *SYM(cpy_PyObject *arg, int xy) \
                { \
                    _HPyFunc_args_FOO a = { arg, xy }; \
                    _HPy_CallRealFunctionFromTrampoline( \
                       _ctx_for_trampolines, HPyFunc_FOO, IMPL, &a); \
                    return a.result; \
                }

            typedef struct {
                cpy_PyObject *arg0;
                int arg1;
                cpy_PyObject * result;
            } _HPyFunc_args_BAR;

            #define _HPyFunc_TRAMPOLINE_HPyFunc_BAR(SYM, IMPL) \
                static cpy_PyObject *SYM(cpy_PyObject *arg0, int arg1) \
                { \
                    _HPyFunc_args_BAR a = { arg0, arg1 }; \
                    _HPy_CallRealFunctionFromTrampoline( \
                       _ctx_for_trampolines, HPyFunc_BAR, IMPL, &a); \
                    return a.result; \
                }

            typedef struct {
                int x;
            } _HPyFunc_args_PROC;

            #define _HPyFunc_TRAMPOLINE_HPyFunc_PROC(SYM, IMPL) \
                static void SYM(int x) \
                { \
                    _HPyFunc_args_PROC a = { x }; \
                    _HPy_CallRealFunctionFromTrampoline( \
                       _ctx_for_trampolines, HPyFunc_PROC, IMPL, &a); \
                    return; \
                }
        """
        assert src_equal(got, exp)
コード例 #3
0
    def test_autogen_hpyfunc_declare_h(self):
        api = self.parse("""
            typedef HPy (*HPyFunc_foo)(HPyContext ctx, HPy self);
            typedef HPy (*HPyFunc_bar)(HPyContext ctx, HPy, int);
        """)
        got = autogen_hpyfunc_declare_h(api).generate()
        exp = """
            #define _HPyFunc_DECLARE_HPyFunc_FOO(SYM) static HPy SYM(HPyContext ctx, HPy self)
            #define _HPyFunc_DECLARE_HPyFunc_BAR(SYM) static HPy SYM(HPyContext ctx, HPy, int)

            typedef HPy (*HPyFunc_foo)(HPyContext ctx, HPy self);
            typedef HPy (*HPyFunc_bar)(HPyContext ctx, HPy, int);
        """
        assert src_equal(got, exp)
コード例 #4
0
 def test_autogen_cpython_hpyfunc_trampoline_h(self):
     api = self.parse("""
         typedef HPy (*HPyFunc_foo)(HPyContext ctx, HPy arg, int xy);
         typedef HPy (*HPyFunc_bar)(HPyContext ctx, HPy, int);
     """)
     got = autogen_cpython_hpyfunc_trampoline_h(api).generate()
     exp = r"""
         #define _HPyFunc_TRAMPOLINE_HPyFunc_FOO(SYM, IMPL) \
             static cpy_PyObject *SYM(cpy_PyObject *arg, int xy) \
             { \
                 return _h2py(IMPL(_HPyGetContext(), _py2h(arg), xy)); \
             }
         #define _HPyFunc_TRAMPOLINE_HPyFunc_BAR(SYM, IMPL) \
             static cpy_PyObject *SYM(cpy_PyObject *arg0, int arg1) \
             { \
                 return _h2py(IMPL(_HPyGetContext(), _py2h(arg0), arg1)); \
             }
     """
     assert src_equal(got, exp)