Factor out HSimulate::ReplayEnvironment.
R=titzer@chromium.org Review URL: https://codereview.chromium.org/23005027 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16340 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c7e262dc63
commit
fcdf3bdb77
@ -2435,8 +2435,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
|
||||
HEnvironment* env = current_block_->last_environment();
|
||||
instr->ReplayEnvironment(env);
|
||||
instr->ReplayEnvironment(current_block_->last_environment());
|
||||
|
||||
// There are no real uses of a captured object.
|
||||
return NULL;
|
||||
@ -2484,20 +2483,7 @@ LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
|
||||
HEnvironment* env = current_block_->last_environment();
|
||||
ASSERT(env != NULL);
|
||||
|
||||
env->set_ast_id(instr->ast_id());
|
||||
|
||||
env->Drop(instr->pop_count());
|
||||
for (int i = instr->values()->length() - 1; i >= 0; --i) {
|
||||
HValue* value = instr->values()->at(i);
|
||||
if (instr->HasAssignedIndexAt(i)) {
|
||||
env->Bind(instr->GetAssignedIndexAt(i), value);
|
||||
} else {
|
||||
env->Push(value);
|
||||
}
|
||||
}
|
||||
instr->ReplayEnvironment(current_block_->last_environment());
|
||||
|
||||
// If there is an instruction pending deoptimization environment create a
|
||||
// lazy bailout instruction to capture the environment.
|
||||
|
@ -2289,6 +2289,21 @@ void HSimulate::PrintDataTo(StringStream* stream) {
|
||||
}
|
||||
|
||||
|
||||
void HSimulate::ReplayEnvironment(HEnvironment* env) {
|
||||
ASSERT(env != NULL);
|
||||
env->set_ast_id(ast_id());
|
||||
env->Drop(pop_count());
|
||||
for (int i = values()->length() - 1; i >= 0; --i) {
|
||||
HValue* value = values()->at(i);
|
||||
if (HasAssignedIndexAt(i)) {
|
||||
env->Bind(GetAssignedIndexAt(i), value);
|
||||
} else {
|
||||
env->Push(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Replay captured objects by replacing all captured objects with the
|
||||
// same capture id in the current and all outer environments.
|
||||
void HCapturedObject::ReplayEnvironment(HEnvironment* env) {
|
||||
|
@ -1676,6 +1676,9 @@ class HSimulate V8_FINAL : public HInstruction {
|
||||
void MergeWith(ZoneList<HSimulate*>* list);
|
||||
bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; }
|
||||
|
||||
// Replay effects of this instruction on the given environment.
|
||||
void ReplayEnvironment(HEnvironment* env);
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(Simulate)
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -2564,8 +2564,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
|
||||
HEnvironment* env = current_block_->last_environment();
|
||||
instr->ReplayEnvironment(env);
|
||||
instr->ReplayEnvironment(current_block_->last_environment());
|
||||
|
||||
// There are no real uses of a captured object.
|
||||
return NULL;
|
||||
@ -2615,20 +2614,7 @@ LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
|
||||
HEnvironment* env = current_block_->last_environment();
|
||||
ASSERT(env != NULL);
|
||||
|
||||
env->set_ast_id(instr->ast_id());
|
||||
|
||||
env->Drop(instr->pop_count());
|
||||
for (int i = instr->values()->length() - 1; i >= 0; --i) {
|
||||
HValue* value = instr->values()->at(i);
|
||||
if (instr->HasAssignedIndexAt(i)) {
|
||||
env->Bind(instr->GetAssignedIndexAt(i), value);
|
||||
} else {
|
||||
env->Push(value);
|
||||
}
|
||||
}
|
||||
instr->ReplayEnvironment(current_block_->last_environment());
|
||||
|
||||
// If there is an instruction pending deoptimization environment create a
|
||||
// lazy bailout instruction to capture the environment.
|
||||
|
@ -2361,8 +2361,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
|
||||
HEnvironment* env = current_block_->last_environment();
|
||||
instr->ReplayEnvironment(env);
|
||||
instr->ReplayEnvironment(current_block_->last_environment());
|
||||
|
||||
// There are no real uses of a captured object.
|
||||
return NULL;
|
||||
@ -2410,20 +2409,7 @@ LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
|
||||
HEnvironment* env = current_block_->last_environment();
|
||||
ASSERT(env != NULL);
|
||||
|
||||
env->set_ast_id(instr->ast_id());
|
||||
|
||||
env->Drop(instr->pop_count());
|
||||
for (int i = instr->values()->length() - 1; i >= 0; --i) {
|
||||
HValue* value = instr->values()->at(i);
|
||||
if (instr->HasAssignedIndexAt(i)) {
|
||||
env->Bind(instr->GetAssignedIndexAt(i), value);
|
||||
} else {
|
||||
env->Push(value);
|
||||
}
|
||||
}
|
||||
instr->ReplayEnvironment(current_block_->last_environment());
|
||||
|
||||
// If there is an instruction pending deoptimization environment create a
|
||||
// lazy bailout instruction to capture the environment.
|
||||
|
@ -2374,8 +2374,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) {
|
||||
HEnvironment* env = current_block_->last_environment();
|
||||
instr->ReplayEnvironment(env);
|
||||
instr->ReplayEnvironment(current_block_->last_environment());
|
||||
|
||||
// There are no real uses of a captured object.
|
||||
return NULL;
|
||||
@ -2423,20 +2422,7 @@ LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
|
||||
HEnvironment* env = current_block_->last_environment();
|
||||
ASSERT(env != NULL);
|
||||
|
||||
env->set_ast_id(instr->ast_id());
|
||||
|
||||
env->Drop(instr->pop_count());
|
||||
for (int i = instr->values()->length() - 1; i >= 0; --i) {
|
||||
HValue* value = instr->values()->at(i);
|
||||
if (instr->HasAssignedIndexAt(i)) {
|
||||
env->Bind(instr->GetAssignedIndexAt(i), value);
|
||||
} else {
|
||||
env->Push(value);
|
||||
}
|
||||
}
|
||||
instr->ReplayEnvironment(current_block_->last_environment());
|
||||
|
||||
// If there is an instruction pending deoptimization environment create a
|
||||
// lazy bailout instruction to capture the environment.
|
||||
|
Loading…
Reference in New Issue
Block a user