| Index: src/deoptimizer.cc
|
| diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
|
| index 4f2cd03c04edc364c06b66ffe1273dac6e71ac2b..ef4e39e8c2b1e143adeea7f8687cb0392ab5791b 100644
|
| --- a/src/deoptimizer.cc
|
| +++ b/src/deoptimizer.cc
|
| @@ -1586,15 +1586,34 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| }
|
|
|
| // Copy the register parameters to the failure frame.
|
| + int arguments_length_offset = -1;
|
| for (int i = 0; i < descriptor->register_param_count_; ++i) {
|
| output_frame_offset -= kPointerSize;
|
| DoTranslateCommand(iterator, 0, output_frame_offset);
|
| +
|
| + if (!arg_count_known && descriptor->IsParameterCountRegister(i)) {
|
| + arguments_length_offset = output_frame_offset;
|
| + }
|
| }
|
|
|
| + ASSERT(0 == output_frame_offset);
|
| +
|
| if (!arg_count_known) {
|
| - DoTranslateCommand(iterator, 0, length_frame_offset,
|
| - TRANSLATED_VALUE_IS_NATIVE);
|
| - caller_arg_count = output_frame->GetFrameSlot(length_frame_offset);
|
| + ASSERT(arguments_length_offset >= 0);
|
| + // We know it's a smi because 1) the code stub guarantees the stack
|
| + // parameter count is in smi range, and 2) the DoTranslateCommand in the
|
| + // parameter loop above translated that to a tagged value.
|
| + Smi* smi_caller_arg_count = reinterpret_cast<Smi*>(
|
| + output_frame->GetFrameSlot(arguments_length_offset));
|
| + caller_arg_count = smi_caller_arg_count->value();
|
| + output_frame->SetFrameSlot(length_frame_offset, caller_arg_count);
|
| + if (trace_scope_ != NULL) {
|
| + PrintF(trace_scope_->file(),
|
| + " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| + V8PRIxPTR " ; args.length\n",
|
| + top_address + length_frame_offset, length_frame_offset,
|
| + caller_arg_count);
|
| + }
|
| value = frame_ptr + StandardFrameConstants::kCallerSPOffset +
|
| (caller_arg_count - 1) * kPointerSize;
|
| output_frame->SetFrameSlot(args_arguments_offset, value);
|
| @@ -1602,12 +1621,11 @@ void Deoptimizer::DoComputeCompiledStubFrame(TranslationIterator* iterator,
|
| PrintF(trace_scope_->file(),
|
| " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08"
|
| V8PRIxPTR " ; args.arguments\n",
|
| - top_address + args_arguments_offset, args_arguments_offset, value);
|
| + top_address + args_arguments_offset, args_arguments_offset,
|
| + value);
|
| }
|
| }
|
|
|
| - ASSERT(0 == output_frame_offset);
|
| -
|
| // Copy the double registers from the input into the output frame.
|
| CopyDoubleRegisters(output_frame);
|
|
|
| @@ -1874,10 +1892,8 @@ void Deoptimizer::MaterializeHeapNumbersForDebuggerInspectableFrame(
|
| #endif
|
|
|
|
|
| -static const char* TraceValueType(bool is_smi, bool is_native = false) {
|
| - if (is_native) {
|
| - return "native";
|
| - } else if (is_smi) {
|
| +static const char* TraceValueType(bool is_smi) {
|
| + if (is_smi) {
|
| return "smi";
|
| }
|
|
|
| @@ -2146,13 +2162,11 @@ void Deoptimizer::DoTranslateObject(TranslationIterator* iterator,
|
|
|
|
|
| void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| - int frame_index,
|
| - unsigned output_offset,
|
| - DeoptimizerTranslatedValueType value_type) {
|
| + int frame_index,
|
| + unsigned output_offset) {
|
| disasm::NameConverter converter;
|
| // A GC-safe temporary placeholder that we can put in the output frame.
|
| const intptr_t kPlaceholder = reinterpret_cast<intptr_t>(Smi::FromInt(0));
|
| - bool is_native = value_type == TRANSLATED_VALUE_IS_NATIVE;
|
|
|
| Translation::Opcode opcode =
|
| static_cast<Translation::Opcode>(iterator->Next());
|
| @@ -2190,8 +2204,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| case Translation::INT32_REGISTER: {
|
| int input_reg = iterator->Next();
|
| intptr_t value = input_->GetRegister(input_reg);
|
| - bool is_smi = (value_type == TRANSLATED_VALUE_IS_TAGGED) &&
|
| - Smi::IsValid(value);
|
| + bool is_smi = Smi::IsValid(value);
|
| if (trace_scope_ != NULL) {
|
| PrintF(
|
| trace_scope_->file(),
|
| @@ -2200,18 +2213,15 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| output_offset,
|
| value,
|
| converter.NameOfCPURegister(input_reg),
|
| - TraceValueType(is_smi, is_native));
|
| + TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| intptr_t tagged_value =
|
| reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| - } else if (value_type == TRANSLATED_VALUE_IS_NATIVE) {
|
| - output_[frame_index]->SetFrameSlot(output_offset, value);
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - ASSERT(value_type == TRANSLATED_VALUE_IS_TAGGED);
|
| AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| static_cast<double>(static_cast<int32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| @@ -2222,8 +2232,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| case Translation::UINT32_REGISTER: {
|
| int input_reg = iterator->Next();
|
| uintptr_t value = static_cast<uintptr_t>(input_->GetRegister(input_reg));
|
| - bool is_smi = (value_type == TRANSLATED_VALUE_IS_TAGGED) &&
|
| - (value <= static_cast<uintptr_t>(Smi::kMaxValue));
|
| + bool is_smi = value <= static_cast<uintptr_t>(Smi::kMaxValue);
|
| if (trace_scope_ != NULL) {
|
| PrintF(
|
| trace_scope_->file(),
|
| @@ -2233,18 +2242,15 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| output_offset,
|
| value,
|
| converter.NameOfCPURegister(input_reg),
|
| - TraceValueType(is_smi, is_native));
|
| + TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| intptr_t tagged_value =
|
| reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| - } else if (value_type == TRANSLATED_VALUE_IS_NATIVE) {
|
| - output_[frame_index]->SetFrameSlot(output_offset, value);
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - ASSERT(value_type == TRANSLATED_VALUE_IS_TAGGED);
|
| AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| static_cast<double>(static_cast<uint32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| @@ -2295,8 +2301,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| int input_slot_index = iterator->Next();
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| intptr_t value = input_->GetFrameSlot(input_offset);
|
| - bool is_smi = (value_type == TRANSLATED_VALUE_IS_TAGGED) &&
|
| - Smi::IsValid(value);
|
| + bool is_smi = Smi::IsValid(value);
|
| if (trace_scope_ != NULL) {
|
| PrintF(trace_scope_->file(),
|
| " 0x%08" V8PRIxPTR ": ",
|
| @@ -2306,18 +2311,15 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| output_offset,
|
| value,
|
| input_offset,
|
| - TraceValueType(is_smi, is_native));
|
| + TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| intptr_t tagged_value =
|
| reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| - } else if (value_type == TRANSLATED_VALUE_IS_NATIVE) {
|
| - output_[frame_index]->SetFrameSlot(output_offset, value);
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - ASSERT(value_type == TRANSLATED_VALUE_IS_TAGGED);
|
| AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| static_cast<double>(static_cast<int32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
| @@ -2330,8 +2332,7 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| unsigned input_offset = input_->GetOffsetFromSlotIndex(input_slot_index);
|
| uintptr_t value =
|
| static_cast<uintptr_t>(input_->GetFrameSlot(input_offset));
|
| - bool is_smi = (value_type == TRANSLATED_VALUE_IS_TAGGED) &&
|
| - (value <= static_cast<uintptr_t>(Smi::kMaxValue));
|
| + bool is_smi = value <= static_cast<uintptr_t>(Smi::kMaxValue);
|
| if (trace_scope_ != NULL) {
|
| PrintF(trace_scope_->file(),
|
| " 0x%08" V8PRIxPTR ": ",
|
| @@ -2341,18 +2342,15 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
|
| output_offset,
|
| value,
|
| input_offset,
|
| - TraceValueType(is_smi, is_native));
|
| + TraceValueType(is_smi));
|
| }
|
| if (is_smi) {
|
| intptr_t tagged_value =
|
| reinterpret_cast<intptr_t>(Smi::FromInt(static_cast<int>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, tagged_value);
|
| - } else if (value_type == TRANSLATED_VALUE_IS_NATIVE) {
|
| - output_[frame_index]->SetFrameSlot(output_offset, value);
|
| } else {
|
| // We save the untagged value on the side and store a GC-safe
|
| // temporary placeholder in the frame.
|
| - ASSERT(value_type == TRANSLATED_VALUE_IS_TAGGED);
|
| AddDoubleValue(output_[frame_index]->GetTop() + output_offset,
|
| static_cast<double>(static_cast<uint32_t>(value)));
|
| output_[frame_index]->SetFrameSlot(output_offset, kPlaceholder);
|
|
|