Index: runtime/lib/bigint.dart |
diff --git a/runtime/lib/bigint.dart b/runtime/lib/bigint.dart |
index adfb0db4cca73f924008dec248d1c07a09a464d5..60e40337e239465b5ab46d27df906e855af56a0f 100644 |
--- a/runtime/lib/bigint.dart |
+++ b/runtime/lib/bigint.dart |
@@ -267,7 +267,9 @@ class _Bigint extends _IntegerImplementation implements int { |
return r_used; |
} |
- // r_digits[0..r_used-1] = x_digits[0..x_used-1] << n. |
+ // r_digits[ds..x_used+ds] = x_digits[0..x_used-1] << (n % _DIGIT_BITS) |
+ // where ds = ceil(n / _DIGIT_BITS) |
+ // Doesn't clear digits below ds. |
static void _lsh(Uint32List x_digits, int x_used, int n, |
Uint32List r_digits) { |
final ds = n ~/ _DIGIT_BITS; |
@@ -1404,7 +1406,7 @@ class _Bigint extends _IntegerImplementation implements int { |
if (e == 0) return 1; |
m = m._toBigint(); |
final m_used = m._used; |
- final m_used2p4 = 2*m_used + 4; |
+ final m_used2p4 = 2 * m_used + 4; |
final e_bitlen = e.bitLength; |
if (e_bitlen <= 0) return 1; |
final bool cannotUseMontgomery = m.isEven || _abs() >= m; |
@@ -1562,7 +1564,7 @@ class _Bigint extends _IntegerImplementation implements int { |
if (((x_used == 1) && (x_digits[0] == 1)) || |
((y_used == 1) && (y_digits[0] == 1))) return 1; |
bool xy_cloned = false; |
- while (x.isEven && y.isEven) { |
+ while (((x_digits[0] & 1) == 0) && ((y_digits[0] & 1) == 0)) { |
_rsh(x_digits, x_used, 1, x_digits); |
_rsh(y_digits, y_used, 1, y_digits); |
s++; |
@@ -1746,10 +1748,11 @@ class _Bigint extends _IntegerImplementation implements int { |
if (i == 0) break; |
} |
if (!inv) { |
- if (s > 0) { |
- _lsh(v_digits, m_used, s, v_digits); |
- } |
- return new _Bigint(false, m_used, v_digits)._toValidInt(); |
+ // TODO(regis): Make this work correctly: |
+ // if (s > 0) { |
+ // m_used = _dlShiftDigits(v_digits, m_used, s, v_digits); |
+ // } |
+ return new _Bigint(false, m_used, v_digits)._toValidInt() << s; |
} |
// No inverse if v != 1. |
var i = m_used - 1; |