| 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 | 
|---|