incorporate better error messages in libaml. check for divide by zero on Omod Reference: /n/atom/patch/applied2013/amlmsgs Date: Thu Jun 20 18:54:37 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/libaml/aml.c Thu Jun 20 18:54:08 2013 +++ /sys/src/libaml/aml.c Thu Jun 20 18:54:08 2013 @@ -835,12 +835,12 @@ default: if(PC >= FP->end){ Overrun: - print("PC overrun frame end"); + print("aml: PC overrun frame end"); goto Out; } FP++; if(FP >= FT){ - print("frame stack overflow"); + print("aml: frame stack overflow"); goto Out; } *FP = FP[-1]; @@ -1268,7 +1268,7 @@ { int i; - print("bad opcode %p: ", PC); + print("aml: bad opcode %p: ", PC); for(i=0; i < 8 && (FP->start+i) < FP->end; i++){ if(i > 0) print(" "); @@ -1524,23 +1524,22 @@ case Osub: r = mki(ival(FP->arg[0]) - ival(FP->arg[1])); break; - case Omod: - d = ival(FP->arg[1]); - r = mki(ival(FP->arg[0]) % d); - break; case Omul: r = mki(ival(FP->arg[0]) * ival(FP->arg[1])); break; + case Omod: case Odiv: v = ival(FP->arg[0]); d = ival(FP->arg[1]); if(d == 0){ - print("aml: divide by 0: %#p\n", PC); - return 0; + print("aml: division by zero: PC=%#p\n", PC); + return nil; } + r = mki(v % d); + store(r, FP->arg[2]); + if((FP->op - optab) != Odiv) + return r; r = mki(v / d); - if(FP->arg[2]) - store(mki(v % d), FP->arg[2]); store(r, FP->arg[3]); return r; case Oshl: