Chromium Code Reviews| Index: runtime/vm/object.cc |
| =================================================================== |
| --- runtime/vm/object.cc (revision 9829) |
| +++ runtime/vm/object.cc (working copy) |
| @@ -7205,19 +7205,27 @@ |
| } |
| +void ICData::WriteSentinel() const { |
| + const Array& data = Array::Handle(ic_data()); |
|
siva
2012/07/24 00:14:06
const Smi& sentinel_value = Smi::Handle(Smi::New(k
srdjan
2012/07/24 00:25:31
Done.
|
| + for (intptr_t i = 1; i <= TestEntryLength(); i++) { |
| + data.SetAt(data.Length() - i, Smi::Handle(Smi::New(kIllegalObjectKind))); |
|
siva
2012/07/24 00:14:06
data.SetAt(data.Length() - i, sentinel_value);
srdjan
2012/07/24 00:25:31
Done.
|
| + } |
| +} |
| + |
| + |
| void ICData::AddCheck(const GrowableArray<intptr_t>& class_ids, |
| const Function& target) const { |
| ASSERT(num_args_tested() > 1); // Otherwise use 'AddReceiverCheck'. |
| ASSERT(class_ids.length() == num_args_tested()); |
| - intptr_t old_num = NumberOfChecks(); |
| + const intptr_t old_num = NumberOfChecks(); |
| Array& data = Array::Handle(ic_data()); |
| - intptr_t new_len = data.Length() + TestEntryLength(); |
| + const intptr_t new_len = data.Length() + TestEntryLength(); |
| data = Array::Grow(data, new_len, Heap::kOld); |
| set_ic_data(data); |
| + WriteSentinel(); |
| intptr_t data_pos = old_num * TestEntryLength(); |
| for (intptr_t i = 0; i < class_ids.length(); i++) { |
| - // Null is used as terminating value, do not add it. |
| - ASSERT(class_ids[i] != kNullClass); |
| + // kIllegalObjectKind is used as terminating value, do not add it. |
| ASSERT(class_ids[i] != kIllegalObjectKind); |
| data.SetAt(data_pos++, Smi::Handle(Smi::New(class_ids[i]))); |
| } |
| @@ -7229,16 +7237,15 @@ |
| void ICData::AddReceiverCheck(intptr_t receiver_class_id, |
| const Function& target) const { |
| ASSERT(num_args_tested() == 1); // Otherwise use 'AddCheck'. |
| - // Not supporting collection of null receivers. |
| - ASSERT(receiver_class_id != kNullClass); |
| ASSERT(receiver_class_id != kIllegalObjectKind); |
| ASSERT(!target.IsNull()); |
| - intptr_t old_num = NumberOfChecks(); |
| + const intptr_t old_num = NumberOfChecks(); |
| Array& data = Array::Handle(ic_data()); |
| - intptr_t new_len = data.Length() + TestEntryLength(); |
| + const intptr_t new_len = data.Length() + TestEntryLength(); |
| data = Array::Grow(data, new_len, Heap::kOld); |
| set_ic_data(data); |
| + WriteSentinel(); |
| intptr_t data_pos = old_num * TestEntryLength(); |
| if ((receiver_class_id == kSmi) && (data_pos > 0)) { |
| // Instert kSmi in position 0. |
| @@ -7370,6 +7377,7 @@ |
| // IC data array must be null terminated (sentinel entry). |
| const Array& ic_data = Array::Handle(Array::New(len, Heap::kOld)); |
| result.set_ic_data(ic_data); |
| + result.WriteSentinel(); |
| return result.raw(); |
| } |