bytecodealliance / bytecodealliance/go-modules

wit-bindgen-go hangs on deeply nested result types

Open
#410 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
148
Forks
20
PR merge metrics
No merged PRs in 30d

Description

**Summary**

`wit-bindgen-go generate` hangs and is eventually killed (SIGTERM) when processing a legal WIT package that contains a very deeply nested `result<_, result<_, list<...>>>` shape.

**Steps-To-Reproduce**

```bash
ulimit -Sv 4194304 # 4GB virtual mem cap
go run ./cmd/wit-bindgen-go \
generate \
--versioned \
--generate-wit \
--out .poc_out \
poc.wit
```

**poc.wit** (validated by `wasm-tools component wit`)

```plain
package x:name5;

interface name1 {
}

interface name2 {
}

interface name3 {
}

interface name4 {
}

interface name5 {
}

interface name6 {
}

interface name7 {
}

interface name8 {
}

interface name9 {
}

world name {
import name2:name3/x@1.1.0+1.2.0;
use name2:name3/x@1.1.0+1.2.0.{name5 as name};

type name2 = tuple>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>, bool, bool, bool, bool, bool>;

type name3 = result<_, result<_, list>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;

flags name4 {
name5,
name6,
name7,
name8,
name9,
name10,
name11,
name12,
name13,
}

type name14 = tuple>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>, bool, bool, bool, bool, bool>;

record name15 {
name16: bool,
}

export name2:name3/x@1.1.0+1.2.0;
}
package name2:name3@1.1.0+1.2.0 {
interface x {
type name8 = result<_, result<_, list>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;

enum name12 {
name13,
name14,
}

type name10 = result>>>>>>>>>>>>>>>>>>>>>>>>>>>;

type name3 = result>>>>>>>>>>>>>>>>>>>>>>>>>>>;

enum name5 {
name6,
name7,
}

name2: func(name: result<_, list>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>, name1: bool, name2: bool, name3: bool);

name: async func(name: tuple>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>, bool>>) -> tuple>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>, bool>;

name9: func(name: result<_, list>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>, name1: bool, name2: bool, name3: bool);

x11: func();

x: func();
}
}
```

**Expected**

writes generated Go bindings successfully.

**Actual**

process spins until killed (OOM).

**Environment**

ubuntu 22.04, x86-64, Go 1.24.3

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.