OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 | 2 |
3 #include <stdlib.h> | 3 #include <stdlib.h> |
4 | 4 |
5 #include "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "compilation-cache.h" | 7 #include "compilation-cache.h" |
8 #include "execution.h" | 8 #include "execution.h" |
9 #include "factory.h" | 9 #include "factory.h" |
10 #include "macro-assembler.h" | 10 #include "macro-assembler.h" |
(...skipping 1763 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1774 v8::Handle<v8::Function> g = | 1774 v8::Handle<v8::Function> g = |
1775 v8::Handle<v8::Function>::Cast(global->Get(v8_str("g"))); | 1775 v8::Handle<v8::Function>::Cast(global->Get(v8_str("g"))); |
1776 g->Call(global, 0, NULL); | 1776 g->Call(global, 0, NULL); |
1777 } | 1777 } |
1778 | 1778 |
1779 HEAP->incremental_marking()->set_should_hurry(true); | 1779 HEAP->incremental_marking()->set_should_hurry(true); |
1780 HEAP->CollectGarbage(OLD_POINTER_SPACE); | 1780 HEAP->CollectGarbage(OLD_POINTER_SPACE); |
1781 } | 1781 } |
1782 | 1782 |
1783 | 1783 |
| 1784 // Implemented in the test-alloc.cc test suite. |
| 1785 void SimulateFullSpace(PagedSpace* space); |
| 1786 |
| 1787 |
1784 TEST(PrototypeTransitionClearing) { | 1788 TEST(PrototypeTransitionClearing) { |
1785 InitializeVM(); | 1789 InitializeVM(); |
1786 v8::HandleScope scope; | 1790 v8::HandleScope scope; |
1787 | 1791 |
1788 CompileRun( | 1792 CompileRun( |
1789 "var base = {};" | 1793 "var base = {};" |
1790 "var live = [];" | 1794 "var live = [];" |
1791 "for (var i = 0; i < 10; i++) {" | 1795 "for (var i = 0; i < 10; i++) {" |
1792 " var object = {};" | 1796 " var object = {};" |
1793 " var prototype = {};" | 1797 " var prototype = {};" |
(...skipping 18 matching lines...) Expand all Loading... |
1812 int j = Map::kProtoTransitionHeaderSize + | 1816 int j = Map::kProtoTransitionHeaderSize + |
1813 i * Map::kProtoTransitionElementsPerEntry; | 1817 i * Map::kProtoTransitionElementsPerEntry; |
1814 CHECK(trans->get(j + Map::kProtoTransitionMapOffset)->IsMap()); | 1818 CHECK(trans->get(j + Map::kProtoTransitionMapOffset)->IsMap()); |
1815 Object* proto = trans->get(j + Map::kProtoTransitionPrototypeOffset); | 1819 Object* proto = trans->get(j + Map::kProtoTransitionPrototypeOffset); |
1816 CHECK(proto->IsTheHole() || proto->IsJSObject()); | 1820 CHECK(proto->IsTheHole() || proto->IsJSObject()); |
1817 } | 1821 } |
1818 | 1822 |
1819 // Make sure next prototype is placed on an old-space evacuation candidate. | 1823 // Make sure next prototype is placed on an old-space evacuation candidate. |
1820 Handle<JSObject> prototype; | 1824 Handle<JSObject> prototype; |
1821 PagedSpace* space = HEAP->old_pointer_space(); | 1825 PagedSpace* space = HEAP->old_pointer_space(); |
1822 do { | 1826 { |
| 1827 AlwaysAllocateScope always_allocate; |
| 1828 SimulateFullSpace(space); |
1823 prototype = FACTORY->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); | 1829 prototype = FACTORY->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, TENURED); |
1824 } while (space->FirstPage() == space->LastPage() || | 1830 } |
1825 !space->LastPage()->Contains(prototype->address())); | |
1826 | 1831 |
1827 // Add a prototype on an evacuation candidate and verify that transition | 1832 // Add a prototype on an evacuation candidate and verify that transition |
1828 // clearing correctly records slots in prototype transition array. | 1833 // clearing correctly records slots in prototype transition array. |
1829 i::FLAG_always_compact = true; | 1834 i::FLAG_always_compact = true; |
1830 Handle<Map> map(baseObject->map()); | 1835 Handle<Map> map(baseObject->map()); |
1831 CHECK(!space->LastPage()->Contains( | 1836 CHECK(!space->LastPage()->Contains( |
1832 map->GetPrototypeTransitions()->address())); | 1837 map->GetPrototypeTransitions()->address())); |
1833 CHECK(space->LastPage()->Contains(prototype->address())); | 1838 CHECK(space->LastPage()->Contains(prototype->address())); |
1834 baseObject->SetPrototype(*prototype, false)->ToObjectChecked(); | 1839 baseObject->SetPrototype(*prototype, false)->ToObjectChecked(); |
1835 CHECK(map->GetPrototypeTransition(*prototype)->IsMap()); | 1840 CHECK(map->GetPrototypeTransition(*prototype)->IsMap()); |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2087 v8::Utils::OpenHandle( | 2092 v8::Utils::OpenHandle( |
2088 *v8::Handle<v8::Object>::Cast( | 2093 *v8::Handle<v8::Object>::Cast( |
2089 v8::Context::GetCurrent()->Global()->Get(v8_str("root")))); | 2094 v8::Context::GetCurrent()->Global()->Get(v8_str("root")))); |
2090 | 2095 |
2091 // The root object should be in a sane state. | 2096 // The root object should be in a sane state. |
2092 CHECK(root->IsJSObject()); | 2097 CHECK(root->IsJSObject()); |
2093 CHECK(root->map()->IsMap()); | 2098 CHECK(root->map()->IsMap()); |
2094 } | 2099 } |
2095 | 2100 |
2096 | 2101 |
2097 // Implemented in the test-alloc.cc test suite. | |
2098 void SimulateFullSpace(PagedSpace* space); | |
2099 | |
2100 | |
2101 TEST(ReleaseOverReservedPages) { | 2102 TEST(ReleaseOverReservedPages) { |
2102 i::FLAG_trace_gc = true; | 2103 i::FLAG_trace_gc = true; |
2103 // The optimizer can allocate stuff, messing up the test. | 2104 // The optimizer can allocate stuff, messing up the test. |
2104 i::FLAG_crankshaft = false; | 2105 i::FLAG_crankshaft = false; |
2105 i::FLAG_always_opt = false; | 2106 i::FLAG_always_opt = false; |
2106 InitializeVM(); | 2107 InitializeVM(); |
2107 v8::HandleScope scope; | 2108 v8::HandleScope scope; |
2108 static const int number_of_test_pages = 20; | 2109 static const int number_of_test_pages = 20; |
2109 | 2110 |
2110 // Prepare many pages with low live-bytes count. | 2111 // Prepare many pages with low live-bytes count. |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2505 Handle<Object> call_function(call); | 2506 Handle<Object> call_function(call); |
2506 | 2507 |
2507 // Now we are ready to mess up the heap. | 2508 // Now we are ready to mess up the heap. |
2508 HEAP->CollectAllGarbage(Heap::kReduceMemoryFootprintMask); | 2509 HEAP->CollectAllGarbage(Heap::kReduceMemoryFootprintMask); |
2509 | 2510 |
2510 // Either heap verification caught the problem already or we go kaboom once | 2511 // Either heap verification caught the problem already or we go kaboom once |
2511 // the CallIC is executed the next time. | 2512 // the CallIC is executed the next time. |
2512 USE(global->SetProperty(*name, *call_function, NONE, kNonStrictMode)); | 2513 USE(global->SetProperty(*name, *call_function, NONE, kNonStrictMode)); |
2513 CompileRun("call();"); | 2514 CompileRun("call();"); |
2514 } | 2515 } |
OLD | NEW |