mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
...
This commit is contained in:
parent
4fe1e2bec5
commit
c24dd51198
39
src/cffi.h
39
src/cffi.h
@ -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);
|
||||||
@ -121,36 +126,36 @@ struct NativeProxyFuncC final: NativeProxyFuncCBase {
|
|||||||
NativeProxyFuncC(_Fp func) : func(func) {}
|
NativeProxyFuncC(_Fp func) : func(func) {}
|
||||||
|
|
||||||
PyObject* operator()(VM* vm, ArgsView args) override {
|
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()));
|
vm->TypeError("expected " + std::to_string(N) + " arguments, but got " + std::to_string(args.size()));
|
||||||
}
|
}
|
||||||
return call<Ret>(vm, args, std::make_index_sequence<N>());
|
return call<Ret>(vm, args, std::make_index_sequence<N>());
|
||||||
}
|
}
|
||||||
|
|
||||||
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...>){
|
||||||
func(py_cast<Params>(vm, args[Is])...);
|
if constexpr(std::is_void_v<__Ret>){
|
||||||
return vm->None;
|
func(py_cast<Params>(vm, args[Is])...);
|
||||||
}
|
return vm->None;
|
||||||
|
}else{
|
||||||
template<typename __Ret, size_t... Is>
|
__Ret ret = func(py_cast<Params>(vm, args[Is])...);
|
||||||
std::enable_if_t<!std::is_void_v<__Ret>, PyObject*> call(VM* vm, ArgsView args, std::index_sequence<Is...>) {
|
return VAR(std::move(ret));
|
||||||
__Ret ret = func(py_cast<Params>(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<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
|
Loading…
x
Reference in New Issue
Block a user