Index: test/cctest/test-api.cc |
=================================================================== |
--- test/cctest/test-api.cc (revision 1251) |
+++ test/cctest/test-api.cc (working copy) |
@@ -491,6 +491,76 @@ |
} |
+THREADED_TEST(ScriptMakingExternalString) { |
+ TestResource::dispose_count = 0; |
+ uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); |
+ { |
+ v8::HandleScope scope; |
+ LocalContext env; |
+ Local<String> source = String::New(two_byte_source); |
+ bool success = source->MakeExternal(new TestResource(two_byte_source)); |
+ CHECK(success); |
+ Local<Script> script = Script::Compile(source); |
+ Local<Value> value = script->Run(); |
+ CHECK(value->IsNumber()); |
+ CHECK_EQ(7, value->Int32Value()); |
+ v8::internal::Heap::CollectAllGarbage(); |
+ CHECK_EQ(0, TestResource::dispose_count); |
+ } |
+ v8::internal::Heap::CollectAllGarbage(); |
+ CHECK_EQ(1, TestResource::dispose_count); |
+} |
+ |
+ |
+THREADED_TEST(ScriptMakingExternalAsciiString) { |
+ TestAsciiResource::dispose_count = 0; |
+ const char* c_source = "1 + 2 * 3"; |
+ { |
+ v8::HandleScope scope; |
+ LocalContext env; |
+ Local<String> source = v8_str(c_source); |
+ bool success = source->MakeExternal( |
+ new TestAsciiResource(i::StrDup(c_source))); |
+ CHECK(success); |
+ Local<Script> script = Script::Compile(source); |
+ Local<Value> value = script->Run(); |
+ CHECK(value->IsNumber()); |
+ CHECK_EQ(7, value->Int32Value()); |
+ v8::internal::Heap::CollectAllGarbage(); |
+ CHECK_EQ(0, TestAsciiResource::dispose_count); |
+ } |
+ v8::internal::Heap::CollectAllGarbage(); |
+ CHECK_EQ(1, TestAsciiResource::dispose_count); |
+} |
+ |
+ |
+THREADED_TEST(UsingExternalString) { |
+ v8::HandleScope scope; |
+ uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
+ Local<String> string = String::NewExternal(new TestResource(two_byte_string)); |
+ i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
+ // Trigger GCs so that the newly allocated string moves to old gen. |
+ i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now |
+ i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now |
+ i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); |
+ CHECK(isymbol->IsSymbol()); |
+} |
+ |
+ |
+THREADED_TEST(UsingExternalAsciiString) { |
+ v8::HandleScope scope; |
+ const char* one_byte_string = "test string"; |
+ Local<String> string = String::NewExternal( |
+ new TestAsciiResource(i::StrDup(one_byte_string))); |
+ i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
+ // Trigger GCs so that the newly allocated string moves to old gen. |
+ i::Heap::CollectGarbage(0, i::NEW_SPACE); // in survivor space now |
+ i::Heap::CollectGarbage(0, i::NEW_SPACE); // in old gen now |
+ i::Handle<i::String> isymbol = i::Factory::SymbolFromString(istring); |
+ CHECK(isymbol->IsSymbol()); |
+} |
+ |
+ |
THREADED_TEST(GlobalProperties) { |
v8::HandleScope scope; |
LocalContext env; |