| OLD | NEW |
| 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 2572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2583 "function mkbar () { return new (new Function(\"\")) (); }" | 2583 "function mkbar () { return new (new Function(\"\")) (); }" |
| 2584 "function f (x) { return (x instanceof foo); }" | 2584 "function f (x) { return (x instanceof foo); }" |
| 2585 "function g () { f(mkbar()); }" | 2585 "function g () { f(mkbar()); }" |
| 2586 "f(new foo()); f(new foo());" | 2586 "f(new foo()); f(new foo());" |
| 2587 "%OptimizeFunctionOnNextCall(f);" | 2587 "%OptimizeFunctionOnNextCall(f);" |
| 2588 "f(new foo()); g();"); | 2588 "f(new foo()); g();"); |
| 2589 } | 2589 } |
| 2590 | 2590 |
| 2591 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 2591 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
| 2592 marking->Stop(); | 2592 marking->Stop(); |
| 2593 marking->Start(Heap::kNoGCFlags); | 2593 CcTest::heap()->StartIncrementalMarking(); |
| 2594 | 2594 |
| 2595 Handle<JSFunction> f = | 2595 Handle<JSFunction> f = |
| 2596 v8::Utils::OpenHandle( | 2596 v8::Utils::OpenHandle( |
| 2597 *v8::Handle<v8::Function>::Cast( | 2597 *v8::Handle<v8::Function>::Cast( |
| 2598 CcTest::global()->Get(v8_str("f")))); | 2598 CcTest::global()->Get(v8_str("f")))); |
| 2599 | 2599 |
| 2600 CHECK(f->IsOptimized()); | 2600 CHECK(f->IsOptimized()); |
| 2601 | 2601 |
| 2602 while (!Marking::IsBlack(Marking::MarkBitFrom(f->code())) && | 2602 while (!Marking::IsBlack(Marking::MarkBitFrom(f->code())) && |
| 2603 !marking->IsStopped()) { | 2603 !marking->IsStopped()) { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2711 "f();"); | 2711 "f();"); |
| 2712 } | 2712 } |
| 2713 Handle<JSFunction> f = | 2713 Handle<JSFunction> f = |
| 2714 v8::Utils::OpenHandle( | 2714 v8::Utils::OpenHandle( |
| 2715 *v8::Handle<v8::Function>::Cast( | 2715 *v8::Handle<v8::Function>::Cast( |
| 2716 CcTest::global()->Get(v8_str("f")))); | 2716 CcTest::global()->Get(v8_str("f")))); |
| 2717 CHECK(f->IsOptimized()); | 2717 CHECK(f->IsOptimized()); |
| 2718 | 2718 |
| 2719 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 2719 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
| 2720 marking->Stop(); | 2720 marking->Stop(); |
| 2721 marking->Start(Heap::kNoGCFlags); | 2721 CcTest::heap()->StartIncrementalMarking(); |
| 2722 // The following calls will increment CcTest::heap()->global_ic_age(). | 2722 // The following calls will increment CcTest::heap()->global_ic_age(). |
| 2723 CcTest::isolate()->ContextDisposedNotification(); | 2723 CcTest::isolate()->ContextDisposedNotification(); |
| 2724 SimulateIncrementalMarking(CcTest::heap()); | 2724 SimulateIncrementalMarking(CcTest::heap()); |
| 2725 CcTest::heap()->CollectAllGarbage(); | 2725 CcTest::heap()->CollectAllGarbage(); |
| 2726 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); | 2726 CHECK_EQ(CcTest::heap()->global_ic_age(), f->shared()->ic_age()); |
| 2727 CHECK_EQ(0, f->shared()->opt_count()); | 2727 CHECK_EQ(0, f->shared()->opt_count()); |
| 2728 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); | 2728 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); |
| 2729 } | 2729 } |
| 2730 | 2730 |
| 2731 | 2731 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2768 CHECK_EQ(0, f->shared()->opt_count()); | 2768 CHECK_EQ(0, f->shared()->opt_count()); |
| 2769 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); | 2769 CHECK_EQ(0, f->shared()->code()->profiler_ticks()); |
| 2770 } | 2770 } |
| 2771 | 2771 |
| 2772 | 2772 |
| 2773 HEAP_TEST(GCFlags) { | 2773 HEAP_TEST(GCFlags) { |
| 2774 CcTest::InitializeVM(); | 2774 CcTest::InitializeVM(); |
| 2775 Heap* heap = CcTest::heap(); | 2775 Heap* heap = CcTest::heap(); |
| 2776 | 2776 |
| 2777 heap->set_current_gc_flags(Heap::kNoGCFlags); | 2777 heap->set_current_gc_flags(Heap::kNoGCFlags); |
| 2778 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags()); | 2778 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); |
| 2779 | 2779 |
| 2780 // Set the flags to check whether we appropriately resets them after the GC. | 2780 // Set the flags to check whether we appropriately resets them after the GC. |
| 2781 heap->set_current_gc_flags(Heap::kAbortIncrementalMarkingMask); | 2781 heap->set_current_gc_flags(Heap::kAbortIncrementalMarkingMask); |
| 2782 heap->CollectAllGarbage(Heap::kReduceMemoryFootprintMask); | 2782 heap->CollectAllGarbage(Heap::kReduceMemoryFootprintMask); |
| 2783 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags()); | 2783 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); |
| 2784 | 2784 |
| 2785 MarkCompactCollector* collector = heap->mark_compact_collector(); | 2785 MarkCompactCollector* collector = heap->mark_compact_collector(); |
| 2786 if (collector->sweeping_in_progress()) { | 2786 if (collector->sweeping_in_progress()) { |
| 2787 collector->EnsureSweepingCompleted(); | 2787 collector->EnsureSweepingCompleted(); |
| 2788 } | 2788 } |
| 2789 | 2789 |
| 2790 IncrementalMarking* marking = heap->incremental_marking(); | 2790 IncrementalMarking* marking = heap->incremental_marking(); |
| 2791 marking->Stop(); | 2791 marking->Stop(); |
| 2792 marking->Start(Heap::kReduceMemoryFootprintMask); | 2792 heap->StartIncrementalMarking(Heap::kReduceMemoryFootprintMask); |
| 2793 CHECK_NE(0, heap->current_gc_flags() & Heap::kReduceMemoryFootprintMask); | 2793 CHECK_NE(0, heap->current_gc_flags_ & Heap::kReduceMemoryFootprintMask); |
| 2794 | 2794 |
| 2795 heap->CollectGarbage(NEW_SPACE); | 2795 heap->CollectGarbage(NEW_SPACE); |
| 2796 // NewSpace scavenges should not overwrite the flags. | 2796 // NewSpace scavenges should not overwrite the flags. |
| 2797 CHECK_NE(0, heap->current_gc_flags() & Heap::kReduceMemoryFootprintMask); | 2797 CHECK_NE(0, heap->current_gc_flags_ & Heap::kReduceMemoryFootprintMask); |
| 2798 | 2798 |
| 2799 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 2799 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 2800 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags()); | 2800 CHECK_EQ(Heap::kNoGCFlags, heap->current_gc_flags_); |
| 2801 } | 2801 } |
| 2802 | 2802 |
| 2803 | 2803 |
| 2804 TEST(IdleNotificationFinishMarking) { | 2804 TEST(IdleNotificationFinishMarking) { |
| 2805 i::FLAG_allow_natives_syntax = true; | 2805 i::FLAG_allow_natives_syntax = true; |
| 2806 CcTest::InitializeVM(); | 2806 CcTest::InitializeVM(); |
| 2807 SimulateFullSpace(CcTest::heap()->old_space()); | 2807 SimulateFullSpace(CcTest::heap()->old_space()); |
| 2808 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 2808 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
| 2809 marking->Stop(); | 2809 marking->Stop(); |
| 2810 marking->Start(Heap::kNoGCFlags); | 2810 CcTest::heap()->StartIncrementalMarking(); |
| 2811 | 2811 |
| 2812 CHECK_EQ(CcTest::heap()->gc_count(), 0); | 2812 CHECK_EQ(CcTest::heap()->gc_count(), 0); |
| 2813 | 2813 |
| 2814 // TODO(hpayer): We cannot write proper unit test right now for heap. | 2814 // TODO(hpayer): We cannot write proper unit test right now for heap. |
| 2815 // The ideal test would call kMaxIdleMarkingDelayCounter to test the | 2815 // The ideal test would call kMaxIdleMarkingDelayCounter to test the |
| 2816 // marking delay counter. | 2816 // marking delay counter. |
| 2817 | 2817 |
| 2818 // Perform a huge incremental marking step but don't complete marking. | 2818 // Perform a huge incremental marking step but don't complete marking. |
| 2819 intptr_t bytes_processed = 0; | 2819 intptr_t bytes_processed = 0; |
| 2820 do { | 2820 do { |
| (...skipping 1932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4753 | 4753 |
| 4754 TEST(IncrementalMarkingStepMakesBigProgressWithLargeObjects) { | 4754 TEST(IncrementalMarkingStepMakesBigProgressWithLargeObjects) { |
| 4755 CcTest::InitializeVM(); | 4755 CcTest::InitializeVM(); |
| 4756 v8::HandleScope scope(CcTest::isolate()); | 4756 v8::HandleScope scope(CcTest::isolate()); |
| 4757 CompileRun("function f(n) {" | 4757 CompileRun("function f(n) {" |
| 4758 " var a = new Array(n);" | 4758 " var a = new Array(n);" |
| 4759 " for (var i = 0; i < n; i += 100) a[i] = i;" | 4759 " for (var i = 0; i < n; i += 100) a[i] = i;" |
| 4760 "};" | 4760 "};" |
| 4761 "f(10 * 1024 * 1024);"); | 4761 "f(10 * 1024 * 1024);"); |
| 4762 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 4762 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
| 4763 if (marking->IsStopped()) marking->Start(Heap::kNoGCFlags); | 4763 if (marking->IsStopped()) { |
| 4764 CcTest::heap()->StartIncrementalMarking(); |
| 4765 } |
| 4764 // This big step should be sufficient to mark the whole array. | 4766 // This big step should be sufficient to mark the whole array. |
| 4765 marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 4767 marking->Step(100 * MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
| 4766 DCHECK(marking->IsComplete() || | 4768 DCHECK(marking->IsComplete() || |
| 4767 marking->IsReadyToOverApproximateWeakClosure()); | 4769 marking->IsReadyToOverApproximateWeakClosure()); |
| 4768 } | 4770 } |
| 4769 | 4771 |
| 4770 | 4772 |
| 4771 TEST(DisableInlineAllocation) { | 4773 TEST(DisableInlineAllocation) { |
| 4772 i::FLAG_allow_natives_syntax = true; | 4774 i::FLAG_allow_natives_syntax = true; |
| 4773 CcTest::InitializeVM(); | 4775 CcTest::InitializeVM(); |
| (...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5481 Handle<FixedArray> survivor = factory->NewFixedArray(1, NOT_TENURED); | 5483 Handle<FixedArray> survivor = factory->NewFixedArray(1, NOT_TENURED); |
| 5482 Handle<WeakCell> weak_cells[N]; | 5484 Handle<WeakCell> weak_cells[N]; |
| 5483 | 5485 |
| 5484 for (int i = 0; i < N; i++) { | 5486 for (int i = 0; i < N; i++) { |
| 5485 HandleScope inner_scope(isolate); | 5487 HandleScope inner_scope(isolate); |
| 5486 Handle<HeapObject> value = | 5488 Handle<HeapObject> value = |
| 5487 i == 0 ? survivor : factory->NewFixedArray(1, NOT_TENURED); | 5489 i == 0 ? survivor : factory->NewFixedArray(1, NOT_TENURED); |
| 5488 Handle<WeakCell> weak_cell = factory->NewWeakCell(value); | 5490 Handle<WeakCell> weak_cell = factory->NewWeakCell(value); |
| 5489 CHECK(weak_cell->value()->IsFixedArray()); | 5491 CHECK(weak_cell->value()->IsFixedArray()); |
| 5490 IncrementalMarking* marking = heap->incremental_marking(); | 5492 IncrementalMarking* marking = heap->incremental_marking(); |
| 5491 if (marking->IsStopped()) marking->Start(Heap::kNoGCFlags); | 5493 if (marking->IsStopped()) { |
| 5494 heap->StartIncrementalMarking(); |
| 5495 } |
| 5492 marking->Step(128, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 5496 marking->Step(128, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
| 5493 heap->CollectGarbage(NEW_SPACE); | 5497 heap->CollectGarbage(NEW_SPACE); |
| 5494 CHECK(weak_cell->value()->IsFixedArray()); | 5498 CHECK(weak_cell->value()->IsFixedArray()); |
| 5495 weak_cells[i] = inner_scope.CloseAndEscape(weak_cell); | 5499 weak_cells[i] = inner_scope.CloseAndEscape(weak_cell); |
| 5496 } | 5500 } |
| 5497 heap->CollectAllGarbage(); | 5501 heap->CollectAllGarbage(); |
| 5498 CHECK_EQ(*survivor, weak_cells[0]->value()); | 5502 CHECK_EQ(*survivor, weak_cells[0]->value()); |
| 5499 for (int i = 1; i < N; i++) { | 5503 for (int i = 1; i < N; i++) { |
| 5500 CHECK(weak_cells[i]->cleared()); | 5504 CHECK(weak_cells[i]->cleared()); |
| 5501 } | 5505 } |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5774 // Ensure that the object allocated where we need it. | 5778 // Ensure that the object allocated where we need it. |
| 5775 Page* page = Page::FromAddress(o->address()); | 5779 Page* page = Page::FromAddress(o->address()); |
| 5776 CHECK_EQ(desired_offset, page->Offset(o->address())); | 5780 CHECK_EQ(desired_offset, page->Offset(o->address())); |
| 5777 | 5781 |
| 5778 // Now we have an object right at the end of the page. | 5782 // Now we have an object right at the end of the page. |
| 5779 | 5783 |
| 5780 // Enable incremental marking to trigger actions in Heap::AdjustLiveBytes() | 5784 // Enable incremental marking to trigger actions in Heap::AdjustLiveBytes() |
| 5781 // that would cause crash. | 5785 // that would cause crash. |
| 5782 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 5786 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
| 5783 marking->Stop(); | 5787 marking->Stop(); |
| 5784 marking->Start(Heap::kNoGCFlags); | 5788 CcTest::heap()->StartIncrementalMarking(); |
| 5785 CHECK(marking->IsMarking()); | 5789 CHECK(marking->IsMarking()); |
| 5786 | 5790 |
| 5787 // Now everything is set up for crashing in JSObject::MigrateFastToFast() | 5791 // Now everything is set up for crashing in JSObject::MigrateFastToFast() |
| 5788 // when it calls heap->AdjustLiveBytes(...). | 5792 // when it calls heap->AdjustLiveBytes(...). |
| 5789 JSObject::MigrateToMap(o, map2); | 5793 JSObject::MigrateToMap(o, map2); |
| 5790 } | 5794 } |
| 5791 | 5795 |
| 5792 | 5796 |
| 5793 TEST(Regress3631) { | 5797 TEST(Regress3631) { |
| 5794 i::FLAG_expose_gc = true; | 5798 i::FLAG_expose_gc = true; |
| 5795 CcTest::InitializeVM(); | 5799 CcTest::InitializeVM(); |
| 5796 v8::HandleScope scope(CcTest::isolate()); | 5800 v8::HandleScope scope(CcTest::isolate()); |
| 5797 Isolate* isolate = CcTest::i_isolate(); | 5801 Isolate* isolate = CcTest::i_isolate(); |
| 5798 Heap* heap = isolate->heap(); | 5802 Heap* heap = isolate->heap(); |
| 5799 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); | 5803 IncrementalMarking* marking = CcTest::heap()->incremental_marking(); |
| 5800 v8::Local<v8::Value> result = CompileRun( | 5804 v8::Local<v8::Value> result = CompileRun( |
| 5801 "var weak_map = new WeakMap();" | 5805 "var weak_map = new WeakMap();" |
| 5802 "var future_keys = [];" | 5806 "var future_keys = [];" |
| 5803 "for (var i = 0; i < 50; i++) {" | 5807 "for (var i = 0; i < 50; i++) {" |
| 5804 " var key = {'k' : i + 0.1};" | 5808 " var key = {'k' : i + 0.1};" |
| 5805 " weak_map.set(key, 1);" | 5809 " weak_map.set(key, 1);" |
| 5806 " future_keys.push({'x' : i + 0.2});" | 5810 " future_keys.push({'x' : i + 0.2});" |
| 5807 "}" | 5811 "}" |
| 5808 "weak_map"); | 5812 "weak_map"); |
| 5809 if (marking->IsStopped()) { | 5813 if (marking->IsStopped()) { |
| 5810 marking->Start(Heap::kNoGCFlags); | 5814 CcTest::heap()->StartIncrementalMarking(); |
| 5811 } | 5815 } |
| 5812 // Incrementally mark the backing store. | 5816 // Incrementally mark the backing store. |
| 5813 Handle<JSObject> obj = | 5817 Handle<JSObject> obj = |
| 5814 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(result)); | 5818 v8::Utils::OpenHandle(*v8::Handle<v8::Object>::Cast(result)); |
| 5815 Handle<JSWeakCollection> weak_map(reinterpret_cast<JSWeakCollection*>(*obj)); | 5819 Handle<JSWeakCollection> weak_map(reinterpret_cast<JSWeakCollection*>(*obj)); |
| 5816 while (!Marking::IsBlack( | 5820 while (!Marking::IsBlack( |
| 5817 Marking::MarkBitFrom(HeapObject::cast(weak_map->table()))) && | 5821 Marking::MarkBitFrom(HeapObject::cast(weak_map->table()))) && |
| 5818 !marking->IsStopped()) { | 5822 !marking->IsStopped()) { |
| 5819 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); | 5823 marking->Step(MB, IncrementalMarking::NO_GC_VIA_STACK_GUARD); |
| 5820 } | 5824 } |
| (...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6521 { | 6525 { |
| 6522 SharedFunctionInfo::Iterator iterator(isolate); | 6526 SharedFunctionInfo::Iterator iterator(isolate); |
| 6523 while (iterator.Next()) sfi_count--; | 6527 while (iterator.Next()) sfi_count--; |
| 6524 } | 6528 } |
| 6525 | 6529 |
| 6526 CHECK_EQ(0, sfi_count); | 6530 CHECK_EQ(0, sfi_count); |
| 6527 } | 6531 } |
| 6528 | 6532 |
| 6529 } // namespace internal | 6533 } // namespace internal |
| 6530 } // namespace v8 | 6534 } // namespace v8 |
| OLD | NEW |