Skip to content

Commit 08cca04

Browse files
authored
Support externref in EM_JS functions with dynamic linking (#20171)
1 parent aaf54b6 commit 08cca04

File tree

6 files changed

+48
-0
lines changed

6 files changed

+48
-0
lines changed

emscripten.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ def type_to_sig(type):
620620
webassembly.Type.I64: 'j',
621621
webassembly.Type.F32: 'f',
622622
webassembly.Type.F64: 'd',
623+
webassembly.Type.EXTERNREF: 'e',
623624
webassembly.Type.VOID: 'v'
624625
}[type]
625626

src/library_addfunction.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ addToLibrary({
2929
'j': 'i64',
3030
'f': 'f32',
3131
'd': 'f64',
32+
'e': 'externref',
3233
#if MEMORY64
3334
'p': 'i64',
3435
#else

test/core/test_externref_emjs.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "emscripten/em_js.h"
2+
3+
4+
EM_JS(__externref_t, get_ref, (), {
5+
return {a: 7, b: 9};
6+
});
7+
8+
EM_JS(void, modify_ref, (__externref_t arg), {
9+
arg.a += 3;
10+
arg.b -= 3;
11+
});
12+
13+
EM_JS(void, log_ref, (__externref_t arg), {
14+
console.log(arg);
15+
});
16+
17+
int main() {
18+
__externref_t a = get_ref();
19+
log_ref(a);
20+
modify_ref(a);
21+
log_ref(a);
22+
}

test/core/test_externref_emjs.out

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{ a: 7, b: 9 }
2+
{ a: 10, b: 6 }

test/test_core.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9801,6 +9801,19 @@ def test_externref(self):
98019801
self.emcc_args += ['-mreference-types']
98029802
self.do_core_test('test_externref.c', libraries=['asm.o'])
98039803

9804+
@parameterized({
9805+
'': [False],
9806+
'dynlink': [True]
9807+
})
9808+
@requires_node
9809+
@no_wasm2js('wasm2js does not support reference types')
9810+
def test_externref_emjs(self, dynlink):
9811+
self.emcc_args += ['-mreference-types']
9812+
self.node_args += shared.node_reference_types_flags()
9813+
if dynlink:
9814+
self.set_setting('MAIN_MODULE', 2)
9815+
self.do_core_test('test_externref_emjs.c')
9816+
98049817
def test_syscall_intercept(self):
98059818
self.do_core_test('test_syscall_intercept.c')
98069819

tools/shared.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,15 @@ def node_bigint_flags():
356356
return []
357357

358358

359+
def node_reference_types_flags():
360+
node_version = check_node_version()
361+
# reference types were enabled by default in node v18.
362+
if node_version and node_version < (18, 0, 0):
363+
return ['--experimental-wasm-reftypes']
364+
else:
365+
return []
366+
367+
359368
def node_memory64_flags():
360369
return ['--experimental-wasm-memory64']
361370

0 commit comments

Comments
 (0)