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); \
|
static const StrName __x1(#name); \
|
||||||
return OBJ_GET(Type, vm->_modules[__x0]->attr(__x1)); \
|
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) { \
|
static PyObject* register_class(VM* vm, PyObject* mod) { \
|
||||||
if(OBJ_NAME(mod) != #mod) { \
|
if(OBJ_NAME(mod) != #mod) { \
|
||||||
auto msg = fmt("register_class() failed: ", 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);
|
return VAR_T(VoidP, p);
|
||||||
}
|
}
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct _pointer {
|
T to_void_p(VM* vm, PyObject* var){
|
||||||
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){
|
|
||||||
static_assert(std::is_pointer_v<T>);
|
static_assert(std::is_pointer_v<T>);
|
||||||
VoidP& p = CAST(VoidP&, var);
|
VoidP& p = CAST(VoidP&, var);
|
||||||
return reinterpret_cast<T>(p.ptr);
|
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, 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> 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 to_void_p(VM*, PyObject*);
|
||||||
template<typename T> T py_pointer_cast(VM*, PyObject*);
|
|
||||||
|
|
||||||
template<typename __T>
|
template<typename __T>
|
||||||
__T py_cast(VM* vm, PyObject* obj) {
|
__T py_cast(VM* vm, PyObject* obj) {
|
||||||
using T = std::decay_t<__T>;
|
using T = std::decay_t<__T>;
|
||||||
if constexpr(std::is_pointer_v<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){
|
}else if constexpr(is_py_class<T>::value){
|
||||||
_check_py_class<T>(vm, obj);
|
T::_check_type(vm, obj);
|
||||||
return OBJ_GET(T, obj);
|
return OBJ_GET(T, obj);
|
||||||
}else {
|
}else {
|
||||||
return Discarded();
|
return Discarded();
|
||||||
@ -243,7 +242,7 @@ template<typename __T>
|
|||||||
__T _py_cast(VM* vm, PyObject* obj) {
|
__T _py_cast(VM* vm, PyObject* obj) {
|
||||||
using T = std::decay_t<__T>;
|
using T = std::decay_t<__T>;
|
||||||
if constexpr(std::is_pointer_v<__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){
|
}else if constexpr(is_py_class<T>::value){
|
||||||
return OBJ_GET(T, obj);
|
return OBJ_GET(T, obj);
|
||||||
}else{
|
}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));
|
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){
|
inline PyObject* VM::num_negated(PyObject* obj){
|
||||||
if (is_int(obj)){
|
if (is_int(obj)){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user