| Index: src/type-info.cc
|
| diff --git a/src/type-info.cc b/src/type-info.cc
|
| index 78f693c2b01b3884649a573ef05f5c495211c597..d73c618de9a3e2da12d4ad1fcf28dc6cceb6d293 100644
|
| --- a/src/type-info.cc
|
| +++ b/src/type-info.cc
|
| @@ -355,6 +355,15 @@ ZoneMapList* TypeFeedbackOracle::CollectReceiverTypes(int position,
|
| }
|
|
|
|
|
| +void TypeFeedbackOracle::SetInfo(int position, Object* target) {
|
| + MaybeObject* maybe_result = dictionary_->AtNumberPut(position, target);
|
| + Object* result;
|
| + // Dictionary has been allocated with sufficient size for all elements.
|
| + ASSERT(maybe_result->ToObject(&result));
|
| + ASSERT(*dictionary_ == result);
|
| +}
|
| +
|
| +
|
| void TypeFeedbackOracle::PopulateMap(Handle<Code> code) {
|
| Isolate* isolate = Isolate::Current();
|
| HandleScope scope(isolate);
|
| @@ -371,14 +380,14 @@ void TypeFeedbackOracle::PopulateMap(Handle<Code> code) {
|
| int length = code_positions.length();
|
| ASSERT(source_positions.length() == length);
|
| for (int i = 0; i < length; i++) {
|
| - HandleScope loop_scope(isolate);
|
| + AssertNoAllocation no_allocation();
|
| RelocInfo info(code->instruction_start() + code_positions[i],
|
| RelocInfo::CODE_TARGET, 0);
|
| - Handle<Code> target(Code::GetCodeFromTargetAddress(info.target_address()));
|
| + Code* target = Code::GetCodeFromTargetAddress(info.target_address());
|
| int position = source_positions[i];
|
| InlineCacheState state = target->ic_state();
|
| Code::Kind kind = target->kind();
|
| - Handle<Object> value;
|
| +
|
| if (kind == Code::BINARY_OP_IC ||
|
| kind == Code::TYPE_RECORDING_BINARY_OP_IC ||
|
| kind == Code::COMPARE_IC) {
|
| @@ -387,35 +396,28 @@ void TypeFeedbackOracle::PopulateMap(Handle<Code> code) {
|
| // recorded for all binary ICs.
|
| int entry = dictionary_->FindEntry(position);
|
| if (entry == NumberDictionary::kNotFound) {
|
| - value = target;
|
| + SetInfo(position, target);
|
| }
|
| } else if (state == MONOMORPHIC) {
|
| if (kind == Code::KEYED_EXTERNAL_ARRAY_LOAD_IC ||
|
| kind == Code::KEYED_EXTERNAL_ARRAY_STORE_IC) {
|
| - value = target;
|
| + SetInfo(position, target);
|
| } else if (target->kind() != Code::CALL_IC ||
|
| target->check_type() == RECEIVER_MAP_CHECK) {
|
| Map* map = target->FindFirstMap();
|
| if (map == NULL) {
|
| - value = target;
|
| + SetInfo(position, target);
|
| } else {
|
| - value = Handle<Map>(map);
|
| + SetInfo(position, map);
|
| }
|
| } else {
|
| ASSERT(target->kind() == Code::CALL_IC);
|
| CheckType check = target->check_type();
|
| ASSERT(check != RECEIVER_MAP_CHECK);
|
| - value = Handle<Object>(Smi::FromInt(check));
|
| + SetInfo(position, Smi::FromInt(check));
|
| }
|
| } else if (state == MEGAMORPHIC) {
|
| - value = target;
|
| - }
|
| -
|
| - if (!value.is_null()) {
|
| - Handle<NumberDictionary> new_dict =
|
| - isolate->factory()->DictionaryAtNumberPut(
|
| - dictionary_, position, value);
|
| - dictionary_ = loop_scope.CloseAndEscape(new_dict);
|
| + SetInfo(position, target);
|
| }
|
| }
|
| // Allocate handle in the parent scope.
|
|
|