diff --git a/src/obj.h b/src/obj.h index ef86e8b0..d7ff8565 100644 --- a/src/obj.h +++ b/src/obj.h @@ -68,27 +68,25 @@ typedef pkpy::shared_ptr _Func; typedef pkpy::shared_ptr _Iterator; struct PyObject { -protected: - void* _value; -public: PyVar _type; PyVarDict attribs; inline bool isType(const PyVar& type){ return this->_type == type; } - inline void* value(){ return _value; } + inline virtual void* value() = 0; // currently __name__ is only used for 'type' PyVar _typeName(){ return _type->attribs[__name__]; } + + PyObject(PyVar type) : _type(type) {} + virtual ~PyObject() = default; }; template struct Py_ : PyObject { T _valueT; - Py_(T val, const PyVar& type) : _valueT(val) { - _value = &_valueT; - _type = type; - } + Py_(T val, const PyVar& type) : PyObject(type), _valueT(val) {} + virtual void* value() override { return &_valueT; } }; #define UNION_GET(T, obj) (((Py_*)((obj).get()))->_valueT)