Closed lara closed 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.
last()
Array
array[-1]
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
Good catch!🙇
@lara thanks for the report 👍
solved by #854
The instance method
last()
of theArray
object tries to look forarray[-1]
which doesn't exist on an empty array. Ruby handles this by returningnil
.