| Index: src/deoptimizer.cc
|
| ===================================================================
|
| --- src/deoptimizer.cc (revision 7542)
|
| +++ src/deoptimizer.cc (working copy)
|
| @@ -196,8 +196,7 @@
|
| fp_to_sp_delta_(fp_to_sp_delta),
|
| output_count_(0),
|
| output_(NULL),
|
| - integer32_values_(NULL),
|
| - double_values_(NULL) {
|
| + deferred_heap_numbers_(0) {
|
| if (FLAG_trace_deopt && type != OSR) {
|
| PrintF("**** DEOPT: ");
|
| function->PrintName();
|
| @@ -236,8 +235,6 @@
|
|
|
| Deoptimizer::~Deoptimizer() {
|
| ASSERT(input_ == NULL && output_ == NULL);
|
| - delete[] integer32_values_;
|
| - delete[] double_values_;
|
| }
|
|
|
|
|
| @@ -382,13 +379,8 @@
|
| int count = iterator.Next();
|
| ASSERT(output_ == NULL);
|
| output_ = new FrameDescription*[count];
|
| - // Per-frame lists of untagged and unboxed int32 and double values.
|
| - integer32_values_ = new List<ValueDescriptionInteger32>[count];
|
| - double_values_ = new List<ValueDescriptionDouble>[count];
|
| for (int i = 0; i < count; ++i) {
|
| output_[i] = NULL;
|
| - integer32_values_[i].Initialize(0);
|
| - double_values_[i].Initialize(0);
|
| }
|
| output_count_ = count;
|
|
|
| @@ -416,40 +408,22 @@
|
| }
|
|
|
|
|
| -void Deoptimizer::InsertHeapNumberValues(int index, JavaScriptFrame* frame) {
|
| - // We need to adjust the stack index by one for the top-most frame.
|
| - int extra_slot_count = (index == output_count() - 1) ? 1 : 0;
|
| - List<ValueDescriptionInteger32>* ints = &integer32_values_[index];
|
| - for (int i = 0; i < ints->length(); i++) {
|
| - ValueDescriptionInteger32 value = ints->at(i);
|
| - double val = static_cast<double>(value.int32_value());
|
| - InsertHeapNumberValue(frame, value.stack_index(), val, extra_slot_count);
|
| - }
|
| +void Deoptimizer::MaterializeHeapNumbers() {
|
| + for (int i = 0; i < deferred_heap_numbers_.length(); i++) {
|
| + HeapNumberMaterializationDescriptor d = deferred_heap_numbers_[i];
|
| + Handle<Object> num = Factory::NewNumber(d.value());
|
| + if (FLAG_trace_deopt) {
|
| + PrintF("Materializing a new heap number %p [%e] in slot %p\n",
|
| + reinterpret_cast<void*>(*num),
|
| + d.value(),
|
| + d.slot_address());
|
| + }
|
|
|
| - // Iterate over double values and convert them to a heap number.
|
| - List<ValueDescriptionDouble>* doubles = &double_values_[index];
|
| - for (int i = 0; i < doubles->length(); ++i) {
|
| - ValueDescriptionDouble value = doubles->at(i);
|
| - InsertHeapNumberValue(frame, value.stack_index(), value.double_value(),
|
| - extra_slot_count);
|
| + Memory::Object_at(d.slot_address()) = *num;
|
| }
|
| }
|
|
|
|
|
| -void Deoptimizer::InsertHeapNumberValue(JavaScriptFrame* frame,
|
| - int stack_index,
|
| - double val,
|
| - int extra_slot_count) {
|
| - // Add one to the TOS index to take the 'state' pushed before jumping
|
| - // to the stub that calls Runtime::NotifyDeoptimized into account.
|
| - int tos_index = stack_index + extra_slot_count;
|
| - int index = (frame->ComputeExpressionsCount() - 1) - tos_index;
|
| - if (FLAG_trace_deopt) PrintF("Allocating a new heap number: %e\n", val);
|
| - Handle<Object> num = Factory::NewNumber(val);
|
| - frame->SetExpression(index, *num);
|
| -}
|
| -
|
| -
|
| void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| int frame_index,
|
| unsigned output_offset) {
|
| @@ -492,7 +466,6 @@
|
| int input_reg = iterator->Next();
|
| intptr_t value = input_->GetRegister(input_reg);
|
| bool is_smi = Smi::IsValid(value);
|
| - unsigned output_index = output_offset / kPointerSize;
|
| if (FLAG_trace_deopt) {
|
| PrintF(
|
| " 0x%08" V8PRIxPTR ": [top + %d] <- %" V8PRIdPTR " ; %s (%s)\n",
|
| @@ -509,9 +482,8 @@
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - AddInteger32Value(frame_index,
|
| - output_index,
|
| - static_cast<int32_t>(value));
|
| + AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| + static_cast<double>(static_cast<int32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| }
|
| return;
|
| @@ -520,7 +492,6 @@
|
| case Translation::DOUBLE_REGISTER: {
|
| int input_reg = iterator->Next();
|
| double value = input_->GetDoubleRegister(input_reg);
|
| - unsigned output_index = output_offset / kPointerSize;
|
| if (FLAG_trace_deopt) {
|
| PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; %s\n",
|
| output_[frame_index]->GetTop() + output_offset,
|
| @@ -530,7 +501,7 @@
|
| }
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - AddDoubleValue(frame_index, output_index, value);
|
| + AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value);
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| return;
|
| }
|
| @@ -558,7 +529,6 @@
|
| input_->GetOffsetFromSlotIndex(this, input_slot_index);
|
| intptr_t value = input_->GetFrameSlot(input_offset);
|
| bool is_smi = Smi::IsValid(value);
|
| - unsigned output_index = output_offset / kPointerSize;
|
| if (FLAG_trace_deopt) {
|
| PrintF(" 0x%08" V8PRIxPTR ": ",
|
| output_[frame_index]->GetTop() + output_offset);
|
| @@ -575,9 +545,8 @@
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - AddInteger32Value(frame_index,
|
| - output_index,
|
| - static_cast<int32_t>(value));
|
| + AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| + static_cast<double>(static_cast<int32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| }
|
| return;
|
| @@ -588,7 +557,6 @@
|
| unsigned input_offset =
|
| input_->GetOffsetFromSlotIndex(this, input_slot_index);
|
| double value = input_->GetDoubleFrameSlot(input_offset);
|
| - unsigned output_index = output_offset / kPointerSize;
|
| if (FLAG_trace_deopt) {
|
| PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- %e ; [esp + %d]\n",
|
| output_[frame_index]->GetTop() + output_offset,
|
| @@ -598,7 +566,7 @@
|
| }
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - AddDoubleValue(frame_index, output_index, value);
|
| + AddDoubleValue(output_[frame_index]->GetTop() + output_offset, value);
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| return;
|
| }
|
| @@ -901,19 +869,11 @@
|
| }
|
|
|
|
|
| -void Deoptimizer::AddInteger32Value(int frame_index,
|
| - int slot_index,
|
| - int32_t value) {
|
| - ValueDescriptionInteger32 value_desc(slot_index, value);
|
| - integer32_values_[frame_index].Add(value_desc);
|
| -}
|
| -
|
| -
|
| -void Deoptimizer::AddDoubleValue(int frame_index,
|
| - int slot_index,
|
| +void Deoptimizer::AddDoubleValue(intptr_t slot_address,
|
| double value) {
|
| - ValueDescriptionDouble value_desc(slot_index, value);
|
| - double_values_[frame_index].Add(value_desc);
|
| + HeapNumberMaterializationDescriptor value_desc(
|
| + reinterpret_cast<Address>(slot_address), value);
|
| + deferred_heap_numbers_.Add(value_desc);
|
| }
|
|
|
|
|
|
|