cplusplus.zip
generated_wit_00000.wit.zip
generated_wit_00000b.wit.zip
python.zip
world0-pvwxtgtmlk_fromPython.wasm.zip
world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasm.zip
world1-consumer_fromC++.wasm.zip
Summary
Maybe this is related to #1380 and #1381.
The component interface allows a resource file to be passed to the Python component as borrow.
Under wasmtime, this borrowed resource object is normal, and a.size() can be called successfully.
Under jco, this borrowed resource object becomes an 'illegal type object' in Python, and as soon as a method is called, it triggers:
SystemError: Type does not define the tp_name field
followed by a runtime panic/unreachable.
Environment
jco 1.16.1
wasmtime 41.0.0
OS: macOS Sequoia 15.7
CPU: Intel Core i7
Reproduce steps
The specific reproduction steps are as follows:
-
Use the following command to generate Python binding files from generated_wit_00000.wit.
componentize-py -d xxx/witfiles/package3hl16smu1p -w world0-pvwxtgtmlk bindings xxx/python/world0-pvwxtgtmlk
-
Implement the Python program as shown in python.zip.
-
Use the following command to generate Wasm component file from Python.
cd xxx/python/world0-pvwxtgtmlk
componentize-py --wit-path xxx/witfiles/package3hl16smu1p --world world0-pvwxtgtmlk componentize world0-pvwxtgtmlk_generated -o xxx/componentfiles/world0-pvwxtgtmlk_fromPython.wasm
-
Use the following command to generate C++ binding files from generated_wit_00000b.wit.
wit-bindgen cpp xxx/witfiles/package3hl16smu1p --world world1-consumer --out-dir xxx/cplusplus/world1-consumer
-
Implement the C++ program as shown in cplusplus.zip.
-
Use the following command to generate Wasm component file from C++.
xxx/WASI/wasi-sdk-27.0/wasi-sdk-27.0-x86_64-macos/bin/wasm32-wasip2-clang++ -std=c++23 -o xxx/componentfiles/world1-consumer_fromC++.wasm -mexec-model=reactor xxx/cplusplus/world1-consumer/world1-consumer_generated.cpp xxx/cplusplus/world1-consumer/world1_consumer.cpp xxx/cplusplus/world1-consumer/world1_consumer_component_type.o
-
Use wac to combine the two Wasm component files:
wac plug xxx/componentfiles/world1-consumer_fromC++.wasm --plug xxx/componentfiles/world0-pvwxtgtmlk_fromPython.wasm -o xxx/componentfiles/world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasm
-
Use wasmtime to run the final Wasm component file:
wasmtime run world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasm
Wasmtime prints:
[min] run begin
[dbg] py: open_temp path=mem://f-1 size=1
[dbg] py: file.__init__ path=mem://f-1
[min] before borrow-one
[dbg] py: borrow_one begin
[dbg] py: file.size path=mem://f-1
[dbg] py: borrow_one end -> 1
[min] after borrow-one size=1
[min] PASS
- Use jco to run the same final Wasm component file:
jco run world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasm
jco prints:
[min] run begin
[dbg] py: open_temp path=mem://f-1 size=1
[dbg] py: file.__init__ path=mem://f-1
[min] before borrow-one
[dbg] py: borrow_one begin
Traceback (most recent call last):
File "/0/world0-pvwxtgtmlk_generated.py", line 34, in borrow_one
SystemError: Type does not define the tp_name field.
thread '<unnamed>' panicked at runtime/src/lib.rs:499:21:
Python function threw an unexpected exception
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
RuntimeError: unreachable
at libc.so.abort (wasm://wasm/libc.so-001e65fe:wasm-function[458]:0x1041d)
at wasm://wasm/02a725e2:wasm-function[306]:0xf8e8
at libcomponentize_py_runtime.so.std::sys::pal::wasi::helpers::abort_internal::h118dde344a79086c (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2193]:0xceb72)
at libcomponentize_py_runtime.so.std::process::abort::h2738589d00d7233e (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[1645]:0xb87f6)
at libcomponentize_py_runtime.so.__rustc::__rust_abort (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2002]:0xc7330)
at libcomponentize_py_runtime.so.__rustc::__rust_start_panic (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2208]:0xcfc4c)
at libcomponentize_py_runtime.so.__rustc::rust_panic (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2035]:0xc8a1e)
at libcomponentize_py_runtime.so.std::panicking::rust_panic_with_hook::h02d894de16d94192 (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2034]:0xc899c)
at libcomponentize_py_runtime.so.std::panicking::begin_panic_handler::_$u7b$$u7b$closure$u7d$$u7d$::he125d401eefa4f33 (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[1573]:0xb451a)
at libcomponentize_py_runtime.so.std::sys::backtrace::__rust_end_short_backtrace::h31a9416a2c4ea1cb (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[1572]:0xb4442)
Simplified reproduction steps
- Use wasmtime to run the final Wasm component file:
wasmtime run world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasm
Wasmtime prints:
[min] run begin
[dbg] py: open_temp path=mem://f-1 size=1
[dbg] py: file.__init__ path=mem://f-1
[min] before borrow-one
[dbg] py: borrow_one begin
[dbg] py: file.size path=mem://f-1
[dbg] py: borrow_one end -> 1
[min] after borrow-one size=1
[min] PASS
- Use jco to run the same final Wasm component file:
jco run world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasm
jco prints:
[min] run begin
[dbg] py: open_temp path=mem://f-1 size=1
[dbg] py: file.__init__ path=mem://f-1
[min] before borrow-one
[dbg] py: borrow_one begin
Traceback (most recent call last):
File "/0/world0-pvwxtgtmlk_generated.py", line 34, in borrow_one
SystemError: Type does not define the tp_name field.
thread '<unnamed>' panicked at runtime/src/lib.rs:499:21:
Python function threw an unexpected exception
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
RuntimeError: unreachable
at libc.so.abort (wasm://wasm/libc.so-001e65fe:wasm-function[458]:0x1041d)
at wasm://wasm/02a725e2:wasm-function[306]:0xf8e8
at libcomponentize_py_runtime.so.std::sys::pal::wasi::helpers::abort_internal::h118dde344a79086c (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2193]:0xceb72)
at libcomponentize_py_runtime.so.std::process::abort::h2738589d00d7233e (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[1645]:0xb87f6)
at libcomponentize_py_runtime.so.__rustc::__rust_abort (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2002]:0xc7330)
at libcomponentize_py_runtime.so.__rustc::__rust_start_panic (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2208]:0xcfc4c)
at libcomponentize_py_runtime.so.__rustc::rust_panic (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2035]:0xc8a1e)
at libcomponentize_py_runtime.so.std::panicking::rust_panic_with_hook::h02d894de16d94192 (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[2034]:0xc899c)
at libcomponentize_py_runtime.so.std::panicking::begin_panic_handler::_$u7b$$u7b$closure$u7d$$u7d$::he125d401eefa4f33 (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[1573]:0xb451a)
at libcomponentize_py_runtime.so.std::sys::backtrace::__rust_end_short_backtrace::h31a9416a2c4ea1cb (wasm://wasm/libcomponentize_py_runtime.so-0052fcc2:wasm-function[1572]:0xb4442)
Result Analysis
Maybe this is related to #1380 and #1381.
It may be due to a defect in the encapsulation path from jco's borrow to Python objects (type metadata corrupted/incomplete).
Maybe the bug is in the integration of resource borrow with the Python runtime within the jco execution chain.
The most clearly suspicious bug point in the jco source code is the inconsistency of the two branch parameters in the borrow transfer of js-component-bindgen/src/intrinsics/resource.rs.
cplusplus.zip
generated_wit_00000.wit.zip
generated_wit_00000b.wit.zip
python.zip
world0-pvwxtgtmlk_fromPython.wasm.zip
world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasm.zip
world1-consumer_fromC++.wasm.zip
Summary
Maybe this is related to #1380 and #1381.
The component interface allows a resource file to be passed to the Python component as borrow.
Under wasmtime, this borrowed resource object is normal, and a.size() can be called successfully.
Under jco, this borrowed resource object becomes an 'illegal type object' in Python, and as soon as a method is called, it triggers:
SystemError: Type does not define the tp_name field
followed by a runtime panic/unreachable.
Environment
jco 1.16.1
wasmtime 41.0.0
OS: macOS Sequoia 15.7
CPU: Intel Core i7
Reproduce steps
The specific reproduction steps are as follows:
Use the following command to generate Python binding files from generated_wit_00000.wit.
componentize-py -d xxx/witfiles/package3hl16smu1p -w world0-pvwxtgtmlk bindings xxx/python/world0-pvwxtgtmlkImplement the Python program as shown in python.zip.
Use the following command to generate Wasm component file from Python.
cd xxx/python/world0-pvwxtgtmlkcomponentize-py --wit-path xxx/witfiles/package3hl16smu1p --world world0-pvwxtgtmlk componentize world0-pvwxtgtmlk_generated -o xxx/componentfiles/world0-pvwxtgtmlk_fromPython.wasmUse the following command to generate C++ binding files from generated_wit_00000b.wit.
wit-bindgen cpp xxx/witfiles/package3hl16smu1p --world world1-consumer --out-dir xxx/cplusplus/world1-consumerImplement the C++ program as shown in cplusplus.zip.
Use the following command to generate Wasm component file from C++.
xxx/WASI/wasi-sdk-27.0/wasi-sdk-27.0-x86_64-macos/bin/wasm32-wasip2-clang++ -std=c++23 -o xxx/componentfiles/world1-consumer_fromC++.wasm -mexec-model=reactor xxx/cplusplus/world1-consumer/world1-consumer_generated.cpp xxx/cplusplus/world1-consumer/world1_consumer.cpp xxx/cplusplus/world1-consumer/world1_consumer_component_type.oUse wac to combine the two Wasm component files:
wac plug xxx/componentfiles/world1-consumer_fromC++.wasm --plug xxx/componentfiles/world0-pvwxtgtmlk_fromPython.wasm -o xxx/componentfiles/world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasmUse wasmtime to run the final Wasm component file:
wasmtime run world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasmWasmtime prints:
jco run world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasmjco prints:
Simplified reproduction steps
wasmtime run world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasmWasmtime prints:
jco run world1-consumer_fromC++_importworld0-pvwxtgtmlk_fromPython.wasmjco prints:
Result Analysis
Maybe this is related to #1380 and #1381.
It may be due to a defect in the encapsulation path from jco's borrow to Python objects (type metadata corrupted/incomplete).
Maybe the bug is in the integration of resource borrow with the Python runtime within the jco execution chain.
The most clearly suspicious bug point in the jco source code is the inconsistency of the two branch parameters in the borrow transfer of js-component-bindgen/src/intrinsics/resource.rs.