System information (version)
- OpenCV => 4.5.1 & master
- Operating System / Platform => node 8/10/14 (built on ubuntu 20)
- Compiler => emscripten
Detailed description
Expected behavior:
- Running opencv.js via node built using the documented instructions correctly loads, passes all tests and runs
test_async.js (see further).
- Pre-built opencv.js passes all tests and
test_async.js
Note that running the tests.html via browser works correctly, the failures are specific to running via node.js.
Actual behavior:
- Self-built opencv.js
node tests.js fails to even fail properly and instead just reports 0 failed, 0 passed
node test_async.js fails to load wasm due to needing experimental wasm threads & shared memory
RuntimeError: abort(RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #73 failed: Invalid opcode (enable with --experimental-wasm-threads) @+39429)
- (with threads enabled)
RuntimeError: abort(RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #73 failed: Atomic opcodes used without shared memory @+39428)
- Pre-built opencv.js
node tests.js fails most tests (34 failed, 10 passed), due to improper loading
node test_async.js works as expected (and generally using the pre-built library works as expected when loaded properly)
**
Running node tests.js simply outputs:
Testing /home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js ...
0 failed, 0 passed
If I modify tests.js and only allow a single file (e.g. tests: [ 'test_mat.js']) I instead get the following error:
You are getting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js
RuntimeError: abort(You are getting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js) at Error
at jsStackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381549)
at stackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381725)
at abort (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:33457)
at Promise.get (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7202)
at Object.<anonymous> (/home/ubuntu/prog/docker-opencv/js_wasm/bin/test_mat.js:756:26)
at runTest (/home/ubuntu/prog/docker-opencv/js_wasm/bin/node_modules/node-qunit/node_modules/qunit/qunit/qunit.js:3044:32)
at Test.run (/home/ubuntu/prog/docker-opencv/js_wasm/bin/node_modules/node-qunit/node_modules/qunit/qunit/qunit.js:3032:8)
at /home/ubuntu/prog/docker-opencv/js_wasm/bin/node_modules/node-qunit/node_modules/qunit/qunit/qunit.js:3255:15
at processTaskQueue (/home/ubuntu/prog/docker-opencv/js_wasm/bin/node_modules/node-qunit/node_modules/qunit/qunit/qunit.js:2640:26)
at /home/ubuntu/prog/docker-opencv/js_wasm/bin/node_modules/node-qunit/node_modules/qunit/qunit/qunit.js:2644:12
0 failed, 0 passed
This is presumably due to the tests not loading the library correctly.
**
Running node test_async.js (code see further) produces the following error:
Node 8/Node 10 -- generic decoding error:
failed to asynchronously prepare wasm: CompileError: WasmCompile: Wasm decoding failed: unexpected section: Code @+37433
CompileError: WasmCompile: Wasm decoding failed: unexpected section: Code @+37433
RuntimeError: abort(CompileError: WasmCompile: Wasm decoding failed: unexpected section: Code @+37433) at Error
at jsStackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381549)
at stackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381725)
at abort (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:33457)
at /home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7358365
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:189:7)
at Function.Module.runMain (module.js:696:11)
at startup (bootstrap_node.js:204:16)
at bootstrap_node.js:625:3
Node 14 -- invalid threads opcode
RuntimeError: abort(RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #73 failed: Invalid opcode (enable with --experimental-wasm-threads) @+39429) at Error
at jsStackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381549)
at stackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381725)
at abort (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:33457)
at /home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7358365) at Error
at jsStackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381549)
at stackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381725)
at process.abort (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:33457)
at process.emit (events.js:315:20)
at processPromiseRejections (internal/process/promises.js:245:33)
at processTicksAndRejections (internal/process/task_queues.js:94:32)
at process.abort (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:33488)
at process.emit (events.js:315:20)
at processPromiseRejections (internal/process/promises.js:245:33)
at processTicksAndRejections (internal/process/task_queues.js:94:32)
Rerunning with --experimental-wasm-threads produces invalid shared memory opcode instead
RuntimeError: abort(RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #73 failed: Atomic opcodes used without shared memory @+39428) at Error
at jsStackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381549)
at stackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381725)
at abort (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:33457)
at /home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7358365) at Error
at jsStackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381549)
at stackTrace (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:7381725)
at process.abort (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:33457)
at process.emit (events.js:315:20)
at processPromiseRejections (internal/process/promises.js:245:33)
at processTicksAndRejections (internal/process/task_queues.js:94:32)
at process.abort (/home/ubuntu/prog/docker-opencv/js_wasm/bin/opencv.js:31:33488)
at process.emit (events.js:315:20)
at processPromiseRejections (internal/process/promises.js:245:33)
at processTicksAndRejections (internal/process/task_queues.js:94:32)
Steps to reproduce
- Follow instructions here except for extra flags (see 2) https://docs.opencv.org/4.5.1/d4/da1/tutorial_js_setup.html
- using emsdk or docker didn't make any difference, nor the latest emsdk vs 2.0.10
- using
--build_wasm or not also doesn't seem to matter (it always produces wasm)
- Build with
--build_test and --build_flags '-s ASSERTIONS=1'
sudo docker run --rm -v $(pwd):/src -u 1000:1000 emscripten/emsdk:2.0.10 emcmake python3 ./opencv/platforms/js/build_js.py js_assertions --build_test --build_flags '-s ASSERTIONS=1'
- install node dependencies & run tests
- change
tests.js to run only for a single file (tests: [ 'test_mat.js' ]) & run tests
- run
node test_async.js
let cv
function loadOpenCv() {
return new Promise(resolve => {
global.Module = {
onRuntimeInitialized: () => {
console.log('opencv ready')
resolve()
}
}
cv = require('./opencv.js')
})
}
loadOpenCv().then(() => {
const mat = new cv.Mat(10, 20, cv.CV_8UC3)
console.log(mat.cols)
mat.delete()
})
Issue submission checklist
System information (version)
Detailed description
Expected behavior:
test_async.js(see further).test_async.jsNote that running the
tests.htmlvia browser works correctly, the failures are specific to running via node.js.Actual behavior:
node tests.jsfails to even fail properly and instead just reports0 failed, 0 passednode test_async.jsfails to load wasm due to needing experimental wasm threads & shared memoryRuntimeError: abort(RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #73 failed: Invalid opcode (enable with --experimental-wasm-threads) @+39429)RuntimeError: abort(RuntimeError: abort(CompileError: WebAssembly.instantiate(): Compiling function #73 failed: Atomic opcodes used without shared memory @+39428)node tests.jsfails most tests (34 failed, 10 passed), due to improper loadingnode test_async.jsworks as expected (and generally using the pre-built library works as expected when loaded properly)**
Running
node tests.jssimply outputs:If I modify
tests.jsand only allow a single file (e.g.tests: [ 'test_mat.js']) I instead get the following error:This is presumably due to the tests not loading the library correctly.
**
Running
node test_async.js(code see further) produces the following error:Node 8/Node 10 -- generic decoding error:
Node 14 -- invalid threads opcode
Rerunning with
--experimental-wasm-threadsproduces invalid shared memory opcode insteadSteps to reproduce
--build_wasmor not also doesn't seem to matter (it always produces wasm)--build_testand--build_flags '-s ASSERTIONS=1'tests.jsto run only for a single file (tests: [ 'test_mat.js' ]) & run testsnode test_async.jsIssue submission checklist
answers.opencv.org, Stack Overflow, etc and have not found solution