mirror of https://github.com/pyodide/pyodide.git
Add tests for dyncall_so patch (#908)
This commit is contained in:
parent
3f9062adf7
commit
108c613a28
|
@ -1,3 +1,5 @@
|
|||
Tests for this are in emsdk/tests/test_dyncall.py
|
||||
|
||||
--- a/emsdk/fastcomp/emscripten/src/support.js
|
||||
+++ b/emsdk/fastcomp/emscripten/src/support.js
|
||||
@@ -338,6 +338,11 @@ function relocateExports(exports, memoryBase, tableBase, moduleLocal) {
|
||||
|
|
|
@ -16,3 +16,28 @@ env = {
|
|||
"EM_CACHE": str(EMSDK / ".emscripten_cache"),
|
||||
"BINARYEN_ROOT": str(EMSDK / "binaryen"),
|
||||
}
|
||||
|
||||
MAIN_C = """
|
||||
#include <stdio.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
int main() {
|
||||
puts("hello from main");
|
||||
void *handle = dlopen("library.wasm", RTLD_NOW);
|
||||
if (!handle) {
|
||||
puts("cannot load side module");
|
||||
puts(dlerror());
|
||||
return 1;
|
||||
}
|
||||
typedef void (*type_v)();
|
||||
type_v side_func = (type_v) dlsym(handle, "foo");
|
||||
if (!side_func) {
|
||||
puts("cannot load side function");
|
||||
puts(dlerror());
|
||||
return 1;
|
||||
} else {
|
||||
side_func();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
"""
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
import subprocess
|
||||
from . import common
|
||||
|
||||
|
||||
def test_emulate_function(tmpdir):
|
||||
with tmpdir.as_cwd():
|
||||
with open("library.c", "w") as f:
|
||||
f.write(
|
||||
"""\
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <setjmp.h>
|
||||
#include <assert.h>
|
||||
|
||||
// This can be any function that has a signature not found in main.
|
||||
__attribute__ ((noinline)) int indirect_function(int a, float b, int c, double d) {
|
||||
return a;
|
||||
}
|
||||
|
||||
typedef int (*type_iifid) (int, float, int, double);
|
||||
|
||||
void foo() {
|
||||
// Hack to force inclusion of malloc
|
||||
volatile int x = (int) malloc(1);
|
||||
free((void *) x);
|
||||
|
||||
type_iifid fp = &indirect_function;
|
||||
|
||||
jmp_buf buf;
|
||||
int i = setjmp(buf);
|
||||
|
||||
printf("%d\\n", i);
|
||||
assert(fp(i, 0, 0, 0) == i);
|
||||
|
||||
if (i == 0) longjmp(buf, 1);
|
||||
}
|
||||
"""
|
||||
)
|
||||
with open("main.c", "w") as f:
|
||||
f.write(common.MAIN_C)
|
||||
|
||||
subprocess.run(
|
||||
[
|
||||
"emcc",
|
||||
"-s",
|
||||
"SIDE_MODULE=1",
|
||||
"library.c",
|
||||
"-o",
|
||||
"library.wasm",
|
||||
"-s",
|
||||
"EMULATE_FUNCTION_POINTER_CASTS=1",
|
||||
"-s",
|
||||
"EXPORT_ALL=1",
|
||||
],
|
||||
check=True,
|
||||
env=common.env,
|
||||
)
|
||||
subprocess.run(
|
||||
[
|
||||
"emcc",
|
||||
"-s",
|
||||
"MAIN_MODULE=1",
|
||||
"main.c",
|
||||
"--embed-file",
|
||||
"library.wasm",
|
||||
"-s",
|
||||
"EMULATE_FUNCTION_POINTER_CASTS=1",
|
||||
],
|
||||
check=True,
|
||||
env=common.env,
|
||||
)
|
||||
out = subprocess.run(
|
||||
["node", "a.out.js"], capture_output=True, check=True, env=common.env
|
||||
)
|
||||
assert out.stdout == b"hello from main\n0\n4\n"
|
|
@ -14,31 +14,8 @@ void foo() {
|
|||
}"""
|
||||
)
|
||||
with open("main.c", "w") as f:
|
||||
f.write(
|
||||
"""\
|
||||
#include <stdio.h>
|
||||
#include <dlfcn.h>
|
||||
f.write(common.MAIN_C)
|
||||
|
||||
int main() {
|
||||
puts("hello from main");
|
||||
void *f = dlopen("library.wasm", RTLD_NOW);
|
||||
if (!f) {
|
||||
puts("cannot load side module");
|
||||
puts(dlerror());
|
||||
return 1;
|
||||
}
|
||||
typedef void (*voidfunc)();
|
||||
voidfunc g = (voidfunc) dlsym(f, "foo");
|
||||
if (!g) {
|
||||
puts("cannot load side function");
|
||||
return 1;
|
||||
} else {
|
||||
g();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
"""
|
||||
)
|
||||
subprocess.run(
|
||||
[
|
||||
"emcc",
|
||||
|
|
Loading…
Reference in New Issue