| 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 4578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4589 | 4589 |
| 4590 | 4590 |
| 4591 Handle<JSFunction> GetFunctionByName(Isolate* isolate, const char* name) { | 4591 Handle<JSFunction> GetFunctionByName(Isolate* isolate, const char* name) { |
| 4592 Handle<String> str = isolate->factory()->InternalizeUtf8String(name); | 4592 Handle<String> str = isolate->factory()->InternalizeUtf8String(name); |
| 4593 Handle<Object> obj = | 4593 Handle<Object> obj = |
| 4594 Object::GetProperty(isolate->global_object(), str).ToHandleChecked(); | 4594 Object::GetProperty(isolate->global_object(), str).ToHandleChecked(); |
| 4595 return Handle<JSFunction>::cast(obj); | 4595 return Handle<JSFunction>::cast(obj); |
| 4596 } | 4596 } |
| 4597 | 4597 |
| 4598 | 4598 |
| 4599 void CheckIC(Code* code, Code::Kind kind, InlineCacheState state) { | 4599 void CheckIC(Code* code, Code::Kind kind, SharedFunctionInfo* shared, |
| 4600 Code* ic = FindFirstIC(code, kind); | 4600 int ic_slot, InlineCacheState state) { |
| 4601 CHECK(ic->is_inline_cache_stub()); | 4601 if (FLAG_vector_ics && |
| 4602 CHECK(ic->ic_state() == state); | 4602 (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC || |
| 4603 kind == Code::CALL_IC)) { |
| 4604 TypeFeedbackVector* vector = shared->feedback_vector(); |
| 4605 FeedbackVectorICSlot slot(ic_slot); |
| 4606 if (kind == Code::LOAD_IC) { |
| 4607 LoadICNexus nexus(vector, slot); |
| 4608 CHECK_EQ(nexus.StateFromFeedback(), state); |
| 4609 } else if (kind == Code::KEYED_LOAD_IC) { |
| 4610 KeyedLoadICNexus nexus(vector, slot); |
| 4611 CHECK_EQ(nexus.StateFromFeedback(), state); |
| 4612 } else if (kind == Code::CALL_IC) { |
| 4613 CallICNexus nexus(vector, slot); |
| 4614 CHECK_EQ(nexus.StateFromFeedback(), state); |
| 4615 } |
| 4616 } else { |
| 4617 Code* ic = FindFirstIC(code, kind); |
| 4618 CHECK(ic->is_inline_cache_stub()); |
| 4619 CHECK(ic->ic_state() == state); |
| 4620 } |
| 4603 } | 4621 } |
| 4604 | 4622 |
| 4605 | 4623 |
| 4606 TEST(MonomorphicStaysMonomorphicAfterGC) { | 4624 TEST(MonomorphicStaysMonomorphicAfterGC) { |
| 4607 if (FLAG_always_opt) return; | 4625 if (FLAG_always_opt) return; |
| 4608 // TODO(mvstanton): vector ics need weak support! | |
| 4609 if (FLAG_vector_ics) return; | |
| 4610 CcTest::InitializeVM(); | 4626 CcTest::InitializeVM(); |
| 4611 Isolate* isolate = CcTest::i_isolate(); | 4627 Isolate* isolate = CcTest::i_isolate(); |
| 4612 Heap* heap = isolate->heap(); | 4628 Heap* heap = isolate->heap(); |
| 4613 v8::HandleScope scope(CcTest::isolate()); | 4629 v8::HandleScope scope(CcTest::isolate()); |
| 4614 CompileRun( | 4630 CompileRun( |
| 4615 "function loadIC(obj) {" | 4631 "function loadIC(obj) {" |
| 4616 " return obj.name;" | 4632 " return obj.name;" |
| 4617 "}" | 4633 "}" |
| 4618 "function testIC() {" | 4634 "function testIC() {" |
| 4619 " var proto = {'name' : 'weak'};" | 4635 " var proto = {'name' : 'weak'};" |
| 4620 " var obj = Object.create(proto);" | 4636 " var obj = Object.create(proto);" |
| 4621 " loadIC(obj);" | 4637 " loadIC(obj);" |
| 4622 " loadIC(obj);" | 4638 " loadIC(obj);" |
| 4623 " loadIC(obj);" | 4639 " loadIC(obj);" |
| 4624 " return proto;" | 4640 " return proto;" |
| 4625 "};"); | 4641 "};"); |
| 4626 Handle<JSFunction> loadIC = GetFunctionByName(isolate, "loadIC"); | 4642 Handle<JSFunction> loadIC = GetFunctionByName(isolate, "loadIC"); |
| 4627 { | 4643 { |
| 4628 v8::HandleScope scope(CcTest::isolate()); | 4644 v8::HandleScope scope(CcTest::isolate()); |
| 4629 CompileRun("(testIC())"); | 4645 CompileRun("(testIC())"); |
| 4630 } | 4646 } |
| 4631 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 4647 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 4632 CheckIC(loadIC->code(), Code::LOAD_IC, MONOMORPHIC); | 4648 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 0, MONOMORPHIC); |
| 4633 { | 4649 { |
| 4634 v8::HandleScope scope(CcTest::isolate()); | 4650 v8::HandleScope scope(CcTest::isolate()); |
| 4635 CompileRun("(testIC())"); | 4651 CompileRun("(testIC())"); |
| 4636 } | 4652 } |
| 4637 CheckIC(loadIC->code(), Code::LOAD_IC, MONOMORPHIC); | 4653 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 0, MONOMORPHIC); |
| 4638 } | 4654 } |
| 4639 | 4655 |
| 4640 | 4656 |
| 4641 TEST(PolymorphicStaysPolymorphicAfterGC) { | 4657 TEST(PolymorphicStaysPolymorphicAfterGC) { |
| 4642 if (FLAG_always_opt) return; | 4658 if (FLAG_always_opt) return; |
| 4643 // TODO(mvstanton): vector ics need weak support! | |
| 4644 if (FLAG_vector_ics) return; | |
| 4645 CcTest::InitializeVM(); | 4659 CcTest::InitializeVM(); |
| 4646 Isolate* isolate = CcTest::i_isolate(); | 4660 Isolate* isolate = CcTest::i_isolate(); |
| 4647 Heap* heap = isolate->heap(); | 4661 Heap* heap = isolate->heap(); |
| 4648 v8::HandleScope scope(CcTest::isolate()); | 4662 v8::HandleScope scope(CcTest::isolate()); |
| 4649 CompileRun( | 4663 CompileRun( |
| 4650 "function loadIC(obj) {" | 4664 "function loadIC(obj) {" |
| 4651 " return obj.name;" | 4665 " return obj.name;" |
| 4652 "}" | 4666 "}" |
| 4653 "function testIC() {" | 4667 "function testIC() {" |
| 4654 " var proto = {'name' : 'weak'};" | 4668 " var proto = {'name' : 'weak'};" |
| 4655 " var obj = Object.create(proto);" | 4669 " var obj = Object.create(proto);" |
| 4656 " loadIC(obj);" | 4670 " loadIC(obj);" |
| 4657 " loadIC(obj);" | 4671 " loadIC(obj);" |
| 4658 " loadIC(obj);" | 4672 " loadIC(obj);" |
| 4659 " var poly = Object.create(proto);" | 4673 " var poly = Object.create(proto);" |
| 4660 " poly.x = true;" | 4674 " poly.x = true;" |
| 4661 " loadIC(poly);" | 4675 " loadIC(poly);" |
| 4662 " return proto;" | 4676 " return proto;" |
| 4663 "};"); | 4677 "};"); |
| 4664 Handle<JSFunction> loadIC = GetFunctionByName(isolate, "loadIC"); | 4678 Handle<JSFunction> loadIC = GetFunctionByName(isolate, "loadIC"); |
| 4665 { | 4679 { |
| 4666 v8::HandleScope scope(CcTest::isolate()); | 4680 v8::HandleScope scope(CcTest::isolate()); |
| 4667 CompileRun("(testIC())"); | 4681 CompileRun("(testIC())"); |
| 4668 } | 4682 } |
| 4669 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 4683 heap->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 4670 CheckIC(loadIC->code(), Code::LOAD_IC, POLYMORPHIC); | 4684 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 0, POLYMORPHIC); |
| 4671 { | 4685 { |
| 4672 v8::HandleScope scope(CcTest::isolate()); | 4686 v8::HandleScope scope(CcTest::isolate()); |
| 4673 CompileRun("(testIC())"); | 4687 CompileRun("(testIC())"); |
| 4674 } | 4688 } |
| 4675 CheckIC(loadIC->code(), Code::LOAD_IC, POLYMORPHIC); | 4689 CheckIC(loadIC->code(), Code::LOAD_IC, loadIC->shared(), 0, POLYMORPHIC); |
| 4676 } | 4690 } |
| 4677 | 4691 |
| 4678 | 4692 |
| 4679 TEST(WeakCell) { | 4693 TEST(WeakCell) { |
| 4680 CcTest::InitializeVM(); | 4694 CcTest::InitializeVM(); |
| 4681 Isolate* isolate = CcTest::i_isolate(); | 4695 Isolate* isolate = CcTest::i_isolate(); |
| 4682 v8::internal::Heap* heap = CcTest::heap(); | 4696 v8::internal::Heap* heap = CcTest::heap(); |
| 4683 v8::internal::Factory* factory = isolate->factory(); | 4697 v8::internal::Factory* factory = isolate->factory(); |
| 4684 | 4698 |
| 4685 HandleScope outer_scope(isolate); | 4699 HandleScope outer_scope(isolate); |
| (...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5178 | 5192 |
| 5179 TEST(WritableVsImmortalRoots) { | 5193 TEST(WritableVsImmortalRoots) { |
| 5180 for (int i = 0; i < Heap::kStrongRootListLength; ++i) { | 5194 for (int i = 0; i < Heap::kStrongRootListLength; ++i) { |
| 5181 Heap::RootListIndex root_index = static_cast<Heap::RootListIndex>(i); | 5195 Heap::RootListIndex root_index = static_cast<Heap::RootListIndex>(i); |
| 5182 bool writable = Heap::RootCanBeWrittenAfterInitialization(root_index); | 5196 bool writable = Heap::RootCanBeWrittenAfterInitialization(root_index); |
| 5183 bool immortal = Heap::RootIsImmortalImmovable(root_index); | 5197 bool immortal = Heap::RootIsImmortalImmovable(root_index); |
| 5184 // A root value can be writable, immortal, or neither, but not both. | 5198 // A root value can be writable, immortal, or neither, but not both. |
| 5185 CHECK(!immortal || !writable); | 5199 CHECK(!immortal || !writable); |
| 5186 } | 5200 } |
| 5187 } | 5201 } |
| OLD | NEW |