Fix JSON stringify.
authoryangguo@chromium.org <yangguo@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 3 Dec 2012 16:23:30 +0000 (16:23 +0000)
committeryangguo@chromium.org <yangguo@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Mon, 3 Dec 2012 16:23:30 +0000 (16:23 +0000)
R=verwaest@chromium.org
BUG=

Review URL: https://chromiumcodereview.appspot.com/11421200

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13118 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/json-stringifier.h

index 80ef395..09014f0 100644 (file)
@@ -136,8 +136,7 @@ class BasicJsonStringifier BASE_EMBEDDED {
                                         int length));
 
   template <bool is_ascii, typename Char>
-  INLINE(void SerializeString_(Vector<const Char> vector,
-                               Handle<String> string));
+  INLINE(void SerializeString_(Handle<String> string));
 
   template <typename Char>
   INLINE(bool DoNotEscape(Char c));
@@ -675,9 +674,8 @@ void BasicJsonStringifier::SerializeStringUnchecked_(const SrcChar* src,
 
 
 template <bool is_ascii, typename Char>
-void BasicJsonStringifier::SerializeString_(Vector<const Char> vector,
-                                            Handle<String> string) {
-  int length = vector.length();
+void BasicJsonStringifier::SerializeString_(Handle<String> string) {
+  int length = string->length();
   Append_<is_ascii, char>('"');
   // We make a rough estimate to find out if the current string can be
   // serialized without allocating a new string part. The worst case length of
@@ -685,6 +683,8 @@ void BasicJsonStringifier::SerializeString_(Vector<const Char> vector,
   // is a more pessimistic estimate, but faster to calculate.
 
   if (((part_length_ - current_index_) >> 3) > length) {
+    AssertNoAllocation no_allocation;
+    Vector<const Char> vector = GetCharVector<Char>(string);
     if (is_ascii) {
       SerializeStringUnchecked_(
           vector.start(),
@@ -698,6 +698,7 @@ void BasicJsonStringifier::SerializeString_(Vector<const Char> vector,
     }
   } else {
     String* string_location = *string;
+    Vector<const Char> vector = GetCharVector<Char>(string);
     for (int i = 0; i < length; i++) {
       Char c = vector[i];
       if (DoNotEscape(c)) {
@@ -751,16 +752,16 @@ void BasicJsonStringifier::SerializeString(Handle<String> object) {
   String::FlatContent flat = object->GetFlatContent();
   if (is_ascii_) {
     if (flat.IsAscii()) {
-      SerializeString_<true, char>(flat.ToAsciiVector(), object);
+      SerializeString_<true, char>(object);
     } else {
       ChangeEncoding();
       SerializeString(object);
     }
   } else {
     if (flat.IsAscii()) {
-      SerializeString_<false, char>(flat.ToAsciiVector(), object);
+      SerializeString_<false, char>(object);
     } else {
-      SerializeString_<false, uc16>(flat.ToUC16Vector(), object);
+      SerializeString_<false, uc16>(object);
     }
   }
 }