Skip to content

Commit c8ed500

Browse files
committed
RObjectConverters: Heap clone fix.
1 parent fdc7333 commit c8ed500

File tree

2 files changed

+55
-16
lines changed

2 files changed

+55
-16
lines changed

RTLTestRunApp/src/RObjectTests/RObjectReflecting_strings.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,11 @@ namespace unit_test
369369
ASSERT_NE(&str_addr, STR_STD_STRING.c_str());
370370
}
371371
};
372-
testWithAlloc.operator()<rtl::alloc::Stack>();
373-
// TODO: This fails. Fix it.
372+
374373
// Should even std::string to 'char' conversion be allowed implicitly?
375374
// Need to re-think it. The implicit conversions are not used in core dispatch yet.
376-
// will sit on it for a while.
377-
//testWithAlloc.operator()<rtl::alloc::Heap>();
375+
testWithAlloc.operator()<rtl::alloc::Stack>();
376+
testWithAlloc.operator()<rtl::alloc::Heap>();
378377
}
379378

380379

ReflectionTemplateLib/rtl/detail/src/RObjectConverters_string.cpp

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include <rtl/rtl_typeid.h>
1313
#include <detail/inc/ReflectCast.hpp>
14+
#include <detail/inc/RObjectUPtr.h>
1415

1516
namespace rtl::detail
1617
{
@@ -20,10 +21,23 @@ namespace rtl::detail
2021
{
2122
const auto& conversion = [](const std::any& pSrc, const EntityKind& pSrcEntityKind, EntityKind& pNewEntityKind)-> std::any
2223
{
23-
pNewEntityKind = EntityKind::Ptr;
24-
const auto& isPtr = (pSrcEntityKind == EntityKind::Ptr);
25-
const auto& srcObj = (isPtr ? *std::any_cast<const std::string*>(pSrc) : std::any_cast<const std::string&>(pSrc));
26-
return std::any(srcObj.c_str());
24+
try {
25+
pNewEntityKind = EntityKind::Ptr;
26+
const auto& isPtr = (pSrcEntityKind == EntityKind::Ptr);
27+
if (pSrcEntityKind == EntityKind::Wrapper) {
28+
//TODO: Will fail for any other wrapper other than 'RObjectUPtr<>'.
29+
const auto& srcRUptr = std::any_cast<const RObjectUPtr<std::string>&>(pSrc);
30+
return std::any(srcRUptr.get()->c_str());
31+
}
32+
else {
33+
const auto& srcObj = (isPtr ? *std::any_cast<const std::string*>(pSrc) : std::any_cast<const std::string&>(pSrc));
34+
return std::any(srcObj.c_str());
35+
}
36+
}
37+
catch (std::exception e) {
38+
pNewEntityKind = EntityKind::None;
39+
return std::any();
40+
}
2741
};
2842
conversions().emplace_back(std::pair(traits::uid<char>::value, conversion));
2943
}
@@ -35,10 +49,23 @@ namespace rtl::detail
3549
{
3650
const auto& conversion = [](const std::any& pSrc, const EntityKind& pSrcEntityKind, EntityKind& pNewEntityKind)-> std::any
3751
{
38-
pNewEntityKind = EntityKind::Ptr;
39-
const auto& isPtr = (pSrcEntityKind == EntityKind::Ptr);
40-
const auto& srcObj = (isPtr ? *std::any_cast<const std::string_view*>(pSrc) : std::any_cast<const std::string_view&>(pSrc));
41-
return std::any(srcObj.data());
52+
try {
53+
pNewEntityKind = EntityKind::Ptr;
54+
const auto& isPtr = (pSrcEntityKind == EntityKind::Ptr);
55+
if (pSrcEntityKind == EntityKind::Wrapper) {
56+
//TODO: Will fail for any other wrapper other than 'RObjectUPtr<>'.
57+
const auto& srcRUptr = std::any_cast<const RObjectUPtr<std::string>&>(pSrc);
58+
return std::any(srcRUptr.get()->data());
59+
}
60+
else {
61+
const auto& srcObj = (isPtr ? *std::any_cast<const std::string_view*>(pSrc) : std::any_cast<const std::string_view&>(pSrc));
62+
return std::any(srcObj.data());
63+
}
64+
}
65+
catch (std::exception e) {
66+
pNewEntityKind = EntityKind::None;
67+
return std::any();
68+
}
4269
};
4370
conversions().emplace_back(std::pair(traits::uid<char>::value, conversion));
4471
}
@@ -51,10 +78,23 @@ namespace rtl::detail
5178
using _toType = std::string;
5279
const auto& conversion = [](const std::any& pSrc, const EntityKind& pSrcEntityKind, EntityKind& pNewEntityKind)-> std::any
5380
{
54-
pNewEntityKind = EntityKind::Value;
55-
const auto& isPtr = (pSrcEntityKind == EntityKind::Ptr);
56-
const auto& srcObj = (isPtr ? *std::any_cast<const std::string_view*>(pSrc) : std::any_cast<const std::string_view&>(pSrc));
57-
return std::any(_toType(srcObj));
81+
try {
82+
pNewEntityKind = EntityKind::Value;
83+
const auto& isPtr = (pSrcEntityKind == EntityKind::Ptr);
84+
if (pSrcEntityKind == EntityKind::Wrapper) {
85+
//TODO: Will fail for any other wrapper other than 'RObjectUPtr<>'.
86+
const auto& srcRUptr = std::any_cast<const RObjectUPtr<std::string_view>&>(pSrc);
87+
return std::any(_toType(*srcRUptr.get()));
88+
}
89+
else {
90+
const auto& srcObj = (isPtr ? *std::any_cast<const std::string_view*>(pSrc) : std::any_cast<const std::string_view&>(pSrc));
91+
return std::any(_toType(srcObj));
92+
}
93+
}
94+
catch (std::exception e) {
95+
pNewEntityKind = EntityKind::None;
96+
return std::any();
97+
}
5898
};
5999
conversions().emplace_back(std::pair(traits::uid<_toType>::value, conversion));
60100
}

0 commit comments

Comments
 (0)