Skip to content

Commit 664853d

Browse files
committed
Runtime: Fixed sys.version_info type
Inherits from tuple now
1 parent 45ff15f commit 664853d

1 file changed

Lines changed: 30 additions & 18 deletions

File tree

src/runtime/modules/SysModule.cpp

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)