mirror of
https://github.com/hexedtech/codemp.git
synced 2024-11-22 07:14:50 +01:00
fix(java): errors in send buffer glue, safer error handling
This commit is contained in:
parent
795423de2a
commit
5cf6c4d4eb
3 changed files with 21 additions and 9 deletions
|
@ -147,8 +147,8 @@ pub extern "system" fn Java_mp_code_BufferController_send<'local>(
|
||||||
self_ptr: jlong,
|
self_ptr: jlong,
|
||||||
input: JObject<'local>,
|
input: JObject<'local>,
|
||||||
) {
|
) {
|
||||||
let Ok(start) = env.get_field(&input, "start", "I")
|
let Ok(start) = env.get_field(&input, "start", "J")
|
||||||
.and_then(|sr| sr.i())
|
.and_then(|sr| sr.j())
|
||||||
.jexcept(&mut env)
|
.jexcept(&mut env)
|
||||||
.try_into()
|
.try_into()
|
||||||
else {
|
else {
|
||||||
|
@ -157,8 +157,8 @@ pub extern "system" fn Java_mp_code_BufferController_send<'local>(
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let Ok(end) = env.get_field(&input, "end", "I")
|
let Ok(end) = env.get_field(&input, "end", "J")
|
||||||
.and_then(|er| er.i())
|
.and_then(|er| er.j())
|
||||||
.jexcept(&mut env)
|
.jexcept(&mut env)
|
||||||
.try_into()
|
.try_into()
|
||||||
else {
|
else {
|
||||||
|
@ -175,7 +175,7 @@ pub extern "system" fn Java_mp_code_BufferController_send<'local>(
|
||||||
.map(|b| b.into())
|
.map(|b| b.into())
|
||||||
.jexcept(&mut env);
|
.jexcept(&mut env);
|
||||||
|
|
||||||
let hash = env.get_field(&input, "hash", "Ljava/util/OptionalLong")
|
let hash = env.get_field(&input, "hash", "Ljava/util/OptionalLong;")
|
||||||
.and_then(|hash| hash.l())
|
.and_then(|hash| hash.l())
|
||||||
.and_then(|hash| {
|
.and_then(|hash| {
|
||||||
if env.call_method(&hash, "isPresent", "()Z", &[]).and_then(|r| r.z()).jexcept(&mut env) {
|
if env.call_method(&hash, "isPresent", "()Z", &[]).and_then(|r| r.z()).jexcept(&mut env) {
|
||||||
|
|
|
@ -110,8 +110,12 @@ impl<T> JExceptable<T> for Result<T, jni::errors::Error> where T: Default {
|
||||||
fn jexcept(self, env: &mut jni::JNIEnv) -> T {
|
fn jexcept(self, env: &mut jni::JNIEnv) -> T {
|
||||||
if let Err(err) = &self {
|
if let Err(err) = &self {
|
||||||
let msg = format!("{err}");
|
let msg = format!("{err}");
|
||||||
env.throw_new("mp/code/exceptions/JNIException", msg)
|
if let Err(err) = env.throw_new("mp/code/exceptions/JNIException", msg) {
|
||||||
.expect("A severe error occurred: we were unable to create a JNIException. This is an unrecoverable state.");
|
if let Err(err) = env.exception_describe() {
|
||||||
|
tracing::error!("An exception occurred and we failed to even describe it: {err:#?}.");
|
||||||
|
}
|
||||||
|
panic!("A severe error occurred: we were unable to create a JNIException from {err:#?}. This is an unrecoverable state.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
self.unwrap_or_default()
|
self.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
@ -121,8 +125,12 @@ impl<T> JExceptable<T> for Result<T, uuid::Error> where T: Default {
|
||||||
fn jexcept(self, env: &mut jni::JNIEnv) -> T {
|
fn jexcept(self, env: &mut jni::JNIEnv) -> T {
|
||||||
if let Err(err) = &self {
|
if let Err(err) = &self {
|
||||||
let msg = format!("{err}");
|
let msg = format!("{err}");
|
||||||
env.throw_new("java/lang/IllegalArgumentException", msg)
|
if let Err(err) = env.throw_new("java/lang/IllegalArgumentException", msg) {
|
||||||
.expect("A severe error occurred: we were unable to create a JNIException. This is an unrecoverable state.");
|
if let Err(err) = env.exception_describe() {
|
||||||
|
tracing::error!("An exception occurred and we failed to even describe it: {err:#?}.");
|
||||||
|
}
|
||||||
|
panic!("A severe error occurred: we were unable to create a JNIException from {err:#?}. This is an unrecoverable state.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
self.unwrap_or_default()
|
self.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,10 @@ pub extern "system" fn Java_mp_code_Workspace_get_1buffer<'local>(
|
||||||
self_ptr: jlong,
|
self_ptr: jlong,
|
||||||
input: JString<'local>
|
input: JString<'local>
|
||||||
) -> jobject {
|
) -> jobject {
|
||||||
|
if input.is_null() {
|
||||||
|
return std::ptr::null_mut();
|
||||||
|
}
|
||||||
|
|
||||||
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
|
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
|
||||||
let path = unsafe { env.get_string_unchecked(&input) }
|
let path = unsafe { env.get_string_unchecked(&input) }
|
||||||
.map(|path| path.to_string_lossy().to_string())
|
.map(|path| path.to_string_lossy().to_string())
|
||||||
|
|
Loading…
Reference in a new issue