Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
| index ef3761e51e7a8a5d53c59b26966f43f29273e2e6..73f86147f66960c4fbe82e1b74f62095096d2fb2 100644 |
| --- a/src/ia32/lithium-codegen-ia32.cc |
| +++ b/src/ia32/lithium-codegen-ia32.cc |
| @@ -758,37 +758,57 @@ void LCodeGen::WriteTranslation(LEnvironment* environment, |
| UNREACHABLE(); |
| } |
| + int object_index = 0; |
| + int dematerialized_index = 0; |
| for (int i = 0; i < translation_size; ++i) { |
| LOperand* value = environment->values()->at(i); |
| - |
| - // TODO(mstarzinger): Introduce marker operands to indicate that this value |
| - // is not present and must be reconstructed from the deoptimizer. Currently |
| - // this is only used for the arguments object. |
| - if (value == NULL) { |
| - int arguments_count = environment->values()->length() - translation_size; |
| - translation->BeginArgumentsObject(arguments_count); |
| - for (int i = 0; i < arguments_count; ++i) { |
| - LOperand* value = environment->values()->at(translation_size + i); |
| - AddToTranslation(translation, |
| - value, |
| - environment->HasTaggedValueAt(translation_size + i), |
| - environment->HasUint32ValueAt(translation_size + i)); |
| - } |
| - continue; |
| - } |
| - |
| - AddToTranslation(translation, |
| + AddToTranslation(environment, |
| + translation, |
| value, |
| environment->HasTaggedValueAt(i), |
| - environment->HasUint32ValueAt(i)); |
| + environment->HasUint32ValueAt(i), |
| + &object_index, |
| + &dematerialized_index); |
| } |
| } |
| -void LCodeGen::AddToTranslation(Translation* translation, |
| +void LCodeGen::AddToTranslation(LEnvironment* environment, |
| + Translation* translation, |
| LOperand* op, |
| bool is_tagged, |
| - bool is_uint32) { |
| + bool is_uint32, |
| + int* object_index_pointer, |
| + int* dematerialized_index_pointer) { |
| + if (op == LEnvironment::materialization_marker()) { |
| + int object_index = (*object_index_pointer)++; |
| + if (environment->ObjectIsDuplicateAt(object_index)) { |
|
titzer
2013/08/01 17:11:50
ObjectDuplicate means...object reference?
Michael Starzinger
2013/08/05 15:13:00
Correct. It means that a previously translated obj
|
| + int dupe_of = environment->ObjectDuplicateOfAt(object_index); |
| + translation->DuplicateObject(dupe_of); |
| + return; |
| + } |
| + int object_length = environment->ObjectLengthAt(object_index); |
| + if (environment->ObjectIsArgumentsAt(object_index)) { |
| + translation->BeginArgumentsObject(object_length); |
| + } else { |
| + translation->BeginCapturedObject(object_length); |
| + } |
| + int dematerialized_index = *dematerialized_index_pointer; |
| + int env_offset = environment->translation_size() + dematerialized_index; |
| + *dematerialized_index_pointer += object_length; |
| + for (int i = 0; i < object_length; ++i) { |
| + LOperand* value = environment->values()->at(env_offset + i); |
| + AddToTranslation(environment, |
| + translation, |
| + value, |
| + environment->HasTaggedValueAt(env_offset + i), |
| + environment->HasUint32ValueAt(env_offset + i), |
| + object_index_pointer, |
| + dematerialized_index_pointer); |
| + } |
| + return; |
| + } |
| + |
| if (op->IsStackSlot()) { |
| if (is_tagged) { |
| translation->StoreStackSlot(op->index()); |