...
This commit is contained in:
blueloveTH 2023-05-13 14:44:57 +08:00
parent 4fe1e2bec5
commit c24dd51198

View File

@ -72,6 +72,11 @@ struct PlainOldData{
inline void add_module_c(VM* vm){ inline void add_module_c(VM* vm){
PyObject* mod = vm->new_module("c"); 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){ vm->bind_func<1>(mod, "free", [](VM* vm, ArgsView args){
void* p = CAST(void*, args[0]); void* p = CAST(void*, args[0]);
free(p); free(p);
@ -128,29 +133,29 @@ struct NativeProxyFuncC final: NativeProxyFuncCBase {
} }
template<typename __Ret, size_t... Is> template<typename __Ret, size_t... Is>
std::enable_if_t<std::is_void_v<__Ret>, PyObject*> call(VM* vm, ArgsView args, std::index_sequence<Is...>) { PyObject* call(VM* vm, ArgsView args, std::index_sequence<Is...>){
if constexpr(std::is_void_v<__Ret>){
func(py_cast<Params>(vm, args[Is])...); func(py_cast<Params>(vm, args[Is])...);
return vm->None; return vm->None;
} }else{
template<typename __Ret, size_t... Is>
std::enable_if_t<!std::is_void_v<__Ret>, PyObject*> call(VM* vm, ArgsView args, std::index_sequence<Is...>) {
__Ret ret = func(py_cast<Params>(vm, args[Is])...); __Ret ret = func(py_cast<Params>(vm, args[Is])...);
return VAR(std::move(ret)); 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<int ARGC, typename T> template<int ARGC, typename T>
inline void bind_any_c_fp(VM* vm, PyObject* obj, Str name, T fp){ inline void bind_any_c_fp(VM* vm, PyObject* obj, Str name, T fp){
static_assert(std::is_pod_v<T>); static_assert(std::is_pod_v<T>);
static_assert(std::is_pointer_v<T>); static_assert(std::is_pointer_v<T>);
static const StrName m_proxy("__proxy__"); PyObject* func = VAR(NativeFunc(_any_c_wrapper, ARGC, false));
static const auto wrapper = [](VM* vm, ArgsView args){ func->attr().set("__proxy__", VAR_T(VoidP, new NativeProxyFuncC(fp)));
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)));
obj->attr().set(name, func); obj->attr().set(name, func);
} }
} // namespace pkpy } // namespace pkpy