File tree Expand file tree Collapse file tree 3 files changed +54
-2
lines changed
Sources/WasmKit/Execution Expand file tree Collapse file tree 3 files changed +54
-2
lines changed Original file line number Diff line number Diff line change @@ -19,6 +19,13 @@ struct NameRegistry {
1919 registry. register ( instance: instance, nameMap: nameMap)
2020 }
2121 }
22+
23+ for (name, entry) in instance. exports {
24+ // Use exported name if the function doesn't have name in name section.
25+ guard case . function( let function) = entry else { continue }
26+ guard registry. functionNames [ function] == nil else { continue }
27+ registry. functionNames [ function] = name
28+ }
2229 }
2330 }
2431
@@ -48,7 +55,7 @@ struct NameRegistry {
4855 }
4956 // Fallback
5057 if function. isWasm {
51- return " function[ \( function. wasm. index) ] "
58+ return " wasm function[\( function. wasm. index) ] "
5259 } else {
5360 return " unknown host function "
5461 }
Original file line number Diff line number Diff line change @@ -147,7 +147,7 @@ class EncoderTests: XCTestCase {
147147 """ ,
148148 options: EncodeOptions ( nameSection: true )
149149 )
150-
150+
151151 var parser = WasmParser . Parser ( bytes: bytes)
152152 var customSections : [ CustomSection ] = [ ]
153153 while let payload = try parser. parseNext ( ) {
Original file line number Diff line number Diff line change @@ -51,4 +51,49 @@ final class ExecutionTests: XCTestCase {
5151 let results = try _start ( )
5252 XCTAssertEqual ( results, [ . i32( 42 ) ] )
5353 }
54+
55+ func testBacktrace( ) throws {
56+ let module = try parseWasm (
57+ bytes: wat2wasm (
58+ """
59+ (module
60+ (memory (export " memory " ) 1)
61+ (func $foo (result i32)
62+ unreachable
63+ )
64+ (func $bar (result i32)
65+ (call $foo)
66+ )
67+ (func (export " _start " )
68+ (call $bar)
69+ (drop)
70+ )
71+ )
72+ """ ,
73+ options: EncodeOptions ( nameSection: true )
74+ )
75+ )
76+
77+ let engine = Engine ( )
78+ let store = Store ( engine: engine)
79+ let instance = try module. instantiate ( store: store)
80+ let _start = try XCTUnwrap ( instance. exports [ function: " _start " ] )
81+
82+ let trap : Trap
83+ do {
84+ try _start ( )
85+ XCTFail ( " expect unreachable trap " )
86+ return
87+ } catch let error {
88+ trap = try XCTUnwrap ( error as? Trap )
89+ }
90+
91+ XCTAssertEqual (
92+ trap. backtrace? . symbols. compactMap ( \.?. name) ,
93+ [
94+ " foo " ,
95+ " bar " ,
96+ " _start " ,
97+ ] )
98+ }
5499}
You can’t perform that action at this time.
0 commit comments