Skip to content

Commit 8faa43f

Browse files
committed
lib(rust): Use packed(u64) tuple when +multivalue feature not defined
rust-lang/rust#73755 (comment)
1 parent 4636bf0 commit 8faa43f

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

libs/rust/src/lib.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,29 @@ mod host {
3030
}
3131

3232
pub mod num {
33-
use crate::types::{number::Type, JSNumber, Null, Number};
33+
use crate::types::{ffi::CTuple, number::Type, JSNumber, Null, Number};
34+
use core::ffi::c_void;
3435
pub type Setter = extern "C" fn(Number, JSNumber);
3536
pub type Getter = extern "C" fn(Number) -> JSNumber;
3637

3738
#[link(wasm_import_module = "nusa")]
3839
#[allow(improper_ctypes)]
3940
extern "C" {
41+
#[cfg(target_feature = "multivalue")]
4042
#[link_name = "num.allocate"]
4143
pub fn allocate(ty: Type, len: u16, nullable: bool) -> (Number, Null);
44+
45+
#[cfg(not(target_feature = "multivalue"))]
46+
#[link_name = "num.cABIallocate"]
47+
pub fn allocate(ty: Type, len: u16, nullable: bool) -> CTuple<Number, Null>;
48+
49+
#[cfg(target_feature = "multivalue")]
4250
#[link_name = "num.accessor"]
4351
pub fn accessor(ty: Type) -> (Getter, Setter);
52+
53+
#[cfg(not(target_feature = "multivalue"))]
54+
#[link_name = "num.cABIaccessor"]
55+
pub fn accessor(ty: Type) -> CTuple<*const c_void, *const c_void>;
4456
}
4557

4658
#[link(wasm_import_module = "nusa")]

libs/rust/src/number.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{host, types, Accessor, Series};
2-
use core::primitive;
2+
use core::{intrinsics::transmute, primitive};
33
use types::number::{JSNumber, Type};
44

55
macro_rules! bridge {
@@ -19,7 +19,7 @@ macro_rules! bridge {
1919
}
2020

2121
fn allocate(len: host::Size) -> (usize, usize) {
22-
let (number, null) = unsafe { host::num::allocate(Type::$Ty, len, false) };
22+
let (number, null) = unsafe { host::num::allocate(Type::$Ty, len, false).into() };
2323
(number.addr, null.addr)
2424
}
2525

@@ -33,8 +33,8 @@ macro_rules! bridge {
3333
pub fn new() -> Self {
3434
let len = unsafe { host::scope::size() };
3535
let (addr, _) = Self::allocate(len);
36-
let (getter, setter) = unsafe { host::num::accessor(Type::$Ty) };
37-
let accr = (getter, setter);
36+
let (getter, setter) = unsafe { host::num::accessor(Type::$Ty).into() };
37+
let accr = unsafe { (transmute(getter), transmute(setter)) };
3838
$ty { len, addr, accr }
3939
}
4040
}

0 commit comments

Comments
 (0)