Chromium Code Reviews| Index: runtime/lib/integers.dart |
| diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart |
| index 7c242ef95659a9872e9810492060f0d695f8dc13..aa2267efc0a9be8ad733fc28ff7e569242e77d53 100644 |
| --- a/runtime/lib/integers.dart |
| +++ b/runtime/lib/integers.dart |
| @@ -233,31 +233,38 @@ class _Smi extends _IntegerImplementation implements int { |
| String toString() { |
| if (this == 0) return "0"; |
| - var reversed = new List(); |
| - var val = this < 0 ? -this : this; |
| + var reversed = _toStringBuffer; |
| + var negative = false; |
| + var val = this; |
| + int index = 0; |
| + |
| + if (this < 0) { |
|
kasperl
2013/09/24 11:22:09
Use val < 0?
Lasse Reichstein Nielsen
2013/09/24 19:48:49
good point.
|
| + negative = true; |
| + // Handle the first digit as negative to avoid negating the minimum |
| + // smi, for which the negation is not a smi. |
| + int digit = -(val.remainder(10)); |
| + reversed[index++] = digit + 0x30; |
| + val = -(val ~/ 10); |
| + } |
| + |
| while (val > 0) { |
| - reversed.add((val % 10) + 0x30); |
| + int digit = val % 10; |
| + reversed[index++] = (digit + 0x30); |
| val = val ~/ 10; |
| } |
| - final int numDigits = reversed.length; |
| - List digits; |
| - int i; |
| - if (this < 0) { |
| - digits = new List(numDigits + 1); |
| - digits[0] = 0x2D; // '-'. |
| - i = 1; |
| - } else { |
| - digits = new List(numDigits); |
| - i = 0; |
| - } |
| - int ri = reversed.length - 1; |
| - for (; i < digits.length; i++, ri--) { |
| - digits[i] = reversed[ri]; |
| + if (negative) reversed[index++] = 0x2D; // '-'. |
| + |
| + _OneByteString string = _OneByteString._allocate(index); |
| + for (int i = 0, j = index; i < index; i++) { |
| + string._setAt(i, reversed[--j]); |
| } |
| - return _StringBase.createFromCharCodes(digits); |
| + return string; |
| } |
| } |
| +// Reusable buffer used by smi.toString. |
| +List _toStringBuffer = new Uint8List(20); |
| + |
| // Represents integers that cannot be represented by Smi but fit into 64bits. |
| class _Mint extends _IntegerImplementation implements int { |
| factory _Mint._uninstantiable() { |