diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index 51d875f61..5b6105b1b 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -835,7 +835,7 @@ struct meta_data { */ template bool set(meta_handle instance, Type &&value) const { - return node->set && node->set(std::move(instance), std::forward(value)); + return node->set && node->set(std::move(instance), meta_any{*ctx, std::forward(value)}); } /** @@ -975,7 +975,7 @@ struct meta_func { */ template meta_any invoke(meta_handle instance, Args &&...args) const { - meta_any arguments[sizeof...(Args) + 1u]{std::forward(args)...}; + meta_any arguments[sizeof...(Args) + 1u]{{*ctx, std::forward(args)}...}; return invoke(std::move(instance), arguments, sizeof...(Args)); } @@ -1364,7 +1364,7 @@ public: */ template [[nodiscard]] meta_any construct(Args &&...args) const { - meta_any arguments[sizeof...(Args) + 1u]{std::forward(args)...}; + meta_any arguments[sizeof...(Args) + 1u]{{*ctx, std::forward(args)}...}; return construct(arguments, sizeof...(Args)); } @@ -1431,7 +1431,7 @@ public: */ template meta_any invoke(const id_type id, meta_handle instance, Args &&...args) const { - meta_any arguments[sizeof...(Args) + 1u]{std::forward(args)...}; + meta_any arguments[sizeof...(Args) + 1u]{{*ctx, std::forward(args)}...}; // TODO return invoke(id, std::move(instance), arguments, sizeof...(Args)); } diff --git a/test/entt/meta/meta_context.cpp b/test/entt/meta/meta_context.cpp index a69c5933b..5b01d935a 100644 --- a/test/entt/meta/meta_context.cpp +++ b/test/entt/meta/meta_context.cpp @@ -13,11 +13,11 @@ struct base {}; struct clazz: base { clazz() = default; - clazz(int) - : clazz{} {} + clazz(int v) + : value{v} {} - clazz(char, int) - : clazz{} {} + clazz(char, int v) + : value{v} {} int func(int v) { return (value = v); @@ -169,6 +169,17 @@ TEST_F(MetaContext, MetaType) { ASSERT_EQ(global.id(), "foo"_hs); ASSERT_EQ(local.id(), "bar"_hs); + + clazz instance{}; + const argument value{2}; + + ASSERT_NE(instance.value, value.get()); + ASSERT_EQ(global.invoke("func"_hs, instance, value).cast(), value.get()); + ASSERT_EQ(instance.value, value.get()); + + ASSERT_NE(instance.value, value.get_mul()); + ASSERT_EQ(local.invoke("func"_hs, instance, value).cast(), value.get_mul()); + ASSERT_NE(instance.value, value.get_mul()); } TEST_F(MetaContext, MetaBase) { @@ -208,12 +219,12 @@ TEST_F(MetaContext, MetaData) { clazz instance{}; const argument value{2}; - grw.set(instance, value); - + ASSERT_NE(instance.value, value.get()); + ASSERT_TRUE(grw.set(instance, value)); ASSERT_EQ(instance.value, value.get()); - lrw.set(entt::meta_handle{context, instance}, entt::meta_any{context, value}); - + ASSERT_NE(instance.value, value.get_mul()); + ASSERT_TRUE(lrw.set(instance, value)); ASSERT_EQ(instance.value, value.get_mul()); } @@ -243,7 +254,7 @@ TEST_F(MetaContext, MetaFunc) { ASSERT_EQ(instance.value, value.get()); ASSERT_NE(instance.value, value.get_mul()); - ASSERT_EQ(local.invoke(entt::meta_handle{context, instance}, entt::meta_any{context, value}).cast(), value.get_mul()); + ASSERT_EQ(local.invoke(instance, value).cast(), value.get_mul()); ASSERT_NE(instance.value, value.get_mul()); } @@ -251,14 +262,30 @@ TEST_F(MetaContext, MetaCtor) { const auto global = entt::resolve(); const auto local = entt::resolve(context); - ASSERT_TRUE(global.construct()); - ASSERT_TRUE(local.construct()); + auto any = global.construct(); + auto other = local.construct(); - ASSERT_TRUE(global.construct(0)); - ASSERT_FALSE(local.construct(0)); + ASSERT_TRUE(any); + ASSERT_TRUE(other); - ASSERT_FALSE(global.construct('c', 0)); - ASSERT_TRUE(local.construct('c', 0)); + ASSERT_EQ(any.cast().value, 0); + ASSERT_EQ(other.cast().value, 0); + + argument argument{2}; + + any = global.construct(argument); + other = local.construct(argument); + + ASSERT_TRUE(any); + ASSERT_FALSE(other); + ASSERT_EQ(any.cast().value, 2); + + any = global.construct('c', argument); + other = local.construct('c', argument); + + ASSERT_FALSE(any); + ASSERT_TRUE(other); + ASSERT_EQ(other.cast().value, 4); } TEST_F(MetaContext, MetaConv) {