diff --git a/crates/ffi/src/actions.rs b/crates/ffi/src/actions.rs index 6d7afd5..fc823aa 100644 --- a/crates/ffi/src/actions.rs +++ b/crates/ffi/src/actions.rs @@ -118,11 +118,11 @@ pub(crate) fn action_result_to_c(r: &CoreActionResult) -> AdActionResult { let states = if state.states.is_empty() { ptr::null_mut() } else { - let mut ptrs: Vec<*mut std::os::raw::c_char> = + let ptrs: Vec<*mut std::os::raw::c_char> = state.states.iter().map(|s| string_to_c(s)).collect(); - ptrs.shrink_to_fit(); - let raw = ptrs.as_mut_ptr(); - std::mem::forget(ptrs); + let mut boxed = ptrs.into_boxed_slice(); + let raw = boxed.as_mut_ptr(); + std::mem::forget(boxed); raw }; let elem = Box::new(AdElementState { @@ -189,7 +189,7 @@ pub unsafe extern "C" fn ad_resolve_element( } Err(e) => { error::set_last_error(&e); - AdResult::ErrElementNotFound + error::last_error_code() } } } @@ -229,7 +229,7 @@ pub unsafe extern "C" fn ad_execute_action( } Err(e) => { error::set_last_error(&e); - AdResult::ErrActionFailed + error::last_error_code() } } } @@ -255,10 +255,10 @@ pub unsafe extern "C" fn ad_free_action_result(result: *mut AdActionResult) { for ptr in slice.iter() { free_c_string(*ptr); } - drop(Box::from_raw( - std::slice::from_raw_parts_mut(state.states, state.state_count as usize) - .as_mut_ptr(), - )); + drop(Box::from_raw(std::ptr::slice_from_raw_parts_mut( + state.states, + state.state_count as usize, + ))); } drop(Box::from_raw(r.post_state)); r.post_state = ptr::null_mut(); diff --git a/crates/ffi/src/input.rs b/crates/ffi/src/input.rs index 391b1cf..ba836b8 100644 --- a/crates/ffi/src/input.rs +++ b/crates/ffi/src/input.rs @@ -27,7 +27,7 @@ pub unsafe extern "C" fn ad_get_clipboard( } Err(e) => { error::set_last_error(&e); - AdResult::ErrActionFailed + error::last_error_code() } } } @@ -59,7 +59,7 @@ pub unsafe extern "C" fn ad_set_clipboard( } Err(e) => { error::set_last_error(&e); - AdResult::ErrActionFailed + error::last_error_code() } } } @@ -77,7 +77,7 @@ pub unsafe extern "C" fn ad_clear_clipboard(adapter: *const AdAdapter) -> AdResu } Err(e) => { error::set_last_error(&e); - AdResult::ErrActionFailed + error::last_error_code() } } } @@ -135,7 +135,7 @@ pub unsafe extern "C" fn ad_mouse_event( } Err(e) => { error::set_last_error(&e); - AdResult::ErrActionFailed + error::last_error_code() } } } @@ -173,7 +173,7 @@ pub unsafe extern "C" fn ad_drag( } Err(e) => { error::set_last_error(&e); - AdResult::ErrActionFailed + error::last_error_code() } } } diff --git a/crates/ffi/src/tree.rs b/crates/ffi/src/tree.rs index 2911db8..47bc378 100644 --- a/crates/ffi/src/tree.rs +++ b/crates/ffi/src/tree.rs @@ -144,6 +144,9 @@ pub unsafe extern "C" fn ad_get_tree( opts: *const AdTreeOptions, out: *mut AdNodeTree, ) -> AdResult { + (*out).nodes = ptr::null_mut(); + (*out).count = 0; + let adapter = &*adapter; let opts_ref = &*opts; let core_win = crate::windows::ad_window_to_core(&*win);