Clean up TranslationIterator and DeoptimizationInputDataPrint.
Without this refactoring, they break when we add alignment padding in the Translation info. BUG= TEST= Review URL: http://codereview.chromium.org/7569009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8851 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
caf493afb3
commit
92e7656c4d
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -601,8 +601,6 @@ void Deoptimizer::DoComputeFrame(TranslationIterator* iterator,
|
||||
output_frame->SetContinuation(
|
||||
reinterpret_cast<uint32_t>(continuation->entry()));
|
||||
}
|
||||
|
||||
if (output_count_ - 1 == frame_index) iterator->Done();
|
||||
}
|
||||
|
||||
|
||||
|
183
src/objects.cc
183
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<Translation::Opcode>(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<Translation::Opcode>(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<Translation::Opcode>(iterator.Next());
|
||||
if (FLAG_print_code_verbose) {
|
||||
PrintF(out, "%24s %s ", "", Translation::StringFor(opcode));
|
||||
}
|
||||
|
||||
if (opcode == Translation::DUPLICATE) {
|
||||
opcode = static_cast<Translation::Opcode>(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<Translation::Opcode>(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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user