| #if defined(__wasm__) && defined(PY_CALL_TRAMPOLINE) |
| |
| #include <Python.h> |
| |
| typedef PyObject* (*three_arg)(PyObject*, PyObject*, PyObject*); |
| typedef PyObject* (*two_arg)(PyObject*, PyObject*); |
| typedef PyObject* (*one_arg)(PyObject*); |
| typedef PyObject* (*zero_arg)(void); |
| |
| #define RETCALL_IF_SIG_MATCHES(ty, args...) \ |
| if (__builtin_wasm_test_function_pointer_signature((ty)func)) { \ |
| return ((ty)func)(args); \ |
| } |
| |
| PyObject* |
| _PyWasm_TrampolineCall(PyCFunctionWithKeywords func, |
| PyObject* self, |
| PyObject* args, |
| PyObject* kw) |
| { |
| RETCALL_IF_SIG_MATCHES(three_arg, self, args, kw); |
| RETCALL_IF_SIG_MATCHES(two_arg, self, args); |
| RETCALL_IF_SIG_MATCHES(one_arg, self); |
| RETCALL_IF_SIG_MATCHES(zero_arg); |
| PyErr_SetString(PyExc_SystemError, "Handler has incorrect signature"); |
| return NULL; |
| } |
| |
| typedef int (*setter_three_arg)(PyObject*, PyObject*, void*); |
| typedef int (*setter_two_arg)(PyObject*, PyObject*); |
| typedef int (*setter_one_arg)(PyObject*); |
| typedef int (*setter_zero_arg)(void); |
| |
| int |
| _PyWasm_TrampolineCallSetter(setter func, |
| PyObject* self, |
| PyObject* val, |
| void* closure) |
| { |
| RETCALL_IF_SIG_MATCHES(setter_three_arg, self, val, closure); |
| RETCALL_IF_SIG_MATCHES(setter_two_arg, self, val); |
| RETCALL_IF_SIG_MATCHES(setter_one_arg, self); |
| RETCALL_IF_SIG_MATCHES(setter_zero_arg); |
| PyErr_SetString(PyExc_SystemError, "Handler has incorrect signature"); |
| return -1; |
| } |
| |
| #endif // defined(__wasm__) && defined(PY_CALL_TRAMPOLINE) |