Implement Smi.toString in Dart instead of calling to C++ natives. Large performance improvement.

R=asiva@google.com

Review URL: https://codereview.chromium.org//14629015

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@22341 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index 8ee9dd3..55d3626 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -221,6 +221,32 @@
   int operator ~() native "Smi_bitNegate";
   int _shrFromInt(int other) native "Smi_shrFromInt";
   int _shlFromInt(int other) native "Smi_shlFromInt";
+
+  String toString() {
+    if (this == 0) return "0";
+    var reversed = new List();
+    var val = this < 0 ? -this : this;
+    while (val > 0) {
+      reversed.add((val % 10) + 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];
+    }
+    return _StringBase.createFromCharCodes(digits);
+  }
 }
 
 // Represents integers that cannot be represented by Smi but fit into 64bits.