Просмотр исходного кода

meta, fix: meta_prop::next lazy initialization

Innokentiy Alaytsev 6 лет назад
Родитель
Сommit
6889edcfc4
2 измененных файлов с 22 добавлено и 1 удалено
  1. 2 1
      src/entt/meta/factory.hpp
  2. 20 0
      test/entt/meta/meta.cpp

+ 2 - 1
src/entt/meta/factory.hpp

@@ -730,7 +730,7 @@ class extended_meta_factory: public meta_factory<Type> {
         static auto property{std::make_tuple(std::forward<Key>(key), std::forward<Value>(value)...)};
 
         static internal::meta_prop_node node{
-            *curr,
+            nullptr,
             []() -> meta_any {
                 return std::get<0>(property);
             },
@@ -744,6 +744,7 @@ class extended_meta_factory: public meta_factory<Type> {
         };
 
         ENTT_ASSERT(!duplicate(node.key(), *curr));
+        node.next = *curr;
         *curr = &node;
     }
 

+ 20 - 0
test/entt/meta/meta.cpp

@@ -255,6 +255,11 @@ struct Meta: ::testing::Test {
     static void SetUpAfterUnregistration() {
         entt::meta<double>().conv<float>();
 
+        entt::meta<props>()
+                .data<props::prop_bool>("prop_bool"_hs)
+                    .prop(props::prop_int, 0)
+                    .prop(props::prop_value, 3);
+
         entt::meta<derived_type>()
                 .type("my_type"_hs)
                     .prop(props::prop_bool, false)
@@ -2094,3 +2099,18 @@ TEST_F(Meta, Reset) {
     ASSERT_TRUE(entt::resolve("your_type"_hs).func("a_member_function"_hs));
     ASSERT_FALSE(entt::resolve("your_type"_hs).func("another_member_function"_hs));
 }
+
+TEST_F(Meta, ReRegistrationAfterReset) {
+    ASSERT_TRUE(entt::resolve<props>().data("prop_bool"_hs).prop(props::prop_int));
+    ASSERT_TRUE(entt::resolve<props>().data("prop_bool"_hs).prop(props::prop_value));
+
+    entt::meta<double>().reset();
+    entt::meta<props>().reset();
+    entt::meta<derived_type>().reset();
+    entt::meta<another_abstract_type>().reset();
+
+    Meta::SetUpAfterUnregistration();
+
+    ASSERT_TRUE(entt::resolve<props>().data("prop_bool"_hs).prop(props::prop_int));
+    ASSERT_TRUE(entt::resolve<props>().data("prop_bool"_hs).prop(props::prop_value));
+}