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 4900 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4911 | 4911 |
4912 | 4912 |
4913 inline void Code::set_can_have_weak_objects(bool value) { | 4913 inline void Code::set_can_have_weak_objects(bool value) { |
4914 DCHECK(kind() == OPTIMIZED_FUNCTION); | 4914 DCHECK(kind() == OPTIMIZED_FUNCTION); |
4915 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); | 4915 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); |
4916 int updated = CanHaveWeakObjectsField::update(previous, value); | 4916 int updated = CanHaveWeakObjectsField::update(previous, value); |
4917 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); | 4917 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); |
4918 } | 4918 } |
4919 | 4919 |
4920 | 4920 |
4921 bool Code::optimizable() { | |
4922 DCHECK_EQ(FUNCTION, kind()); | |
4923 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1; | |
4924 } | |
4925 | |
4926 | |
4927 void Code::set_optimizable(bool value) { | |
4928 DCHECK_EQ(FUNCTION, kind()); | |
4929 WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0); | |
4930 } | |
4931 | |
4932 | |
4933 bool Code::has_deoptimization_support() { | 4921 bool Code::has_deoptimization_support() { |
4934 DCHECK_EQ(FUNCTION, kind()); | 4922 DCHECK_EQ(FUNCTION, kind()); |
4935 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); | 4923 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); |
4936 return FullCodeFlagsHasDeoptimizationSupportField::decode(flags); | 4924 return FullCodeFlagsHasDeoptimizationSupportField::decode(flags); |
4937 } | 4925 } |
4938 | 4926 |
4939 | 4927 |
4940 void Code::set_has_deoptimization_support(bool value) { | 4928 void Code::set_has_deoptimization_support(bool value) { |
4941 DCHECK_EQ(FUNCTION, kind()); | 4929 DCHECK_EQ(FUNCTION, kind()); |
4942 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); | 4930 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); |
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5734 BOOL_GETTER(SharedFunctionInfo, | 5722 BOOL_GETTER(SharedFunctionInfo, |
5735 compiler_hints, | 5723 compiler_hints, |
5736 optimization_disabled, | 5724 optimization_disabled, |
5737 kOptimizationDisabled) | 5725 kOptimizationDisabled) |
5738 | 5726 |
5739 | 5727 |
5740 void SharedFunctionInfo::set_optimization_disabled(bool disable) { | 5728 void SharedFunctionInfo::set_optimization_disabled(bool disable) { |
5741 set_compiler_hints(BooleanBit::set(compiler_hints(), | 5729 set_compiler_hints(BooleanBit::set(compiler_hints(), |
5742 kOptimizationDisabled, | 5730 kOptimizationDisabled, |
5743 disable)); | 5731 disable)); |
5744 // If disabling optimizations we reflect that in the code object so | |
5745 // it will not be counted as optimizable code. | |
5746 if ((code()->kind() == Code::FUNCTION) && disable) { | |
5747 code()->set_optimizable(false); | |
5748 } | |
5749 } | 5732 } |
5750 | 5733 |
5751 | 5734 |
5752 LanguageMode SharedFunctionInfo::language_mode() { | 5735 LanguageMode SharedFunctionInfo::language_mode() { |
5753 STATIC_ASSERT(LANGUAGE_END == 3); | 5736 STATIC_ASSERT(LANGUAGE_END == 3); |
5754 return construct_language_mode( | 5737 return construct_language_mode( |
5755 BooleanBit::get(compiler_hints(), kStrictModeFunction), | 5738 BooleanBit::get(compiler_hints(), kStrictModeFunction), |
5756 BooleanBit::get(compiler_hints(), kStrongModeFunction)); | 5739 BooleanBit::get(compiler_hints(), kStrongModeFunction)); |
5757 } | 5740 } |
5758 | 5741 |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5980 | 5963 |
5981 void SharedFunctionInfo::TryReenableOptimization() { | 5964 void SharedFunctionInfo::TryReenableOptimization() { |
5982 int tries = opt_reenable_tries(); | 5965 int tries = opt_reenable_tries(); |
5983 set_opt_reenable_tries((tries + 1) & OptReenableTriesBits::kMax); | 5966 set_opt_reenable_tries((tries + 1) & OptReenableTriesBits::kMax); |
5984 // We reenable optimization whenever the number of tries is a large | 5967 // We reenable optimization whenever the number of tries is a large |
5985 // enough power of 2. | 5968 // enough power of 2. |
5986 if (tries >= 16 && (((tries - 1) & tries) == 0)) { | 5969 if (tries >= 16 && (((tries - 1) & tries) == 0)) { |
5987 set_optimization_disabled(false); | 5970 set_optimization_disabled(false); |
5988 set_opt_count(0); | 5971 set_opt_count(0); |
5989 set_deopt_count(0); | 5972 set_deopt_count(0); |
5990 code()->set_optimizable(true); | |
5991 } | 5973 } |
5992 } | 5974 } |
5993 | 5975 |
5994 | 5976 |
5995 bool JSFunction::IsBuiltin() { | 5977 bool JSFunction::IsBuiltin() { |
5996 return context()->global_object()->IsJSBuiltinsObject(); | 5978 return context()->global_object()->IsJSBuiltinsObject(); |
5997 } | 5979 } |
5998 | 5980 |
5999 | 5981 |
6000 bool JSFunction::IsFromNativeScript() { | 5982 bool JSFunction::IsFromNativeScript() { |
(...skipping 17 matching lines...) Expand all Loading... |
6018 SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 6000 SharedFunctionInfo::kDontAdaptArgumentsSentinel; |
6019 } | 6001 } |
6020 | 6002 |
6021 | 6003 |
6022 bool JSFunction::IsOptimized() { | 6004 bool JSFunction::IsOptimized() { |
6023 return code()->kind() == Code::OPTIMIZED_FUNCTION; | 6005 return code()->kind() == Code::OPTIMIZED_FUNCTION; |
6024 } | 6006 } |
6025 | 6007 |
6026 | 6008 |
6027 bool JSFunction::IsOptimizable() { | 6009 bool JSFunction::IsOptimizable() { |
6028 return code()->kind() == Code::FUNCTION && code()->optimizable(); | 6010 return code()->kind() == Code::FUNCTION && !shared()->optimization_disabled(); |
6029 } | 6011 } |
6030 | 6012 |
6031 | 6013 |
6032 bool JSFunction::IsMarkedForOptimization() { | 6014 bool JSFunction::IsMarkedForOptimization() { |
6033 return code() == GetIsolate()->builtins()->builtin( | 6015 return code() == GetIsolate()->builtins()->builtin( |
6034 Builtins::kCompileOptimized); | 6016 Builtins::kCompileOptimized); |
6035 } | 6017 } |
6036 | 6018 |
6037 | 6019 |
6038 bool JSFunction::IsMarkedForConcurrentOptimization() { | 6020 bool JSFunction::IsMarkedForConcurrentOptimization() { |
(...skipping 1594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7633 #undef READ_SHORT_FIELD | 7615 #undef READ_SHORT_FIELD |
7634 #undef WRITE_SHORT_FIELD | 7616 #undef WRITE_SHORT_FIELD |
7635 #undef READ_BYTE_FIELD | 7617 #undef READ_BYTE_FIELD |
7636 #undef WRITE_BYTE_FIELD | 7618 #undef WRITE_BYTE_FIELD |
7637 #undef NOBARRIER_READ_BYTE_FIELD | 7619 #undef NOBARRIER_READ_BYTE_FIELD |
7638 #undef NOBARRIER_WRITE_BYTE_FIELD | 7620 #undef NOBARRIER_WRITE_BYTE_FIELD |
7639 | 7621 |
7640 } } // namespace v8::internal | 7622 } } // namespace v8::internal |
7641 | 7623 |
7642 #endif // V8_OBJECTS_INL_H_ | 7624 #endif // V8_OBJECTS_INL_H_ |
OLD | NEW |