diff --git a/squirrel/sqvm.cpp b/squirrel/sqvm.cpp index 7a47d19..d087c5f 100644 --- a/squirrel/sqvm.cpp +++ b/squirrel/sqvm.cpp @@ -68,12 +68,14 @@ bool SQVM::ARITH_OP(SQUnsignedInteger op,SQObjectPtr &trg,const SQObjectPtr &o1, switch(op) { case '+': res = i1 + i2; break; case '-': res = i1 - i2; break; - case '/': if(i2 == 0) { Raise_Error(_SC("division by zero")); return false; } - res = i1 / i2; + case '/': if (i2 == 0) { Raise_Error(_SC("division by zero")); return false; } + else if (i2 == -1 && i1 == INT_MIN) { Raise_Error(_SC("integer overflow")); return false; } + res = i1 / i2; break; case '*': res = i1 * i2; break; - case '%': if(i2 == 0) { Raise_Error(_SC("modulo by zero")); return false; } - res = i1 % i2; + case '%': if (i2 == 0) { Raise_Error(_SC("modulo by zero")); return false; } + else if (i2 == -1 && i1 == INT_MIN) { res = 0; break; } + res = i1 % i2; break; default: res = 0xDEADBEEF; } @@ -1217,7 +1219,7 @@ bool SQVM::Get(const SQObjectPtr &self, const SQObjectPtr &key, SQObjectPtr &des if(sq_isnumeric(key)){ SQInteger n = tointeger(key); SQInteger len = _string(self)->_len; - if (n < 0) { n += len; } + if (n < 0) { n += len; } if (n >= 0 && n < len) { dest = SQInteger(_stringval(self)[n]); return true;