Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index c694ae38ad7f1f0a24e980a129360b186da3ecb6..c0e02e80537a47645d9b2455257458b2de0c5d44 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -331,16 +331,14 @@ static uint16_t* AsciiToTwoByteString(const char* source) { |
class TestResource: public String::ExternalStringResource { |
public: |
- static int dispose_count; |
- |
- explicit TestResource(uint16_t* data) |
- : data_(data), length_(0) { |
+ explicit TestResource(uint16_t* data, int* counter = NULL) |
+ : data_(data), length_(0), counter_(counter) { |
while (data[length_]) ++length_; |
} |
~TestResource() { |
i::DeleteArray(data_); |
- ++dispose_count; |
+ if (counter_ != NULL) ++*counter_; |
} |
const uint16_t* data() const { |
@@ -353,23 +351,18 @@ class TestResource: public String::ExternalStringResource { |
private: |
uint16_t* data_; |
size_t length_; |
+ int* counter_; |
}; |
-int TestResource::dispose_count = 0; |
- |
- |
class TestAsciiResource: public String::ExternalAsciiStringResource { |
public: |
- static int dispose_count; |
- |
- explicit TestAsciiResource(const char* data) |
- : data_(data), |
- length_(strlen(data)) { } |
+ explicit TestAsciiResource(const char* data, int* counter = NULL) |
+ : data_(data), length_(strlen(data)), counter_(counter) { } |
~TestAsciiResource() { |
i::DeleteArray(data_); |
- ++dispose_count; |
+ if (counter_ != NULL) ++*counter_; |
} |
const char* data() const { |
@@ -382,20 +375,18 @@ class TestAsciiResource: public String::ExternalAsciiStringResource { |
private: |
const char* data_; |
size_t length_; |
+ int* counter_; |
}; |
-int TestAsciiResource::dispose_count = 0; |
- |
- |
THREADED_TEST(ScriptUsingStringResource) { |
- TestResource::dispose_count = 0; |
+ int dispose_count = 0; |
const char* c_source = "1 + 2 * 3"; |
uint16_t* two_byte_source = AsciiToTwoByteString(c_source); |
{ |
v8::HandleScope scope; |
LocalContext env; |
- TestResource* resource = new TestResource(two_byte_source); |
+ TestResource* resource = new TestResource(two_byte_source, &dispose_count); |
Local<String> source = String::NewExternal(resource); |
Local<Script> script = Script::Compile(source); |
Local<Value> value = script->Run(); |
@@ -405,37 +396,38 @@ THREADED_TEST(ScriptUsingStringResource) { |
CHECK_EQ(resource, |
static_cast<TestResource*>(source->GetExternalStringResource())); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(0, TestResource::dispose_count); |
+ CHECK_EQ(0, dispose_count); |
} |
v8::internal::Isolate::Current()->compilation_cache()->Clear(); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(1, TestResource::dispose_count); |
+ CHECK_EQ(1, dispose_count); |
} |
THREADED_TEST(ScriptUsingAsciiStringResource) { |
- TestAsciiResource::dispose_count = 0; |
+ int dispose_count = 0; |
const char* c_source = "1 + 2 * 3"; |
{ |
v8::HandleScope scope; |
LocalContext env; |
Local<String> source = |
- String::NewExternal(new TestAsciiResource(i::StrDup(c_source))); |
+ String::NewExternal(new TestAsciiResource(i::StrDup(c_source), |
+ &dispose_count)); |
Local<Script> script = Script::Compile(source); |
Local<Value> value = script->Run(); |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(0, TestAsciiResource::dispose_count); |
+ CHECK_EQ(0, dispose_count); |
} |
i::Isolate::Current()->compilation_cache()->Clear(); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(1, TestAsciiResource::dispose_count); |
+ CHECK_EQ(1, dispose_count); |
} |
THREADED_TEST(ScriptMakingExternalString) { |
- TestResource::dispose_count = 0; |
+ int dispose_count = 0; |
uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); |
{ |
v8::HandleScope scope; |
@@ -444,23 +436,24 @@ THREADED_TEST(ScriptMakingExternalString) { |
// Trigger GCs so that the newly allocated string moves to old gen. |
HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now |
HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now |
- bool success = source->MakeExternal(new TestResource(two_byte_source)); |
+ bool success = source->MakeExternal(new TestResource(two_byte_source, |
+ &dispose_count)); |
CHECK(success); |
Local<Script> script = Script::Compile(source); |
Local<Value> value = script->Run(); |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(0, TestResource::dispose_count); |
+ CHECK_EQ(0, dispose_count); |
} |
i::Isolate::Current()->compilation_cache()->Clear(); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(1, TestResource::dispose_count); |
+ CHECK_EQ(1, dispose_count); |
} |
THREADED_TEST(ScriptMakingExternalAsciiString) { |
- TestAsciiResource::dispose_count = 0; |
+ int dispose_count = 0; |
const char* c_source = "1 + 2 * 3"; |
{ |
v8::HandleScope scope; |
@@ -470,18 +463,18 @@ THREADED_TEST(ScriptMakingExternalAsciiString) { |
HEAP->CollectGarbage(i::NEW_SPACE); // in survivor space now |
HEAP->CollectGarbage(i::NEW_SPACE); // in old gen now |
bool success = source->MakeExternal( |
- new TestAsciiResource(i::StrDup(c_source))); |
+ new TestAsciiResource(i::StrDup(c_source), &dispose_count)); |
CHECK(success); |
Local<Script> script = Script::Compile(source); |
Local<Value> value = script->Run(); |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(0, TestAsciiResource::dispose_count); |
+ CHECK_EQ(0, dispose_count); |
} |
i::Isolate::Current()->compilation_cache()->Clear(); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(1, TestAsciiResource::dispose_count); |
+ CHECK_EQ(1, dispose_count); |
} |
@@ -605,49 +598,52 @@ THREADED_TEST(UsingExternalAsciiString) { |
THREADED_TEST(ScavengeExternalString) { |
- TestResource::dispose_count = 0; |
+ int dispose_count = 0; |
bool in_new_space = false; |
{ |
v8::HandleScope scope; |
uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
Local<String> string = |
- String::NewExternal(new TestResource(two_byte_string)); |
+ String::NewExternal(new TestResource(two_byte_string, |
+ &dispose_count)); |
i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
HEAP->CollectGarbage(i::NEW_SPACE); |
in_new_space = HEAP->InNewSpace(*istring); |
CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring)); |
- CHECK_EQ(0, TestResource::dispose_count); |
+ CHECK_EQ(0, dispose_count); |
} |
HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); |
- CHECK_EQ(1, TestResource::dispose_count); |
+ CHECK_EQ(1, dispose_count); |
} |
THREADED_TEST(ScavengeExternalAsciiString) { |
- TestAsciiResource::dispose_count = 0; |
+ int dispose_count = 0; |
bool in_new_space = false; |
{ |
v8::HandleScope scope; |
const char* one_byte_string = "test string"; |
Local<String> string = String::NewExternal( |
- new TestAsciiResource(i::StrDup(one_byte_string))); |
+ new TestAsciiResource(i::StrDup(one_byte_string), &dispose_count)); |
i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
HEAP->CollectGarbage(i::NEW_SPACE); |
in_new_space = HEAP->InNewSpace(*istring); |
CHECK(in_new_space || HEAP->old_data_space()->Contains(*istring)); |
- CHECK_EQ(0, TestAsciiResource::dispose_count); |
+ CHECK_EQ(0, dispose_count); |
} |
HEAP->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_DATA_SPACE); |
- CHECK_EQ(1, TestAsciiResource::dispose_count); |
+ CHECK_EQ(1, dispose_count); |
} |
class TestAsciiResourceWithDisposeControl: public TestAsciiResource { |
public: |
+ // Only used by non-threaded tests, so it can use static fields. |
static int dispose_calls; |
+ static int dispose_count; |
TestAsciiResourceWithDisposeControl(const char* data, bool dispose) |
- : TestAsciiResource(data), |
+ : TestAsciiResource(data, &dispose_count), |
dispose_(dispose) { } |
void Dispose() { |
@@ -659,6 +655,7 @@ class TestAsciiResourceWithDisposeControl: public TestAsciiResource { |
}; |
+int TestAsciiResourceWithDisposeControl::dispose_count = 0; |
int TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
@@ -666,7 +663,7 @@ TEST(ExternalStringWithDisposeHandling) { |
const char* c_source = "1 + 2 * 3"; |
// Use a stack allocated external string resource allocated object. |
- TestAsciiResource::dispose_count = 0; |
+ TestAsciiResourceWithDisposeControl::dispose_count = 0; |
TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
TestAsciiResourceWithDisposeControl res_stack(i::StrDup(c_source), false); |
{ |
@@ -678,15 +675,15 @@ TEST(ExternalStringWithDisposeHandling) { |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(0, TestAsciiResource::dispose_count); |
+ CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
} |
i::Isolate::Current()->compilation_cache()->Clear(); |
HEAP->CollectAllGarbage(false); |
CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
- CHECK_EQ(0, TestAsciiResource::dispose_count); |
+ CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
// Use a heap allocated external string resource allocated object. |
- TestAsciiResource::dispose_count = 0; |
+ TestAsciiResourceWithDisposeControl::dispose_count = 0; |
TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
TestAsciiResource* res_heap = |
new TestAsciiResourceWithDisposeControl(i::StrDup(c_source), true); |
@@ -699,12 +696,12 @@ TEST(ExternalStringWithDisposeHandling) { |
CHECK(value->IsNumber()); |
CHECK_EQ(7, value->Int32Value()); |
HEAP->CollectAllGarbage(false); |
- CHECK_EQ(0, TestAsciiResource::dispose_count); |
+ CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
} |
i::Isolate::Current()->compilation_cache()->Clear(); |
HEAP->CollectAllGarbage(false); |
CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
- CHECK_EQ(1, TestAsciiResource::dispose_count); |
+ CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_count); |
} |