From 3332e321440a0158f33bd94b069499d802009521 Mon Sep 17 00:00:00 2001 From: zhangyuang Date: Sat, 21 Oct 2023 22:19:01 +0800 Subject: [PATCH] fix: struct offset position --- src/lib.rs | 14 +++++++++----- src/utils.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 44e8881..03a7fb5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,8 +6,9 @@ use define::{number_to_data_type, DataType, FFIParams, OpenParams, RsArgsValue}; use napi::bindgen_prelude::*; use utils::{ calculate_layout, create_array_from_pointer, get_data_type_size_align, - get_js_function_call_value, js_array_to_number_array, js_array_to_string_array, - js_nunmber_to_i32, js_string_to_string, js_unknown_to_data_type, rs_array_to_js_array, ArrayType, + get_js_function_call_value, get_rs_value_size_align, js_array_to_number_array, + js_array_to_string_array, js_nunmber_to_i32, js_string_to_string, js_unknown_to_data_type, + rs_array_to_js_array, ArrayType, }; use indexmap::IndexMap; @@ -311,9 +312,12 @@ fn load( }; } RsArgsValue::Object(val) => { - let (size, align) = calculate_layout(&val); - let layout = if size > 0 && align > 0 { - Layout::from_size_align(size, 4).unwrap() + let (size, _) = calculate_layout(&val); + + let layout = if size > 0 { + let (_, first_field) = val.get_index(0).unwrap(); + let (_, align) = get_rs_value_size_align(first_field); + Layout::from_size_align(size, align).unwrap() } else { Layout::new::() }; diff --git a/src/utils.rs b/src/utils.rs index 4b11477..4c5a843 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -112,6 +112,35 @@ pub fn calculate_layout(map: &IndexMap) -> (usize, usize) { (size, align) } +pub fn get_rs_value_size_align(val: &RsArgsValue) -> (usize, usize) { + return match val { + RsArgsValue::I32(_) => (std::mem::size_of::(), std::mem::align_of::()), + RsArgsValue::Boolean(_) => (std::mem::size_of::(), std::mem::align_of::()), + RsArgsValue::String(_) => ( + std::mem::size_of::<*const c_char>(), + std::mem::align_of::<*const c_char>(), + ), + RsArgsValue::Double(_) => ( + std::mem::size_of::(), + std::mem::align_of::(), + ), + RsArgsValue::StringArray(_) => ( + std::mem::size_of::<*const *const c_char>(), + std::mem::align_of::<*const *const c_char>(), + ), + RsArgsValue::DoubleArray(_) => ( + std::mem::size_of::<*const c_double>(), + std::mem::align_of::<*const c_double>(), + ), + RsArgsValue::I32Array(_) => ( + std::mem::size_of::<*const c_int>(), + std::mem::align_of::<*const c_int>(), + ), + _ => { + panic!("get_rs_value_size_align error") + } + }; +} pub fn get_data_type_size_align(data_type: DataType) -> (usize, usize) { return match data_type { DataType::I32 => (std::mem::size_of::(), std::mem::align_of::()),