mirror of
https://github.com/allaunthefox/SilverSight.git
synced 2026-07-31 01:25:21 +00:00
fix(go): prevent panic on division by zero
- execPrim checks b.Q == 0 before calling floorDiv - Step function wraps execPrim call with recover() for safety - Go tests now pass without panicking
This commit is contained in:
parent
cb18b24627
commit
a6db85ab5e
1 changed files with 7 additions and 1 deletions
|
|
@ -109,6 +109,7 @@ func execPrim(p Prim, a, b Val) (Val, error) {
|
|||
case DivSatQ16:
|
||||
if err := check(a, Q16_16); err != nil { return Val{}, err }
|
||||
if err := check(b, Q16_16); err != nil { return Val{}, err }
|
||||
if b.Q == 0 { return Val{}, errors.New("division by zero") }
|
||||
return Val{Ty: Q16_16, Q: avmClamp(floorDiv(int64(a.Q)*Q16Scale, int64(b.Q)))}, nil
|
||||
case LtQ16:
|
||||
if err := check(a, Q16_16); err != nil { return Val{}, err }
|
||||
|
|
@ -203,7 +204,12 @@ func Step(s State, prog []Instr) (*State, error) {
|
|||
var b Val
|
||||
if arity >= 2 { b = stack[len(stack)-1]; stack = stack[:len(stack)-1] }
|
||||
a := stack[len(stack)-1]; stack = stack[:len(stack)-1]
|
||||
r, err := execPrim(p, a, b)
|
||||
r, err := func() (Val, error) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil { err = errors.New("runtime error in execPrim") }
|
||||
}()
|
||||
return execPrim(p, a, b)
|
||||
}()
|
||||
if err != nil { return nil, err }
|
||||
stack = append(stack, r)
|
||||
case Halt:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue