Skip to content

Commit 5beb30d

Browse files
authored
Merge pull request #4 from wuwbobo2021/receiver
Make sure of not panicking on thread exit; reduce exception handling boilerplate code; add null checks
2 parents d671991 + 10edd06 commit 5beb30d

File tree

8 files changed

+96
-178
lines changed

8 files changed

+96
-178
lines changed

java-spaghetti/src/array.rs

+21-27
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,15 @@ impl<T: ReferenceType, E: ThrowableType> ObjectArray<T, E> {
191191
assert!(size <= std::i32::MAX as usize); // jsize == jint == i32
192192
let class = T::static_with_jni_type(|t| unsafe { env.require_class(t) });
193193
let size = size as jsize;
194-
let jnienv = env.as_raw();
195-
unsafe {
194+
195+
let object = unsafe {
196+
let env = env.as_raw();
196197
let fill = null_mut();
197-
let object = ((**jnienv).v1_2.NewObjectArray)(jnienv, size, class, fill);
198-
let exception = ((**jnienv).v1_2.ExceptionOccurred)(jnienv);
199-
assert!(exception.is_null()); // Only sane exception here is an OOM exception
200-
Local::from_raw(env, object)
201-
}
198+
((**env).v1_2.NewObjectArray)(env, size, class, fill)
199+
};
200+
// Only sane exception here is an OOM exception
201+
env.exception_check::<E>().map_err(|_| "OOM").unwrap();
202+
unsafe { Local::from_raw(env, object) }
202203
}
203204

204205
pub fn iter<'a, 'env>(self: &'a Ref<'env, Self>) -> ObjectArrayIter<'a, 'env, T, E> {
@@ -232,36 +233,29 @@ impl<T: ReferenceType, E: ThrowableType> ObjectArray<T, E> {
232233
pub fn get<'env>(self: &Ref<'env, Self>, index: usize) -> Result<Option<Local<'env, T>>, Local<'env, E>> {
233234
assert!(index <= std::i32::MAX as usize); // jsize == jint == i32 XXX: Should maybe be treated as an exception?
234235
let index = index as jsize;
235-
let env = self.env().as_raw();
236-
unsafe {
237-
let result = ((**env).v1_2.GetObjectArrayElement)(env, self.as_raw(), index);
238-
let exception = ((**env).v1_2.ExceptionOccurred)(env);
239-
if !exception.is_null() {
240-
((**env).v1_2.ExceptionClear)(env);
241-
Err(Local::from_raw(Env::from_raw(env), exception))
242-
} else if result.is_null() {
243-
Ok(None)
244-
} else {
245-
Ok(Some(Local::from_raw(Env::from_raw(env), result)))
246-
}
236+
let env = self.env();
237+
let result = unsafe {
238+
let env = env.as_raw();
239+
((**env).v1_2.GetObjectArrayElement)(env, self.as_raw(), index)
240+
};
241+
env.exception_check()?;
242+
if result.is_null() {
243+
Ok(None)
244+
} else {
245+
Ok(Some(unsafe { Local::from_raw(env, result) }))
247246
}
248247
}
249248

250249
/// XXX: I don't think there's a way to expose this via std::ops::IndexMut sadly?
251250
pub fn set<'env>(self: &Ref<'env, Self>, index: usize, value: impl AsArg<T>) -> Result<(), Local<'env, E>> {
252251
assert!(index <= std::i32::MAX as usize); // jsize == jint == i32 XXX: Should maybe be treated as an exception?
253252
let index = index as jsize;
254-
let env = self.env().as_raw();
253+
let env = self.env();
255254
unsafe {
255+
let env = env.as_raw();
256256
((**env).v1_2.SetObjectArrayElement)(env, self.as_raw(), index, value.as_arg());
257-
let exception = ((**env).v1_2.ExceptionOccurred)(env);
258-
if !exception.is_null() {
259-
((**env).v1_2.ExceptionClear)(env);
260-
Err(Local::from_raw(Env::from_raw(env), exception))
261-
} else {
262-
Ok(())
263-
}
264257
}
258+
env.exception_check()
265259
}
266260
}
267261

0 commit comments

Comments
 (0)