@@ -228,23 +228,29 @@ class Flags : public PyBaseObject
228228 }
229229};
230230
231- class Version : public PyBaseObject
231+ class Version : public PyTuple
232232{
233233 friend class ::Heap;
234234
235235 public:
236- uint8_t m_major{ 0 };
237- uint8_t m_minor{ 0 };
238- uint8_t m_micro{ 0 };
239- std::string m_release_level;
240- uint8_t m_serial{ 0 };
236+ PyInteger * m_major{ nullptr };
237+ PyInteger * m_minor{ nullptr };
238+ PyInteger * m_micro{ nullptr };
239+ PyString * m_release_level{ nullptr } ;
240+ PyInteger * m_serial{ nullptr };
241241
242- private:
243- Version (PyType *t) : PyBaseObject(t) {}
244242
245- Version (uint8_t major, uint8_t minor, uint8_t micro, std::string release_level, uint8_t serial)
246- : PyBaseObject(s_sys_version->underlying_type ()), m_major(major), m_minor(minor),
247- m_micro(micro), m_release_level(release_level), m_serial(serial)
243+ private:
244+ Version (PyType *t) : PyTuple(t) {}
245+
246+ Version (PyInteger *major,
247+ PyInteger *minor,
248+ PyInteger *micro,
249+ PyString *release_level,
250+ PyInteger *serial)
251+ : PyTuple(s_sys_version, std::vector<Value>{ major, minor, micro, release_level, serial }),
252+ m_major (major), m_minor(minor), m_micro(micro), m_release_level(release_level),
253+ m_serial (serial)
248254 {}
249255
250256 public:
@@ -254,8 +260,14 @@ class Version : public PyBaseObject
254260 std::string release_level,
255261 uint8_t serial)
256262 {
263+ auto *major_obj = PyInteger::create (major).unwrap ();
264+ auto *minor_obj = PyInteger::create (minor).unwrap ();
265+ auto *micro_obj = PyInteger::create (micro).unwrap ();
266+ auto *release_level_obj = PyString::create (release_level).unwrap ();
267+ auto *serial_obj = PyInteger::create (serial).unwrap ();
268+
257269 auto *result = VirtualMachine::the ().heap ().allocate <Version>(
258- major, minor, micro, release_level, serial );
270+ major_obj, minor_obj, micro_obj, release_level_obj, serial_obj );
259271 if (!result) { return Err (memory_error (sizeof (Version))); }
260272 return Ok (result);
261273 }
@@ -264,11 +276,11 @@ class Version : public PyBaseObject
264276 {
265277 return fmt::format (
266278 " sys.version_info(major={}, minor={}, micro={}, releaselevel={}, serial={})" ,
267- m_major,
268- m_minor,
269- m_micro,
270- m_release_level,
271- m_serial);
279+ m_major ? m_major-> as_i64 () : 0 ,
280+ m_minor ? m_minor-> as_i64 () : 0 ,
281+ m_micro ? m_micro-> as_i64 () : 0 ,
282+ m_release_level ? m_release_level-> value () : " " ,
283+ m_serial ? m_major-> as_i64 () : 0 );
272284 }
273285
274286 PyResult<PyObject *> __repr__ () const { return PyString::create (to_string ()); }
@@ -282,7 +294,7 @@ class Version : public PyBaseObject
282294 static PyType *register_type (PyModule *module )
283295 {
284296 if (!s_sys_version) {
285- s_sys_version = klass<Version>(module , " version_info_ " )
297+ s_sys_version = klass<Version>(module , " version_info " , types::tuple () )
286298 .attribute_readonly (" major" , &Version::m_major)
287299 .attribute_readonly (" minor" , &Version::m_minor)
288300 .attribute_readonly (" micro" , &Version::m_micro)
0 commit comments