| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 756b40ba23c035e0d86e575260775de266fe8621..7083fbaaf3c687d158c284aa51855a7a7090930d 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -5241,10 +5241,17 @@ int TypeFeedbackInfo::ic_with_type_info_count() {
|
|
|
| void TypeFeedbackInfo::change_ic_with_type_info_count(int delta) {
|
| int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
|
| - int current_count = ICsWithTypeInfoCountField::decode(value);
|
| - value =
|
| - ICsWithTypeInfoCountField::update(value, current_count + delta);
|
| - WRITE_FIELD(this, kStorage2Offset, Smi::FromInt(value));
|
| + int new_count = ICsWithTypeInfoCountField::decode(value) + delta;
|
| + // We can get negative count here when the type-feedback info is
|
| + // shared between two code objects. The can only happen when
|
| + // the debugger made a shallow copy of code object (see Heap::CopyCode).
|
| + // Since we do not optimize when the debugger is active, we can skip
|
| + // this counter update.
|
| + if (new_count >= 0) {
|
| + new_count &= ICsWithTypeInfoCountField::kMask;
|
| + value = ICsWithTypeInfoCountField::update(value, new_count);
|
| + WRITE_FIELD(this, kStorage2Offset, Smi::FromInt(value));
|
| + }
|
| }
|
|
|
|
|
|
|