OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Review notes: | 5 // Review notes: |
6 // | 6 // |
7 // - The use of macros in these inline functions may seem superfluous | 7 // - The use of macros in these inline functions may seem superfluous |
8 // but it is absolutely needed to make sure gcc generates optimal | 8 // but it is absolutely needed to make sure gcc generates optimal |
9 // code. gcc is not happy when attempting to inline too deep. | 9 // code. gcc is not happy when attempting to inline too deep. |
10 // | 10 // |
(...skipping 4603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4614 STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1); | 4614 STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1); |
4615 WRITE_INT_FIELD(this, kFlagsOffset, flags); | 4615 WRITE_INT_FIELD(this, kFlagsOffset, flags); |
4616 } | 4616 } |
4617 | 4617 |
4618 | 4618 |
4619 Code::Kind Code::kind() { | 4619 Code::Kind Code::kind() { |
4620 return ExtractKindFromFlags(flags()); | 4620 return ExtractKindFromFlags(flags()); |
4621 } | 4621 } |
4622 | 4622 |
4623 | 4623 |
| 4624 bool Code::IsCodeStubOrIC() { |
| 4625 return kind() == STUB || kind() == HANDLER || kind() == LOAD_IC || |
| 4626 kind() == KEYED_LOAD_IC || kind() == CALL_IC || kind() == STORE_IC || |
| 4627 kind() == KEYED_STORE_IC || kind() == BINARY_OP_IC || |
| 4628 kind() == COMPARE_IC || kind() == COMPARE_NIL_IC || |
| 4629 kind() == TO_BOOLEAN_IC; |
| 4630 } |
| 4631 |
| 4632 |
4624 InlineCacheState Code::ic_state() { | 4633 InlineCacheState Code::ic_state() { |
4625 InlineCacheState result = ExtractICStateFromFlags(flags()); | 4634 InlineCacheState result = ExtractICStateFromFlags(flags()); |
4626 // Only allow uninitialized or debugger states for non-IC code | 4635 // Only allow uninitialized or debugger states for non-IC code |
4627 // objects. This is used in the debugger to determine whether or not | 4636 // objects. This is used in the debugger to determine whether or not |
4628 // a call to code object has been replaced with a debug break call. | 4637 // a call to code object has been replaced with a debug break call. |
4629 ASSERT(is_inline_cache_stub() || | 4638 ASSERT(is_inline_cache_stub() || |
4630 result == UNINITIALIZED || | 4639 result == UNINITIALIZED || |
4631 result == DEBUG_STUB); | 4640 result == DEBUG_STUB); |
4632 return result; | 4641 return result; |
4633 } | 4642 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4666 } | 4675 } |
4667 | 4676 |
4668 | 4677 |
4669 inline void Code::set_is_crankshafted(bool value) { | 4678 inline void Code::set_is_crankshafted(bool value) { |
4670 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); | 4679 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); |
4671 int updated = IsCrankshaftedField::update(previous, value); | 4680 int updated = IsCrankshaftedField::update(previous, value); |
4672 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated); | 4681 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated); |
4673 } | 4682 } |
4674 | 4683 |
4675 | 4684 |
4676 int Code::major_key() { | |
4677 ASSERT(has_major_key()); | |
4678 return StubMajorKeyField::decode( | |
4679 READ_UINT32_FIELD(this, kKindSpecificFlags2Offset)); | |
4680 } | |
4681 | |
4682 | |
4683 void Code::set_major_key(int major) { | |
4684 ASSERT(has_major_key()); | |
4685 ASSERT(0 <= major && major < 256); | |
4686 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); | |
4687 int updated = StubMajorKeyField::update(previous, major); | |
4688 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated); | |
4689 } | |
4690 | |
4691 | |
4692 bool Code::has_major_key() { | |
4693 return kind() == STUB || | |
4694 kind() == HANDLER || | |
4695 kind() == BINARY_OP_IC || | |
4696 kind() == COMPARE_IC || | |
4697 kind() == COMPARE_NIL_IC || | |
4698 kind() == LOAD_IC || | |
4699 kind() == KEYED_LOAD_IC || | |
4700 kind() == STORE_IC || | |
4701 kind() == CALL_IC || | |
4702 kind() == KEYED_STORE_IC || | |
4703 kind() == TO_BOOLEAN_IC; | |
4704 } | |
4705 | |
4706 | |
4707 bool Code::optimizable() { | 4685 bool Code::optimizable() { |
4708 ASSERT_EQ(FUNCTION, kind()); | 4686 ASSERT_EQ(FUNCTION, kind()); |
4709 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1; | 4687 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1; |
4710 } | 4688 } |
4711 | 4689 |
4712 | 4690 |
4713 void Code::set_optimizable(bool value) { | 4691 void Code::set_optimizable(bool value) { |
4714 ASSERT_EQ(FUNCTION, kind()); | 4692 ASSERT_EQ(FUNCTION, kind()); |
4715 WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0); | 4693 WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0); |
4716 } | 4694 } |
(...skipping 1405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6122 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset) | 6100 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset) |
6123 ACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset) | 6101 ACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset) |
6124 ACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset) | 6102 ACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset) |
6125 | 6103 |
6126 | 6104 |
6127 void Code::WipeOutHeader() { | 6105 void Code::WipeOutHeader() { |
6128 WRITE_FIELD(this, kRelocationInfoOffset, NULL); | 6106 WRITE_FIELD(this, kRelocationInfoOffset, NULL); |
6129 WRITE_FIELD(this, kHandlerTableOffset, NULL); | 6107 WRITE_FIELD(this, kHandlerTableOffset, NULL); |
6130 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL); | 6108 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL); |
6131 WRITE_FIELD(this, kConstantPoolOffset, NULL); | 6109 WRITE_FIELD(this, kConstantPoolOffset, NULL); |
6132 // Do not wipe out e.g. a minor key. | 6110 // Do not wipe out major/minor keys on a code stub or IC |
6133 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) { | 6111 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) { |
6134 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL); | 6112 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL); |
6135 } | 6113 } |
6136 } | 6114 } |
6137 | 6115 |
6138 | 6116 |
6139 Object* Code::type_feedback_info() { | 6117 Object* Code::type_feedback_info() { |
6140 ASSERT(kind() == FUNCTION); | 6118 ASSERT(kind() == FUNCTION); |
6141 return raw_type_feedback_info(); | 6119 return raw_type_feedback_info(); |
6142 } | 6120 } |
6143 | 6121 |
6144 | 6122 |
6145 void Code::set_type_feedback_info(Object* value, WriteBarrierMode mode) { | 6123 void Code::set_type_feedback_info(Object* value, WriteBarrierMode mode) { |
6146 ASSERT(kind() == FUNCTION); | 6124 ASSERT(kind() == FUNCTION); |
6147 set_raw_type_feedback_info(value, mode); | 6125 set_raw_type_feedback_info(value, mode); |
6148 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kTypeFeedbackInfoOffset, | 6126 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kTypeFeedbackInfoOffset, |
6149 value, mode); | 6127 value, mode); |
6150 } | 6128 } |
6151 | 6129 |
6152 | 6130 |
6153 int Code::stub_info() { | 6131 uint32_t Code::stub_key() { |
6154 ASSERT(kind() == COMPARE_IC || kind() == COMPARE_NIL_IC || | 6132 ASSERT(IsCodeStubOrIC()); |
6155 kind() == BINARY_OP_IC || kind() == LOAD_IC || kind() == CALL_IC); | 6133 return Smi::cast(raw_type_feedback_info())->value() - Smi::kMinValue; |
6156 return Smi::cast(raw_type_feedback_info())->value(); | |
6157 } | 6134 } |
6158 | 6135 |
6159 | 6136 |
6160 void Code::set_stub_info(int value) { | 6137 void Code::set_stub_key(uint32_t key) { |
6161 ASSERT(kind() == COMPARE_IC || | 6138 ASSERT(IsCodeStubOrIC()); |
6162 kind() == COMPARE_NIL_IC || | 6139 set_raw_type_feedback_info(Smi::FromInt(key + Smi::kMinValue)); |
6163 kind() == BINARY_OP_IC || | |
6164 kind() == STUB || | |
6165 kind() == LOAD_IC || | |
6166 kind() == CALL_IC || | |
6167 kind() == KEYED_LOAD_IC || | |
6168 kind() == STORE_IC || | |
6169 kind() == KEYED_STORE_IC); | |
6170 set_raw_type_feedback_info(Smi::FromInt(value)); | |
6171 } | 6140 } |
6172 | 6141 |
6173 | 6142 |
6174 ACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset) | 6143 ACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset) |
6175 INT_ACCESSORS(Code, ic_age, kICAgeOffset) | 6144 INT_ACCESSORS(Code, ic_age, kICAgeOffset) |
6176 | 6145 |
6177 | 6146 |
6178 byte* Code::instruction_start() { | 6147 byte* Code::instruction_start() { |
6179 return FIELD_ADDR(this, kHeaderSize); | 6148 return FIELD_ADDR(this, kHeaderSize); |
6180 } | 6149 } |
(...skipping 1019 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7200 #undef READ_SHORT_FIELD | 7169 #undef READ_SHORT_FIELD |
7201 #undef WRITE_SHORT_FIELD | 7170 #undef WRITE_SHORT_FIELD |
7202 #undef READ_BYTE_FIELD | 7171 #undef READ_BYTE_FIELD |
7203 #undef WRITE_BYTE_FIELD | 7172 #undef WRITE_BYTE_FIELD |
7204 #undef NOBARRIER_READ_BYTE_FIELD | 7173 #undef NOBARRIER_READ_BYTE_FIELD |
7205 #undef NOBARRIER_WRITE_BYTE_FIELD | 7174 #undef NOBARRIER_WRITE_BYTE_FIELD |
7206 | 7175 |
7207 } } // namespace v8::internal | 7176 } } // namespace v8::internal |
7208 | 7177 |
7209 #endif // V8_OBJECTS_INL_H_ | 7178 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |