fix: reopening table implicitly defined by aot

This commit is contained in:
ToruNiina
2023-02-12 02:55:03 +09:00
parent 72789dca42
commit f9b224c222

View File

@@ -1305,6 +1305,8 @@ std::string format_dotted_keys(InputIterator first, const InputIterator last)
// forward decl for is_valid_forward_table_definition
result<std::pair<std::vector<key>, region>, std::string>
parse_table_key(location& loc);
result<std::pair<std::vector<key>, region>, std::string>
parse_array_table_key(location& loc);
template<typename Value>
result<std::pair<typename Value::table_type, region>, std::string>
parse_inline_table(location& loc);
@@ -1420,6 +1422,21 @@ bool is_valid_forward_table_definition(const Value& fwd, const Value& inserting,
// the keys are not equivalent. it is allowed.
return true;
}
// nested array-of-table definition implicitly defines tables.
// those tables can be reopened.
if(const auto atabkeys = parse_array_table_key(def))
{
// table keys always contains all the nodes from the root.
const auto& tks = atabkeys.unwrap().first;
if(std::size_t(std::distance(key_first, key_last)) == tks.size() &&
std::equal(tks.begin(), tks.end(), key_first))
{
// the keys are equivalent. it is not allowed.
return false;
}
// the keys are not equivalent. it is allowed.
return true;
}
if(const auto dotkeys = parse_key(def)) // a.b.c = "foo"
{
// consider the following case.