goby-lang / goby

Goby - Yet another programming language written in Go
MIT License
3.49k stars 171 forks source link

Panic when attempting to use `last()` on an empty array #853

Closed lara closed 4 years ago

lara commented 4 years ago

The instance method last() of the Array object tries to look for array[-1] which doesn't exist on an empty array. Ruby handles this by returning nil.

panic: runtime error: index out of range [-1] [recovered]
        panic: runtime error: index out of range [-1] [recovered]
        panic: runtime error: index out of range [-1] [recovered]
        panic: runtime error: index out of range [-1] [recovered]
        panic: runtime error: index out of range [-1] [recovered]
        panic: runtime error: index out of range [-1]

goroutine 1 [running]:
github.com/goby-lang/goby/vm.(*VM).ExecInstructions.func1(0xc00010e6c0)
        /go/src/github.com/goby-lang/goby/vm/vm.go:193 +0x1d2
panic(0xc3dcc0, 0xc000024040)
        /usr/local/go/src/runtime/panic.go:969 +0x166
github.com/goby-lang/goby/vm.(*Thread).reportErrorAndStop(0xc00010e6c8, 0xc3dcc0, 0xc000024040)
        /go/src/github.com/goby-lang/goby/vm/thread.go:227 +0x373
github.com/goby-lang/goby/vm.(*Thread).startFromTopFrame.func1(0xc00010e6c8)
        /go/src/github.com/goby-lang/goby/vm/thread.go:127 +0x4b
panic(0xc3dcc0, 0xc000024040)
        /usr/local/go/src/runtime/panic.go:969 +0x166
github.com/goby-lang/goby/vm.(*Thread).reportErrorAndStop(0xc00010e6c8, 0xc3dcc0, 0xc000024040)
        /go/src/github.com/goby-lang/goby/vm/thread.go:227 +0x373
github.com/goby-lang/goby/vm.(*Thread).startFromTopFrame.func1(0xc00010e6c8)
        /go/src/github.com/goby-lang/goby/vm/thread.go:127 +0x4b
panic(0xc3dcc0, 0xc000024040)
        /usr/local/go/src/runtime/panic.go:969 +0x166
github.com/goby-lang/goby/vm.(*Thread).reportErrorAndStop(0xc00010e6c8, 0xc3dcc0, 0xc000024040)
        /go/src/github.com/goby-lang/goby/vm/thread.go:227 +0x373
github.com/goby-lang/goby/vm.(*Thread).startFromTopFrame.func1(0xc00010e6c8)
        /go/src/github.com/goby-lang/goby/vm/thread.go:127 +0x4b
panic(0xc3dcc0, 0xc000024040)
        /usr/local/go/src/runtime/panic.go:969 +0x166
github.com/goby-lang/goby/vm.(*Thread).reportErrorAndStop(0xc00010e6c8, 0xc3dcc0, 0xc000024040)
        /go/src/github.com/goby-lang/goby/vm/thread.go:227 +0x373
github.com/goby-lang/goby/vm.(*Thread).startFromTopFrame.func1(0xc00010e6c8)
        /go/src/github.com/goby-lang/goby/vm/thread.go:127 +0x4b
panic(0xc3dcc0, 0xc000024040)
        /usr/local/go/src/runtime/panic.go:969 +0x166
github.com/goby-lang/goby/vm.glob..func21(0xd66620, 0xc0001b1920, 0x2c, 0xc00010e6c8, 0x119dc78, 0x0, 0x0, 0x0, 0x70, 0x78)
        /go/src/github.com/goby-lang/goby/vm/array.go:1020 +0x42f
github.com/goby-lang/goby/vm.(*Thread).evalCallFrame(0xc00010e6c8, 0xd676a0, 0xc0002a5300)
        /go/src/github.com/goby-lang/goby/vm/thread.go:151 +0x1e7
github.com/goby-lang/goby/vm.(*Thread).startFromTopFrame(0xc00010e6c8)
        /go/src/github.com/goby-lang/goby/vm/thread.go:131 +0x82
github.com/goby-lang/goby/vm.(*Thread).evalBuiltinMethod(0xc00010e6c8, 0xd66620, 0xc0001b1920, 0x1129100, 0x2, 0x0, 0xc000191e60, 0x0, 0x2c, 0xc0000287b0, ...)
        /go/src/github.com/goby-lang/goby/vm/thread.go:403 +0x20f
github.com/goby-lang/goby/vm.(*Thread).findAndCallMethod(0xc00010e6c8, 0xd66620, 0xc0001b1920, 0xc000026710, 0x4, 0x2, 0xc000191e60, 0x0, 0x3, 0x2c, ...)
        /go/src/github.com/goby-lang/goby/vm/thread.go:339 +0x43d
github.com/goby-lang/goby/vm.init.0.func27(0xc00010e6c8, 0x2c, 0xc0001d4200, 0xc0001a0f80, 0x4, 0x4)
        /go/src/github.com/goby-lang/goby/vm/instruction.go:412 +0x439
github.com/goby-lang/goby/vm.(*Thread).execInstruction(0xc00010e6c8, 0xc0001d4200, 0xc0001a0fc0)
        /go/src/github.com/goby-lang/goby/vm/thread.go:237 +0x76
github.com/goby-lang/goby/vm.(*Thread).evalCallFrame(0xc00010e6c8, 0xd67760, 0xc0001d4200)
        /go/src/github.com/goby-lang/goby/vm/thread.go:141 +0x3a3
github.com/goby-lang/goby/vm.(*Thread).startFromTopFrame(0xc00010e6c8)
        /go/src/github.com/goby-lang/goby/vm/thread.go:131 +0x82
github.com/goby-lang/goby/vm.(*Thread).builtinMethodYield(0xc00010e6c8, 0xc0001d41e0, 0xc0001875d0, 0x1, 0x1, 0xc000026060)
        /go/src/github.com/goby-lang/goby/vm/thread.go:269 +0x26f
github.com/goby-lang/goby/vm.glob..func14(0xd66620, 0xc0001b1530, 0x26, 0xc00010e6c8, 0x119dc78, 0x0, 0x0, 0xc0001d41e0, 0x70, 0x78)
        /go/src/github.com/goby-lang/goby/vm/array.go:736 +0x1bd
github.com/goby-lang/goby/vm.(*Thread).evalCallFrame(0xc00010e6c8, 0xd676a0, 0xc0002a5240)
        /go/src/github.com/goby-lang/goby/vm/thread.go:151 +0x1e7
github.com/goby-lang/goby/vm.(*Thread).startFromTopFrame(0xc00010e6c8)
        /go/src/github.com/goby-lang/goby/vm/thread.go:131 +0x82
github.com/goby-lang/goby/vm.(*Thread).evalBuiltinMethod(0xc00010e6c8, 0xd66620, 0xc0001b1530, 0x1129020, 0x0, 0x0, 0xc000191c80, 0xc0001d41e0, 0x26, 0xc0000287b0, ...)
        /go/src/github.com/goby-lang/goby/vm/thread.go:403 +0x20f
github.com/goby-lang/goby/vm.(*Thread).findAndCallMethod(0xc00010e6c8, 0xd66620, 0xc0001b1530, 0xc000026668, 0x4, 0x0, 0xc000191c80, 0x0, 0x1, 0x26, ...)
        /go/src/github.com/goby-lang/goby/vm/thread.go:339 +0x43d
github.com/goby-lang/goby/vm.init.0.func27(0xc00010e6c8, 0x26, 0xc0001f5ba0, 0xc0001a1140, 0x4, 0x4)
        /go/src/github.com/goby-lang/goby/vm/instruction.go:412 +0x439
github.com/goby-lang/goby/vm.(*Thread).execInstruction(0xc00010e6c8, 0xc0001f5ba0, 0xc0001a1180)
        /go/src/github.com/goby-lang/goby/vm/thread.go:237 +0x76
github.com/goby-lang/goby/vm.(*Thread).evalCallFrame(0xc00010e6c8, 0xd67760, 0xc0001f5ba0)
        /go/src/github.com/goby-lang/goby/vm/thread.go:141 +0x3a3
github.com/goby-lang/goby/vm.(*Thread).startFromTopFrame(0xc00010e6c8)
        /go/src/github.com/goby-lang/goby/vm/thread.go:131 +0x82
github.com/goby-lang/goby/vm.(*VM).ExecInstructions(0xc00010e6c0, 0xc000194280, 0xa, 0x10, 0xc0000287b0, 0x28)
        /go/src/github.com/goby-lang/goby/vm/vm.go:209 +0x75b
main.main()
        /go/src/github.com/goby-lang/goby/goby.go:124 +0xaf8
hachi8833 commented 4 years ago

Good catch!🙇

st0012 commented 4 years ago

@lara thanks for the report 👍

st0012 commented 4 years ago

solved by #854