Skip to content

Commit 3c8e96a

Browse files
committed
callable init errors, test cases.
1 parent 730452d commit 3c8e96a

File tree

7 files changed

+136
-39
lines changed

7 files changed

+136
-39
lines changed

RTLTestRunApp/src/FunctionalityTests/StaticTypeReflectiveCalls/StrictStaticTypeDispatch_ConstMethod.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,35 @@ namespace rtl_tests
4444
}
4545

4646

47+
TEST(StrictStaticTypeRtl_const_method, init_errors_validation)
48+
{
49+
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StrConst::struct_);
50+
ASSERT_TRUE(optStringUtil);
51+
52+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_reverseString);
53+
ASSERT_TRUE(reverseString);
54+
{
55+
rtl::method<const StrConst, std::string(char*)> reverse_string = reverseString->targetT<const StrConst>()
56+
.argsT<char*>()
57+
.returnT<std::string>();
58+
EXPECT_FALSE(reverse_string);
59+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::SignatureMismatch);
60+
}{
61+
rtl::method<const StrConst, const char*(std::string)> reverse_string = reverseString->targetT<const StrConst>()
62+
.argsT<std::string>()
63+
.returnT<const char*>();
64+
EXPECT_FALSE(reverse_string);
65+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::ReturnTypeMismatch);
66+
} {
67+
rtl::method<const StrConst, std::string(std::string)> reverse_string = reverseString->targetT<const StrConst>()
68+
.argsT<std::string>()
69+
.returnT<std::string>();
70+
EXPECT_TRUE(reverse_string);
71+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::None);
72+
}
73+
}
74+
75+
4776
TEST(StrictStaticTypeRtl_const_method, overload_resolution_with_known_signatures)
4877
{
4978
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StrConst::struct_);

RTLTestRunApp/src/FunctionalityTests/StaticTypeReflectiveCalls/StrictStaticTypeDispatch_Function.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ using namespace test_mirror;
1212

1313
namespace rtl_tests
1414
{
15-
TEST(StrictStaticTypeRtl_function, namespace_fn_validation_with_known_signature)
15+
TEST(StrictStaticTypeRtl_function, init_errors_validation)
1616
{
1717
std::optional<rtl::Function> setReal = cxx::mirror().getFunction(str_complex, str_setReal);
1818
ASSERT_TRUE(setReal);
@@ -22,9 +22,11 @@ namespace rtl_tests
2222
{
2323
rtl::function<void(double)> functor = setReal->argsT<double>().returnT<void>();
2424
EXPECT_TRUE(functor);
25+
EXPECT_EQ(functor.get_init_error(), rtl::error::None);
2526
} {
2627
rtl::function<void(float)> functor = setReal->argsT<float>().returnT<void>();
2728
EXPECT_FALSE(functor);
29+
EXPECT_EQ(functor.get_init_error(), rtl::error::SignatureMismatch);
2830
}
2931
}
3032

@@ -36,9 +38,11 @@ namespace rtl_tests
3638
{
3739
rtl::function<void(double)> functor = setImaginary->argsT<double>().returnT<void>();
3840
EXPECT_TRUE(functor);
41+
EXPECT_EQ(functor.get_init_error(), rtl::error::None);
3942
} {
4043
rtl::function<char(double)> functor = setImaginary->argsT<double>().returnT<char>();
4144
EXPECT_FALSE(functor);
45+
EXPECT_EQ(functor.get_init_error(), rtl::error::ReturnTypeMismatch);
4246
}
4347
}
4448
}

RTLTestRunApp/src/FunctionalityTests/StaticTypeReflectiveCalls/StrictStaticTypeDispatch_Method.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,35 @@ using namespace test_mirror;
1313

1414
namespace rtl_tests
1515
{
16+
TEST(StrictStaticTypeRtl_method, init_errors_validation)
17+
{
18+
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StrMute::struct_);
19+
ASSERT_TRUE(optStringUtil);
20+
21+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_reverseString);
22+
ASSERT_TRUE(reverseString);
23+
{
24+
rtl::method<StrMute, std::string(char*)> reverse_string = reverseString->targetT<StrMute>()
25+
.argsT<char*>()
26+
.returnT<std::string>();
27+
EXPECT_FALSE(reverse_string);
28+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::SignatureMismatch);
29+
}{
30+
rtl::method<StrMute, const char*(std::string)> reverse_string = reverseString->targetT<StrMute>()
31+
.argsT<std::string>()
32+
.returnT<const char*>();
33+
EXPECT_FALSE(reverse_string);
34+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::ReturnTypeMismatch);
35+
} {
36+
rtl::method<StrMute, std::string(std::string)> reverse_string = reverseString->targetT<StrMute>()
37+
.argsT<std::string>()
38+
.returnT<std::string>();
39+
EXPECT_TRUE(reverse_string);
40+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::None);
41+
}
42+
}
43+
44+
1645
TEST(StrictStaticTypeRtl_method, overload_resolution_with_known_signatures)
1746
{
1847
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StrMute::struct_);

RTLTestRunApp/src/FunctionalityTests/StaticTypeReflectiveCalls/StrictStaticTypeDispatch_StaticMethod.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,32 @@ using namespace test_mirror;
1111

1212
namespace rtl_tests
1313
{
14+
TEST(StrictStaticTypeRtl_static_method, init_errors_validation)
15+
{
16+
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StrStatic::struct_);
17+
ASSERT_TRUE(optStringUtil);
18+
19+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_reverseString);
20+
ASSERT_TRUE(reverseString);
21+
{
22+
rtl::static_method<std::string(char*)> reverse_string = reverseString->argsT<char*>()
23+
.returnT<std::string>();
24+
EXPECT_FALSE(reverse_string);
25+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::SignatureMismatch);
26+
}{
27+
rtl::static_method<const char*(std::string)> reverse_string = reverseString->argsT<std::string>()
28+
.returnT<const char*>();
29+
EXPECT_FALSE(reverse_string);
30+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::ReturnTypeMismatch);
31+
} {
32+
rtl::static_method<std::string(std::string)> reverse_string = reverseString->argsT<std::string>()
33+
.returnT<std::string>();
34+
EXPECT_TRUE(reverse_string);
35+
EXPECT_EQ(reverse_string.get_init_error(), rtl::error::None);
36+
}
37+
}
38+
39+
1440
TEST(StrictStaticTypeRtl_static_method, using_wrong_class_n_callable_apis_for_static_method)
1541
{
1642
{

ReflectionTemplateLib/rtl/detail/inc/FunctionCaller.hpp

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,23 @@ namespace rtl::detail
6767
inline constexpr const static_method<return_t(args_t...)> HopFunction<member_kind, args_t...>::returnT() const
6868
{
6969
static_method<return_t(args_t...)> mth;
70-
if (m_fnIndex != rtl::index_none)
71-
{
72-
auto& ty_meta = m_overloadsFnMeta[m_fnIndex];
73-
if (ty_meta.get_member_kind() != member::Static) {
74-
mth.set_init_error(error::InvalidNonStaticMethodCaller);
75-
}
76-
else if (ty_meta.get_member_kind() == member::Static &&
77-
traits::uid<return_t>::value == ty_meta.get_return_id())
78-
{
70+
if (m_fnIndex == rtl::index_none) {
71+
mth.set_init_error(error::SignatureMismatch);
72+
return mth;
73+
}
74+
75+
auto& ty_meta = m_overloadsFnMeta[m_fnIndex];
76+
if (ty_meta.get_member_kind() != member::Static) {
77+
mth.set_init_error(error::InvalidNonStaticMethodCaller);
78+
}
79+
else if (ty_meta.get_member_kind() == member::Static){
80+
if (traits::uid<return_t>::value == ty_meta.get_return_id())
81+
{
7982
using function_t = dispatch::function_ptr<return_t, args_t...>;
8083
auto fptr = static_cast<const function_t&>(ty_meta.get_functor()).f_ptr();
8184
return static_method<return_t(args_t...)>(fptr);
8285
}
86+
mth.set_init_error(error::ReturnTypeMismatch);
8387
}
8488
return mth;
8589
}
@@ -90,20 +94,23 @@ namespace rtl::detail
9094
inline constexpr const function<return_t(args_t...)> HopFunction<member_kind, args_t...>::returnT() const
9195
{
9296
function<return_t(args_t...)> fn;
93-
if (m_fnIndex != rtl::index_none)
94-
{
95-
auto& ty_meta = m_overloadsFnMeta[m_fnIndex];
96-
if (ty_meta.get_member_kind() == member::Static)
97-
{
98-
fn.set_init_error(error::InvalidStaticMethodCaller);
99-
}
100-
else if (ty_meta.get_member_kind() == member::None &&
101-
traits::uid<return_t>::value == ty_meta.get_return_id())
97+
if (m_fnIndex == rtl::index_none) {
98+
fn.set_init_error(error::SignatureMismatch);
99+
return fn;
100+
}
101+
102+
auto& ty_meta = m_overloadsFnMeta[m_fnIndex];
103+
if (ty_meta.get_member_kind() == member::Static) {
104+
fn.set_init_error(error::InvalidStaticMethodCaller);
105+
}
106+
else if (ty_meta.get_member_kind() == member::None) {
107+
if (traits::uid<return_t>::value == ty_meta.get_return_id())
102108
{
103109
using function_t = dispatch::function_ptr<return_t, args_t...>;
104110
auto fptr = static_cast<const function_t&>(ty_meta.get_functor()).f_ptr();
105111
return function<return_t(args_t...)>(fptr);
106112
}
113+
fn.set_init_error(error::ReturnTypeMismatch);
107114
}
108115
return fn;
109116
}
@@ -113,9 +120,11 @@ namespace rtl::detail
113120
template<class ...args_t>
114121
inline constexpr const HopFunction<member_kind, args_t...> Hopper<member_kind>::argsT() const
115122
{
123+
std::size_t index = rtl::index_none;
116124
std::vector<rtl::type_meta> fnTyMetas(call_by::ncref);
117-
118125
auto normalId = traits::uid<traits::normal_sign_id_t<args_t...>>::value;
126+
auto strictId = traits::uid<traits::strict_sign_id_t<args_t...>>::value;
127+
119128
for (auto& ty_meta : m_functorsMeta)
120129
{
121130
if (normalId == ty_meta.get_normal_args_id())
@@ -129,9 +138,6 @@ namespace rtl::detail
129138
else fnTyMetas.push_back(ty_meta);
130139
}
131140
}
132-
133-
std::size_t index = rtl::index_none;
134-
auto strictId = traits::uid<traits::strict_sign_id_t<args_t...>>::value;
135141
for (int i = 0; i < fnTyMetas.size(); i++)
136142
{
137143
auto& ty_meta = fnTyMetas[i];
@@ -140,7 +146,6 @@ namespace rtl::detail
140146
break;
141147
}
142148
}
143-
144149
return { index, fnTyMetas };
145150
}
146151

@@ -171,14 +176,12 @@ namespace rtl::detail
171176
}
172177
}
173178

174-
if ((isReturnTvoid = ty_meta.is_void()))
175-
{
179+
if ((isReturnTvoid = ty_meta.is_void())) {
176180
using fn_cast = dispatch::functor_cast<dispatch::fn_void::yes, traits::normal_sign_t<args_t>...>;
177181
auto fn = fn_cast(ty_meta.get_functor()).template to_function<dispatch::erase::t_return>();
178182
pHopper.get_vhop().push_back(fn.f_ptr());
179183
}
180-
else
181-
{
184+
else {
182185
using fn_cast = dispatch::functor_cast<dispatch::fn_void::no, traits::normal_sign_t<args_t>...>;
183186
auto fn = fn_cast(ty_meta.get_functor()).template to_function<dispatch::erase::t_return>();
184187
pHopper.get_rhop().push_back(fn.f_ptr());

ReflectionTemplateLib/rtl/detail/inc/MethodInvoker.hpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,23 @@ namespace rtl::detail
175175
inline constexpr const method<record_t, return_t(args_t...)> HopMethod<record_t, args_t...>::returnT() const
176176
{
177177
method<record_t, return_t(args_t...)> mth;
178-
if (m_fnIndex != rtl::index_none)
179-
{
180-
auto& ty_meta = m_overloadsFnMeta[m_fnIndex];
181-
if (ty_meta.get_member_kind() == member::Static) {
182-
mth.set_init_error(error::InvalidStaticMethodCaller);
183-
}
184-
else if(traits::uid<return_t>::value == ty_meta.get_return_id()) {
178+
if (m_fnIndex == rtl::index_none) {
179+
mth.set_init_error(error::SignatureMismatch);
180+
return mth;
181+
}
185182

183+
auto& ty_meta = m_overloadsFnMeta[m_fnIndex];
184+
if (ty_meta.get_member_kind() == member::Static) {
185+
mth.set_init_error(error::InvalidStaticMethodCaller);
186+
}
187+
else {
188+
if (traits::uid<return_t>::value == ty_meta.get_return_id())
189+
{
186190
using method_t = dispatch::method_ptr<record_t, return_t, args_t...>;
187191
auto fptr = static_cast<const method_t&>(ty_meta.get_functor()).f_ptr();
188192
return method<record_t, return_t(args_t...)>(fptr);
189193
}
194+
mth.set_init_error(error::ReturnTypeMismatch);
190195
}
191196
return mth;
192197
}
@@ -196,10 +201,13 @@ namespace rtl::detail
196201
template<class ...args_t>
197202
inline constexpr HopMethod<record_t, args_t...> Hopper<member_kind, record_t>::argsT() const
198203
{
199-
auto recordId = traits::uid<record_t>::value;
204+
std::size_t index = rtl::index_none;
200205
std::vector<rtl::type_meta> fnTyMetas(call_by::ncref);
201206

207+
auto recordId = traits::uid<record_t>::value;
202208
auto normalId = traits::uid<traits::normal_sign_id_t<args_t...>>::value;
209+
auto strictId = traits::uid<traits::strict_sign_id_t<args_t...>>::value;
210+
203211
for (auto& ty_meta : m_functorsMeta)
204212
{
205213
if constexpr (!std::is_same_v<record_t, RObject>)
@@ -219,9 +227,6 @@ namespace rtl::detail
219227
else fnTyMetas.push_back(ty_meta);
220228
}
221229
}
222-
223-
std::size_t index = rtl::index_none;
224-
auto strictId = traits::uid<traits::strict_sign_id_t<args_t...>>::value;
225230
for (int i = 0; i < fnTyMetas.size(); i++)
226231
{
227232
auto& ty_meta = fnTyMetas[i];

ReflectionTemplateLib/rtl/rtl_errors.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace rtl
2424

2525
TargetMismatch,
2626
SignatureMismatch,
27+
ReturnTypeMismatch,
2728
RefBindingMismatch,
2829
ExplicitRefBindingRequired,
2930
InvalidStaticMethodCaller,

0 commit comments

Comments
 (0)