4141#include " jni_dep.h"
4242#include " metaprogramming/double_locked_value.h"
4343#include " metaprogramming/string_concatenate.h"
44+ #include " implementation/id.h"
4445
4546namespace jni {
46-
4747// Transforms a OverloadRef IdT into a fully qualified ID. Storage is keyed
4848// against these IDs to reduce excess MethodID lookups.
4949template <typename IdT>
@@ -56,7 +56,7 @@ struct OverloadRefUniqueId {
5656 // Dashes are solely for readability in debugging.
5757 static constexpr std::string_view TypeName () {
5858 return metaprogramming::StringConcatenate_v<
59- kClassQualifier , kDash , kOverloadName , kDash , Signature_v<IdT>>;
59+ kClassQualifier , kDash , kOverloadName , kDash , Signature_v<IdT>>;
6060 }
6161};
6262
@@ -68,25 +68,25 @@ struct OverloadRef {
6868 using SelfIdT = typename IdT::template ChangeIdType<IdType::CLASS>;
6969
7070 using ReturnProxied = std::conditional_t <
71- ReturnIdT::kIsSelf ,
72- Return_t<typename SelfIdT::MaterializeCDeclT, SelfIdT>,
73- Return_t<typename ReturnIdT::MaterializeCDeclT, ReturnIdT>>;
71+ ReturnIdT::kIsSelf ,
72+ Return_t<typename SelfIdT::MaterializeCDeclT, SelfIdT>,
73+ Return_t<typename ReturnIdT::MaterializeCDeclT, ReturnIdT>>;
7474
7575 static jmethodID GetMethodID (jclass clazz) {
7676 static auto get_lambda =
7777 [clazz](metaprogramming::DoubleLockedValue<jmethodID>* storage) {
78- if (kConfiguration .release_method_ids_on_teardown_ ) {
79- DefaultRefs<jmethodID>().push_back (storage);
80- }
78+ if (kConfiguration .release_method_ids_on_teardown_ ) {
79+ DefaultRefs<jmethodID>().push_back (storage);
80+ }
8181
82- if constexpr (IdT::kIsStatic ) {
83- return jni::JniHelper::GetStaticMethodID (clazz, IdT::Name (),
84- Signature_v<IdT>.data ());
85- } else {
86- return jni::JniHelper::GetMethodID (clazz, IdT::Name (),
87- Signature_v<IdT>.data ());
88- }
89- };
82+ if constexpr (IdT::kIsStatic ) {
83+ return jni::JniHelper::GetStaticMethodID (clazz, IdT::Name (),
84+ Signature_v<IdT>.data ());
85+ } else {
86+ return jni::JniHelper::GetMethodID (clazz, IdT::Name (),
87+ Signature_v<IdT>.data ());
88+ }
89+ };
9090
9191 return RefStorage<decltype (get_lambda), OverloadRefUniqueId<IdT>>::Get (
9292 get_lambda);
@@ -102,30 +102,36 @@ struct OverloadRef {
102102 if constexpr (std::is_same_v<ReturnProxied, void >) {
103103 return InvokeHelper<void , kRank , kStatic >::Invoke (
104104 object, clazz, mthd,
105- Proxy_t<Params>::ProxyAsArg (std::forward<Params>(params))...);
105+ ForwardWithRefStrip (Proxy_t<Params>::ProxyAsArg (
106+ std::forward<Params>(params)))...);
106107 } else if constexpr (IdT::kIsConstructor ) {
107108 return ReturnProxied{
108109 AdoptLocal{},
109110 LifecycleHelper<jobject, LifecycleType::LOCAL>::Construct (
110111 clazz, mthd,
111- Proxy_t<Params>::ProxyAsArg (std::forward<Params>(params))...)};
112+ ForwardWithRefStrip (
113+ Proxy_t<Params>::ProxyAsArg (
114+ std::forward<Params>(params)))...)};
112115 } else {
113116 if constexpr (std::is_base_of_v<RefBaseBase, ReturnProxied>) {
114117 return ReturnProxied{
115118 AdoptLocal{},
116119 InvokeHelper<typename ReturnIdT::CDecl, kRank , kStatic >::Invoke (
117120 object, clazz, mthd,
118- Proxy_t<Params>::ProxyAsArg (std::forward<Params>(params))...)};
121+ ForwardWithRefStrip (
122+ Proxy_t<Params>::ProxyAsArg (std::forward<Params>(params)))
123+ ...)};
119124 } else {
120125 return static_cast <ReturnProxied>(
121- InvokeHelper<typename ReturnIdT::CDecl, kRank , kStatic >::Invoke (
122- object, clazz, mthd,
123- Proxy_t<Params>::ProxyAsArg (std::forward<Params>(params))...));
126+ InvokeHelper<typename ReturnIdT::CDecl, kRank , kStatic >::Invoke (
127+ object, clazz, mthd,
128+ ForwardWithRefStrip (
129+ Proxy_t<Params>::ProxyAsArg (
130+ std::forward<Params>(params)))...));
124131 }
125132 }
126133 }
127134};
135+ } // namespace jni
128136
129- } // namespace jni
130-
131- #endif // JNI_BIND_OVERLOAD_REF_H
137+ #endif // JNI_BIND_OVERLOAD_REF_H
0 commit comments