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:
allaun 2026-06-30 18:15:09 -05:00
parent cb18b24627
commit a6db85ab5e

View file

@ -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: