Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 9b0279126df051d69f7397086b7c89d423f1c3c2..689286f904c7a5a9c8f7d6e2d938d7e337d7b921 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -714,298 +714,9 @@ TEST(ExternalStringWithDisposeHandling) { |
} |
-static void TestNewLatin1String(int encoding1, int encoding2) { |
- const char* chars1 = "ASCII 123"; |
- const char* chars1js = "'ASCII 123'"; |
- int str1_len = static_cast<int>(strlen(chars1)); |
- const char* chars2 = "Non-ASCII \xAB\xCD\xEF"; |
- const char* chars2js = "'Non-ASCII \\u00ab\\u00cd\\u00ef'"; |
- int str2_len = static_cast<int>(strlen(chars2)); |
- |
- Local<String> str1 = String::New(chars1, str1_len, encoding1); |
- Local<String> str2 = String::New(chars2, str2_len, encoding2); |
- Local<String> str1_compare = CompileRun(chars1js)->ToString(); |
- Local<String> str2_compare = CompileRun(chars2js)->ToString(); |
- |
- if (encoding1 & String::NOT_ASCII_HINT) { |
- CHECK(v8::Utils::OpenHandle(*str1)->IsSeqTwoByteString()); |
- } else { |
- CHECK(v8::Utils::OpenHandle(*str1)->IsSeqAsciiString()); |
- } |
- CHECK(v8::Utils::OpenHandle(*str1_compare)->IsSeqAsciiString()); |
- CHECK(v8::Utils::OpenHandle(*str2)->IsSeqTwoByteString()); |
- CHECK(v8::Utils::OpenHandle(*str2_compare)->IsSeqTwoByteString()); |
- |
- CHECK(str1_compare->Equals(str1)); |
- CHECK(str2_compare->Equals(str2)); |
-} |
- |
- |
-TEST(CreateLatin1String) { |
- v8::HandleScope scope; |
- LocalContext env; |
- |
- int latin1 = String::LATIN1_ENCODING; |
- int l_noascii = String::LATIN1_ENCODING | String::NOT_ASCII_HINT; |
- int l_ascii = String::LATIN1_ENCODING | String::ASCII_HINT; |
- |
- TestNewLatin1String(latin1, latin1); |
- TestNewLatin1String(l_ascii, latin1); |
- TestNewLatin1String(l_noascii, l_noascii); |
-} |
- |
- |
-TEST(ExternalStringEncoding) { |
- v8::HandleScope scope; |
- LocalContext env; |
- int counter = 0; |
- |
- { HandleScope scope; |
- uint16_t* two_byte_ascii = AsciiToTwoByteString("two byte ascii"); |
- uint16_t* two_byte = AsciiToTwoByteString("two byte non-ascii \x99"); |
- char* ascii = i::StrDup("ascii"); |
- |
- TestResource* two_byte_resource = new TestResource(two_byte, &counter); |
- TestResource* two_byte_ascii_resource = |
- new TestResource(two_byte_ascii, &counter); |
- TestAsciiResource* ascii_resource = |
- new TestAsciiResource(ascii, &counter); |
- |
- Local<String> two_byte_external = String::NewExternal(two_byte_resource); |
- Local<String> two_byte_ascii_external = |
- String::NewExternal(two_byte_ascii_resource); |
- Local<String> ascii_external = String::NewExternal(ascii_resource); |
- Local<String> not_external = v8_str("not external"); |
- |
- CHECK_EQ(String::UTF_16_ENCODING | String::NOT_ASCII_HINT, |
- two_byte_external->GetExternalStringEncoding()); |
- CHECK_EQ(String::UTF_16_ENCODING | String::ASCII_HINT, |
- two_byte_ascii_external->GetExternalStringEncoding()); |
- CHECK_EQ(String::LATIN1_ENCODING | String::ASCII_HINT, |
- ascii_external->GetExternalStringEncoding()); |
- CHECK_EQ(String::INVALID_ENCODING, |
- not_external->GetExternalStringEncoding()); |
- |
- CHECK_EQ(two_byte_resource, two_byte_external->GetExternalStringResource()); |
- CHECK_EQ(two_byte_ascii_resource, |
- two_byte_ascii_external->GetExternalStringResourceBase()); |
- CHECK_EQ(ascii_resource, ascii_external->GetExternalStringResourceBase()); |
- |
- CHECK_EQ(0, counter); |
- } |
- |
- HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
- |
- CHECK_EQ(3, counter); |
-} |
- |
- |
-TEST(WriteLatin1String) { |
- HandleScope scope; |
- LocalContext env; |
- const char* latin1_ascii = "latin1 ascii"; |
- const char* latin1 = "\x99 latin1 non-ascii \xF8"; |
- const char* concat = "latin1 ascii\x99 latin1 non-ascii \xF8"; |
- const char* sub = "latin1 non-ascii \xF8"; |
- |
- Local<String> latin1_ascii_string = String::New(latin1_ascii, |
- String::kUndefinedLength, |
- String::LATIN1_ENCODING); |
- Local<String> latin1_string = String::New(latin1, |
- String::kUndefinedLength, |
- String::LATIN1_ENCODING); |
- Local<String> concat_string = String::Concat(latin1_ascii_string, |
- latin1_string); |
- Local<String> sub_string = v8::Utils::ToLocal( |
- FACTORY->NewSubString( |
- v8::Utils::OpenHandle(*latin1_string), 2, latin1_string->Length())); |
- |
- CHECK(v8::Utils::OpenHandle(*latin1_ascii_string)->IsSeqAsciiString()); |
- CHECK(v8::Utils::OpenHandle(*latin1_string)->IsSeqTwoByteString()); |
- CHECK(v8::Utils::OpenHandle(*concat_string)->IsConsString()); |
- CHECK(v8::Utils::OpenHandle(*sub_string)->IsSlicedString()); |
- |
- char buffer[64]; |
- CHECK_EQ(static_cast<int>(strlen(latin1_ascii)), |
- latin1_ascii_string->WriteLatin1(buffer)); |
- CHECK_EQ(0, strcmp(latin1_ascii, buffer)); |
- CHECK_EQ(static_cast<int>(strlen(latin1)), |
- latin1_string->WriteLatin1(buffer)); |
- CHECK_EQ(0, strcmp(latin1, buffer)); |
- CHECK_EQ(static_cast<int>(strlen(concat)), |
- concat_string->WriteLatin1(buffer)); |
- CHECK_EQ(0, strcmp(concat, buffer)); |
- CHECK_EQ(static_cast<int>(strlen(sub)), |
- sub_string->WriteLatin1(buffer)); |
- CHECK_EQ(0, strcmp(sub, buffer)); |
- |
- memset(buffer, 0x1, sizeof(buffer)); |
- CHECK_EQ(static_cast<int>(strlen(latin1)), |
- latin1_string->WriteLatin1(buffer, |
- 0, |
- String::kUndefinedLength, |
- String::NO_NULL_TERMINATION)); |
- CHECK_EQ(0, strncmp(latin1, buffer, strlen(latin1))); |
- CHECK_NE(0, strcmp(latin1, buffer)); |
- buffer[strlen(latin1)] = '\0'; |
- CHECK_EQ(0, strcmp(latin1, buffer)); |
- |
- CHECK_EQ(static_cast<int>(strlen(latin1)) - 2, |
- latin1_string->WriteLatin1(buffer, 2)); |
- CHECK_EQ(0, strncmp(latin1 + 2, buffer, strlen(latin1))); |
-} |
- |
- |
-class TestLatin1Resource: public String::ExternalLatin1StringResource { |
- public: |
- explicit TestLatin1Resource(const char* data, int* counter = NULL) |
- : data_(data), length_(strlen(data)), counter_(counter) { } |
- |
- ~TestLatin1Resource() { |
- i::DeleteArray(data_); |
- if (counter_ != NULL) ++*counter_; |
- } |
- |
- const char* data() const { |
- return data_; |
- } |
- |
- size_t length() const { |
- return length_; |
- } |
- private: |
- const char* data_; |
- size_t length_; |
- int* counter_; |
-}; |
- |
- |
-TEST(ExternalLatin1String) { |
- HandleScope scope; |
- LocalContext env; |
- int counter = 0; |
- |
- { HandleScope scope; |
- char* latin1_ascii_a = i::StrDup("latin1 ascii a"); |
- char* latin1_ascii_b = i::StrDup("latin1 ascii b"); |
- char* latin1_a = i::StrDup("latin non-ascii \xAA"); |
- char* latin1_b = i::StrDup("latin non-ascii \xBB"); |
- |
- TestLatin1Resource* latin1_ascii_a_resource = |
- new TestLatin1Resource(latin1_ascii_a, &counter); |
- TestLatin1Resource* latin1_ascii_b_resource = |
- new TestLatin1Resource(latin1_ascii_b, &counter); |
- TestLatin1Resource* latin1_a_resource = |
- new TestLatin1Resource(latin1_a, &counter); |
- TestLatin1Resource* latin1_b_resource = |
- new TestLatin1Resource(latin1_b, &counter); |
- |
- Local<String> latin1_ascii_a_external = |
- String::NewExternal(latin1_ascii_a_resource); |
- Local<String> latin1_ascii_b_external = String::NewExternal( |
- latin1_ascii_b_resource, |
- String::LATIN1_ENCODING | String::ASCII_HINT); |
- CHECK_EQ(0, counter); |
- |
- // Non-ascii latin1 strings are internalized immediately as two-byte |
- // string and the external resource is disposed. |
- Local<String> latin1_a_external = String::NewExternal(latin1_a_resource); |
- Local<String> latin1_b_external = String::NewExternal( |
- latin1_b_resource, String::LATIN1_ENCODING | String::NOT_ASCII_HINT); |
- CHECK(v8::Utils::OpenHandle(*latin1_a_external)->IsSeqTwoByteString()); |
- CHECK(v8::Utils::OpenHandle(*latin1_b_external)->IsSeqTwoByteString()); |
- CHECK_EQ(2, counter); |
- |
- CHECK_EQ(latin1_ascii_a_external->GetExternalStringEncoding(), |
- (v8::String::LATIN1_ENCODING | v8::String::ASCII_HINT)); |
- CHECK_EQ(latin1_ascii_b_external->GetExternalStringEncoding(), |
- (v8::String::LATIN1_ENCODING | v8::String::ASCII_HINT)); |
- CHECK_EQ(latin1_a_external->GetExternalStringEncoding(), |
- v8::String::INVALID_ENCODING); |
- CHECK_EQ(latin1_b_external->GetExternalStringEncoding(), |
- v8::String::INVALID_ENCODING); |
- |
- CHECK_EQ(latin1_ascii_a_resource, |
- latin1_ascii_a_external->GetExternalStringResourceBase()); |
- CHECK_EQ(latin1_ascii_b_resource, |
- latin1_ascii_b_external->GetExternalStringResourceBase()); |
- } |
- |
- HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
- CHECK_EQ(4, counter); |
-} |
- |
- |
-TEST(ExternalizeLatin1String) { |
- HandleScope scope; |
- LocalContext env; |
- int counter = 0; |
- |
- { HandleScope scope; |
- Local<String> latin1_a_ascii = String::New("latin1 a ascii"); |
- Local<String> latin1_b_ascii = String::New("latin1 b ascii"); |
- Local<String> latin1 = String::New("latin1 non-ascii \xAA", |
- String::kUndefinedLength, |
- String::LATIN1_ENCODING); |
- |
- CHECK(v8::Utils::OpenHandle(*latin1_a_ascii)->IsSeqAsciiString()); |
- CHECK(v8::Utils::OpenHandle(*latin1_b_ascii)->IsSeqAsciiString()); |
- CHECK(v8::Utils::OpenHandle(*latin1)->IsSeqTwoByteString()); |
- |
- // Run GC twice to put those strings into old space for externalizing. |
- HEAP->CollectGarbage(i::NEW_SPACE); |
- HEAP->CollectGarbage(i::NEW_SPACE); |
- |
- char* latin1_a_ascii_chars = i::NewArray<char>(64); |
- uint16_t* latin1_b_ascii_chars = i::NewArray<uint16_t>(64); |
- uint16_t* latin1_chars = i::NewArray<uint16_t>(64); |
- |
- latin1_a_ascii->WriteLatin1(latin1_a_ascii_chars); |
- latin1_b_ascii->Write(latin1_b_ascii_chars); |
- latin1->Write(latin1_chars); |
- |
- TestLatin1Resource* latin1_a_ascii_resource = |
- new TestLatin1Resource(latin1_a_ascii_chars, &counter); |
- TestResource* latin1_b_ascii_resource = |
- new TestResource(latin1_b_ascii_chars, &counter); |
- TestResource* latin1_resource = |
- new TestResource(latin1_chars, &counter); |
- |
- CHECK(latin1_a_ascii->MakeExternal(latin1_a_ascii_resource)); |
- CHECK(latin1_a_ascii->IsExternalAscii()); |
- CHECK_EQ(latin1_a_ascii->GetExternalStringEncoding(), |
- (v8::String::LATIN1_ENCODING | v8::String::ASCII_HINT)); |
- CHECK_EQ(latin1_a_ascii_resource, |
- latin1_a_ascii->GetExternalStringResourceBase()); |
- CHECK(latin1_a_ascii->Equals(String::New("latin1 a ascii"))); |
- |
- CHECK(latin1_b_ascii->MakeExternal(latin1_b_ascii_resource)); |
- CHECK(latin1_b_ascii->IsExternal()); |
- CHECK_EQ(latin1_b_ascii->GetExternalStringEncoding(), |
- (v8::String::UTF_16_ENCODING | v8::String::ASCII_HINT)); |
- CHECK_EQ(latin1_b_ascii_resource, |
- latin1_b_ascii->GetExternalStringResourceBase()); |
- CHECK(latin1_b_ascii->Equals(String::New("latin1 b ascii"))); |
- |
- CHECK(latin1->MakeExternal(latin1_resource)); |
- CHECK(latin1->IsExternal()); |
- CHECK_EQ(latin1->GetExternalStringEncoding(), |
- (v8::String::UTF_16_ENCODING | v8::String::NOT_ASCII_HINT)); |
- CHECK_EQ(latin1_resource, |
- latin1->GetExternalStringResourceBase()); |
- CHECK(latin1->Equals(String::New("latin1 non-ascii \xAA", |
- String::kUndefinedLength, |
- String::LATIN1_ENCODING))); |
- } |
- |
- HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
- CHECK_EQ(3, counter); |
-} |
- |
- |
THREADED_TEST(StringConcat) { |
{ |
- HandleScope scope; |
+ v8::HandleScope scope; |
LocalContext env; |
const char* one_byte_string_1 = "function a_times_t"; |
const char* two_byte_string_1 = "wo_plus_b(a, b) {return "; |