Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ project_options(

# TODO: Address all the warning below. This should be only temporary...
target_compile_options(project_warnings
INTERFACE $<$<COMPILE_LANGUAGE:CXX>:-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 $<$<COMPILE_LANGUAGE:CXX>:-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(
Expand Down
1 change: 1 addition & 0 deletions src/executable/bytecode/serialization/deserialize.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "forward.hpp"
#include "runtime/Value.hpp"
#include "serialize.hpp"
#include "utilities.hpp"

#include <span>
#include <string>
Expand Down
108 changes: 58 additions & 50 deletions src/executable/bytecode/serialization/serialize.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#pragma once

#include "runtime/PyTuple.hpp"
#include "utilities.hpp"

#include <cstdint>
#include <string>
#include <vector>

Expand Down Expand Up @@ -37,12 +39,12 @@ enum class ValueType {

template<typename T> inline void serialize(const T &value, std::vector<uint8_t> &result)
{
result.reserve(result.size() + sizeof(T));
for (size_t i = 0; i < sizeof(T); ++i) {
result.push_back(reinterpret_cast<const uint8_t *>(&value)[i]);
}
auto *data = bit_cast<const uint8_t *>(&value);
result.insert(result.end(), data, data + sizeof(T));
}

template<> inline void serialize<Value>(const Value &value, std::vector<uint8_t> &result);

template<> inline void serialize<bool>(const bool &value, std::vector<uint8_t> &result)
{
result.push_back(value ? 1 : 0);
Expand All @@ -67,56 +69,62 @@ inline void serialize(const VectorType &value, std::vector<uint8_t> &result)
for (const auto &el : value) { serialize(el, result); }
}

template<> inline void serialize<Tuple>(const Tuple &value, std::vector<uint8_t> &result)
{
serialize(value.elements.size(), result);
for (const auto &el : value.elements) { serialize(el, result); }
}

template<> inline void serialize<PyTuple *>(PyTuple *const &value, std::vector<uint8_t> &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<uint8_t>(ValueType::INT64), result);
serialize(int_value, result);
},
[&](const double &v) {
serialize(static_cast<uint8_t>(ValueType::F64), result);
serialize(v, result);
},
for (const auto &el : value->elements()) { serialize(el, result); }
}

template<> inline void serialize<Value>(const Value &value, std::vector<uint8_t> &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<uint8_t>(ValueType::INT64), result);
serialize(int_value, result);
},
[&](const double &v) {
serialize(static_cast<uint8_t>(ValueType::F64), result);
serialize(v, result);
},
val.value);
},
[&](const String &val) {
serialize(static_cast<uint8_t>(ValueType::STRING), result);
serialize(val.s, result);
},
[&](const Bytes &bytes) {
serialize(static_cast<uint8_t>(ValueType::BYTES), result);
serialize(bytes.b, result);
},
[&](const Ellipsis &) {
serialize(static_cast<uint8_t>(ValueType::ELLIPSIS), result);
},
[&](const NameConstant &val) {
std::visit(overloaded{ [&](const bool &v) {
serialize(
static_cast<uint8_t>(ValueType::BOOL), result);
serialize(v, result);
},
[&](const NoneType &) {
serialize(static_cast<uint8_t>(ValueType::NONE), result);
} },
val.value);
},
[&](const Tuple &tuple) {
serialize(static_cast<uint8_t>(ValueType::TUPLE), result);
serialize(tuple.elements, result);
},
[&](PyObject *const &) { TODO(); },
},
val.value);
},
[&](const String &val) {
serialize(static_cast<uint8_t>(ValueType::STRING), result);
serialize(val.s, result);
},
[&](const Bytes &bytes) {
serialize(static_cast<uint8_t>(ValueType::BYTES), result);
serialize(bytes.b, result);
},
[&](const Ellipsis &) { serialize(static_cast<uint8_t>(ValueType::ELLIPSIS), result); },
[&](const NameConstant &val) {
std::visit(overloaded{ [&](const bool &v) {
serialize(static_cast<uint8_t>(ValueType::BOOL), result);
serialize(v, result);
},
[&](const NoneType &) {
serialize(static_cast<uint8_t>(ValueType::NONE), result);
} },
val.value);
},
[&](const Tuple &tuple) {
serialize(static_cast<uint8_t>(ValueType::TUPLE), result);
serialize(tuple, result);
},
el);
}// namespace py
[&](PyObject *const &) { TODO(); },
},
value);
}
}// namespace py
Loading