mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
up
This commit is contained in:
parent
a4d9f8dc82
commit
44afa5b023
@ -431,8 +431,8 @@ struct pointer {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
std::enable_if_t<std::is_pointer_v<T>, T>
|
T py_pointer_cast(VM* vm, const PyVar& var){
|
||||||
py_cast(VM* vm, const PyVar& var){
|
static_assert(std::is_pointer_v<T>);
|
||||||
Pointer& p = CAST(Pointer&, var);
|
Pointer& p = CAST(Pointer&, var);
|
||||||
const TypeInfo* type = _type_db.get<typename pointer<T>::baseT>();
|
const TypeInfo* type = _type_db.get<typename pointer<T>::baseT>();
|
||||||
const int level = pointer<T>::level;
|
const int level = pointer<T>::level;
|
||||||
|
21
src/obj.h
21
src/obj.h
@ -178,26 +178,31 @@ template <typename T> struct is_py_class<T, std::void_t<decltype(T::_type)>> : s
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
void _check_py_class(VM* vm, const PyVar& var);
|
void _check_py_class(VM* vm, const PyVar& var);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T py_pointer_cast(VM* vm, const PyVar& var);
|
||||||
|
|
||||||
template<typename __T>
|
template<typename __T>
|
||||||
std::enable_if_t<!std::is_pointer_v<__T>, __T>
|
__T py_cast(VM* vm, const PyVar& obj) {
|
||||||
py_cast(VM* vm, const PyVar& obj) {
|
if constexpr(std::is_pointer_v<__T>){
|
||||||
|
return py_pointer_cast<__T>(vm, obj);
|
||||||
|
}
|
||||||
using T = std::decay_t<__T>;
|
using T = std::decay_t<__T>;
|
||||||
if constexpr(is_py_class<T>::value){
|
if constexpr(is_py_class<T>::value){
|
||||||
_check_py_class<T>(vm, obj);
|
_check_py_class<T>(vm, obj);
|
||||||
return OBJ_GET(T, obj);
|
return OBJ_GET(T, obj);
|
||||||
}else{
|
|
||||||
throw std::runtime_error("bad py_cast() call");
|
|
||||||
}
|
}
|
||||||
|
throw std::runtime_error("bad py_cast() call");
|
||||||
}
|
}
|
||||||
template<typename __T>
|
template<typename __T>
|
||||||
std::enable_if_t<!std::is_pointer_v<__T>, __T>
|
__T _py_cast(VM* vm, const PyVar& obj) {
|
||||||
_py_cast(VM* vm, const PyVar& obj) {
|
if constexpr(std::is_pointer_v<__T>){
|
||||||
|
return py_pointer_cast<__T>(vm, obj);
|
||||||
|
}
|
||||||
using T = std::decay_t<__T>;
|
using T = std::decay_t<__T>;
|
||||||
if constexpr(is_py_class<T>::value){
|
if constexpr(is_py_class<T>::value){
|
||||||
return OBJ_GET(T, obj);
|
return OBJ_GET(T, obj);
|
||||||
}else{
|
|
||||||
throw std::runtime_error("bad py_cast() call");
|
|
||||||
}
|
}
|
||||||
|
throw std::runtime_error("bad py_cast() call");
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VAR(x) py_var(vm, x)
|
#define VAR(x) py_var(vm, x)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user