Skip to content

Commit 8d1d407

Browse files
committed
Invoke now correctly returns a LocalString for rank 1 jstring.
Previously this returned a `jobject` which triggered an incorrect lifecycle<jobject> to be used. Thrash test.
1 parent c926a92 commit 8d1d407

File tree

5 files changed

+7786
-2
lines changed

5 files changed

+7786
-2
lines changed

implementation/local_string.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ class LocalString : public LocalStringImpl {
4848
using Base = LocalStringImpl;
4949
using Base::Base;
5050

51+
~LocalString()
52+
{
53+
printf("~LocalString\n");
54+
}
55+
5156
LocalString(LocalObject<kJavaLangString>&& obj)
5257
: Base(AdoptLocal{}, static_cast<jstring>(obj.Release())) {}
5358

implementation/overload_ref.h

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,22 @@ struct OverloadRefUniqueId {
6060
}
6161
};
6262

63+
template <typename T>
64+
constexpr std::string_view type_name() {
65+
#ifdef __clang__
66+
std::string_view p = __PRETTY_FUNCTION__;
67+
return std::string_view(p.data() + 31, p.size() - 31 - 1);
68+
#elif defined(__GNUC__)
69+
std::string_view p = __PRETTY_FUNCTION__;
70+
return std::string_view(p.data() + 46, p.size() - 46 - 1);
71+
#elif defined(_MSC_VER)
72+
std::string_view p = __FUNCSIG__;
73+
return std::string_view(p.data() + 38, p.size() - 38 - 7);
74+
#else
75+
#error Unsupported compiler
76+
#endif
77+
}
78+
6379
template <typename IdT_, IdType kReturnIDType>
6480
struct OverloadRef {
6581
using IdT = IdT_;
@@ -93,7 +109,7 @@ struct OverloadRef {
93109
}
94110

95111
template <typename... Params>
96-
static ReturnProxied Invoke(jclass clazz, jobject object,
112+
static auto Invoke(jclass clazz, jobject object,
97113
Params&&... params) {
98114
constexpr std::size_t kRank = ReturnIdT::kRank;
99115
constexpr bool kStatic = ReturnIdT::kIsStatic;
@@ -104,11 +120,38 @@ struct OverloadRef {
104120
object, clazz, mthd,
105121
Proxy_t<Params>::ProxyAsArg(std::forward<Params>(params))...);
106122
} else if constexpr (IdT::kIsConstructor) {
107-
return ReturnProxied{
123+
if constexpr (std::is_same_v<typename IdT::_JniT::SpanType, jstring> && IdT::kRank == 0)
124+
{
125+
//printf("jif return proxied %s ", type_name<ReturnProxied>().data());
126+
127+
/*
128+
auto a =
129+
ReturnProxied{
130+
AdoptLocal{},
131+
LifecycleHelper<jobject, LifecycleType::LOCAL>::Construct(
132+
clazz, mthd,
133+
Proxy_t<Params>::ProxyAsArg(std::forward<Params>(params))...)
134+
};
135+
*/
136+
137+
return LocalString{
138+
AdoptLocal{},
139+
Proxy_t<Params>::ProxyAsArg(std::forward<Params>(params))...
140+
};
141+
/*
142+
return LocalString{
143+
AdoptLocal{},
144+
a.Release() };
145+
*/
146+
147+
} else
148+
{
149+
return ReturnProxied{
108150
AdoptLocal{},
109151
LifecycleHelper<jobject, LifecycleType::LOCAL>::Construct(
110152
clazz, mthd,
111153
Proxy_t<Params>::ProxyAsArg(std::forward<Params>(params))...)};
154+
}
112155
} else {
113156
if constexpr (std::is_base_of_v<RefBaseBase, ReturnProxied>) {
114157
return ReturnProxied{

implementation/string_ref_test.cc

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,49 @@ TEST_F(JniTest, GlobalString_AllowsRValueGlobalString) {
235235
obj.Call<"TakesStrParam">(GlobalString{"abcde"});
236236
}
237237

238+
TEST_F(JniTest, AllocationThrash)
239+
{
240+
int i = 0;
241+
//while (true)
242+
for (int i = 0; i < 1; i++)
243+
{
244+
//for (int j = 0; j < 10000; j++)
245+
for (int j = 0; j < 1; j++)
246+
{
247+
/*
248+
LocalString str = "akdfajslkfaskflj"
249+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
250+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
251+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
252+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
253+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
254+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
255+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
256+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
257+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
258+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
259+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
260+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
261+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
262+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
263+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
264+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
265+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
266+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
267+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
268+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs"
269+
"alkdsjklafjkldsajklfasdjldasfjklasdfkjdlasfkjdsafljafs";
270+
*/
271+
LocalString str { "akdfajslkfaskflj" };
272+
}
273+
274+
i++;
275+
if (i % 100 == 0)
276+
{
277+
std::cout << "Iteration: " << i << std::endl;
278+
// I even tried to manually call gc, but it has no effect in this case.
279+
}
280+
}
281+
}
282+
238283
} // namespace

javatests/com/jnibind/test/StringTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,11 @@ public void nullStringTests() {
146146
public void globalReturnsCorrectlyOverJniBoundary() {
147147
jniReturnsAGlobalString();
148148
}
149+
150+
native void nativeAllocationThrash();
151+
152+
@Test
153+
public void allocationThrash() {
154+
nativeAllocationThrash();
155+
}
149156
}

0 commit comments

Comments
 (0)