Chromium Code Reviews| Index: src/objects-inl.h |
| diff --git a/src/objects-inl.h b/src/objects-inl.h |
| index 0620e0e876ed6cb7754d35f342bfc8ed5117efc9..3c6e5bace0a4d70d6c0f18526f8918ea44893abe 100644 |
| --- a/src/objects-inl.h |
| +++ b/src/objects-inl.h |
| @@ -3617,7 +3617,7 @@ ACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset) |
| ACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset) |
| ACCESSORS(SharedFunctionInfo, this_property_assignments, Object, |
| kThisPropertyAssignmentsOffset) |
| -SMI_ACCESSORS(SharedFunctionInfo, ic_age, kICAgeOffset) |
| +SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset) |
| BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype, |
| @@ -3666,8 +3666,10 @@ SMI_ACCESSORS(SharedFunctionInfo, compiler_hints, |
| SMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count, |
| kThisPropertyAssignmentsCountOffset) |
| SMI_ACCESSORS(SharedFunctionInfo, opt_count, kOptCountOffset) |
| -SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset) |
| -SMI_ACCESSORS(SharedFunctionInfo, deopt_counter, kDeoptCounterOffset) |
| +SMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset) |
| +SMI_ACCESSORS(SharedFunctionInfo, |
| + stress_deopt_counter, |
| + kStressDeoptCounterOffset) |
| #else |
| #define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \ |
| @@ -3719,8 +3721,10 @@ PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, |
| kThisPropertyAssignmentsCountOffset) |
| PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, opt_count, kOptCountOffset) |
| -PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset) |
| -PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, deopt_counter, kDeoptCounterOffset) |
| +PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, counters, kCountersOffset) |
| +PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, |
| + stress_deopt_counter, |
| + kStressDeoptCounterOffset) |
| #endif |
| @@ -3921,12 +3925,72 @@ void SharedFunctionInfo::set_code_age(int code_age) { |
| } |
| +int SharedFunctionInfo::ic_age() { |
|
Jakob Kummerow
2012/06/11 12:13:59
Y U NO use BitField<type, shift, size>? That'd aut
ulan
2012/06/11 16:07:31
Yeah, BitField is cleaner. Done.
|
| + return (counters() >> kICAgeShift) & kICAgeMask; |
| +} |
| + |
| + |
| +void SharedFunctionInfo::set_ic_age(int ic_age) { |
| + ASSERT(ic_age <= kICAgeMask); |
| + int value = counters() & ~(kICAgeMask << kICAgeShift); |
| + set_counters(value | ((ic_age & kICAgeMask) << kICAgeShift)); |
| +} |
| + |
| + |
| +int SharedFunctionInfo::deopt_count() { |
| + return (counters() >> kDeoptCountShift) & kDeoptCountMask; |
| +} |
| + |
| + |
| +void SharedFunctionInfo::set_deopt_count(int deopt_count) { |
| + ASSERT(deopt_count <= kDeoptCountMask); |
| + int value = counters() & ~(kDeoptCountMask << kDeoptCountShift); |
| + set_counters(value | ((deopt_count & kDeoptCountMask) << kDeoptCountShift)); |
| +} |
| + |
| + |
| +void SharedFunctionInfo::increment_deopt_count() { |
| + int value = counters(); |
| + int deopt_count = (value >> kDeoptCountShift) & kDeoptCountMask; |
| + deopt_count++; |
| + value &= ~(kDeoptCountMask << kDeoptCountShift); |
| + set_counters(value | ((deopt_count & kDeoptCountMask) << kDeoptCountShift)); |
| +} |
| + |
| + |
| +int SharedFunctionInfo::opt_reenable_tries() { |
| + return (counters() >> kOptReenableTriesShift) & kOptReenableTriesMask; |
| +} |
| + |
| + |
| +void SharedFunctionInfo::set_opt_reenable_tries(int tries) { |
| + ASSERT(tries <= kOptReenableTriesMask); |
| + int value = counters() & ~(kOptReenableTriesMask << kOptReenableTriesShift); |
| + value |= ((tries & kOptReenableTriesMask) << kOptReenableTriesShift); |
| + set_counters(value); |
| +} |
| + |
| + |
| bool SharedFunctionInfo::has_deoptimization_support() { |
| Code* code = this->code(); |
| return code->kind() == Code::FUNCTION && code->has_deoptimization_support(); |
| } |
| +void SharedFunctionInfo::TryReenableOptimization() { |
| + int tries = opt_reenable_tries(); |
| + set_opt_reenable_tries(tries + 1); |
| + // We reenable optimization whenever the number of tries is a large |
| + // enough power of 2. |
| + if (tries >= 16 && (((tries - 1) & tries) == 0)) { |
| + set_optimization_disabled(false); |
| + set_opt_count(0); |
| + set_deopt_count(0); |
| + code()->set_optimizable(true); |
| + } |
| +} |
| + |
| + |
| bool JSFunction::IsBuiltin() { |
| return context()->global()->IsJSBuiltinsObject(); |
| } |