Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: test/cctest/test-heap.cc

Issue 259173003: Kiss goodbye to MaybeObject. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 228
229 CheckFindCodeObject(isolate); 229 CheckFindCodeObject(isolate);
230 } 230 }
231 231
232 232
233 TEST(Tagging) { 233 TEST(Tagging) {
234 CcTest::InitializeVM(); 234 CcTest::InitializeVM();
235 int request = 24; 235 int request = 24;
236 CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request))); 236 CHECK_EQ(request, static_cast<int>(OBJECT_POINTER_ALIGN(request)));
237 CHECK(Smi::FromInt(42)->IsSmi()); 237 CHECK(Smi::FromInt(42)->IsSmi());
238 CHECK(Failure::RetryAfterGC(NEW_SPACE)->IsFailure());
239 CHECK_EQ(NEW_SPACE,
240 Failure::RetryAfterGC(NEW_SPACE)->allocation_space());
241 CHECK_EQ(OLD_POINTER_SPACE,
242 Failure::RetryAfterGC(OLD_POINTER_SPACE)->allocation_space());
243 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi()); 238 CHECK(Smi::FromInt(Smi::kMinValue)->IsSmi());
244 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi()); 239 CHECK(Smi::FromInt(Smi::kMaxValue)->IsSmi());
245 } 240 }
246 241
247 242
248 TEST(GarbageCollection) { 243 TEST(GarbageCollection) {
249 CcTest::InitializeVM(); 244 CcTest::InitializeVM();
250 Isolate* isolate = CcTest::i_isolate(); 245 Isolate* isolate = CcTest::i_isolate();
251 Heap* heap = isolate->heap(); 246 Heap* heap = isolate->heap();
252 Factory* factory = isolate->factory(); 247 Factory* factory = isolate->factory();
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 // just enough room to allocate JSObject and thus fill the newspace. 998 // just enough room to allocate JSObject and thus fill the newspace.
1004 999
1005 int allocation_amount = Min(FixedArray::kMaxSize, 1000 int allocation_amount = Min(FixedArray::kMaxSize,
1006 Page::kMaxRegularHeapObjectSize + kPointerSize); 1001 Page::kMaxRegularHeapObjectSize + kPointerSize);
1007 int allocation_len = LenFromSize(allocation_amount); 1002 int allocation_len = LenFromSize(allocation_amount);
1008 NewSpace* new_space = heap->new_space(); 1003 NewSpace* new_space = heap->new_space();
1009 Address* top_addr = new_space->allocation_top_address(); 1004 Address* top_addr = new_space->allocation_top_address();
1010 Address* limit_addr = new_space->allocation_limit_address(); 1005 Address* limit_addr = new_space->allocation_limit_address();
1011 while ((*limit_addr - *top_addr) > allocation_amount) { 1006 while ((*limit_addr - *top_addr) > allocation_amount) {
1012 CHECK(!heap->always_allocate()); 1007 CHECK(!heap->always_allocate());
1013 Object* array = heap->AllocateFixedArray(allocation_len)->ToObjectChecked(); 1008 Object* array = heap->AllocateFixedArray(allocation_len).ToObjectChecked();
1014 CHECK(!array->IsFailure());
1015 CHECK(new_space->Contains(array)); 1009 CHECK(new_space->Contains(array));
1016 } 1010 }
1017 1011
1018 // Step 3: now allocate fixed array and JSObject to fill the whole new space. 1012 // Step 3: now allocate fixed array and JSObject to fill the whole new space.
1019 int to_fill = static_cast<int>(*limit_addr - *top_addr - object_size); 1013 int to_fill = static_cast<int>(*limit_addr - *top_addr - object_size);
1020 int fixed_array_len = LenFromSize(to_fill); 1014 int fixed_array_len = LenFromSize(to_fill);
1021 CHECK(fixed_array_len < FixedArray::kMaxLength); 1015 CHECK(fixed_array_len < FixedArray::kMaxLength);
1022 1016
1023 CHECK(!heap->always_allocate()); 1017 CHECK(!heap->always_allocate());
1024 Object* array = heap->AllocateFixedArray(fixed_array_len)->ToObjectChecked(); 1018 Object* array = heap->AllocateFixedArray(fixed_array_len).ToObjectChecked();
1025 CHECK(!array->IsFailure());
1026 CHECK(new_space->Contains(array)); 1019 CHECK(new_space->Contains(array));
1027 1020
1028 Object* object = heap->AllocateJSObjectFromMap(*my_map)->ToObjectChecked(); 1021 Object* object = heap->AllocateJSObjectFromMap(*my_map).ToObjectChecked();
1029 CHECK(new_space->Contains(object)); 1022 CHECK(new_space->Contains(object));
1030 JSObject* jsobject = JSObject::cast(object); 1023 JSObject* jsobject = JSObject::cast(object);
1031 CHECK_EQ(0, FixedArray::cast(jsobject->elements())->length()); 1024 CHECK_EQ(0, FixedArray::cast(jsobject->elements())->length());
1032 CHECK_EQ(0, jsobject->properties()->length()); 1025 CHECK_EQ(0, jsobject->properties()->length());
1033 // Create a reference to object in new space in jsobject. 1026 // Create a reference to object in new space in jsobject.
1034 jsobject->FastPropertyAtPut(-1, array); 1027 jsobject->FastPropertyAtPut(-1, array);
1035 1028
1036 CHECK_EQ(0, static_cast<int>(*limit_addr - *top_addr)); 1029 CHECK_EQ(0, static_cast<int>(*limit_addr - *top_addr));
1037 1030
1038 // Step 4: clone jsobject, but force always allocate first to create a clone 1031 // Step 4: clone jsobject, but force always allocate first to create a clone
1039 // in old pointer space. 1032 // in old pointer space.
1040 Address old_pointer_space_top = heap->old_pointer_space()->top(); 1033 Address old_pointer_space_top = heap->old_pointer_space()->top();
1041 AlwaysAllocateScope aa_scope(isolate); 1034 AlwaysAllocateScope aa_scope(isolate);
1042 Object* clone_obj = heap->CopyJSObject(jsobject)->ToObjectChecked(); 1035 Object* clone_obj = heap->CopyJSObject(jsobject).ToObjectChecked();
1043 JSObject* clone = JSObject::cast(clone_obj); 1036 JSObject* clone = JSObject::cast(clone_obj);
1044 if (clone->address() != old_pointer_space_top) { 1037 if (clone->address() != old_pointer_space_top) {
1045 // Alas, got allocated from free list, we cannot do checks. 1038 // Alas, got allocated from free list, we cannot do checks.
1046 return; 1039 return;
1047 } 1040 }
1048 CHECK(heap->old_pointer_space()->Contains(clone->address())); 1041 CHECK(heap->old_pointer_space()->Contains(clone->address()));
1049 } 1042 }
1050 1043
1051 1044
1052 TEST(TestCodeFlushing) { 1045 TEST(TestCodeFlushing) {
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
1610 } 1603 }
1611 int initial_size = static_cast<int>(CcTest::heap()->SizeOfObjects()); 1604 int initial_size = static_cast<int>(CcTest::heap()->SizeOfObjects());
1612 1605
1613 { 1606 {
1614 // Allocate objects on several different old-space pages so that 1607 // Allocate objects on several different old-space pages so that
1615 // concurrent sweeper threads will be busy sweeping the old space on 1608 // concurrent sweeper threads will be busy sweeping the old space on
1616 // subsequent GC runs. 1609 // subsequent GC runs.
1617 AlwaysAllocateScope always_allocate(CcTest::i_isolate()); 1610 AlwaysAllocateScope always_allocate(CcTest::i_isolate());
1618 int filler_size = static_cast<int>(FixedArray::SizeFor(8192)); 1611 int filler_size = static_cast<int>(FixedArray::SizeFor(8192));
1619 for (int i = 1; i <= 100; i++) { 1612 for (int i = 1; i <= 100; i++) {
1620 CcTest::heap()->AllocateFixedArray(8192, TENURED)->ToObjectChecked(); 1613 CcTest::heap()->AllocateFixedArray(8192, TENURED).ToObjectChecked();
1621 CHECK_EQ(initial_size + i * filler_size, 1614 CHECK_EQ(initial_size + i * filler_size,
1622 static_cast<int>(CcTest::heap()->SizeOfObjects())); 1615 static_cast<int>(CcTest::heap()->SizeOfObjects()));
1623 } 1616 }
1624 } 1617 }
1625 1618
1626 // The heap size should go back to initial size after a full GC, even 1619 // The heap size should go back to initial size after a full GC, even
1627 // though sweeping didn't finish yet. 1620 // though sweeping didn't finish yet.
1628 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); 1621 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags);
1629 1622
1630 // Normally sweeping would not be complete here, but no guarantees. 1623 // Normally sweeping would not be complete here, but no guarantees.
(...skipping 1843 matching lines...) Expand 10 before | Expand all | Expand 10 after
3474 } 3467 }
3475 3468
3476 3469
3477 // Helper function that simulates a fill new-space in the heap. 3470 // Helper function that simulates a fill new-space in the heap.
3478 static inline void AllocateAllButNBytes(v8::internal::NewSpace* space, 3471 static inline void AllocateAllButNBytes(v8::internal::NewSpace* space,
3479 int extra_bytes) { 3472 int extra_bytes) {
3480 int space_remaining = static_cast<int>( 3473 int space_remaining = static_cast<int>(
3481 *space->allocation_limit_address() - *space->allocation_top_address()); 3474 *space->allocation_limit_address() - *space->allocation_top_address());
3482 CHECK(space_remaining >= extra_bytes); 3475 CHECK(space_remaining >= extra_bytes);
3483 int new_linear_size = space_remaining - extra_bytes; 3476 int new_linear_size = space_remaining - extra_bytes;
3484 v8::internal::MaybeObject* maybe = space->AllocateRaw(new_linear_size); 3477 v8::internal::AllocationResult allocation =
3485 v8::internal::FreeListNode* node = v8::internal::FreeListNode::cast(maybe); 3478 space->AllocateRaw(new_linear_size);
3479 v8::internal::FreeListNode* node =
3480 v8::internal::FreeListNode::cast(allocation.ToObjectChecked());
3486 node->set_size(space->heap(), new_linear_size); 3481 node->set_size(space->heap(), new_linear_size);
3487 } 3482 }
3488 3483
3489 3484
3490 TEST(Regress169928) { 3485 TEST(Regress169928) {
3491 i::FLAG_allow_natives_syntax = true; 3486 i::FLAG_allow_natives_syntax = true;
3492 i::FLAG_crankshaft = false; 3487 i::FLAG_crankshaft = false;
3493 CcTest::InitializeVM(); 3488 CcTest::InitializeVM();
3494 Isolate* isolate = CcTest::i_isolate(); 3489 Isolate* isolate = CcTest::i_isolate();
3495 Factory* factory = isolate->factory(); 3490 Factory* factory = isolate->factory();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3533 3528
3534 Handle<JSArray> array = factory->NewJSArrayWithElements(array_data, 3529 Handle<JSArray> array = factory->NewJSArrayWithElements(array_data,
3535 FAST_SMI_ELEMENTS, 3530 FAST_SMI_ELEMENTS,
3536 NOT_TENURED); 3531 NOT_TENURED);
3537 3532
3538 CHECK_EQ(Smi::FromInt(2), array->length()); 3533 CHECK_EQ(Smi::FromInt(2), array->length());
3539 CHECK(array->HasFastSmiOrObjectElements()); 3534 CHECK(array->HasFastSmiOrObjectElements());
3540 3535
3541 // We need filler the size of AllocationMemento object, plus an extra 3536 // We need filler the size of AllocationMemento object, plus an extra
3542 // fill pointer value. 3537 // fill pointer value.
3543 MaybeObject* maybe_object = CcTest::heap()->new_space()->AllocateRaw( 3538 HeapObject* obj = NULL;
3539 AllocationResult allocation = CcTest::heap()->new_space()->AllocateRaw(
3544 AllocationMemento::kSize + kPointerSize); 3540 AllocationMemento::kSize + kPointerSize);
3545 Object* obj = NULL; 3541 CHECK(allocation.To(&obj));
3546 CHECK(maybe_object->ToObject(&obj)); 3542 Address addr_obj = obj->address();
3547 Address addr_obj = reinterpret_cast<Address>( 3543 CcTest::heap()->CreateFillerObjectAt(
3548 reinterpret_cast<byte*>(obj - kHeapObjectTag)); 3544 addr_obj, AllocationMemento::kSize + kPointerSize);
3549 CcTest::heap()->CreateFillerObjectAt(addr_obj,
3550 AllocationMemento::kSize + kPointerSize);
3551 3545
3552 // Give the array a name, making sure not to allocate strings. 3546 // Give the array a name, making sure not to allocate strings.
3553 v8::Handle<v8::Object> array_obj = v8::Utils::ToLocal(array); 3547 v8::Handle<v8::Object> array_obj = v8::Utils::ToLocal(array);
3554 CcTest::global()->Set(array_name, array_obj); 3548 CcTest::global()->Set(array_name, array_obj);
3555 3549
3556 // This should crash with a protection violation if we are running a build 3550 // This should crash with a protection violation if we are running a build
3557 // with the bug. 3551 // with the bug.
3558 AlwaysAllocateScope aa_scope(isolate); 3552 AlwaysAllocateScope aa_scope(isolate);
3559 v8::Script::Compile(mote_code_string)->Run(); 3553 v8::Script::Compile(mote_code_string)->Run();
3560 } 3554 }
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
4215 "array;"); 4209 "array;");
4216 4210
4217 Handle<JSObject> o = 4211 Handle<JSObject> o =
4218 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(result)); 4212 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(result));
4219 CHECK(heap->InOldPointerSpace(o->elements())); 4213 CHECK(heap->InOldPointerSpace(o->elements()));
4220 CHECK(heap->InOldPointerSpace(*o)); 4214 CHECK(heap->InOldPointerSpace(*o));
4221 Page* page = Page::FromAddress(o->elements()->address()); 4215 Page* page = Page::FromAddress(o->elements()->address());
4222 CHECK(page->WasSwept() || 4216 CHECK(page->WasSwept() ||
4223 Marking::IsBlack(Marking::MarkBitFrom(o->elements()))); 4217 Marking::IsBlack(Marking::MarkBitFrom(o->elements())));
4224 } 4218 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698