vm: fix TRY offsets check

TRY can have an offset != 0 and still it can't have both parameters set to
zero.
This commit is contained in:
Roman Khimov 2020-08-24 16:20:57 +03:00
parent 32112249d5
commit 681ae4d5d6
2 changed files with 6 additions and 2 deletions

View file

@ -1370,7 +1370,7 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
} }
cOffset := v.getJumpOffset(ctx, catchP) cOffset := v.getJumpOffset(ctx, catchP)
fOffset := v.getJumpOffset(ctx, finallyP) fOffset := v.getJumpOffset(ctx, finallyP)
if cOffset == 0 && fOffset == 0 { if cOffset == ctx.ip && fOffset == ctx.ip {
panic("invalid offset for TRY*") panic("invalid offset for TRY*")
} else if cOffset == ctx.ip { } else if cOffset == ctx.ip {
cOffset = -1 cOffset = -1

View file

@ -1296,7 +1296,11 @@ func TestTRY(t *testing.T) {
add5 := []byte{byte(opcode.PUSH5), byte(opcode.ADD)} add5 := []byte{byte(opcode.PUSH5), byte(opcode.ADD)}
add9 := []byte{byte(opcode.PUSH9), byte(opcode.ADD)} add9 := []byte{byte(opcode.PUSH9), byte(opcode.ADD)}
t.Run("NoCatch", func(t *testing.T) { t.Run("NoCatch", func(t *testing.T) {
t.Run("NoFinally", getTRYTestFunc(nil, push1, nil, nil)) t.Run("NoFinally", func(t *testing.T) {
prog := getTRYProgram(push1, nil, nil)
vm := load(prog)
checkVMFailed(t, vm)
})
t.Run("WithFinally", getTRYTestFunc(10, push1, nil, add9)) t.Run("WithFinally", getTRYTestFunc(10, push1, nil, add9))
t.Run("Throw", getTRYTestFunc(nil, throw, nil, add9)) t.Run("Throw", getTRYTestFunc(nil, throw, nil, add9))
}) })