go-stack / stack

Package stack implements utilities to capture, manipulate, and format call stacks.
MIT License
394 stars 33 forks source link

Deprecated function Call.PC() breaks tinygo compatibility? #31

Open dkegel-fastly opened 2 years ago

dkegel-fastly commented 2 years ago

Following a rabbit hole of dependencies that starts at https://github.com/tinygo-org/tinygo/issues/2153, I noticed that

$ git clone https://github.com/go-stack/stack
$ cd stack
$ go test

succeeds, but

$ tinygo test

fails with

stack.go:164:17: c.frame.PC undefined (type runtime.Frame has no field or method PC)

That's

162 // Deprecated: Use Call.Frame instead.
163 func (c Call) PC() uintptr {
164         return c.frame.PC
165 }

So for what it's worth, the deprecated function Call.PC() is causing tinygo build failure. Commenting it out lets tinygo test pass.

ChrisHines commented 2 years ago

Indeed. Tinygo's runtime.Frame type is not fully compatible with Go's runtime.Frame type. It is missing several fields.

The best solution here is to move func (c Call) PC() uintptr into a separate file that specifies a !tinygo build tag.

Would you like to submit a PR for that?

dkegel-fastly commented 2 years ago

I must have been smoking something. Fixing that one problem uncovers another one now:

stack_test.go:580:6: fn.FileLine undefined (type *runtime.Func has no field or method FileLine)

so maybe it's best to leave sleeping dogs lie for a bit, until the need for a fix is stronger.

ChrisHines commented 2 years ago

Sure. Tinygo's runtime package is quite a bit smaller than Go's, so any code that depends on runtime is likely to have issues like this.