Skip to content

Fix "make c" target#199

Merged
rossberg merged 3 commits intoWebAssembly:mainfrom
bacek:bacek/make-c
Mar 18, 2026
Merged

Fix "make c" target#199
rossberg merged 3 commits intoWebAssembly:mainfrom
bacek:bacek/make-c

Conversation

@bacek
Copy link
Contributor

@bacek bacek commented Mar 17, 2026

Fixes:

  • Fix new-delete-type-mismatch in WASM_DEFINE_OWN
  • example/hostref: fix resource leaks on early error exits
  • Enable --experimental-wasm-typed-funcref in V8

bacek and others added 3 commits March 18, 2026 07:59
wasm.hh types (FuncType, GlobalType, etc.) are empty pimpl handles —
sizeof is 1. The actual allocated object is the concrete impl (e.g.
FuncTypeImpl, 40 bytes). Using `delete x` on the derived wrapper struct
triggered ASAN new-delete-type-mismatch because the sized operator delete
received sizeof(wasm_functype_t)=1 instead of sizeof(FuncTypeImpl)=40.

Fix: use destroyer{}(static_cast<Name*>(x)) which routes through
Name::destroy() -> delete impl(this), the correct cleanup path.

Re-enable `make c` in CI now that the memory management issue is fixed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use goto-based cleanup to ensure engine/store/binary are always
freed on all error paths. Also fix fclose missing before goto on
fread failure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Set experimental_wasm_typed_funcref flag in flags_init() so externref
wasm modules compile correctly. Update hostref.wat to use typed
ref.null syntax (ref.null extern) required by the typed funcref
proposal, and regenerate hostref.wasm.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@bacek bacek changed the title Fix "make c Fix "make c" target Mar 17, 2026
@bacek
Copy link
Contributor Author

bacek commented Mar 17, 2026

$ make c
==== C hello ====
Initializing...
Loading binary...
Validating module...
Compiling module...
Creating callback...
Instantiating module...
Extracting export...
Calling export...
Calling back...
> Hello World!
Shutting down...
Done.
==== Done ====
==== C callback ====
Initializing...
Loading binary...
Compiling module...
Creating callback...
Instantiating module...
Extracting export...
Calling export...
Calling back...
> 7
Calling back closure...
> 42
Printing result...
> 49
Shutting down...
Done.
==== Done ====
==== C trap ====
Initializing...
Loading binary...
Compiling module...
Creating callback...
Instantiating module...
Extracting exports...
Calling export 0...
Calling back...
Printing message...
> Uncaught Error: callback abort
Printing origin...
> Empty origin.
Printing trace...
> Empty trace.
Calling export 1...
Printing message...
> Uncaught RuntimeError: unreachable
Printing origin...
> Empty origin.
Printing trace...
> Empty trace.
Shutting down...
Done.
==== Done ====
==== C start ====
Initializing...
Loading binary...
Compiling module...
Instantiating module...
Printing message...
> Uncaught RuntimeError: unreachable
Printing origin...
> Empty origin.
Printing trace...
> Empty trace.
Shutting down...
Done.
==== Done ====
==== C reflect ====
Initializing...
Loading binary...
Compiling module...
Instantiating module...
Extracting export...
> export 0 "func"
>> initial: func i32 f64 f32 -> i32
>> current: func i32 f64 f32 -> i32
>> in-arity: 3, out-arity: 1
> export 1 "global"
>> initial: global const f64
>> current: global const f64
> export 2 "table"
>> initial: table 0d 50d funcref
>> current: table 0d 50d funcref
> export 3 "memory"
>> initial: memory 1d
>> current: memory 1d
Shutting down...
Done.
==== Done ====
==== C global ====
Initializing...
Loading binary...
Compiling module...
Creating globals...
Instantiating module...
Extracting exports...
Accessing globals...
Shutting down...
Done.
==== Done ====
==== C memory ====
Initializing...
Loading binary...
Compiling module...
Instantiating module...
Extracting exports...
Checking memory...
Mutating memory...
Growing memory...
Creating stand-alone memory...
Shutting down...
Done.
==== Done ====
==== C hostref ====
Initializing...
Loading binary...
Compiling module...
Creating callback...
Instantiating module...
Extracting exports...
Creating host references...
Accessing global...
call_v_r... okay
call_r_v... okay
call_v_r... okay
call_r_v... okay
call_v_r... okay
call_r_v... okay
call_v_r... okay
call_v_r... okay
Accessing table...
call_i_r... okay
call_i_r... okay
call_ir_v... okay
call_ir_v... okay
call_i_r... okay
call_i_r... okay
call_ir_v... okay
call_i_r... okay
call_i_r... okay
Accessing function...
call_r_r... Calling back...
> > (nil)
okay
call_r_r... Calling back...
> > 0x1
okay
call_r_r... Calling back...
> > 0x2
okay
Shutting down...
Done.
==== Done ====
==== C finalize ====
Initializing...
Live count 0
Creating store 1...
Running in store 1...
Loading binary...
Compiling module...
Instantiating modules...
0
10000
20000
30000
40000
50000
Finalizing #0...
Finalizing #10000...
Finalizing #20000...
Finalizing #30000...
60000
Finalizing #40000...
Finalizing #50000...
70000
80000
Finalizing #60000...
90000
100000
Live count 32963
Creating store 2...
Running in store 2...
Loading binary...
Compiling module...
Instantiating modules...
0
10000
20000
30000
40000
50000
Finalizing #0...
Finalizing #10000...
Finalizing #20000...
Finalizing #30000...
60000
Finalizing #40000...
Finalizing #50000...
70000
80000
Finalizing #60000...
90000
100000
Live count 65138
Deleting store 2...
Finalizing #70000...
Finalizing #80000...
Finalizing #90000...
Finalizing #100000...
Live count 32963
Running in store 1...
Loading binary...
Compiling module...
Instantiating modules...
0
Finalizing #70000...
Finalizing #80000...
10000
20000
Finalizing #90000...
Finalizing #100000...
Finalizing #0...
30000
40000
50000
60000
Finalizing #10000...
Finalizing #20000...
Finalizing #30000...
Finalizing #40000...
70000
80000
Finalizing #50000...
Finalizing #60000...
90000
100000
Live count 34476
Deleting store 1...
Finalizing #70000...
Finalizing #80000...
Finalizing #90000...
Finalizing #100000...
Live count 0
Shutting down...
Done.
==== Done ====
==== C multi ====
Initializing...
Loading binary...
Compiling module...
Creating callback...
Instantiating module...
Extracting export...
Calling export...
Calling back...
> > 1 3 2 4

Printing result...
> 4 3 2 1
Shutting down...
Done.
==== Done ====

Copy link
Member

@rossberg rossberg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Excellent, thanks a lot!

@rossberg rossberg merged commit 6c2ad56 into WebAssembly:main Mar 18, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants