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, ...@@ -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) { void TypeFeedbackOracle::PopulateMap(Handle<Code> code) {
Isolate* isolate = Isolate::Current(); Isolate* isolate = Isolate::Current();
HandleScope scope(isolate); HandleScope scope(isolate);
...@@ -371,14 +380,14 @@ void TypeFeedbackOracle::PopulateMap(Handle<Code> code) { ...@@ -371,14 +380,14 @@ void TypeFeedbackOracle::PopulateMap(Handle<Code> code) {
int length = code_positions.length(); int length = code_positions.length();
ASSERT(source_positions.length() == length); ASSERT(source_positions.length() == length);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
HandleScope loop_scope(isolate); AssertNoAllocation no_allocation();
RelocInfo info(code->instruction_start() + code_positions[i], RelocInfo info(code->instruction_start() + code_positions[i],
RelocInfo::CODE_TARGET, 0); RelocInfo::CODE_TARGET, 0);
Handle<Code> target(Code::GetCodeFromTargetAddress(info.target_address())); Code* target = Code::GetCodeFromTargetAddress(info.target_address());
int position = source_positions[i]; int position = source_positions[i];
InlineCacheState state = target->ic_state(); InlineCacheState state = target->ic_state();
Code::Kind kind = target->kind(); Code::Kind kind = target->kind();
Handle<Object> value;
if (kind == Code::BINARY_OP_IC || if (kind == Code::BINARY_OP_IC ||
kind == Code::TYPE_RECORDING_BINARY_OP_IC || kind == Code::TYPE_RECORDING_BINARY_OP_IC ||
kind == Code::COMPARE_IC) { kind == Code::COMPARE_IC) {
...@@ -387,35 +396,28 @@ void TypeFeedbackOracle::PopulateMap(Handle<Code> code) { ...@@ -387,35 +396,28 @@ void TypeFeedbackOracle::PopulateMap(Handle<Code> code) {
// recorded for all binary ICs. // recorded for all binary ICs.
int entry = dictionary_->FindEntry(position); int entry = dictionary_->FindEntry(position);
if (entry == NumberDictionary::kNotFound) { if (entry == NumberDictionary::kNotFound) {
value = target; SetInfo(position, target);
} }
} else if (state == MONOMORPHIC) { } else if (state == MONOMORPHIC) {
if (kind == Code::KEYED_EXTERNAL_ARRAY_LOAD_IC || if (kind == Code::KEYED_EXTERNAL_ARRAY_LOAD_IC ||
kind == Code::KEYED_EXTERNAL_ARRAY_STORE_IC) { kind == Code::KEYED_EXTERNAL_ARRAY_STORE_IC) {
value = target; SetInfo(position, target);
} else if (target->kind() != Code::CALL_IC || } else if (target->kind() != Code::CALL_IC ||
target->check_type() == RECEIVER_MAP_CHECK) { target->check_type() == RECEIVER_MAP_CHECK) {
Map* map = target->FindFirstMap(); Map* map = target->FindFirstMap();
if (map == NULL) { if (map == NULL) {
value = target; SetInfo(position, target);
} else { } else {
value = Handle<Map>(map); SetInfo(position, map);
} }
} else { } else {
ASSERT(target->kind() == Code::CALL_IC); ASSERT(target->kind() == Code::CALL_IC);
CheckType check = target->check_type(); CheckType check = target->check_type();
ASSERT(check != RECEIVER_MAP_CHECK); ASSERT(check != RECEIVER_MAP_CHECK);
value = Handle<Object>(Smi::FromInt(check)); SetInfo(position, Smi::FromInt(check));
} }
} else if (state == MEGAMORPHIC) { } else if (state == MEGAMORPHIC) {
value = target; SetInfo(position, target);
}
if (!value.is_null()) {
Handle<NumberDictionary> new_dict =
isolate->factory()->DictionaryAtNumberPut(
dictionary_, position, value);
dictionary_ = loop_scope.CloseAndEscape(new_dict);
} }
} }
// Allocate handle in the parent scope. // Allocate handle in the parent scope.
......
...@@ -267,6 +267,8 @@ class TypeFeedbackOracle BASE_EMBEDDED { ...@@ -267,6 +267,8 @@ class TypeFeedbackOracle BASE_EMBEDDED {
Handle<String> name, Handle<String> name,
Code::Flags flags); Code::Flags flags);
void SetInfo(int position, Object* target);
void PopulateMap(Handle<Code> code); void PopulateMap(Handle<Code> code);
void CollectPositions(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