Commit 9a46c6f9 authored by whesse@chromium.org's avatar whesse@chromium.org

Reduce handle usage in type-info.cc PopulateMap.

BUG=none
TEST=none

Review URL: http://codereview.chromium.org/6771008

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7444 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 4a3b75f7
......@@ -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.
......
......@@ -267,6 +267,8 @@ class TypeFeedbackOracle BASE_EMBEDDED {
Handle<String> name,
Code::Flags flags);
void SetInfo(int position, Object* target);
void PopulateMap(Handle<Code> code);
void CollectPositions(Code* code,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment