mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
This commit is contained in:
parent
3a07b05279
commit
df2f7bb58e
26
src/cffi.h
26
src/cffi.h
@ -11,6 +11,11 @@ namespace pkpy {
|
||||
static const StrName __x1(#name); \
|
||||
return OBJ_GET(Type, vm->_modules[__x0]->attr(__x1)); \
|
||||
} \
|
||||
static void _check_type(VM* vm, PyObject* val){ \
|
||||
if(!vm->isinstance(val, T::_type(vm))){ \
|
||||
vm->TypeError("expected '" #mod "." #name "', got " + OBJ_NAME(val).escape()); \
|
||||
} \
|
||||
} \
|
||||
static PyObject* register_class(VM* vm, PyObject* mod) { \
|
||||
if(OBJ_NAME(mod) != #mod) { \
|
||||
auto msg = fmt("register_class() failed: ", OBJ_NAME(mod), " != ", #mod); \
|
||||
@ -57,27 +62,8 @@ inline PyObject* py_var(VM* vm, char* p){
|
||||
return VAR_T(VoidP, p);
|
||||
}
|
||||
/***********************************************/
|
||||
|
||||
template<typename T>
|
||||
struct _pointer {
|
||||
static constexpr int level = 0;
|
||||
using baseT = T;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct _pointer<T*> {
|
||||
static constexpr int level = _pointer<T>::level + 1;
|
||||
using baseT = typename _pointer<T>::baseT;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct pointer {
|
||||
static constexpr int level = _pointer<std::decay_t<T>>::level;
|
||||
using baseT = typename _pointer<std::decay_t<T>>::baseT;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
T py_pointer_cast(VM* vm, PyObject* var){
|
||||
T to_void_p(VM* vm, PyObject* var){
|
||||
static_assert(std::is_pointer_v<T>);
|
||||
VoidP& p = CAST(VoidP&, var);
|
||||
return reinterpret_cast<T>(p.ptr);
|
||||
|
@ -223,16 +223,15 @@ union BitsCvt {
|
||||
template <typename, typename=void> struct is_py_class : std::false_type {};
|
||||
template <typename T> struct is_py_class<T, std::void_t<decltype(T::_type)>> : std::true_type {};
|
||||
|
||||
template<typename T> void _check_py_class(VM*, PyObject*);
|
||||
template<typename T> T py_pointer_cast(VM*, PyObject*);
|
||||
template<typename T> T to_void_p(VM*, PyObject*);
|
||||
|
||||
template<typename __T>
|
||||
__T py_cast(VM* vm, PyObject* obj) {
|
||||
using T = std::decay_t<__T>;
|
||||
if constexpr(std::is_pointer_v<T>){
|
||||
return py_pointer_cast<T>(vm, obj);
|
||||
return to_void_p<T>(vm, obj);
|
||||
}else if constexpr(is_py_class<T>::value){
|
||||
_check_py_class<T>(vm, obj);
|
||||
T::_check_type(vm, obj);
|
||||
return OBJ_GET(T, obj);
|
||||
}else {
|
||||
return Discarded();
|
||||
@ -243,7 +242,7 @@ template<typename __T>
|
||||
__T _py_cast(VM* vm, PyObject* obj) {
|
||||
using T = std::decay_t<__T>;
|
||||
if constexpr(std::is_pointer_v<__T>){
|
||||
return py_pointer_cast<__T>(vm, obj);
|
||||
return to_void_p<__T>(vm, obj);
|
||||
}else if constexpr(is_py_class<T>::value){
|
||||
return OBJ_GET(T, obj);
|
||||
}else{
|
||||
|
4
src/vm.h
4
src/vm.h
@ -536,10 +536,6 @@ inline PyObject* py_var(VM* vm, std::string_view val){
|
||||
return VAR(Str(val));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void _check_py_class(VM* vm, PyObject* obj){
|
||||
vm->check_non_tagged_type(obj, T::_type(vm));
|
||||
}
|
||||
|
||||
inline PyObject* VM::num_negated(PyObject* obj){
|
||||
if (is_int(obj)){
|
||||
|
Loading…
x
Reference in New Issue
Block a user