Index: src/frames.cc |
diff --git a/src/frames.cc b/src/frames.cc |
index 3af72887e9fd434e1a1308a745451ef913199e75..bdc76a9bfeb7d9f972f3b1c9a61eabed8003ca1f 100644 |
--- a/src/frames.cc |
+++ b/src/frames.cc |
@@ -329,21 +329,20 @@ void SafeStackTraceFrameIterator::Advance() { |
Code* StackFrame::GetSafepointData(Address pc, |
- uint8_t** safepoint_entry, |
+ SafepointEntry* safepoint_entry, |
unsigned* stack_slots) { |
PcToCodeCache::PcToCodeCacheEntry* entry = PcToCodeCache::GetCacheEntry(pc); |
- uint8_t* cached_safepoint_entry = entry->safepoint_entry; |
- if (cached_safepoint_entry == NULL) { |
- cached_safepoint_entry = entry->code->GetSafepointEntry(pc); |
- ASSERT(cached_safepoint_entry != NULL); // No safepoint found. |
- entry->safepoint_entry = cached_safepoint_entry; |
+ SafepointEntry cached_safepoint_entry = entry->safepoint_entry; |
+ if (!entry->safepoint_entry.is_valid()) { |
+ entry->safepoint_entry = entry->code->GetSafepointEntry(pc); |
+ ASSERT(entry->safepoint_entry.is_valid()); |
} else { |
- ASSERT(cached_safepoint_entry == entry->code->GetSafepointEntry(pc)); |
+ ASSERT(entry->safepoint_entry.Equals(entry->code->GetSafepointEntry(pc))); |
} |
// Fill in the results and return the code. |
Code* code = entry->code; |
- *safepoint_entry = cached_safepoint_entry; |
+ *safepoint_entry = entry->safepoint_entry; |
*stack_slots = code->stack_slots(); |
return code; |
} |
@@ -536,7 +535,7 @@ void OptimizedFrame::Iterate(ObjectVisitor* v) const { |
// Compute the safepoint information. |
unsigned stack_slots = 0; |
- uint8_t* safepoint_entry = NULL; |
+ SafepointEntry safepoint_entry; |
Code* code = StackFrame::GetSafepointData( |
pc(), &safepoint_entry, &stack_slots); |
unsigned slot_space = stack_slots * kPointerSize; |
@@ -548,10 +547,17 @@ void OptimizedFrame::Iterate(ObjectVisitor* v) const { |
Object** parameters_limit = &Memory::Object_at( |
fp() + JavaScriptFrameConstants::kFunctionOffset - slot_space); |
+ // Visit the parameters that may be on top of the saved registers. |
+ if (safepoint_entry.argument_count() > 0) { |
+ v->VisitPointers(parameters_base, |
+ parameters_base + safepoint_entry.argument_count()); |
+ parameters_base += safepoint_entry.argument_count(); |
+ } |
+ |
// Visit the registers that contain pointers if any. |
- if (SafepointTable::HasRegisters(safepoint_entry)) { |
+ if (safepoint_entry.HasRegisters()) { |
for (int i = kNumSafepointRegisters - 1; i >=0; i--) { |
- if (SafepointTable::HasRegisterAt(safepoint_entry, i)) { |
+ if (safepoint_entry.HasRegisterAt(i)) { |
int reg_stack_index = MacroAssembler::SafepointRegisterStackIndex(i); |
v->VisitPointer(parameters_base + reg_stack_index); |
} |
@@ -561,7 +567,8 @@ void OptimizedFrame::Iterate(ObjectVisitor* v) const { |
} |
// We're done dealing with the register bits. |
- safepoint_entry += kNumSafepointRegisters >> kBitsPerByteLog2; |
+ uint8_t* safepoint_bits = safepoint_entry.bits(); |
+ safepoint_bits += kNumSafepointRegisters >> kBitsPerByteLog2; |
// Visit the rest of the parameters. |
v->VisitPointers(parameters_base, parameters_limit); |
@@ -570,7 +577,7 @@ void OptimizedFrame::Iterate(ObjectVisitor* v) const { |
for (unsigned index = 0; index < stack_slots; index++) { |
int byte_index = index >> kBitsPerByteLog2; |
int bit_index = index & (kBitsPerByte - 1); |
- if ((safepoint_entry[byte_index] & (1U << bit_index)) != 0) { |
+ if ((safepoint_bits[byte_index] & (1U << bit_index)) != 0) { |
v->VisitPointer(parameters_limit + index); |
} |
} |
@@ -778,14 +785,8 @@ DeoptimizationInputData* OptimizedFrame::GetDeoptimizationData( |
ASSERT(code != NULL); |
ASSERT(code->kind() == Code::OPTIMIZED_FUNCTION); |
- SafepointTable table(code); |
- unsigned pc_offset = static_cast<unsigned>(pc() - code->instruction_start()); |
- for (unsigned i = 0; i < table.length(); i++) { |
- if (table.GetPcOffset(i) == pc_offset) { |
- *deopt_index = table.GetDeoptimizationIndex(i); |
- break; |
- } |
- } |
+ SafepointEntry safepoint_entry = code->GetSafepointEntry(pc()); |
+ *deopt_index = safepoint_entry.deoptimization_index(); |
ASSERT(*deopt_index != AstNode::kNoNumber); |
return DeoptimizationInputData::cast(code->deoptimization_data()); |
@@ -1150,7 +1151,7 @@ PcToCodeCache::PcToCodeCacheEntry* PcToCodeCache::GetCacheEntry(Address pc) { |
// been set. Otherwise, we risk trying to use a cache entry before |
// the code has been computed. |
entry->code = GcSafeFindCodeForPc(pc); |
- entry->safepoint_entry = NULL; |
+ entry->safepoint_entry.Reset(); |
entry->pc = pc; |
} |
return entry; |