【发布时间】:2018-09-16 09:30:12
【问题描述】:
我正在使用“wasm32-unknown-unknown”目标进行一个涉及 Rust 和 WebAssembly 的项目。使用这个函数从我的 Rust 代码中返回 Vec<i32> 是没有问题的:
#[no_mangle]
pub extern "C" fn calc_vector() -> usize {
unsafe {
vec_len = 0;
}
let mut data: Vec<i32> = Vec::new();
for i in 0..1000 {
data.push(i);
}
unsafe {
vec_len = data.len();
}
data.as_mut_ptr() as usize
}
这会返回一个偏移量,然后我从 JS 调用另一个函数来获取我的Vec 的长度。然后我再次在 JavaScript 中构建 Vector(知道 i32 -> 4x uint8):
let vec_addr = exports.calc_vector();
let vec_len = exports.get_vec_len();
while(arr.length < vec_len) {
let numberUint8 = new DataView(view.buffer, vec_addr, 4);
let number = numberUint8.getInt32(0, true);
arr.push(number)
// move to next value in vector
vec_addr += 4;
}
使用它,我想创建一个返回 Vec<Vec<i32>> 的 Rust 函数,但是它不起作用:
#[no_mangle]
pub extern "C" fn calc_vector_in_vector() -> usize {
unsafe {
vec_len = 0;
elements_in_vect = 0;
}
let mut outer_vec: Vec<*mut i32> = Vec::new();
let mut inner_vec: Vec<i32> = Vec::new();
for i in 0..100 {
inner_vec.push(i);
unsafe {
elements_in_vect += 1;
}
}
outer_vec.push(inner_vec.as_mut_ptr());
unsafe {
vec_len = outer_vec.len();
}
outer_vec.as_mut_ptr() as usize
}
我认为我可以使用与单个Vec 相同的逻辑:在从calc_vector_in_vector() 返回的地址是外部向量的第一个条目,包含的地址为i32 的第一个元素的第一个元素内部向量(实际数字)。但是,在这个地址上似乎有废话。我在这里做错了什么?
【问题讨论】:
-
我不确定第一个示例是如何工作的。您正在返回一个指向立即超出范围的值的指针。我没有使用过wasm,但我想这样做的方法是在Javascript中分配一个缓冲区,并从Rust中填充缓冲区。这样,Javascript 就拥有数据并且不会超出范围。
-
请参阅How to return a string (or similar) from Rust in WebAssembly? 了解如何正确返回
Vec。
标签: javascript pointers rust webassembly