Fix a deoptimization bug.

We reset the count of outgoing arguments, used for the index in the
frame's outgoing arguments, for each level of inlining.  This could
result in the arguments overlapping, rather than stacking on top of
each other.

R=whesse@chromium.org,fschneider@chromium.org
BUG=
TEST=

Review URL: http://codereview.chromium.org/7932022

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9331 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 403a0222
...@@ -712,7 +712,9 @@ LInstruction* LChunkBuilder::DefineFixedDouble( ...@@ -712,7 +712,9 @@ LInstruction* LChunkBuilder::DefineFixedDouble(
LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
HEnvironment* hydrogen_env = current_block_->last_environment(); HEnvironment* hydrogen_env = current_block_->last_environment();
instr->set_environment(CreateEnvironment(hydrogen_env)); int argument_index_accumulator = 0;
instr->set_environment(CreateEnvironment(hydrogen_env,
&argument_index_accumulator));
return instr; return instr;
} }
...@@ -995,10 +997,13 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) { ...@@ -995,10 +997,13 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
} }
LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { LEnvironment* LChunkBuilder::CreateEnvironment(
HEnvironment* hydrogen_env,
int* argument_index_accumulator) {
if (hydrogen_env == NULL) return NULL; if (hydrogen_env == NULL) return NULL;
LEnvironment* outer = CreateEnvironment(hydrogen_env->outer()); LEnvironment* outer =
CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
int ast_id = hydrogen_env->ast_id(); int ast_id = hydrogen_env->ast_id();
ASSERT(ast_id != AstNode::kNoNumber); ASSERT(ast_id != AstNode::kNoNumber);
int value_count = hydrogen_env->length(); int value_count = hydrogen_env->length();
...@@ -1008,7 +1013,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1008,7 +1013,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
argument_count_, argument_count_,
value_count, value_count,
outer); outer);
int argument_index = 0;
for (int i = 0; i < value_count; ++i) { for (int i = 0; i < value_count; ++i) {
if (hydrogen_env->is_special_index(i)) continue; if (hydrogen_env->is_special_index(i)) continue;
...@@ -1017,7 +1021,7 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1017,7 +1021,7 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
if (value->IsArgumentsObject()) { if (value->IsArgumentsObject()) {
op = NULL; op = NULL;
} else if (value->IsPushArgument()) { } else if (value->IsPushArgument()) {
op = new LArgument(argument_index++); op = new LArgument((*argument_index_accumulator)++);
} else { } else {
op = UseAny(value); op = UseAny(value);
} }
......
...@@ -2160,7 +2160,8 @@ class LChunkBuilder BASE_EMBEDDED { ...@@ -2160,7 +2160,8 @@ class LChunkBuilder BASE_EMBEDDED {
LInstruction* instr, int ast_id); LInstruction* instr, int ast_id);
void ClearInstructionPendingDeoptimizationEnvironment(); void ClearInstructionPendingDeoptimizationEnvironment();
LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env); LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
int* argument_index_accumulator);
void VisitInstruction(HInstruction* current); void VisitInstruction(HInstruction* current);
......
...@@ -619,11 +619,13 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, ...@@ -619,11 +619,13 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
intptr_t input_value = input_->GetRegister(input_reg); intptr_t input_value = input_->GetRegister(input_reg);
if (FLAG_trace_deopt) { if (FLAG_trace_deopt) {
PrintF( PrintF(
" 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s\n", " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" V8PRIxPTR " ; %s ",
output_[frame_index]->GetTop() + output_offset, output_[frame_index]->GetTop() + output_offset,
output_offset, output_offset,
input_value, input_value,
converter.NameOfCPURegister(input_reg)); converter.NameOfCPURegister(input_reg));
reinterpret_cast<Object*>(input_value)->ShortPrint();
PrintF("\n");
} }
output_[frame_index]->SetFrameSlot(output_offset, input_value); output_[frame_index]->SetFrameSlot(output_offset, input_value);
return; return;
...@@ -681,10 +683,12 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator, ...@@ -681,10 +683,12 @@ void Deoptimizer::DoTranslateCommand(TranslationIterator* iterator,
if (FLAG_trace_deopt) { if (FLAG_trace_deopt) {
PrintF(" 0x%08" V8PRIxPTR ": ", PrintF(" 0x%08" V8PRIxPTR ": ",
output_[frame_index]->GetTop() + output_offset); output_[frame_index]->GetTop() + output_offset);
PrintF("[top + %d] <- 0x%08" V8PRIxPTR " ; [esp + %d]\n", PrintF("[top + %d] <- 0x%08" V8PRIxPTR " ; [esp + %d] ",
output_offset, output_offset,
input_value, input_value,
input_offset); input_offset);
reinterpret_cast<Object*>(input_value)->ShortPrint();
PrintF("\n");
} }
output_[frame_index]->SetFrameSlot(output_offset, input_value); output_[frame_index]->SetFrameSlot(output_offset, input_value);
return; return;
......
...@@ -708,7 +708,9 @@ LInstruction* LChunkBuilder::DefineFixedDouble( ...@@ -708,7 +708,9 @@ LInstruction* LChunkBuilder::DefineFixedDouble(
LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
HEnvironment* hydrogen_env = current_block_->last_environment(); HEnvironment* hydrogen_env = current_block_->last_environment();
instr->set_environment(CreateEnvironment(hydrogen_env)); int argument_index_accumulator = 0;
instr->set_environment(CreateEnvironment(hydrogen_env,
&argument_index_accumulator));
return instr; return instr;
} }
...@@ -995,10 +997,13 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) { ...@@ -995,10 +997,13 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
} }
LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { LEnvironment* LChunkBuilder::CreateEnvironment(
HEnvironment* hydrogen_env,
int* argument_index_accumulator) {
if (hydrogen_env == NULL) return NULL; if (hydrogen_env == NULL) return NULL;
LEnvironment* outer = CreateEnvironment(hydrogen_env->outer()); LEnvironment* outer =
CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
int ast_id = hydrogen_env->ast_id(); int ast_id = hydrogen_env->ast_id();
ASSERT(ast_id != AstNode::kNoNumber); ASSERT(ast_id != AstNode::kNoNumber);
int value_count = hydrogen_env->length(); int value_count = hydrogen_env->length();
...@@ -1008,7 +1013,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1008,7 +1013,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
argument_count_, argument_count_,
value_count, value_count,
outer); outer);
int argument_index = 0;
for (int i = 0; i < value_count; ++i) { for (int i = 0; i < value_count; ++i) {
if (hydrogen_env->is_special_index(i)) continue; if (hydrogen_env->is_special_index(i)) continue;
...@@ -1017,7 +1021,7 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1017,7 +1021,7 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
if (value->IsArgumentsObject()) { if (value->IsArgumentsObject()) {
op = NULL; op = NULL;
} else if (value->IsPushArgument()) { } else if (value->IsPushArgument()) {
op = new LArgument(argument_index++); op = new LArgument((*argument_index_accumulator)++);
} else { } else {
op = UseAny(value); op = UseAny(value);
} }
......
...@@ -2262,7 +2262,8 @@ class LChunkBuilder BASE_EMBEDDED { ...@@ -2262,7 +2262,8 @@ class LChunkBuilder BASE_EMBEDDED {
LInstruction* instr, int ast_id); LInstruction* instr, int ast_id);
void ClearInstructionPendingDeoptimizationEnvironment(); void ClearInstructionPendingDeoptimizationEnvironment();
LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env); LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
int* argument_index_accumulator);
void VisitInstruction(HInstruction* current); void VisitInstruction(HInstruction* current);
......
...@@ -1036,7 +1036,6 @@ void JSObject::JSObjectShortPrint(StringStream* accumulator) { ...@@ -1036,7 +1036,6 @@ void JSObject::JSObjectShortPrint(StringStream* accumulator) {
global_object ? "Global Object: " : "", global_object ? "Global Object: " : "",
vowel ? "n" : ""); vowel ? "n" : "");
accumulator->Put(str); accumulator->Put(str);
accumulator->Put('>');
printed = true; printed = true;
} }
} }
......
...@@ -707,7 +707,9 @@ LInstruction* LChunkBuilder::DefineFixedDouble( ...@@ -707,7 +707,9 @@ LInstruction* LChunkBuilder::DefineFixedDouble(
LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) {
HEnvironment* hydrogen_env = current_block_->last_environment(); HEnvironment* hydrogen_env = current_block_->last_environment();
instr->set_environment(CreateEnvironment(hydrogen_env)); int argument_index_accumulator = 0;
instr->set_environment(CreateEnvironment(hydrogen_env,
&argument_index_accumulator));
return instr; return instr;
} }
...@@ -990,10 +992,13 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) { ...@@ -990,10 +992,13 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
} }
LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { LEnvironment* LChunkBuilder::CreateEnvironment(
HEnvironment* hydrogen_env,
int* argument_index_accumulator) {
if (hydrogen_env == NULL) return NULL; if (hydrogen_env == NULL) return NULL;
LEnvironment* outer = CreateEnvironment(hydrogen_env->outer()); LEnvironment* outer =
CreateEnvironment(hydrogen_env->outer(), argument_index_accumulator);
int ast_id = hydrogen_env->ast_id(); int ast_id = hydrogen_env->ast_id();
ASSERT(ast_id != AstNode::kNoNumber); ASSERT(ast_id != AstNode::kNoNumber);
int value_count = hydrogen_env->length(); int value_count = hydrogen_env->length();
...@@ -1003,7 +1008,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1003,7 +1008,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
argument_count_, argument_count_,
value_count, value_count,
outer); outer);
int argument_index = 0;
for (int i = 0; i < value_count; ++i) { for (int i = 0; i < value_count; ++i) {
if (hydrogen_env->is_special_index(i)) continue; if (hydrogen_env->is_special_index(i)) continue;
...@@ -1012,7 +1016,7 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1012,7 +1016,7 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
if (value->IsArgumentsObject()) { if (value->IsArgumentsObject()) {
op = NULL; op = NULL;
} else if (value->IsPushArgument()) { } else if (value->IsPushArgument()) {
op = new LArgument(argument_index++); op = new LArgument((*argument_index_accumulator)++);
} else { } else {
op = UseAny(value); op = UseAny(value);
} }
......
...@@ -2148,7 +2148,8 @@ class LChunkBuilder BASE_EMBEDDED { ...@@ -2148,7 +2148,8 @@ class LChunkBuilder BASE_EMBEDDED {
LInstruction* instr, int ast_id); LInstruction* instr, int ast_id);
void ClearInstructionPendingDeoptimizationEnvironment(); void ClearInstructionPendingDeoptimizationEnvironment();
LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env); LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
int* argument_index_accumulator);
void VisitInstruction(HInstruction* current); void VisitInstruction(HInstruction* current);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment