From 5a76241644612f45c1ee8f21c42857f447ac972a Mon Sep 17 00:00:00 2001 From: gf712 Date: Mon, 22 Dec 2025 10:34:16 +0000 Subject: [PATCH] bytecode: fix const serialisation Nested tuples were not being serialised properly, they were just serialised as bytes, which does not work with nested tuples and strings. --- CMakeLists.txt | 2 +- .../bytecode/serialization/deserialize.hpp | 1 + .../bytecode/serialization/serialize.hpp | 108 ++++++++++-------- 3 files changed, 60 insertions(+), 51 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61fd6e5..2754d48 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,7 +74,7 @@ project_options( # TODO: Address all the warning below. This should be only temporary... target_compile_options(project_warnings - INTERFACE $<$:-Wno-sign-conversion;-Wno-shadow;-Wno-implicit-fallthrough;-Wno-old-style-cast;-Wno-deprecated-copy;-Wno-missing-field-initializers;-Wno-null-dereference;-Wno-maybe-uninitialized> + INTERFACE $<$:-Wno-sign-conversion;-Wno-shadow;-Wno-implicit-fallthrough;-Wno-old-style-cast;-Wno-deprecated-copy;-Wno-missing-field-initializers;-Wno-null-dereference;-Wno-maybe-uninitialized;-Wno-stringop-overflow> ) check_cxx_source_compiles( diff --git a/src/executable/bytecode/serialization/deserialize.hpp b/src/executable/bytecode/serialization/deserialize.hpp index 2d1d71b..65e2858 100644 --- a/src/executable/bytecode/serialization/deserialize.hpp +++ b/src/executable/bytecode/serialization/deserialize.hpp @@ -3,6 +3,7 @@ #include "forward.hpp" #include "runtime/Value.hpp" #include "serialize.hpp" +#include "utilities.hpp" #include #include diff --git a/src/executable/bytecode/serialization/serialize.hpp b/src/executable/bytecode/serialization/serialize.hpp index 2d2fd7a..94c8c4e 100644 --- a/src/executable/bytecode/serialization/serialize.hpp +++ b/src/executable/bytecode/serialization/serialize.hpp @@ -1,7 +1,9 @@ #pragma once #include "runtime/PyTuple.hpp" +#include "utilities.hpp" +#include #include #include @@ -37,12 +39,12 @@ enum class ValueType { template inline void serialize(const T &value, std::vector &result) { - result.reserve(result.size() + sizeof(T)); - for (size_t i = 0; i < sizeof(T); ++i) { - result.push_back(reinterpret_cast(&value)[i]); - } + auto *data = bit_cast(&value); + result.insert(result.end(), data, data + sizeof(T)); } +template<> inline void serialize(const Value &value, std::vector &result); + template<> inline void serialize(const bool &value, std::vector &result) { result.push_back(value ? 1 : 0); @@ -67,56 +69,62 @@ inline void serialize(const VectorType &value, std::vector &result) for (const auto &el : value) { serialize(el, result); } } +template<> inline void serialize(const Tuple &value, std::vector &result) +{ + serialize(value.elements.size(), result); + for (const auto &el : value.elements) { serialize(el, result); } +} + template<> inline void serialize(PyTuple *const &value, std::vector &result) { serialize(value->size(), result); - for (const auto &el : value->elements()) { - std::visit( - overloaded{ - [&](const Number &val) { - std::visit(overloaded{ - [&](const BigIntType &v) { - ASSERT(v.fits_ulong_p()); - const auto int_value = v.get_ui(); - serialize(static_cast(ValueType::INT64), result); - serialize(int_value, result); - }, - [&](const double &v) { - serialize(static_cast(ValueType::F64), result); - serialize(v, result); - }, + for (const auto &el : value->elements()) { serialize(el, result); } +} + +template<> inline void serialize(const Value &value, std::vector &result) +{ + std::visit( + overloaded{ + [&](const Number &val) { + std::visit(overloaded{ + [&](const BigIntType &v) { + ASSERT(v.fits_ulong_p()); + const auto int_value = v.get_ui(); + serialize(static_cast(ValueType::INT64), result); + serialize(int_value, result); + }, + [&](const double &v) { + serialize(static_cast(ValueType::F64), result); + serialize(v, result); }, - val.value); - }, - [&](const String &val) { - serialize(static_cast(ValueType::STRING), result); - serialize(val.s, result); - }, - [&](const Bytes &bytes) { - serialize(static_cast(ValueType::BYTES), result); - serialize(bytes.b, result); - }, - [&](const Ellipsis &) { - serialize(static_cast(ValueType::ELLIPSIS), result); - }, - [&](const NameConstant &val) { - std::visit(overloaded{ [&](const bool &v) { - serialize( - static_cast(ValueType::BOOL), result); - serialize(v, result); - }, - [&](const NoneType &) { - serialize(static_cast(ValueType::NONE), result); - } }, - val.value); - }, - [&](const Tuple &tuple) { - serialize(static_cast(ValueType::TUPLE), result); - serialize(tuple.elements, result); - }, - [&](PyObject *const &) { TODO(); }, + }, + val.value); + }, + [&](const String &val) { + serialize(static_cast(ValueType::STRING), result); + serialize(val.s, result); + }, + [&](const Bytes &bytes) { + serialize(static_cast(ValueType::BYTES), result); + serialize(bytes.b, result); + }, + [&](const Ellipsis &) { serialize(static_cast(ValueType::ELLIPSIS), result); }, + [&](const NameConstant &val) { + std::visit(overloaded{ [&](const bool &v) { + serialize(static_cast(ValueType::BOOL), result); + serialize(v, result); + }, + [&](const NoneType &) { + serialize(static_cast(ValueType::NONE), result); + } }, + val.value); + }, + [&](const Tuple &tuple) { + serialize(static_cast(ValueType::TUPLE), result); + serialize(tuple, result); }, - el); - }// namespace py + [&](PyObject *const &) { TODO(); }, + }, + value); } }// namespace py