This commit is contained in:
blueloveTH 2024-05-13 19:46:35 +08:00
parent 393952d800
commit f03f4ebefd
3 changed files with 17 additions and 14 deletions

View File

@ -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();

View File

@ -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;

View File

@ -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'>"