From c24dd5119849f21d4f3047b9da72aaa0d926b2b1 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 13 May 2023 14:44:57 +0800 Subject: [PATCH] ... ... --- src/cffi.h | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/cffi.h b/src/cffi.h index 40c5a51b..2490a426 100644 --- a/src/cffi.h +++ b/src/cffi.h @@ -72,6 +72,11 @@ struct PlainOldData{ inline void add_module_c(VM* vm){ PyObject* mod = vm->new_module("c"); + vm->bind_func<1>(mod, "malloc", [](VM* vm, ArgsView args){ + i64 size = CAST(i64, args[0]); + return VAR(malloc(size)); + }); + vm->bind_func<1>(mod, "free", [](VM* vm, ArgsView args){ void* p = CAST(void*, args[0]); free(p); @@ -121,36 +126,36 @@ struct NativeProxyFuncC final: NativeProxyFuncCBase { NativeProxyFuncC(_Fp func) : func(func) {} PyObject* operator()(VM* vm, ArgsView args) override { - if (args.size() != N) { + if (args.size() != N){ vm->TypeError("expected " + std::to_string(N) + " arguments, but got " + std::to_string(args.size())); } return call(vm, args, std::make_index_sequence()); } template - std::enable_if_t, PyObject*> call(VM* vm, ArgsView args, std::index_sequence) { - func(py_cast(vm, args[Is])...); - return vm->None; - } - - template - std::enable_if_t, PyObject*> call(VM* vm, ArgsView args, std::index_sequence) { - __Ret ret = func(py_cast(vm, args[Is])...); - return VAR(std::move(ret)); + PyObject* call(VM* vm, ArgsView args, std::index_sequence){ + if constexpr(std::is_void_v<__Ret>){ + func(py_cast(vm, args[Is])...); + return vm->None; + }else{ + __Ret ret = func(py_cast(vm, args[Is])...); + return VAR(std::move(ret)); + } } }; +inline PyObject* _any_c_wrapper(VM* vm, ArgsView args){ + static const StrName m_proxy("__proxy__"); + NativeProxyFuncCBase* pf = CAST(NativeProxyFuncCBase*, args[-2]->attr(m_proxy)); + return (*pf)(vm, args); +} + template inline void bind_any_c_fp(VM* vm, PyObject* obj, Str name, T fp){ static_assert(std::is_pod_v); static_assert(std::is_pointer_v); - static const StrName m_proxy("__proxy__"); - static const auto wrapper = [](VM* vm, ArgsView args){ - NativeProxyFuncCBase* pf = CAST(NativeProxyFuncCBase*, args[-2]->attr(m_proxy)); - return (*pf)(vm, args); - }; - PyObject* func = VAR(NativeFunc(wrapper, ARGC, false)); - func->attr().set(m_proxy, VAR_T(VoidP, new NativeProxyFuncC(fp))); + PyObject* func = VAR(NativeFunc(_any_c_wrapper, ARGC, false)); + func->attr().set("__proxy__", VAR_T(VoidP, new NativeProxyFuncC(fp))); obj->attr().set(name, func); } } // namespace pkpy \ No newline at end of file