diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc index ed3b1f014a..5feb73d739 100644 --- a/src/deoptimizer.cc +++ b/src/deoptimizer.cc @@ -1183,11 +1183,11 @@ void TranslationBuffer::Add(int32_t value) { int32_t TranslationIterator::Next() { - ASSERT(HasNext()); // Run through the bytes until we reach one with a least significant // bit of zero (marks the end). uint32_t bits = 0; for (int i = 0; true; i += 7) { + ASSERT(HasNext()); uint8_t next = buffer_->get(index_++); bits |= (next >> 1) << i; if ((next & 1) == 0) break; diff --git a/src/deoptimizer.h b/src/deoptimizer.h index 81345ad2d1..033d92480b 100644 --- a/src/deoptimizer.h +++ b/src/deoptimizer.h @@ -497,9 +497,7 @@ class TranslationIterator BASE_EMBEDDED { int32_t Next(); - bool HasNext() const { return index_ >= 0; } - - void Done() { index_ = -1; } + bool HasNext() const { return index_ < buffer_->length(); } void Skip(int n) { for (int i = 0; i < n; i++) Next(); diff --git a/src/ia32/deoptimizer-ia32.cc b/src/ia32/deoptimizer-ia32.cc index 0e47e971cb..e23f3e9eff 100644 --- a/src/ia32/deoptimizer-ia32.cc +++ b/src/ia32/deoptimizer-ia32.cc @@ -601,8 +601,6 @@ void Deoptimizer::DoComputeFrame(TranslationIterator* iterator, output_frame->SetContinuation( reinterpret_cast(continuation->entry())); } - - if (output_count_ - 1 == frame_index) iterator->Done(); } diff --git a/src/objects.cc b/src/objects.cc index 183c632445..1345f2770d 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -7070,124 +7070,93 @@ void DeoptimizationInputData::DeoptimizationInputDataPrint(FILE* out) { PrintF(out, "%6s %6s %6s %12s\n", "index", "ast id", "argc", "commands"); for (int i = 0; i < deopt_count; i++) { - int command_count = 0; PrintF(out, "%6d %6d %6d", i, AstId(i)->value(), ArgumentsStackHeight(i)->value()); + + if (!FLAG_print_code_verbose) continue; + // Print details of the frame translation. int translation_index = TranslationIndex(i)->value(); TranslationIterator iterator(TranslationByteArray(), translation_index); Translation::Opcode opcode = static_cast(iterator.Next()); ASSERT(Translation::BEGIN == opcode); int frame_count = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, " %s {count=%d}\n", Translation::StringFor(opcode), - frame_count); - } + PrintF(out, " %s {count=%d}\n", Translation::StringFor(opcode), + frame_count); - for (int i = 0; i < frame_count; ++i) { - opcode = static_cast(iterator.Next()); - ASSERT(Translation::FRAME == opcode); - int ast_id = iterator.Next(); - int function_id = iterator.Next(); - JSFunction* function = - JSFunction::cast(LiteralArray()->get(function_id)); - unsigned height = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, "%24s %s {ast_id=%d, function=", - "", Translation::StringFor(opcode), ast_id); - function->PrintName(out); - PrintF(out, ", height=%u}\n", height); - } - - // Size of translation is height plus all incoming arguments including - // receiver. - int size = height + function->shared()->formal_parameter_count() + 1; - command_count += size; - for (int j = 0; j < size; ++j) { - opcode = static_cast(iterator.Next()); - if (FLAG_print_code_verbose) { - PrintF(out, "%24s %s ", "", Translation::StringFor(opcode)); - } - - if (opcode == Translation::DUPLICATE) { - opcode = static_cast(iterator.Next()); - if (FLAG_print_code_verbose) { - PrintF(out, "%s ", Translation::StringFor(opcode)); - } - --j; // Two commands share the same frame index. - } - - switch (opcode) { - case Translation::BEGIN: - case Translation::FRAME: - case Translation::DUPLICATE: - UNREACHABLE(); - break; - - case Translation::REGISTER: { - int reg_code = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, "{input=%s}", converter.NameOfCPURegister(reg_code)); - } - break; - } - - case Translation::INT32_REGISTER: { - int reg_code = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, "{input=%s}", converter.NameOfCPURegister(reg_code)); - } - break; - } - - case Translation::DOUBLE_REGISTER: { - int reg_code = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, "{input=%s}", - DoubleRegister::AllocationIndexToString(reg_code)); - } - break; - } - - case Translation::STACK_SLOT: { - int input_slot_index = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, "{input=%d}", input_slot_index); - } - break; - } - - case Translation::INT32_STACK_SLOT: { - int input_slot_index = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, "{input=%d}", input_slot_index); - } - break; - } - - case Translation::DOUBLE_STACK_SLOT: { - int input_slot_index = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, "{input=%d}", input_slot_index); - } - break; - } - - case Translation::LITERAL: { - unsigned literal_index = iterator.Next(); - if (FLAG_print_code_verbose) { - PrintF(out, "{literal_id=%u}", literal_index); - } - break; - } - - case Translation::ARGUMENTS_OBJECT: - break; - } - if (FLAG_print_code_verbose) PrintF(out, "\n"); + while (iterator.HasNext() && + Translation::BEGIN != + (opcode = static_cast(iterator.Next()))) { + PrintF(out, "%24s %s ", "", Translation::StringFor(opcode)); + + switch (opcode) { + case Translation::BEGIN: + UNREACHABLE(); + break; + + case Translation::FRAME: { + int ast_id = iterator.Next(); + int function_id = iterator.Next(); + JSFunction* function = + JSFunction::cast(LiteralArray()->get(function_id)); + unsigned height = iterator.Next(); + PrintF(out, "{ast_id=%d, \nfunction=", ast_id); + function->PrintName(out); + PrintF(out, ", height=%u}", height); + break; + } + + case Translation::DUPLICATE: + break; + + case Translation::REGISTER: { + int reg_code = iterator.Next(); + PrintF(out, "{input=%s}", converter.NameOfCPURegister(reg_code)); + break; + } + + case Translation::INT32_REGISTER: { + int reg_code = iterator.Next(); + PrintF(out, "{input=%s}", converter.NameOfCPURegister(reg_code)); + break; + } + + case Translation::DOUBLE_REGISTER: { + int reg_code = iterator.Next(); + PrintF(out, "{input=%s}", + DoubleRegister::AllocationIndexToString(reg_code)); + break; + } + + case Translation::STACK_SLOT: { + int input_slot_index = iterator.Next(); + PrintF(out, "{input=%d}", input_slot_index); + break; + } + + case Translation::INT32_STACK_SLOT: { + int input_slot_index = iterator.Next(); + PrintF(out, "{input=%d}", input_slot_index); + break; + } + + case Translation::DOUBLE_STACK_SLOT: { + int input_slot_index = iterator.Next(); + PrintF(out, "{input=%d}", input_slot_index); + break; + } + + case Translation::LITERAL: { + unsigned literal_index = iterator.Next(); + PrintF(out, "{literal_id=%u}", literal_index); + break; + } + + case Translation::ARGUMENTS_OBJECT: + break; } + PrintF(out, "\n"); } - if (!FLAG_print_code_verbose) PrintF(out, " %12d\n", command_count); } }