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(); | 
| } |