Это возможно и вот как это работает:
- Когда структура C передается значением , она обрабатывается так, как если бы она была передана указателем.
Структура:
typedef struct {
size_t a;
double b;
} my_struct_t;
Передать по значению (C):
size_t my_struct_get_a(my_struct_t my) {
return my.a;
}
Передать по значению (Wasm):
(func $func3 (param $var0 i32) (result i32)
get_local $var0
i32.load
)
Передать поуказатель (C):
size_t my_struct_ptr_get_a(const my_struct_t* my) {
return my->a;
}
Передача по указателю (Wasm):
(func $func5 (param $var0 i32) (result i32)
get_local $var0
i32.load
)
Код WebAssembly такой же!
Если структура C
возвращена значением , то ожидается, что она будет передана в качестве первого параметра функции!
Возврат по значению (C):
my_struct_t my_struct_create(size_t a, double b) {
return (my_struct_t){a, b};
}
Возвращаемое значение (Wasm):
(func $func1 (param $var0 i32) (param $var1 i32) (param $var2 f64)
get_local $var0
get_local $var2
f64.store offset=8
get_local $var0
get_local $var1
i32.store
)
Обратите внимание, что Wasm не содержит result
и имеет 3 param
с.
Для сравнения давайте проверим альтернативуфункция:
void my_struct_fill(my_struct_t* my, size_t a, double b) {
my->a = a;
my->b = b;
}
Wasm равен предыдущей функции:
(func $func2 (param $var0 i32) (param $var1 i32) (param $var2 f64)
get_local $var0
get_local $var2
f64.store offset=8
get_local $var0
get_local $var1
i32.store
)
Пример полного кода C и его Wasm
Обратите внимание, этоподход хорошо работает для WebAssembly, asm.js не был проверен.