Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1053)

Side by Side Diff: src/deoptimizer.cc

Issue 1572293002: [turbofan] Make context deoptmizable (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/runtime/runtime-compiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/deoptimizer.h" 5 #include "src/deoptimizer.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/ast/prettyprinter.h" 8 #include "src/ast/prettyprinter.h"
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/disasm.h" 10 #include "src/disasm.h"
(...skipping 929 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 } 940 }
941 941
942 // For the bottommost output frame the context can be gotten from the input 942 // For the bottommost output frame the context can be gotten from the input
943 // frame. For all subsequent output frames it can be gotten from the function 943 // frame. For all subsequent output frames it can be gotten from the function
944 // so long as we don't inline functions that need local contexts. 944 // so long as we don't inline functions that need local contexts.
945 Register context_reg = JavaScriptFrame::context_register(); 945 Register context_reg = JavaScriptFrame::context_register();
946 output_offset -= kPointerSize; 946 output_offset -= kPointerSize;
947 input_offset -= kPointerSize; 947 input_offset -= kPointerSize;
948 // Read the context from the translations. 948 // Read the context from the translations.
949 Object* context = value_iterator->GetRawValue(); 949 Object* context = value_iterator->GetRawValue();
950 // The context should not be a placeholder for a materialized object.
951 CHECK(context != isolate_->heap()->arguments_marker());
952 if (context == isolate_->heap()->undefined_value()) { 950 if (context == isolate_->heap()->undefined_value()) {
953 // If the context was optimized away, just use the context from 951 // If the context was optimized away, just use the context from
954 // the activation. This should only apply to Crankshaft code. 952 // the activation. This should only apply to Crankshaft code.
955 CHECK(!compiled_code_->is_turbofanned()); 953 CHECK(!compiled_code_->is_turbofanned());
956 context = 954 context =
957 is_bottommost 955 is_bottommost
958 ? reinterpret_cast<Object*>(input_->GetFrameSlot(input_offset)) 956 ? reinterpret_cast<Object*>(input_->GetFrameSlot(input_offset))
959 : function->context(); 957 : function->context();
960 } 958 }
961 value = reinterpret_cast<intptr_t>(context); 959 value = reinterpret_cast<intptr_t>(context);
962 output_frame->SetContext(value); 960 output_frame->SetContext(value);
963 if (is_topmost) output_frame->SetRegister(context_reg.code(), value); 961 if (is_topmost) output_frame->SetRegister(context_reg.code(), value);
964 WriteValueToOutput(context, input_index, frame_index, output_offset, 962 WriteValueToOutput(context, input_index, frame_index, output_offset,
965 "context "); 963 "context ");
964 if (context == isolate_->heap()->arguments_marker()) {
965 Address output_address =
966 reinterpret_cast<Address>(output_[frame_index]->GetTop()) +
967 output_offset;
968 values_to_materialize_.push_back({output_address, value_iterator});
969 }
966 value_iterator++; 970 value_iterator++;
967 input_index++; 971 input_index++;
968 972
969 // The function was mentioned explicitly in the BEGIN_FRAME. 973 // The function was mentioned explicitly in the BEGIN_FRAME.
970 output_offset -= kPointerSize; 974 output_offset -= kPointerSize;
971 input_offset -= kPointerSize; 975 input_offset -= kPointerSize;
972 value = reinterpret_cast<intptr_t>(function); 976 value = reinterpret_cast<intptr_t>(function);
973 // The function for the bottommost output frame should also agree with the 977 // The function for the bottommost output frame should also agree with the
974 // input frame. 978 // input frame.
975 DCHECK(!is_bottommost || input_->GetFrameSlot(input_offset) == value); 979 DCHECK(!is_bottommost || input_->GetFrameSlot(input_offset) == value);
(...skipping 2509 matching lines...) Expand 10 before | Expand all | Expand 10 after
3485 object->set_elements(FixedArrayBase::cast(*elements)); 3489 object->set_elements(FixedArrayBase::cast(*elements));
3486 object->set_length(*length); 3490 object->set_length(*length);
3487 return object; 3491 return object;
3488 } 3492 }
3489 case FIXED_ARRAY_TYPE: { 3493 case FIXED_ARRAY_TYPE: {
3490 Handle<Object> lengthObject = MaterializeAt(frame_index, value_index); 3494 Handle<Object> lengthObject = MaterializeAt(frame_index, value_index);
3491 int32_t length = 0; 3495 int32_t length = 0;
3492 CHECK(lengthObject->ToInt32(&length)); 3496 CHECK(lengthObject->ToInt32(&length));
3493 Handle<FixedArray> object = 3497 Handle<FixedArray> object =
3494 isolate_->factory()->NewFixedArray(length); 3498 isolate_->factory()->NewFixedArray(length);
3499 // We need to set the map, because the fixed array we are
3500 // materializing could be a context or an arguments object,
3501 // in which case we must retain that information.
3502 object->set_map(*map);
3495 slot->value_ = object; 3503 slot->value_ = object;
3496 for (int i = 0; i < length; ++i) { 3504 for (int i = 0; i < length; ++i) {
3497 Handle<Object> value = MaterializeAt(frame_index, value_index); 3505 Handle<Object> value = MaterializeAt(frame_index, value_index);
3498 object->set(i, *value); 3506 object->set(i, *value);
3499 } 3507 }
3500 return object; 3508 return object;
3501 } 3509 }
3502 case FIXED_DOUBLE_ARRAY_TYPE: { 3510 case FIXED_DOUBLE_ARRAY_TYPE: {
3511 DCHECK_EQ(*map, isolate_->heap()->fixed_double_array_map());
3503 Handle<Object> lengthObject = MaterializeAt(frame_index, value_index); 3512 Handle<Object> lengthObject = MaterializeAt(frame_index, value_index);
3504 int32_t length = 0; 3513 int32_t length = 0;
3505 CHECK(lengthObject->ToInt32(&length)); 3514 CHECK(lengthObject->ToInt32(&length));
3506 Handle<FixedArrayBase> object = 3515 Handle<FixedArrayBase> object =
3507 isolate_->factory()->NewFixedDoubleArray(length); 3516 isolate_->factory()->NewFixedDoubleArray(length);
3508 slot->value_ = object; 3517 slot->value_ = object;
3509 if (length > 0) { 3518 if (length > 0) {
3510 Handle<FixedDoubleArray> double_array = 3519 Handle<FixedDoubleArray> double_array =
3511 Handle<FixedDoubleArray>::cast(object); 3520 Handle<FixedDoubleArray>::cast(object);
3512 for (int i = 0; i < length; ++i) { 3521 for (int i = 0; i < length; ++i) {
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
3700 DCHECK(value_info->IsMaterializedObject()); 3709 DCHECK(value_info->IsMaterializedObject());
3701 3710
3702 value_info->value_ = 3711 value_info->value_ =
3703 Handle<Object>(previously_materialized_objects->get(i), isolate_); 3712 Handle<Object>(previously_materialized_objects->get(i), isolate_);
3704 } 3713 }
3705 } 3714 }
3706 } 3715 }
3707 3716
3708 } // namespace internal 3717 } // namespace internal
3709 } // namespace v8 3718 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/runtime/runtime-compiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698