Index: src/hydrogen-instructions.cc |
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc |
index d301036be1fa16e16922cd1aef4eaf7b25ff2df1..ec220d7c8dc79c3feb83356ece3459704f3af1bb 100644 |
--- a/src/hydrogen-instructions.cc |
+++ b/src/hydrogen-instructions.cc |
@@ -2325,23 +2325,38 @@ void HSimulate::ReplayEnvironment(HEnvironment* env) { |
} |
+static void ReplayEnvironmentNested(const ZoneList<HValue*>* values, |
+ HCapturedObject* other) { |
+ for (int i = 0; i < values->length(); ++i) { |
+ HValue* value = values->at(i); |
+ if (value->IsCapturedObject()) { |
+ if (HCapturedObject::cast(value)->capture_id() == other->capture_id()) { |
+ values->at(i) = other; |
+ } else { |
+ ReplayEnvironmentNested(HCapturedObject::cast(value)->values(), other); |
+ } |
+ } |
+ } |
+} |
+ |
+ |
// 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) { |
ASSERT(env != NULL); |
while (env != NULL) { |
- for (int i = 0; i < env->length(); ++i) { |
- HValue* value = env->values()->at(i); |
- if (value->IsCapturedObject() && |
- HCapturedObject::cast(value)->capture_id() == this->capture_id()) { |
- env->SetValueAt(i, this); |
- } |
- } |
+ ReplayEnvironmentNested(env->values(), this); |
env = env->outer(); |
} |
} |
+void HCapturedObject::PrintDataTo(StringStream* stream) { |
+ stream->Add("#%d ", capture_id()); |
+ HDematerializedObject::PrintDataTo(stream); |
+} |
+ |
+ |
void HEnterInlined::RegisterReturnTarget(HBasicBlock* return_target, |
Zone* zone) { |
ASSERT(return_target->IsInlineReturnTarget()); |