** Integer division; return 'm // n', that is, floor(m/n). ** C division truncates its result (rounds towards zero). ** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer, ** otherwise 'floor(q) == trunc(q) - 1'. */
| 733 | ** otherwise 'floor(q) == trunc(q) - 1'. |
| 734 | */ |
| 735 | lua_Integer luaV_idiv (lua_State *L, lua_Integer m, lua_Integer n) { |
| 736 | if (l_unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */ |
| 737 | if (n == 0) |
| 738 | luaG_runerror(L, "attempt to divide by zero"); |
| 739 | return intop(-, 0, m); /* n==-1; avoid overflow with 0x80000...//-1 */ |
| 740 | } |
| 741 | else { |
| 742 | lua_Integer q = m / n; /* perform C division */ |
| 743 | if ((m ^ n) < 0 && m % n != 0) /* 'm/n' would be negative non-integer? */ |
| 744 | q -= 1; /* correct result for different rounding */ |
| 745 | return q; |
| 746 | } |
| 747 | } |
| 748 | |
| 749 | |
| 750 | /* |
no test coverage detected