Sivelkiria Operating System repository

Commit 35f88a9e authored by Dmitry Baskakov's avatar Dmitry Baskakov
Browse files

Merge branch 'test-kernel-interfaces' into 'master'

Fix tests for kernel interfaces

See merge request !82
1 merge request!82Fix tests for kernel interfaces
Showing with 248 additions and 118 deletions
+248 -118
......@@ -164,6 +164,7 @@ namespace sivelkiria::kernel::data_pack {
$tree_by_handle_enum_key->add_numerical_variant($field_set->get_type()->get_handle(), $field_set, '::sivdk::value_type_handle::' . $field_set->get_type()->get_handle_enum_key());
$tree_by_type_index->add_numerical_variant($index, $field_set);
}
$tree_by_handle_enum_key->add_string_variant(bcsub(bcpow('2', '64'), '1'), null, '::sivdk::value_type_handle::invalid');
?><?= $template_line ?>
template <size_type container_index, typename allocated_data_tuple>
......@@ -183,7 +184,10 @@ namespace sivelkiria::kernel::data_pack {
cpp_if_tree_printer::get(),
2,
'reader.get_type()',
function(dynamic_structure_field_set $fields, int $offset) {
function(?dynamic_structure_field_set $fields, int $offset) {
if (!$fields)
return 'value.m_data = std::nullopt;';
$tabs = offset($offset);
?><?= $tabs ?>value.m_data = subtypes::<?= $fields->get_type()->get_handle_enum_key() ?>__fields{};
......@@ -198,7 +202,12 @@ namespace sivelkiria::kernel::data_pack {
else
{
?><?= $tabs ?>auto& fields = std::get<typename subtypes::<?= $fields->get_type()->get_handle_enum_key() ?>__fields>(*value.m_data);
<?= $tabs ?>auto* const caches = cache ? &std::get<typename subtypes::<?= $fields->get_type()->get_handle_enum_key() ?>__cache>(*cache) : nullptr;
<?= $tabs ?>typename subtypes::<?= $fields->get_type()->get_handle_enum_key() ?>__cache* caches = nullptr;
<?= $tabs ?>if (cache)
<?= $tabs ?>{
<?= $tabs ?> *static_cast<subtypes::cache*>(cache) = typename subtypes::<?= $fields->get_type()->get_handle_enum_key() ?>__cache{};
<?= $tabs ?> caches = &std::get<typename subtypes::<?= $fields->get_type()->get_handle_enum_key() ?>__cache>(*cache);
<?= $tabs ?>}
<?php
}
......@@ -247,12 +256,14 @@ namespace sivelkiria::kernel::data_pack {
bool <?= $scope_prefix ?>extract_value(exception_value& error, const data_pack_type* pack, pack_field_const_iterator position,
kernel_side_type& value, [[maybe_unused]] domain_base* caller, [[maybe_unused]] domain_base* callee, domain_base* source)
{
dynamic_structure_reader reader(pack, position);
if (!reader.is_valid())
if (!value.m_data)
{
source->raise_parameter_data_unavailable(error);
return false;
return true;
}
dynamic_structure_reader reader(pack, position, &error, source);
if (!reader.is_valid())
return false;
[[maybe_unused]] auto field = reader.get_fields();
<?php
......@@ -479,6 +490,7 @@ namespace sivelkiria::kernel::data_pack {
$tree_by_type_index->add_numerical_variant($index, $field_set);
$has_present_fields_tree->add_numerical_variant($index, $field_set->has_present_fields());
}
$tree_by_handle_enum_key->add_string_variant(bcsub(bcpow('2', '64'), '1'), null, '::sivdk::value_type_handle::invalid');
?><?= $template_line ?>
......@@ -486,12 +498,9 @@ namespace sivelkiria::kernel::data_pack {
pack_field_const_iterator parameter, const data_pack* pack,
domain_base* owner, exception_value& error, [[maybe_unused]] bool changeable)
{
dynamic_structure_reader reader(pack, parameter);
dynamic_structure_reader reader(pack, parameter, &error, owner);
if (!reader.is_valid())
{
owner->raise_parameter_data_unavailable(error);
return false;
}
[[maybe_unused]] auto field = reader.get_fields();
<?php
......@@ -513,7 +522,10 @@ namespace sivelkiria::kernel::data_pack {
cpp_if_tree_printer::get(),
2,
'reader.get_type()',
function(dynamic_structure_field_set $fields, int $offset) {
function(?dynamic_structure_field_set $fields, int $offset) {
if (!$fields)
return '// No containers to use';
$tabs = offset($offset);
$remaining_fields = $fields->count_present_fields();
if (!$remaining_fields)
......@@ -710,7 +722,10 @@ namespace sivelkiria::kernel::data_pack {
cpp_if_tree_printer::get(),
2,
'reader.get_type()',
function(dynamic_structure_field_set $fields, int $offset) {
function(?dynamic_structure_field_set $fields, int $offset) {
if (!$fields)
return '// No fields to release';
$tabs = offset($offset);
if (!$fields->has_present_fields())
return '// No fields to release';
......
......@@ -8,6 +8,7 @@ require_once(dirname(__FILE__) . '/../types/type_resolver.php');
require_once(dirname(__FILE__) . '/../types/type_kind.php');
require_once(dirname(__FILE__) . '/../types/structure_info.php');
require_once(dirname(__FILE__) . '/../cpp/type_utils.php');
require_once(dirname(__FILE__) . '/../cpp/code_utils.php');
require_once(dirname(__FILE__) . '/kernel_reference_list.php');
require_once(dirname(__FILE__) . '/type_utils.php');
require_once(dirname(__FILE__) . '/../utils/search_tree_generator.php');
......@@ -22,6 +23,7 @@ use \sivelkiria\generator\cpp\type_reference_list;
use \sivelkiria\generator\cpp\cpp_if_tree_printer;
use \sivelkiria\generator\utils\search_tree_generator;
use function \sivelkiria\generator\cpp\is_unbound;
use function \sivelkiria\generator\cpp\offset;
/**
* A handler that generates shared code that prepares reading the dynamic structure.
......@@ -88,7 +90,7 @@ final class dynamic_structure_reader_generator extends code_generator
?>
namespace sivelkiria::kernel::data_pack {
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header)
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error, domain_base* owner)
: m_valid(false)
{
module_pointer structure_body;
......@@ -124,7 +126,25 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
$tree->add_numerical_variant($handle, $field_count, $handle_value);
}
$tree->print(cpp_if_tree_printer::get(), 1, 'm_type', function (string $count, int $offset) { return "field_count = $count;"; }, function (int $offset) { return 'return;'; });
$tree->print(
cpp_if_tree_printer::get(),
1,
'm_type',
function (string $count, int $offset)
{
return "field_count = $count;";
},
function (int $offset)
{
$tabs = offset($offset);
?><?= $tabs ?>if (error)
<?= $tabs ?>{
<?= $tabs ?> owner->raise_invalid_value_type_parameter(*error);
<?= $tabs ?> return;
<?= $tabs ?>}
<?php
}
);
?>
......@@ -138,6 +158,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
.template with_record_size<sizeof(handle_type)>();
m_valid = m_fields;
}
if (!m_valid && error)
{
owner->raise_parameter_data_unavailable(*error);
}
}
} // namespace sivelkiria::kernel::data_pack
......
......@@ -3,19 +3,18 @@
#include <sivkernel/data_pack/pack_iterators.h>
#include <sivkernel/data_pack/data_pack.h>
#include <sivkernel/object_value.h>
namespace sivelkiria::kernel::data_pack {
class dynamic_structure_reader
{
public:
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header);
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error = nullptr, domain_base* owner = nullptr);
bool is_valid() const
{
if (m_type == sivdk::value_type_handle::invalid)
return true;
return m_fields;
return m_valid;
}
sivdk::value_type_handle get_type() const
{
......
......@@ -3,19 +3,18 @@
#include <sivkernel/data_pack/pack_iterators.h>
#include <sivkernel/data_pack/data_pack.h>
#include <sivkernel/object_value.h>
namespace sivelkiria::kernel::data_pack {
class dynamic_structure_reader
{
public:
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header);
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error = nullptr, domain_base* owner = nullptr);
bool is_valid() const
{
if (m_type == sivdk::value_type_handle::invalid)
return true;
return m_fields;
return m_valid;
}
sivdk::value_type_handle get_type() const
{
......
......@@ -3,7 +3,7 @@
namespace sivelkiria::kernel::data_pack {
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header)
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error, domain_base* owner)
: m_valid(false)
{
module_pointer structure_body;
......@@ -15,7 +15,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
}
size_type field_count = 0;
return;
if (error)
{
owner->raise_invalid_value_type_parameter(*error);
return;
}
if (field_count == 0)
{
......@@ -27,6 +31,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
.template with_record_size<sizeof(handle_type)>();
m_valid = m_fields;
}
if (!m_valid && error)
{
owner->raise_parameter_data_unavailable(*error);
}
}
} // namespace sivelkiria::kernel::data_pack
......
......@@ -3,19 +3,18 @@
#include <sivkernel/data_pack/pack_iterators.h>
#include <sivkernel/data_pack/data_pack.h>
#include <sivkernel/object_value.h>
namespace sivelkiria::kernel::data_pack {
class dynamic_structure_reader
{
public:
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header);
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error = nullptr, domain_base* owner = nullptr);
bool is_valid() const
{
if (m_type == sivdk::value_type_handle::invalid)
return true;
return m_fields;
return m_valid;
}
sivdk::value_type_handle get_type() const
{
......
......@@ -28,7 +28,12 @@ namespace sivelkiria::kernel::data_pack {
{
value.m_data = subtypes::graphics__drawing_operation__fields{};
auto& fields = std::get<typename subtypes::graphics__drawing_operation__fields>(*value.m_data);
auto* const caches = cache ? &std::get<typename subtypes::graphics__drawing_operation__cache>(*cache) : nullptr;
typename subtypes::graphics__drawing_operation__cache* caches = nullptr;
if (cache)
{
*static_cast<subtypes::cache*>(cache) = typename subtypes::graphics__drawing_operation__cache{};
caches = &std::get<typename subtypes::graphics__drawing_operation__cache>(*cache);
}
constexpr auto graphics__drawing_operation__name_containers_offset = 0;
sivdk_type_traits<::std::u16string, void>::kernel_side_container_sizes graphics__drawing_operation__name_sizes = common::tuple_slice<graphics__drawing_operation__name_containers_offset, std::tuple_size<sivdk_type_traits<::std::u16string, void>::kernel_side_dynamic_data_types>::value>(sizes);
......@@ -71,7 +76,12 @@ namespace sivelkiria::kernel::data_pack {
{
value.m_data = subtypes::graphics__line__fields{};
auto& fields = std::get<typename subtypes::graphics__line__fields>(*value.m_data);
auto* const caches = cache ? &std::get<typename subtypes::graphics__line__cache>(*cache) : nullptr;
typename subtypes::graphics__line__cache* caches = nullptr;
if (cache)
{
*static_cast<subtypes::cache*>(cache) = typename subtypes::graphics__line__cache{};
caches = &std::get<typename subtypes::graphics__line__cache>(*cache);
}
constexpr auto graphics__drawing_operation__name_containers_offset = 0;
sivdk_type_traits<::std::u16string, void>::kernel_side_container_sizes graphics__drawing_operation__name_sizes = common::tuple_slice<graphics__drawing_operation__name_containers_offset, std::tuple_size<sivdk_type_traits<::std::u16string, void>::kernel_side_dynamic_data_types>::value>(sizes);
......@@ -172,7 +182,14 @@ namespace sivelkiria::kernel::data_pack {
}
else
{
return false;
if (reader.get_type() < ::sivdk::value_type_handle::invalid)
{
return false;
}
else
{
value.m_data = std::nullopt;
}
}
}
......@@ -183,12 +200,14 @@ namespace sivelkiria::kernel::data_pack {
bool sivdk_type_traits<::sivelkiria::kernel::types::graphics::drawing_operation, void>::extract_value(exception_value& error, const data_pack_type* pack, pack_field_const_iterator position,
kernel_side_type& value, [[maybe_unused]] domain_base* caller, [[maybe_unused]] domain_base* callee, domain_base* source)
{
dynamic_structure_reader reader(pack, position);
if (!reader.is_valid())
if (!value.m_data)
{
source->raise_parameter_data_unavailable(error);
return false;
return true;
}
dynamic_structure_reader reader(pack, position, &error, source);
if (!reader.is_valid())
return false;
[[maybe_unused]] auto field = reader.get_fields();
if (value.m_data->index() < 1)
......@@ -415,17 +434,22 @@ namespace sivelkiria::kernel::data_pack {
return false;
[[maybe_unused]] auto field = reader.get_fields();
if (reader.get_type() < ::sivdk::value_type_handle::graphics__line)
{
return false;
}
else
if (reader.get_type() <= ::sivdk::value_type_handle::graphics__line)
{
if (reader.get_type() <= ::sivdk::value_type_handle::graphics__line)
if (reader.get_type() < ::sivdk::value_type_handle::graphics__line)
{
return false;
}
else
{
value.m_data = subtypes::graphics__line__fields{};
auto& fields = std::get<typename subtypes::graphics__line__fields>(*value.m_data);
auto* const caches = cache ? &std::get<typename subtypes::graphics__line__cache>(*cache) : nullptr;
typename subtypes::graphics__line__cache* caches = nullptr;
if (cache)
{
*static_cast<subtypes::cache*>(cache) = typename subtypes::graphics__line__cache{};
caches = &std::get<typename subtypes::graphics__line__cache>(*cache);
}
constexpr auto graphics__drawing_operation__name_containers_offset = 0;
sivdk_type_traits<::std::u16string, void>::kernel_side_container_sizes graphics__drawing_operation__name_sizes = common::tuple_slice<graphics__drawing_operation__name_containers_offset, std::tuple_size<sivdk_type_traits<::std::u16string, void>::kernel_side_dynamic_data_types>::value>(sizes);
......@@ -524,10 +548,17 @@ namespace sivelkiria::kernel::data_pack {
return false;
sizes = std::tuple_cat(common::tuple_slice<0, graphics__line__parallel_count_containers_offset>(sizes), graphics__line__parallel_count_sizes, common::tuple_slice<graphics__line__parallel_count_containers_offset + std::tuple_size<sivdk_type_traits<uint64_t, void>::kernel_side_dynamic_data_types>::value, std::tuple_size<kernel_side_container_sizes>::value - graphics__line__parallel_count_containers_offset - std::tuple_size<sivdk_type_traits<uint64_t, void>::kernel_side_dynamic_data_types>::value>(sizes));
}
else
}
else
{
if (reader.get_type() < ::sivdk::value_type_handle::invalid)
{
return false;
}
else
{
value.m_data = std::nullopt;
}
}
return true;
......@@ -537,12 +568,14 @@ namespace sivelkiria::kernel::data_pack {
bool sivdk_type_traits<::sivelkiria::kernel::types::graphics::line, void>::extract_value(exception_value& error, const data_pack_type* pack, pack_field_const_iterator position,
kernel_side_type& value, [[maybe_unused]] domain_base* caller, [[maybe_unused]] domain_base* callee, domain_base* source)
{
dynamic_structure_reader reader(pack, position);
if (!reader.is_valid())
if (!value.m_data)
{
source->raise_parameter_data_unavailable(error);
return false;
return true;
}
dynamic_structure_reader reader(pack, position, &error, source);
if (!reader.is_valid())
return false;
[[maybe_unused]] auto field = reader.get_fields();
if (value.m_data->index() <= 0)
......
......@@ -6,7 +6,7 @@
namespace sivelkiria::kernel::data_pack {
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header)
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error, domain_base* owner)
: m_valid(false)
{
module_pointer structure_body;
......@@ -22,7 +22,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
{
if (m_type < sivdk::value_type_handle::graphics__drawing_operation)
{
return;
if (error)
{
owner->raise_invalid_value_type_parameter(*error);
return;
}
}
else
{
......@@ -37,7 +41,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
}
else
{
return;
if (error)
{
owner->raise_invalid_value_type_parameter(*error);
return;
}
}
}
......@@ -51,6 +59,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
.template with_record_size<sizeof(handle_type)>();
m_valid = m_fields;
}
if (!m_valid && error)
{
owner->raise_parameter_data_unavailable(*error);
}
}
} // namespace sivelkiria::kernel::data_pack
......
......@@ -6,12 +6,9 @@ namespace sivelkiria::kernel::data_pack {
pack_field_const_iterator parameter, const data_pack* pack,
domain_base* owner, exception_value& error, [[maybe_unused]] bool changeable)
{
dynamic_structure_reader reader(pack, parameter);
dynamic_structure_reader reader(pack, parameter, &error, owner);
if (!reader.is_valid())
{
owner->raise_parameter_data_unavailable(error);
return false;
}
[[maybe_unused]] auto field = reader.get_fields();
typename sivdk_type_traits<::std::u16string, void>::kernel_side_container_sizes name_graphics__drawing_operation_container_sizes;
......@@ -129,8 +126,15 @@ namespace sivelkiria::kernel::data_pack {
}
else
{
owner->raise_invalid_value_type_parameter(error);
return false;
if (reader.get_type() < ::sivdk::value_type_handle::invalid)
{
owner->raise_invalid_value_type_parameter(error);
return false;
}
else
{
// No containers to use
}
}
}
......@@ -343,47 +347,57 @@ namespace sivelkiria::kernel::data_pack {
return;
[[maybe_unused]] auto field = reader.get_fields();
if (reader.get_type() == ::sivdk::value_type_handle::graphics__drawing_operation)
if (reader.get_type() < ::sivdk::value_type_handle::graphics__line)
{
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<uint64_t, void>::release_unparsed_handles(field, pack, owner);
if (reader.get_type() == ::sivdk::value_type_handle::graphics__drawing_operation)
{
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<uint64_t, void>::release_unparsed_handles(field, pack, owner);
}
}
else if (reader.get_type() == ::sivdk::value_type_handle::graphics__line)
else
{
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<uint64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<uint64_t, void>::module_side_field_count;
sivdk_type_traits<int64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<int64_t, void>::module_side_field_count;
sivdk_type_traits<int64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<int64_t, void>::module_side_field_count;
sivdk_type_traits<int64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<int64_t, void>::module_side_field_count;
sivdk_type_traits<int64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<int64_t, void>::module_side_field_count;
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<uint64_t, void>::release_unparsed_handles(field, pack, owner);
if (reader.get_type() == ::sivdk::value_type_handle::graphics__line)
{
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<uint64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<uint64_t, void>::module_side_field_count;
sivdk_type_traits<int64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<int64_t, void>::module_side_field_count;
sivdk_type_traits<int64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<int64_t, void>::module_side_field_count;
sivdk_type_traits<int64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<int64_t, void>::module_side_field_count;
sivdk_type_traits<int64_t, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<int64_t, void>::module_side_field_count;
sivdk_type_traits<::std::u16string, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<::std::u16string, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<double, void>::release_unparsed_handles(field, pack, owner);
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<uint64_t, void>::release_unparsed_handles(field, pack, owner);
}
else if (reader.get_type() == ::sivdk::value_type_handle::invalid)
{
// No fields to release
}
}
}
......@@ -691,12 +705,9 @@ namespace sivelkiria::kernel::data_pack {
pack_field_const_iterator parameter, const data_pack* pack,
domain_base* owner, exception_value& error, [[maybe_unused]] bool changeable)
{
dynamic_structure_reader reader(pack, parameter);
dynamic_structure_reader reader(pack, parameter, &error, owner);
if (!reader.is_valid())
{
owner->raise_parameter_data_unavailable(error);
return false;
}
[[maybe_unused]] auto field = reader.get_fields();
typename sivdk_type_traits<::std::u16string, void>::kernel_side_container_sizes name_graphics__drawing_operation_container_sizes;
......@@ -741,14 +752,14 @@ namespace sivelkiria::kernel::data_pack {
typename sivdk_type_traits<uint64_t, void>::kernel_side_container_sizes parallel_count_graphics__line_container_sizes;
common::tuple_fill(parallel_count_graphics__line_container_sizes, 0);
if (reader.get_type() < ::sivdk::value_type_handle::graphics__line)
if (reader.get_type() <= ::sivdk::value_type_handle::graphics__line)
{
owner->raise_invalid_value_type_parameter(error);
return false;
}
else
{
if (reader.get_type() <= ::sivdk::value_type_handle::graphics__line)
if (reader.get_type() < ::sivdk::value_type_handle::graphics__line)
{
owner->raise_invalid_value_type_parameter(error);
return false;
}
else
{
if (!sivdk_type_traits<::std::u16string, void>::calculate_kernel_side_container_sizes(name_graphics__drawing_operation_container_sizes, field, pack, owner, error, changeable))
return false;
......@@ -792,11 +803,18 @@ namespace sivelkiria::kernel::data_pack {
if (!sivdk_type_traits<uint64_t, void>::calculate_kernel_side_container_sizes(parallel_count_graphics__line_container_sizes, field, pack, owner, error, changeable))
return false;
}
else
}
else
{
if (reader.get_type() < ::sivdk::value_type_handle::invalid)
{
owner->raise_invalid_value_type_parameter(error);
return false;
}
else
{
// No containers to use
}
}
sizes = std::tuple_cat(name_graphics__drawing_operation_container_sizes, quality_graphics__drawing_operation_container_sizes, speed_graphics__drawing_operation_container_sizes, description_graphics__drawing_operation_container_sizes, repeats_graphics__drawing_operation_container_sizes, x0_graphics__line_container_sizes, y0_graphics__line_container_sizes, x1_graphics__line_container_sizes, y1_graphics__line_container_sizes, color_graphics__line_container_sizes, thickness_graphics__line_container_sizes, dash_graphics__line_container_sizes, opacity_graphics__line_container_sizes, parallel_count_graphics__line_container_sizes);
......@@ -983,6 +1001,10 @@ namespace sivelkiria::kernel::data_pack {
field += sivdk_type_traits<double, void>::module_side_field_count;
sivdk_type_traits<uint64_t, void>::release_unparsed_handles(field, pack, owner);
}
else if (reader.get_type() == ::sivdk::value_type_handle::invalid)
{
// No fields to release
}
}
void sivdk_type_traits<::sivelkiria::kernel::types::graphics::line, void>::release_caller_side_objects(kernel_side_type& value, [[maybe_unused]] domain_base* caller)
......
......@@ -3,19 +3,18 @@
#include <sivkernel/data_pack/pack_iterators.h>
#include <sivkernel/data_pack/data_pack.h>
#include <sivkernel/object_value.h>
namespace sivelkiria::kernel::data_pack {
class dynamic_structure_reader
{
public:
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header);
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error = nullptr, domain_base* owner = nullptr);
bool is_valid() const
{
if (m_type == sivdk::value_type_handle::invalid)
return true;
return m_fields;
return m_valid;
}
sivdk::value_type_handle get_type() const
{
......
......@@ -3,7 +3,7 @@
namespace sivelkiria::kernel::data_pack {
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header)
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error, domain_base* owner)
: m_valid(false)
{
module_pointer structure_body;
......@@ -15,7 +15,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
}
size_type field_count = 0;
return;
if (error)
{
owner->raise_invalid_value_type_parameter(*error);
return;
}
if (field_count == 0)
{
......@@ -27,6 +31,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
.template with_record_size<sizeof(handle_type)>();
m_valid = m_fields;
}
if (!m_valid && error)
{
owner->raise_parameter_data_unavailable(*error);
}
}
} // namespace sivelkiria::kernel::data_pack
......
......@@ -3,19 +3,18 @@
#include <sivkernel/data_pack/pack_iterators.h>
#include <sivkernel/data_pack/data_pack.h>
#include <sivkernel/object_value.h>
namespace sivelkiria::kernel::data_pack {
class dynamic_structure_reader
{
public:
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header);
dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error = nullptr, domain_base* owner = nullptr);
bool is_valid() const
{
if (m_type == sivdk::value_type_handle::invalid)
return true;
return m_fields;
return m_valid;
}
sivdk::value_type_handle get_type() const
{
......
......@@ -3,7 +3,7 @@
namespace sivelkiria::kernel::data_pack {
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header)
dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_field_const_iterator header, exception_value* error, domain_base* owner)
: m_valid(false)
{
module_pointer structure_body;
......@@ -15,7 +15,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
}
size_type field_count = 0;
return;
if (error)
{
owner->raise_invalid_value_type_parameter(*error);
return;
}
if (field_count == 0)
{
......@@ -27,6 +31,11 @@ dynamic_structure_reader::dynamic_structure_reader(const data_pack* data, pack_f
.template with_record_size<sizeof(handle_type)>();
m_valid = m_fields;
}
if (!m_valid && error)
{
owner->raise_parameter_data_unavailable(*error);
}
}
} // namespace sivelkiria::kernel::data_pack
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment