Make JxArrayRef less error-prone for jxArray (#1190)

Add a length-taking overload so that if a length happens to be provided for
a jarray, the direct byte buffer overload is not used.
This commit is contained in:
Peter Johnson
2018-07-17 20:19:49 -07:00
committed by GitHub
parent 297863b17a
commit caa03d23a3

View File

@@ -223,13 +223,16 @@ class JArrayRefBase : public JArrayRefInner<JArrayRefBase<T>, T> {
this->m_elements = elements;
}
JArrayRefBase(JNIEnv* env, jarray jarr) {
JArrayRefBase(JNIEnv* env, jarray jarr, size_t size) {
this->m_env = env;
this->m_jarr = jarr;
this->m_size = jarr ? env->GetArrayLength(jarr) : 0;
this->m_size = size;
this->m_elements = nullptr;
}
JArrayRefBase(JNIEnv* env, jarray jarr)
: JArrayRefBase(env, jarr, jarr ? env->GetArrayLength(jarr) : 0) {}
JNIEnv* m_env;
jarray m_jarr = nullptr;
size_t m_size;
@@ -252,6 +255,14 @@ class JArrayRefBase : public JArrayRefInner<JArrayRefBase<T>, T> {
errs() << "JArrayRef was passed a null pointer at \n" \
<< GetJavaStackTrace(env); \
} \
J##F##ArrayRef(JNIEnv* env, T##Array jarr, int len) \
: detail::JArrayRefBase<T>(env, jarr, len) { \
if (jarr) \
m_elements = env->Get##F##ArrayElements(jarr, nullptr); \
else \
errs() << "JArrayRef was passed a null pointer at \n" \
<< GetJavaStackTrace(env); \
} \
J##F##ArrayRef(JNIEnv* env, T##Array jarr) \
: detail::JArrayRefBase<T>(env, jarr) { \
if (jarr) \
@@ -269,6 +280,15 @@ class JArrayRefBase : public JArrayRefInner<JArrayRefBase<T>, T> {
\
class CriticalJ##F##ArrayRef : public detail::JArrayRefBase<T> { \
public: \
CriticalJ##F##ArrayRef(JNIEnv* env, T##Array jarr, int len) \
: detail::JArrayRefBase<T>(env, jarr, len) { \
if (jarr) \
m_elements = \
static_cast<T*>(env->GetPrimitiveArrayCritical(jarr, nullptr)); \
else \
errs() << "JArrayRef was passed a null pointer at \n" \
<< GetJavaStackTrace(env); \
} \
CriticalJ##F##ArrayRef(JNIEnv* env, T##Array jarr) \
: detail::JArrayRefBase<T>(env, jarr) { \
if (jarr) \