Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index 061ec9b6d3542b93c029da74ba1d105becb0d769..0d22bc914168eb9fd10d69db7d34023626b8d5a7 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -763,37 +763,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)) { |
+ 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()); |