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 2595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2606 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | 2606 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( |
2607 global->Get(ctx, v8_str("g")).ToLocalChecked()); | 2607 global->Get(ctx, v8_str("g")).ToLocalChecked()); |
2608 g->Call(ctx, global, 0, nullptr).ToLocalChecked(); | 2608 g->Call(ctx, global, 0, nullptr).ToLocalChecked(); |
2609 } | 2609 } |
2610 | 2610 |
2611 CcTest::heap()->incremental_marking()->set_should_hurry(true); | 2611 CcTest::heap()->incremental_marking()->set_should_hurry(true); |
2612 CcTest::heap()->CollectGarbage(OLD_SPACE); | 2612 CcTest::heap()->CollectGarbage(OLD_SPACE); |
2613 } | 2613 } |
2614 | 2614 |
2615 | 2615 |
2616 TEST(PrototypeTransitionClearing) { | |
2617 if (FLAG_never_compact) return; | |
2618 CcTest::InitializeVM(); | |
2619 Isolate* isolate = CcTest::i_isolate(); | |
2620 Factory* factory = isolate->factory(); | |
2621 v8::HandleScope scope(CcTest::isolate()); | |
2622 v8::Local<v8::Context> ctx = CcTest::isolate()->GetCurrentContext(); | |
2623 | |
2624 CompileRun("var base = {};"); | |
2625 i::Handle<JSReceiver> baseObject = | |
2626 v8::Utils::OpenHandle(*v8::Local<v8::Object>::Cast( | |
2627 CcTest::global()->Get(ctx, v8_str("base")).ToLocalChecked())); | |
2628 | |
2629 int initialTransitions = | |
2630 TransitionArray::NumberOfPrototypeTransitionsForTest(baseObject->map()); | |
2631 | |
2632 CompileRun( | |
2633 "var live = [];" | |
2634 "for (var i = 0; i < 10; i++) {" | |
2635 " var object = {};" | |
2636 " var prototype = {};" | |
2637 " object.__proto__ = prototype;" | |
2638 " if (i >= 3) live.push(object, prototype);" | |
2639 "}"); | |
2640 | |
2641 // Verify that only dead prototype transitions are cleared. | |
2642 CHECK_EQ( | |
2643 initialTransitions + 10, | |
2644 TransitionArray::NumberOfPrototypeTransitionsForTest(baseObject->map())); | |
2645 CcTest::heap()->CollectAllGarbage(); | |
2646 const int transitions = 10 - 3; | |
2647 CHECK_EQ( | |
2648 initialTransitions + transitions, | |
2649 TransitionArray::NumberOfPrototypeTransitionsForTest(baseObject->map())); | |
2650 | |
2651 // Verify that prototype transitions array was compacted. | |
2652 FixedArray* trans = | |
2653 TransitionArray::GetPrototypeTransitions(baseObject->map()); | |
2654 for (int i = initialTransitions; i < initialTransitions + transitions; i++) { | |
2655 int j = TransitionArray::kProtoTransitionHeaderSize + i; | |
2656 CHECK(trans->get(j)->IsWeakCell()); | |
2657 CHECK(WeakCell::cast(trans->get(j))->value()->IsMap()); | |
2658 } | |
2659 | |
2660 // Make sure next prototype is placed on an old-space evacuation candidate. | |
2661 Handle<JSObject> prototype; | |
2662 PagedSpace* space = CcTest::heap()->old_space(); | |
2663 { | |
2664 AlwaysAllocateScope always_allocate(isolate); | |
2665 SimulateFullSpace(space); | |
2666 prototype = factory->NewJSArray(32 * KB, FAST_HOLEY_ELEMENTS, | |
2667 Strength::WEAK, TENURED); | |
2668 } | |
2669 | |
2670 // Add a prototype on an evacuation candidate and verify that transition | |
2671 // clearing correctly records slots in prototype transition array. | |
2672 i::FLAG_always_compact = true; | |
2673 Handle<Map> map(baseObject->map()); | |
2674 CHECK(!space->LastPage()->Contains( | |
2675 TransitionArray::GetPrototypeTransitions(*map)->address())); | |
2676 CHECK(space->LastPage()->Contains(prototype->address())); | |
2677 } | |
2678 | |
2679 | |
2680 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { | 2616 TEST(ResetSharedFunctionInfoCountersDuringIncrementalMarking) { |
2681 i::FLAG_stress_compaction = false; | 2617 i::FLAG_stress_compaction = false; |
2682 i::FLAG_allow_natives_syntax = true; | 2618 i::FLAG_allow_natives_syntax = true; |
2683 #ifdef VERIFY_HEAP | 2619 #ifdef VERIFY_HEAP |
2684 i::FLAG_verify_heap = true; | 2620 i::FLAG_verify_heap = true; |
2685 #endif | 2621 #endif |
2686 | 2622 |
2687 CcTest::InitializeVM(); | 2623 CcTest::InitializeVM(); |
2688 if (!CcTest::i_isolate()->use_crankshaft()) return; | 2624 if (!CcTest::i_isolate()->use_crankshaft()) return; |
2689 v8::HandleScope outer_scope(CcTest::isolate()); | 2625 v8::HandleScope outer_scope(CcTest::isolate()); |
(...skipping 3860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6550 isolate->IncrementJsCallsFromApiCounter(); | 6486 isolate->IncrementJsCallsFromApiCounter(); |
6551 isolate->IncrementJsCallsFromApiCounter(); | 6487 isolate->IncrementJsCallsFromApiCounter(); |
6552 isolate->IncrementJsCallsFromApiCounter(); | 6488 isolate->IncrementJsCallsFromApiCounter(); |
6553 calls_per_ms = memory_reducer->SampleAndGetJsCallsPerMs(4); | 6489 calls_per_ms = memory_reducer->SampleAndGetJsCallsPerMs(4); |
6554 CheckDoubleEquals(2, calls_per_ms); | 6490 CheckDoubleEquals(2, calls_per_ms); |
6555 } | 6491 } |
6556 | 6492 |
6557 | 6493 |
6558 } // namespace internal | 6494 } // namespace internal |
6559 } // namespace v8 | 6495 } // namespace v8 |
OLD | NEW |