Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 0b704d07ef5749cf056d2584e84815f7e3b03a59..d22bcb59100ddf6abd751288c422dbca189ff285 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -605,37 +605,57 @@ void LCodeGen::WriteTranslation(LEnvironment* environment, |
break; |
} |
+ 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)) { |
+ 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()); |