@@ -191,14 +191,15 @@ impl<T: ReferenceType, E: ThrowableType> ObjectArray<T, E> {
191
191
assert ! ( size <= std:: i32 :: MAX as usize ) ; // jsize == jint == i32
192
192
let class = T :: static_with_jni_type ( |t| unsafe { env. require_class ( t) } ) ;
193
193
let size = size as jsize ;
194
- let jnienv = env. as_raw ( ) ;
195
- unsafe {
194
+
195
+ let object = unsafe {
196
+ let env = env. as_raw ( ) ;
196
197
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 ) }
202
203
}
203
204
204
205
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> {
232
233
pub fn get < ' env > ( self : & Ref < ' env , Self > , index : usize ) -> Result < Option < Local < ' env , T > > , Local < ' env , E > > {
233
234
assert ! ( index <= std:: i32 :: MAX as usize ) ; // jsize == jint == i32 XXX: Should maybe be treated as an exception?
234
235
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) } ) )
247
246
}
248
247
}
249
248
250
249
/// XXX: I don't think there's a way to expose this via std::ops::IndexMut sadly?
251
250
pub fn set < ' env > ( self : & Ref < ' env , Self > , index : usize , value : impl AsArg < T > ) -> Result < ( ) , Local < ' env , E > > {
252
251
assert ! ( index <= std:: i32 :: MAX as usize ) ; // jsize == jint == i32 XXX: Should maybe be treated as an exception?
253
252
let index = index as jsize ;
254
- let env = self . env ( ) . as_raw ( ) ;
253
+ let env = self . env ( ) ;
255
254
unsafe {
255
+ let env = env. as_raw ( ) ;
256
256
( ( * * 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
- }
264
257
}
258
+ env. exception_check ( )
265
259
}
266
260
}
267
261
0 commit comments