Web Assembly, struct to JavaScript Object and back
tirithen
tirithen at gmail.com
Tue Jun 23 18:15:25 UTC 2020
I'm experimenting with generating wasm files with ldc2 but I'm
having problems when trying to pass JavaScript Objects and
receive them as structs and the other way around.
I found this super nice getting started guide that works fine for
basic types like double and so on
https://wiki.dlang.org/Generating_WebAssembly_with_LDC , but I'm
puzzled on how to pass more advanced data structures.
I found this C example where it's mentioned that structs in that
case will always be passed by pointer
https://stackoverflow.com/questions/50615377/how-do-you-call-a-c-function-that-takes-or-returns-a-struct-by-value-from-js-v#answer-56405899 . Is something similar possible with D?
My setup so far:
test.d:
extern (C): // disable D mangling
void callback(double a, double b, double c);
double add(double a, double b) {
const c = a + b;
callback(a, b, c);
return c;
}
struct Vector2 {
double x;
double y;
}
Vector2 addVectors(Vector2 a, Vector2 b) {
return Vector2(a.x + b.x, a.y + b.y);
}
void _start() {
}
index.html:
<html>
<head>
<script>
const callback = (a, b, c) => {
console.log(`callback from D: ${a} + ${b} = ${c}`);
};
fetch('test.wasm').then((response) =>
response.arrayBuffer()).then((code) => {
const importObject = {env: {callback}};
WebAssembly.instantiate(code, importObject).then(result
=> {
const {exports} = result.instance;
const r = exports.add(42, -2.5);
console.log('r = ' + r);
const r2 = exports.addVectors({x: 2, y: 4}, {x: 1, y:
-1.5});
console.log('r2 =', r2);
});
});
</script>
</head>
<body>
Test page, open console to see the WASM results
</body>
</html>
Then I build test.d with:
$ ldc2 -mtriple=wasm32-unknown-unknown-wasm -L-allow-undefined
-betterC test.d
When I serve and open the address in a browser and open the
console I get:
r = 39.5
r2 = undefined
Anyone that has something similar working with struct objects?
More information about the Digitalmars-d-learn
mailing list