Skip to content

Commit c410e88

Browse files
authored
[orc-rt] Enable transparent SPS conversion for Expected<T*>. (#162073)
Expected<T*> values will be converted to/from Expected<ExecutorAddr> values.
1 parent 009da92 commit c410e88

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

orc-rt/include/orc-rt/SPSWrapperFunction.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,21 @@ template <typename... SPSArgTs> struct WFSPSHelper {
6363
}
6464
};
6565

66+
template <typename T> struct Serializable<Expected<T *>> {
67+
typedef SPSSerializableExpected<ExecutorAddr> serializable_type;
68+
static SPSSerializableExpected<ExecutorAddr> to(Expected<T *> Val) {
69+
return SPSSerializableExpected<ExecutorAddr>(
70+
Val ? Expected<ExecutorAddr>(ExecutorAddr::fromPtr(*Val))
71+
: Expected<ExecutorAddr>(Val.takeError()));
72+
}
73+
static Expected<T *> from(SPSSerializableExpected<ExecutorAddr> Val) {
74+
if (auto Tmp = Val.toExpected())
75+
return Tmp->toPtr<T *>();
76+
else
77+
return Tmp.takeError();
78+
}
79+
};
80+
6681
template <typename... Ts> struct DeserializableTuple;
6782

6883
template <typename... Ts> struct DeserializableTuple<std::tuple<Ts...>> {

orc-rt/unittests/SPSWrapperFunctionTest.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,30 @@ TEST(SPSWrapperFunctionUtilsTest, TransparentSerializationPointers) {
242242
EXPECT_EQ(P, &X);
243243
}
244244

245+
static void
246+
expected_int_pointer_sps_wrapper(orc_rt_SessionRef Session, void *CallCtx,
247+
orc_rt_WrapperFunctionReturn Return,
248+
orc_rt_WrapperFunctionBuffer ArgBytes) {
249+
SPSWrapperFunction<SPSExpected<SPSExecutorAddr>(SPSExecutorAddr)>::handle(
250+
Session, CallCtx, Return, ArgBytes,
251+
[](move_only_function<void(Expected<int32_t *>)> Return, int32_t *P) {
252+
Return(P);
253+
});
254+
}
255+
256+
TEST(SPSWrapperFunctionUtilsTest, TransparentSerializationExpectedPointers) {
257+
int X = 42;
258+
int *P = nullptr;
259+
SPSWrapperFunction<SPSExpected<SPSExecutorAddr>(SPSExecutorAddr)>::call(
260+
DirectCaller(nullptr, expected_int_pointer_sps_wrapper),
261+
[&](Expected<Expected<int32_t *>> R) {
262+
P = cantFail(cantFail(std::move(R)));
263+
},
264+
&X);
265+
266+
EXPECT_EQ(P, &X);
267+
}
268+
245269
template <size_t N> struct SPSOpCounter {};
246270

247271
namespace orc_rt {

0 commit comments

Comments
 (0)