| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 0f72e2944ad293b544dd735d20ee37e223b10ee6..48643e3d045f548d05b3a2814a0be07faad7b6a0 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -492,37 +492,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());
|
|
|