From a9cefcb823a9ee05dbb836a54ef554bfa949e073 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Tue, 10 Aug 2021 16:07:17 +0200 Subject: [PATCH] meta: avoid risk of name clashing on meta types and meta data members --- src/entt/meta/factory.hpp | 15 +++++++++------ test/entt/meta/meta_data.cpp | 13 +++++++++++++ test/entt/meta/meta_type.cpp | 13 +++++++++++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/entt/meta/factory.hpp b/src/entt/meta/factory.hpp index 20ea504ae..c16ccae06 100644 --- a/src/entt/meta/factory.hpp +++ b/src/entt/meta/factory.hpp @@ -159,10 +159,11 @@ struct meta_factory { auto type(const id_type id = type_hash::value()) { auto * const node = internal::meta_info::resolve(); + meta_range range{*internal::meta_context::global()}; + ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id, node](const auto *curr) { return curr != node && curr->id == id; }) == range.cend(), "Duplicate identifier"); node->id = id; - if(meta_range range{*internal::meta_context::global()}; std::find(range.cbegin(), range.cend(), node) == range.cend()) { - ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id](const auto *curr) { return curr->id == id; }) == range.cend(), "Duplicate identifier"); + if(std::find(range.cbegin(), range.cend(), node) == range.cend()) { node->next = *internal::meta_context::global(); *internal::meta_context::global() = node; } @@ -411,10 +412,11 @@ struct meta_factory { &meta_getter }; + meta_range range{type->data}; + ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id](const auto *curr) { return curr != &node && curr->id == id; }) == range.cend(), "Duplicate identifier"); node.id = id; - if(meta_range range{type->data}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { - ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id](const auto *curr) { return curr->id == id; }) == range.cend(), "Duplicate identifier"); + if(std::find(range.cbegin(), range.cend(), &node) == range.cend()) { node.next = type->data; type->data = &node; } @@ -460,10 +462,11 @@ struct meta_factory { &meta_getter }; + meta_range range{type->data}; + ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id](const auto *curr) { return curr != &node && curr->id == id; }) == range.cend(), "Duplicate identifier"); node.id = id; - if(meta_range range{type->data}; std::find(range.cbegin(), range.cend(), &node) == range.cend()) { - ENTT_ASSERT(std::find_if(range.cbegin(), range.cend(), [id](const auto *curr) { return curr->id == id; }) == range.cend(), "Duplicate identifier"); + if(std::find(range.cbegin(), range.cend(), &node) == range.cend()) { node.next = type->data; type->data = &node; } diff --git a/test/entt/meta/meta_data.cpp b/test/entt/meta/meta_data.cpp index 52fb09d31..cd92b4389 100644 --- a/test/entt/meta/meta_data.cpp +++ b/test/entt/meta/meta_data.cpp @@ -515,3 +515,16 @@ TEST_F(MetaData, ReRegistration) { ASSERT_FALSE(type.data("value"_hs)); ASSERT_TRUE(type.data("field"_hs)); } + +TEST_F(MetaData, NameCollision) { + using namespace entt::literals; + + ASSERT_NO_FATAL_FAILURE(entt::meta().data<&clazz_t::j>("j"_hs)); + ASSERT_TRUE(entt::resolve().data("j"_hs)); + + ASSERT_NO_FATAL_FAILURE(entt::meta().data<&clazz_t::j>("cj"_hs)); + ASSERT_FALSE(entt::resolve().data("j"_hs)); + ASSERT_TRUE(entt::resolve().data("cj"_hs)); + + ASSERT_DEATH(entt::meta().data<&clazz_t::j>("i"_hs), ""); +} diff --git a/test/entt/meta/meta_type.cpp b/test/entt/meta/meta_type.cpp index 018be8107..4e7ac0fd7 100644 --- a/test/entt/meta/meta_type.cpp +++ b/test/entt/meta/meta_type.cpp @@ -640,3 +640,16 @@ TEST_F(MetaType, ReRegistration) { ASSERT_TRUE(entt::resolve("real"_hs)); ASSERT_TRUE(entt::resolve("real"_hs).data("var"_hs)); } + +TEST_F(MetaType, NameCollision) { + using namespace entt::literals; + + ASSERT_NO_FATAL_FAILURE(entt::meta().type("clazz"_hs)); + ASSERT_TRUE(entt::resolve("clazz"_hs)); + + ASSERT_NO_FATAL_FAILURE(entt::meta().type("quux"_hs)); + ASSERT_FALSE(entt::resolve("clazz"_hs)); + ASSERT_TRUE(entt::resolve("quux"_hs)); + + ASSERT_DEATH(entt::meta().type("abstract"_hs), ""); +}