From 1c6ea530506a7d6aa5635c3e2a79740359bc2de4 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Fri, 10 Feb 2023 15:54:53 +0800 Subject: [PATCH] up --- src/common.h | 10 +--------- src/obj.h | 14 ++++++-------- src/vm.h | 3 ++- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/common.h b/src/common.h index 563d80b0..92bf42d3 100644 --- a/src/common.h +++ b/src/common.h @@ -39,17 +39,9 @@ typedef double f64; struct Dummy { char _; }; #define DUMMY_VAL Dummy() -#define DUMMY_VAL_TP Dummy template void* tid() { static volatile int8_t _x; return (void*)(&_x); -} - -// This does not ensure to be unique when the pointer of obj->type is deleted & reused. -// But it is good enough for now. -template -inline void* obj_tid(void* alt) { return tid(); } -template<> -inline void* obj_tid(void* alt) { return alt; } \ No newline at end of file +} \ No newline at end of file diff --git a/src/obj.h b/src/obj.h index d8a4e88d..4c8b3b9f 100644 --- a/src/obj.h +++ b/src/obj.h @@ -76,12 +76,12 @@ typedef pkpy::shared_ptr _Func; struct PyObject { PyVar type; PyVarDict attribs; + void* _tid; inline bool is_type(const PyVar& type) const noexcept{ return this->type == type; } virtual void* value() = 0; - virtual void* type_id() = 0; - PyObject(const PyVar& type) : type(type) {} + PyObject(const PyVar& type, void* _tid) : type(type), _tid(_tid) {} virtual ~PyObject() = default; }; @@ -89,13 +89,11 @@ template struct Py_ : PyObject { T _value; - Py_(const PyVar& type, T val) : PyObject(type), _value(val) {} + Py_(const PyVar& type, T val) : PyObject(type, tid()), _value(val) {} void* value() override { return &_value; } - void* type_id() override { return obj_tid((void*)type.get()); } }; -// Unsafe cast from PyObject to C++ type -#define OBJ_GET(T, obj) (*static_cast((obj)->value())) +#define OBJ_GET(T, obj) (((Py_*)((obj).get()))->_value) #define OBJ_NAME(obj) OBJ_GET(_Str, (obj)->attribs[__name__]) #define OBJ_TP_NAME(obj) OBJ_GET(_Str, (obj)->type->attribs[__name__]) @@ -113,8 +111,8 @@ namespace pkpy { struct sp_deleter { inline static void call(int* counter) { PyObject* obj = (PyObject*)(counter + 1); - std::vector& pool = _obj_pool[obj->type_id()]; - if(pool.size() > 60){ + std::vector& pool = _obj_pool[obj->_tid]; + if(obj->_tid==tid() || pool.size() > 60){ obj->~PyObject(); free(counter); }else{ diff --git a/src/vm.h b/src/vm.h index cd82a849..c2951771 100644 --- a/src/vm.h +++ b/src/vm.h @@ -596,7 +596,8 @@ public: template inline PyVar new_object(PyVar type, T _value) { if(!type->is_type(_tp_type)) UNREACHABLE(); - std::vector& pool = _obj_pool[obj_tid((void*)type.get())]; + if constexpr (std::is_same_v) return pkpy::make_shared>(type, _value); + std::vector& pool = _obj_pool[tid()]; if(pool.empty()) return pkpy::make_shared>(type, _value); int* counter = pool.back(); pool.pop_back(); *counter = 1;