Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index 0cf3f7ba41563e2b54df1f6e1e79f6bbe18bbeda..be5ecba688cb90d66e0202d2a388c928e10c3a09 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -58,7 +58,7 @@ using ::v8::Function; |
using ::v8::AccessorInfo; |
using ::v8::Extension; |
-namespace i = ::v8::internal; |
+namespace i = ::i; |
static void ExpectString(const char* code, const char* expected) { |
@@ -381,11 +381,11 @@ THREADED_TEST(ScriptUsingStringResource) { |
CHECK(source->IsExternal()); |
CHECK_EQ(resource, |
static_cast<TestResource*>(source->GetExternalStringResource())); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(0, TestResource::dispose_count); |
} |
- v8::internal::CompilationCache::Clear(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::CompilationCache::Clear(); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(1, TestResource::dispose_count); |
} |
@@ -402,11 +402,11 @@ THREADED_TEST(ScriptUsingAsciiStringResource) { |
Local<Value> value = script->Run(); |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(0, TestAsciiResource::dispose_count); |
} |
- v8::internal::CompilationCache::Clear(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::CompilationCache::Clear(); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(1, TestAsciiResource::dispose_count); |
} |
@@ -427,11 +427,11 @@ THREADED_TEST(ScriptMakingExternalString) { |
Local<Value> value = script->Run(); |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(0, TestResource::dispose_count); |
} |
- v8::internal::CompilationCache::Clear(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::CompilationCache::Clear(); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(1, TestResource::dispose_count); |
} |
@@ -453,11 +453,11 @@ THREADED_TEST(ScriptMakingExternalAsciiString) { |
Local<Value> value = script->Run(); |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(0, TestAsciiResource::dispose_count); |
} |
- v8::internal::CompilationCache::Clear(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::CompilationCache::Clear(); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(1, TestAsciiResource::dispose_count); |
} |
@@ -645,11 +645,11 @@ TEST(ExternalStringWithDisposeHandling) { |
Local<Value> value = script->Run(); |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(0, TestAsciiResource::dispose_count); |
} |
- v8::internal::CompilationCache::Clear(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::CompilationCache::Clear(); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
CHECK_EQ(0, TestAsciiResource::dispose_count); |
@@ -666,11 +666,11 @@ TEST(ExternalStringWithDisposeHandling) { |
Local<Value> value = script->Run(); |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(0, TestAsciiResource::dispose_count); |
} |
- v8::internal::CompilationCache::Clear(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::CompilationCache::Clear(); |
+ i::Heap::CollectAllGarbage(false); |
CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
CHECK_EQ(1, TestAsciiResource::dispose_count); |
} |
@@ -708,7 +708,7 @@ THREADED_TEST(StringConcat) { |
CHECK(value->IsNumber()); |
CHECK_EQ(68, value->Int32Value()); |
} |
- v8::internal::CompilationCache::Clear(); |
+ i::CompilationCache::Clear(); |
i::Heap::CollectAllGarbage(false); |
i::Heap::CollectAllGarbage(false); |
} |
@@ -1881,7 +1881,7 @@ static const char* js_code_causing_out_of_memory = |
// that come after them so they cannot run in parallel. |
TEST(OutOfMemory) { |
// It's not possible to read a snapshot into a heap with different dimensions. |
- if (v8::internal::Snapshot::IsEnabled()) return; |
+ if (i::Snapshot::IsEnabled()) return; |
// Set heap limits. |
static const int K = 1024; |
v8::ResourceConstraints constraints; |
@@ -1922,7 +1922,7 @@ v8::Handle<Value> ProvokeOutOfMemory(const v8::Arguments& args) { |
TEST(OutOfMemoryNested) { |
// It's not possible to read a snapshot into a heap with different dimensions. |
- if (v8::internal::Snapshot::IsEnabled()) return; |
+ if (i::Snapshot::IsEnabled()) return; |
// Set heap limits. |
static const int K = 1024; |
v8::ResourceConstraints constraints; |
@@ -1951,7 +1951,7 @@ TEST(OutOfMemoryNested) { |
TEST(HugeConsStringOutOfMemory) { |
// It's not possible to read a snapshot into a heap with different dimensions. |
- if (v8::internal::Snapshot::IsEnabled()) return; |
+ if (i::Snapshot::IsEnabled()) return; |
v8::HandleScope scope; |
LocalContext context; |
// Set heap limits. |
@@ -6811,7 +6811,7 @@ static v8::Handle<Value> InterceptorCallICFastApi(Local<String> name, |
int* call_count = reinterpret_cast<int*>(v8::External::Unwrap(info.Data())); |
++(*call_count); |
if ((*call_count) % 20 == 0) { |
- v8::internal::Heap::CollectAllGarbage(true); |
+ i::Heap::CollectAllGarbage(true); |
} |
return v8::Handle<Value>(); |
} |
@@ -7620,8 +7620,8 @@ THREADED_TEST(ObjectProtoToString) { |
bool ApiTestFuzzer::fuzzing_ = false; |
-v8::internal::Semaphore* ApiTestFuzzer::all_tests_done_= |
- v8::internal::OS::CreateSemaphore(0); |
+i::Semaphore* ApiTestFuzzer::all_tests_done_= |
+ i::OS::CreateSemaphore(0); |
int ApiTestFuzzer::active_tests_; |
int ApiTestFuzzer::tests_being_run_; |
int ApiTestFuzzer::current_; |
@@ -7899,7 +7899,7 @@ THREADED_TEST(LockUnlockLock) { |
static int GetGlobalObjectsCount() { |
int count = 0; |
- v8::internal::HeapIterator it; |
+ i::HeapIterator it; |
for (i::HeapObject* object = it.next(); object != NULL; object = it.next()) |
if (object->IsJSGlobalObject()) count++; |
return count; |
@@ -7912,11 +7912,11 @@ static int GetSurvivingGlobalObjectsCount() { |
// the first garbage collection but some of the maps have already |
// been marked at that point. Therefore some of the maps are not |
// collected until the second garbage collection. |
- v8::internal::Heap::CollectAllGarbage(false); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
int count = GetGlobalObjectsCount(); |
#ifdef DEBUG |
- if (count > 0) v8::internal::Heap::TracePathToGlobal(); |
+ if (count > 0) i::Heap::TracePathToGlobal(); |
#endif |
return count; |
} |
@@ -10021,7 +10021,7 @@ static void ExternalArrayTestHelper(v8::ExternalArrayType array_type, |
THREADED_TEST(ExternalByteArray) { |
- ExternalArrayTestHelper<v8::internal::ExternalByteArray, int8_t>( |
+ ExternalArrayTestHelper<i::ExternalByteArray, int8_t>( |
v8::kExternalByteArray, |
-128, |
127); |
@@ -10029,7 +10029,7 @@ THREADED_TEST(ExternalByteArray) { |
THREADED_TEST(ExternalUnsignedByteArray) { |
- ExternalArrayTestHelper<v8::internal::ExternalUnsignedByteArray, uint8_t>( |
+ ExternalArrayTestHelper<i::ExternalUnsignedByteArray, uint8_t>( |
v8::kExternalUnsignedByteArray, |
0, |
255); |
@@ -10037,7 +10037,7 @@ THREADED_TEST(ExternalUnsignedByteArray) { |
THREADED_TEST(ExternalShortArray) { |
- ExternalArrayTestHelper<v8::internal::ExternalShortArray, int16_t>( |
+ ExternalArrayTestHelper<i::ExternalShortArray, int16_t>( |
v8::kExternalShortArray, |
-32768, |
32767); |
@@ -10045,7 +10045,7 @@ THREADED_TEST(ExternalShortArray) { |
THREADED_TEST(ExternalUnsignedShortArray) { |
- ExternalArrayTestHelper<v8::internal::ExternalUnsignedShortArray, uint16_t>( |
+ ExternalArrayTestHelper<i::ExternalUnsignedShortArray, uint16_t>( |
v8::kExternalUnsignedShortArray, |
0, |
65535); |
@@ -10053,7 +10053,7 @@ THREADED_TEST(ExternalUnsignedShortArray) { |
THREADED_TEST(ExternalIntArray) { |
- ExternalArrayTestHelper<v8::internal::ExternalIntArray, int32_t>( |
+ ExternalArrayTestHelper<i::ExternalIntArray, int32_t>( |
v8::kExternalIntArray, |
INT_MIN, // -2147483648 |
INT_MAX); // 2147483647 |
@@ -10061,7 +10061,7 @@ THREADED_TEST(ExternalIntArray) { |
THREADED_TEST(ExternalUnsignedIntArray) { |
- ExternalArrayTestHelper<v8::internal::ExternalUnsignedIntArray, uint32_t>( |
+ ExternalArrayTestHelper<i::ExternalUnsignedIntArray, uint32_t>( |
v8::kExternalUnsignedIntArray, |
0, |
UINT_MAX); // 4294967295 |
@@ -10069,7 +10069,7 @@ THREADED_TEST(ExternalUnsignedIntArray) { |
THREADED_TEST(ExternalFloatArray) { |
- ExternalArrayTestHelper<v8::internal::ExternalFloatArray, float>( |
+ ExternalArrayTestHelper<i::ExternalFloatArray, float>( |
v8::kExternalFloatArray, |
-500, |
500); |
@@ -10547,7 +10547,7 @@ TEST(Regress528) { |
other_context->Enter(); |
CompileRun(source_simple); |
other_context->Exit(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
if (GetGlobalObjectsCount() == 1) break; |
} |
CHECK_GE(2, gc_count); |
@@ -10569,7 +10569,7 @@ TEST(Regress528) { |
other_context->Enter(); |
CompileRun(source_eval); |
other_context->Exit(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
if (GetGlobalObjectsCount() == 1) break; |
} |
CHECK_GE(2, gc_count); |
@@ -10596,7 +10596,7 @@ TEST(Regress528) { |
other_context->Enter(); |
CompileRun(source_exception); |
other_context->Exit(); |
- v8::internal::Heap::CollectAllGarbage(false); |
+ i::Heap::CollectAllGarbage(false); |
if (GetGlobalObjectsCount() == 1) break; |
} |
CHECK_GE(2, gc_count); |
@@ -10859,7 +10859,7 @@ THREADED_TEST(AddToJSFunctionResultCache) { |
" return 'Different results for ' + key1 + ': ' + r1 + ' vs. ' + r1_;" |
" return 'PASSED';" |
"})()"; |
- v8::internal::Heap::ClearJSFunctionResultCaches(); |
+ i::Heap::ClearJSFunctionResultCaches(); |
ExpectString(code, "PASSED"); |
} |
@@ -10883,7 +10883,7 @@ THREADED_TEST(FillJSFunctionResultCache) { |
" return 'FAILED: k0CacheSize is too small';" |
" return 'PASSED';" |
"})()"; |
- v8::internal::Heap::ClearJSFunctionResultCaches(); |
+ i::Heap::ClearJSFunctionResultCaches(); |
ExpectString(code, "PASSED"); |
} |
@@ -10908,7 +10908,7 @@ THREADED_TEST(RoundRobinGetFromCache) { |
" };" |
" return 'PASSED';" |
"})()"; |
- v8::internal::Heap::ClearJSFunctionResultCaches(); |
+ i::Heap::ClearJSFunctionResultCaches(); |
ExpectString(code, "PASSED"); |
} |
@@ -10933,7 +10933,7 @@ THREADED_TEST(ReverseGetFromCache) { |
" };" |
" return 'PASSED';" |
"})()"; |
- v8::internal::Heap::ClearJSFunctionResultCaches(); |
+ i::Heap::ClearJSFunctionResultCaches(); |
ExpectString(code, "PASSED"); |
} |
@@ -10951,6 +10951,87 @@ THREADED_TEST(TestEviction) { |
" };" |
" return 'PASSED';" |
"})()"; |
- v8::internal::Heap::ClearJSFunctionResultCaches(); |
+ i::Heap::ClearJSFunctionResultCaches(); |
ExpectString(code, "PASSED"); |
} |
+ |
+ |
+THREADED_TEST(TwoByteStringInAsciiCons) { |
+ // See Chromium issue 47824. |
+ v8::HandleScope scope; |
+ |
+ LocalContext context; |
+ const char* init_code = |
+ "var str1 = 'abelspendabel';" |
+ "var str2 = str1 + str1 + str1;" |
+ "str2;"; |
+ Local<Value> result = CompileRun(init_code); |
+ |
+ CHECK(result->IsString()); |
+ i::Handle<i::String> string = v8::Utils::OpenHandle(String::Cast(*result)); |
+ int length = string->length(); |
+ CHECK(string->IsAsciiRepresentation()); |
+ |
+ FlattenString(string); |
+ i::Handle<i::String> flat_string = FlattenGetString(string); |
+ |
+ CHECK(string->IsAsciiRepresentation()); |
+ CHECK(flat_string->IsAsciiRepresentation()); |
+ |
+ // Create external resource. |
+ uint16_t* uc16_buffer = new uint16_t[length + 1]; |
+ |
+ i::String::WriteToFlat(*flat_string, uc16_buffer, 0, length); |
+ uc16_buffer[length] = 0; |
+ |
+ TestResource resource(uc16_buffer); |
+ |
+ flat_string->MakeExternal(&resource); |
+ |
+ CHECK(flat_string->IsTwoByteRepresentation()); |
+ |
+ // At this point, we should have a Cons string which is flat and ASCII, |
+ // with a first half that is a two-byte string (although it only contains |
+ // ASCII characters). This is a valid sequence of steps, and it can happen |
+ // in real pages. |
+ |
+ CHECK(string->IsAsciiRepresentation()); |
+ i::ConsString* cons = i::ConsString::cast(*string); |
+ CHECK_EQ(0, cons->second()->length()); |
+ CHECK(cons->first()->IsTwoByteRepresentation()); |
+ |
+ // Check that some string operations work. |
+ |
+ // Atom RegExp. |
+ Local<Value> reresult = CompileRun("str2.match(/abel/g).length;"); |
+ CHECK_EQ(6, reresult->Int32Value()); |
+ |
+ // Nonatom RegExp. |
+ reresult = CompileRun("str2.match(/abe./g).length;"); |
+ CHECK_EQ(6, reresult->Int32Value()); |
+ |
+ reresult = CompileRun("str2.search(/bel/g);"); |
+ CHECK_EQ(1, reresult->Int32Value()); |
+ |
+ reresult = CompileRun("str2.search(/be./g);"); |
+ CHECK_EQ(1, reresult->Int32Value()); |
+ |
+ ExpectTrue("/bel/g.test(str2);"); |
+ |
+ ExpectTrue("/be./g.test(str2);"); |
+ |
+ reresult = CompileRun("/bel/g.exec(str2);"); |
+ CHECK(!reresult->IsNull()); |
+ |
+ reresult = CompileRun("/be./g.exec(str2);"); |
+ CHECK(!reresult->IsNull()); |
+ |
+ ExpectString("str2.substring(2, 10);", "elspenda"); |
+ |
+ ExpectString("str2.substring(2, 20);", "elspendabelabelspe"); |
+ |
+ ExpectString("str2.charAt(2);", "e"); |
+ |
+ reresult = CompileRun("str2.charCodeAt(2);"); |
+ CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value()); |
+} |