Index: test/cctest/test-global-handles.cc |
diff --git a/test/cctest/test-global-handles.cc b/test/cctest/test-global-handles.cc |
index 07b4b4c39a6d1a639321c637dff37f2047034943..0b652db37b628a25d0f10e1e065366f283c00535 100644 |
--- a/test/cctest/test-global-handles.cc |
+++ b/test/cctest/test-global-handles.cc |
@@ -25,9 +25,6 @@ |
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-#include <map> |
-#include <vector> |
- |
#include "global-handles.h" |
#include "cctest.h" |
@@ -320,157 +317,6 @@ TEST(ImplicitReferences) { |
} |
-static const int kBlockSize = 256; |
- |
- |
-TEST(BlockCollection) { |
- v8::V8::Initialize(); |
- Isolate* isolate = Isolate::Current(); |
- GlobalHandles* global_handles = isolate->global_handles(); |
- CHECK_EQ(0, global_handles->block_count()); |
- CHECK_EQ(0, global_handles->global_handles_count()); |
- Object* object = isolate->heap()->undefined_value(); |
- const int kNumberOfBlocks = 5; |
- typedef Handle<Object> Block[kBlockSize]; |
- for (int round = 0; round < 3; round++) { |
- Block blocks[kNumberOfBlocks]; |
- for (int i = 0; i < kNumberOfBlocks; i++) { |
- for (int j = 0; j < kBlockSize; j++) { |
- blocks[i][j] = global_handles->Create(object); |
- } |
- } |
- CHECK_EQ(kNumberOfBlocks, global_handles->block_count()); |
- for (int i = 0; i < kNumberOfBlocks; i++) { |
- for (int j = 0; j < kBlockSize; j++) { |
- global_handles->Destroy(blocks[i][j].location()); |
- } |
- } |
- isolate->heap()->CollectAllAvailableGarbage("BlockCollection"); |
- CHECK_EQ(0, global_handles->global_handles_count()); |
- CHECK_EQ(1, global_handles->block_count()); |
- } |
-} |
- |
- |
-class RandomMutationData { |
- public: |
- explicit RandomMutationData(Isolate* isolate) |
- : isolate_(isolate), weak_offset_(0) {} |
- |
- void Mutate(double strong_growth_tendency, |
- double weak_growth_tendency = 0.05) { |
- for (int i = 0; i < kBlockSize * 100; i++) { |
- if (rng_.next(strong_growth_tendency)) { |
- AddStrong(); |
- } else if (strong_nodes_.size() != 0) { |
- size_t to_remove = rng_.next(static_cast<int>(strong_nodes_.size())); |
- RemoveStrong(to_remove); |
- } |
- if (rng_.next(weak_growth_tendency)) AddWeak(); |
- if (rng_.next(0.05)) { |
-#ifdef DEBUG |
- isolate_->global_handles()->VerifyBlockInvariants(); |
-#endif |
- } |
- if (rng_.next(0.0001)) { |
- isolate_->heap()->PerformScavenge(); |
- } else if (rng_.next(0.00003)) { |
- isolate_->heap()->CollectAllAvailableGarbage(); |
- } |
- CheckSizes(); |
- } |
- } |
- |
- void RemoveAll() { |
- while (strong_nodes_.size() != 0) { |
- RemoveStrong(strong_nodes_.size() - 1); |
- } |
- isolate_->heap()->PerformScavenge(); |
- isolate_->heap()->CollectAllAvailableGarbage(); |
- CheckSizes(); |
- } |
- |
- private: |
- typedef std::vector<Object**> NodeVector; |
- typedef std::map<int32_t, Object**> NodeMap; |
- |
- void CheckSizes() { |
- int stored_sizes = |
- static_cast<int>(strong_nodes_.size() + weak_nodes_.size()); |
- CHECK_EQ(isolate_->global_handles()->global_handles_count(), stored_sizes); |
- } |
- |
- void AddStrong() { |
- Object* object = isolate_->heap()->undefined_value(); |
- Object** location = isolate_->global_handles()->Create(object).location(); |
- strong_nodes_.push_back(location); |
- } |
- |
- void RemoveStrong(size_t offset) { |
- isolate_->global_handles()->Destroy(strong_nodes_.at(offset)); |
- strong_nodes_.erase(strong_nodes_.begin() + offset); |
- } |
- |
- void AddWeak() { |
- v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(isolate_); |
- v8::HandleScope scope(isolate); |
- v8::Local<v8::Object> object = v8::Object::New(); |
- int32_t offset = ++weak_offset_; |
- object->Set(7, v8::Integer::New(offset, isolate)); |
- v8::Persistent<v8::Object> persistent(isolate, object); |
- persistent.MakeWeak(this, WeakCallback); |
- persistent.MarkIndependent(); |
- Object** location = v8::Utils::OpenPersistent(persistent).location(); |
- bool inserted = |
- weak_nodes_.insert(std::make_pair(offset, location)).second; |
- CHECK(inserted); |
- } |
- |
- static void WeakCallback(v8::Isolate* isolate, |
- v8::Persistent<v8::Object>* persistent, |
- RandomMutationData* data) { |
- v8::Local<v8::Object> object = |
- v8::Local<v8::Object>::New(isolate, *persistent); |
- int32_t offset = |
- v8::Local<v8::Integer>::Cast(object->Get(7))->Int32Value(); |
- Object** location = v8::Utils::OpenPersistent(persistent).location(); |
- NodeMap& weak_nodes = data->weak_nodes_; |
- NodeMap::iterator it = weak_nodes.find(offset); |
- CHECK(it != weak_nodes.end()); |
- CHECK(it->second == location); |
- weak_nodes.erase(it); |
- persistent->Dispose(); |
- } |
- |
- Isolate* isolate_; |
- RandomNumberGenerator rng_; |
- NodeVector strong_nodes_; |
- NodeMap weak_nodes_; |
- int32_t weak_offset_; |
-}; |
- |
- |
-TEST(RandomMutation) { |
- v8::V8::Initialize(); |
- Isolate* isolate = Isolate::Current(); |
- CHECK_EQ(0, isolate->global_handles()->block_count()); |
- HandleScope handle_scope(isolate); |
- v8::Context::Scope context_scope( |
- v8::Context::New(reinterpret_cast<v8::Isolate*>(isolate))); |
- RandomMutationData data(isolate); |
- // grow some |
- data.Mutate(0.65); |
- data.Mutate(0.55); |
- // balanced mutation |
- for (int i = 0; i < 3; i++) data.Mutate(0.50); |
- // shrink some |
- data.Mutate(0.45); |
- data.Mutate(0.35); |
- // clear everything |
- data.RemoveAll(); |
-} |
- |
- |
TEST(EternalHandles) { |
CcTest::InitializeVM(); |
Isolate* isolate = Isolate::Current(); |
@@ -518,4 +364,3 @@ TEST(EternalHandles) { |
CHECK_EQ(kArrayLength, eternals->NumberOfHandles()); |
} |
- |