Reviewers: Toon Verwaest,

Description:
Correctly stringify mixed encoding indirect strings.

R=verwa...@chromium.org
BUG=287476

Please review this at https://codereview.chromium.org/23480051/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+60, -2 lines):
  M src/json-stringifier.h
  M test/cctest/test-strings.cc


Index: src/json-stringifier.h
diff --git a/src/json-stringifier.h b/src/json-stringifier.h
index 155ae5ffa9c5a0ca13e27b75ccc31e718e7837c0..0d17b356abb0a1ac1a8447954db81f1386483083 100644
--- a/src/json-stringifier.h
+++ b/src/json-stringifier.h
@@ -835,14 +835,14 @@ Vector<const uc16> BasicJsonStringifier::GetCharVector(Handle<String> string) {
 void BasicJsonStringifier::SerializeString(Handle<String> object) {
   object = FlattenGetString(object);
   if (is_ascii_) {
-    if (object->IsOneByteRepresentation()) {
+    if (object->IsOneByteRepresentationUnderneath()) {
       SerializeString_<true, uint8_t>(object);
     } else {
       ChangeEncoding();
       SerializeString(object);
     }
   } else {
-    if (object->IsOneByteRepresentation()) {
+    if (object->IsOneByteRepresentationUnderneath()) {
       SerializeString_<false, uint8_t>(object);
     } else {
       SerializeString_<false, uc16>(object);
Index: test/cctest/test-strings.cc
diff --git a/test/cctest/test-strings.cc b/test/cctest/test-strings.cc
index 310d93c04ea8b9cadda0c1cbad1d3e25658b923f..f9d8fe630509c9944e7c5a4734cc002fce46f6b5 100644
--- a/test/cctest/test-strings.cc
+++ b/test/cctest/test-strings.cc
@@ -1017,6 +1017,64 @@ TEST(ExternalShortStringAdd) {
 }


+TEST(JSONStringifySliceMadeExternal) {
+  Isolate* isolate = Isolate::Current();
+  Zone zone(isolate);
+  CcTest::InitializeVM();
+
+  // Create a sliced string from a two-byte string.  The latter is turned
+  // into a one-byte external string.  Check that JSON.stringify works.
+  { v8::HandleScope handle_scope(CcTest::isolate());
+    v8::Handle<v8::String> underlying =
+        CompileRun("var underlying = '\u2603bcdefghijklmnopqrstuvwxyz';"
+                   "underlying")->ToString();
+    v8::Handle<v8::String> slice =
+        CompileRun("var slice = underlying.slice(1);"
+                   "slice")->ToString();
+    CHECK(v8::Utils::OpenHandle(*slice)->IsSlicedString());
+    CHECK(v8::Utils::OpenHandle(*underlying)->IsSeqTwoByteString());
+
+    int length = underlying->Length();
+    uint8_t* one_byte = zone.NewArray<uint8_t>(length + 1);
+    underlying->WriteOneByte(one_byte);
+    AsciiResource* resource =
+        new(&zone) AsciiResource(Vector<const char>(
+            reinterpret_cast<char*>(one_byte), length));
+    CHECK(underlying->MakeExternal(resource));
+    CHECK(v8::Utils::OpenHandle(*slice)->IsSlicedString());
+    CHECK(v8::Utils::OpenHandle(*underlying)->IsExternalAsciiString());
+
+    CHECK_EQ("\"bcdefghijklmnopqrstuvwxyz\"",
+             *v8::String::Utf8Value(CompileRun("JSON.stringify(slice)")));
+  }
+
+  // Create a sliced string from a one-byte string.  The latter is turned
+  // into a two-byte external string.  Check that JSON.stringify works.
+  { v8::HandleScope handle_scope(CcTest::isolate());
+    v8::Handle<v8::String> underlying =
+        CompileRun("var underlying = 'abcdefghijklmnopqrstuvwxyz';"
+                   "underlying")->ToString();
+    v8::Handle<v8::String> slice =
+        CompileRun("var slice = underlying.slice(1);"
+                   "slice")->ToString();
+    CHECK(v8::Utils::OpenHandle(*slice)->IsSlicedString());
+    CHECK(v8::Utils::OpenHandle(*underlying)->IsSeqOneByteString());
+
+    int length = underlying->Length();
+    uc16* two_byte = zone.NewArray<uc16>(length + 1);
+    underlying->Write(two_byte);
+    Resource* resource =
+        new(&zone) Resource(Vector<const uc16>(two_byte, length));
+    CHECK(underlying->MakeExternal(resource));
+    CHECK(v8::Utils::OpenHandle(*slice)->IsSlicedString());
+    CHECK(v8::Utils::OpenHandle(*underlying)->IsExternalTwoByteString());
+
+    CHECK_EQ("\"bcdefghijklmnopqrstuvwxyz\"",
+             *v8::String::Utf8Value(CompileRun("JSON.stringify(slice)")));
+  }
+}
+
+
 TEST(CachedHashOverflow) {
// We incorrectly allowed strings to be tagged as array indices even if their
   // values didn't fit in the hash field.


--
--
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to