| 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());
|
|
|