mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
some fix
This commit is contained in:
parent
393952d800
commit
f03f4ebefd
@ -172,27 +172,30 @@ struct PyVar final{
|
|||||||
Type type;
|
Type type;
|
||||||
bool is_sso;
|
bool is_sso;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
char _bytes[12];
|
// 12 bytes SSO
|
||||||
|
int _0; i64 _1;
|
||||||
|
|
||||||
// uninitialized
|
// uninitialized
|
||||||
PyVar() = default;
|
PyVar() = default;
|
||||||
// zero initialized
|
// zero initialized
|
||||||
PyVar(std::nullptr_t): type(), is_sso(false), flags(0), _bytes{0} { }
|
constexpr PyVar(std::nullptr_t): type(0), is_sso(false), flags(0), _0(0), _1(0) {}
|
||||||
// PyObject* initialized (is_sso = false)
|
// PyObject* initialized (is_sso = false)
|
||||||
PyVar(Type type, PyObject* p): type(type), is_sso(false), flags(0) {
|
PyVar(Type type, PyObject* p): type(type), is_sso(false), flags(0), _1(reinterpret_cast<i64>(p)) {}
|
||||||
as<PyObject*>() = p;
|
|
||||||
}
|
|
||||||
// SSO initialized (is_sso = true)
|
// SSO initialized (is_sso = true)
|
||||||
template<typename T>
|
template<typename T>
|
||||||
PyVar(Type type, T value): type(type), is_sso(true), flags(0) {
|
PyVar(Type type, T value): type(type), is_sso(true), flags(0) {
|
||||||
static_assert(sizeof(T) <= sizeof(_bytes), "SSO size exceeded");
|
static_assert(sizeof(T) <= 12, "SSO size exceeded");
|
||||||
as<T>() = value;
|
as<T>() = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T& as() const {
|
T& as(){
|
||||||
static_assert(!std::is_reference_v<T>);
|
static_assert(!std::is_reference_v<T>);
|
||||||
return *(T*)_bytes;
|
if constexpr(sizeof(T) <= 8){
|
||||||
|
return reinterpret_cast<T&>(_1);
|
||||||
|
}else{
|
||||||
|
return reinterpret_cast<T&>(_0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit operator bool() const { return (bool)type; }
|
explicit operator bool() const { return (bool)type; }
|
||||||
@ -210,15 +213,15 @@ struct PyVar final{
|
|||||||
|
|
||||||
PyObject* get() const {
|
PyObject* get() const {
|
||||||
PK_DEBUG_ASSERT(!is_sso)
|
PK_DEBUG_ASSERT(!is_sso)
|
||||||
return as<PyObject*>();
|
return reinterpret_cast<PyObject*>(_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* operator->() const {
|
PyObject* operator->() const {
|
||||||
PK_DEBUG_ASSERT(!is_sso)
|
PK_DEBUG_ASSERT(!is_sso)
|
||||||
return as<PyObject*>();
|
return reinterpret_cast<PyObject*>(_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
i64 hash() const { return as<i64>(); }
|
i64 hash() const { return _1; }
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T& obj_get();
|
T& obj_get();
|
||||||
|
@ -49,7 +49,7 @@ struct ArgsView{
|
|||||||
PyVar* end() const { return _end; }
|
PyVar* end() const { return _end; }
|
||||||
int size() const { return _end - _begin; }
|
int size() const { return _end - _begin; }
|
||||||
bool empty() const { return _begin == _end; }
|
bool empty() const { return _begin == _end; }
|
||||||
PyVar operator[](int i) const { return _begin[i]; }
|
PyVar& operator[](int i) const { return _begin[i]; }
|
||||||
|
|
||||||
List to_list() const;
|
List to_list() const;
|
||||||
Tuple to_tuple() const;
|
Tuple to_tuple() const;
|
||||||
|
@ -3,8 +3,8 @@ import random
|
|||||||
import sys
|
import sys
|
||||||
import math
|
import math
|
||||||
|
|
||||||
a = vec2(1, 2)
|
a = vec2(1.5, 2)
|
||||||
assert a.x == 1
|
assert a.x == 1.5
|
||||||
assert a.y == 2
|
assert a.y == 2
|
||||||
|
|
||||||
assert repr(math) == "<module 'math'>"
|
assert repr(math) == "<module 'math'>"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user