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

Side by Side Diff: src/deoptimizer.cc

Issue 2313343002: [deoptimizer] Support virtual context in interpreted frame. (Closed)
Patch Set: Created 4 years, 3 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 | no next file » | 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 <memory> 7 #include <memory>
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/ast/prettyprinter.h" 10 #include "src/ast/prettyprinter.h"
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 output_frame->SetCallerConstantPool(output_offset, value); 935 output_frame->SetCallerConstantPool(output_offset, value);
936 DebugPrintOutputSlot(value, frame_index, output_offset, 936 DebugPrintOutputSlot(value, frame_index, output_offset,
937 "caller's constant_pool\n"); 937 "caller's constant_pool\n");
938 } 938 }
939 939
940 // For the bottommost output frame the context can be gotten from the input 940 // For the bottommost output frame the context can be gotten from the input
941 // frame. For all subsequent output frames it can be gotten from the function 941 // frame. For all subsequent output frames it can be gotten from the function
942 // so long as we don't inline functions that need local contexts. 942 // so long as we don't inline functions that need local contexts.
943 output_offset -= kPointerSize; 943 output_offset -= kPointerSize;
944 944
945 TranslatedFrame::iterator context_pos = value_iterator;
946 int context_input_index = input_index;
947 // When deoptimizing into a catch block, we need to take the context 945 // When deoptimizing into a catch block, we need to take the context
948 // from just above the top of the operand stack (we push the context 946 // from just above the top of the operand stack (we push the context
949 // at the entry of the try block). 947 // at the entry of the try block).
948 TranslatedFrame::iterator context_pos = value_iterator;
949 int context_input_index = input_index;
950 if (goto_catch_handler) { 950 if (goto_catch_handler) {
951 for (unsigned i = 0; i < height + 1; ++i) { 951 for (unsigned i = 0; i < height + 1; ++i) {
952 context_pos++; 952 context_pos++;
953 context_input_index++; 953 context_input_index++;
954 } 954 }
955 } 955 }
956 // Read the context from the translations. 956 // Read the context from the translations.
957 Object* context = context_pos->GetRawValue(); 957 Object* context = context_pos->GetRawValue();
958 if (context->IsUndefined(isolate_)) { 958 if (context->IsUndefined(isolate_)) {
959 // If the context was optimized away, just use the context from 959 // If the context was optimized away, just use the context from
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1166 value = output_[frame_index - 1]->GetConstantPool(); 1166 value = output_[frame_index - 1]->GetConstantPool();
1167 } 1167 }
1168 output_frame->SetCallerConstantPool(output_offset, value); 1168 output_frame->SetCallerConstantPool(output_offset, value);
1169 DebugPrintOutputSlot(value, frame_index, output_offset, 1169 DebugPrintOutputSlot(value, frame_index, output_offset,
1170 "caller's constant_pool\n"); 1170 "caller's constant_pool\n");
1171 } 1171 }
1172 1172
1173 // For the bottommost output frame the context can be gotten from the input 1173 // For the bottommost output frame the context can be gotten from the input
1174 // frame. For all subsequent output frames it can be gotten from the function 1174 // frame. For all subsequent output frames it can be gotten from the function
1175 // so long as we don't inline functions that need local contexts. 1175 // so long as we don't inline functions that need local contexts.
1176 Register context_reg = InterpretedFrame::context_register();
1177 output_offset -= kPointerSize; 1176 output_offset -= kPointerSize;
1178 1177
1179 // When deoptimizing into a catch block, we need to take the context 1178 // When deoptimizing into a catch block, we need to take the context
1180 // from a register that was specified in the handler table. 1179 // from a register that was specified in the handler table.
1181 TranslatedFrame::iterator context_pos = value_iterator; 1180 TranslatedFrame::iterator context_pos = value_iterator;
1182 int context_input_index = input_index; 1181 int context_input_index = input_index;
1183 if (goto_catch_handler) { 1182 if (goto_catch_handler) {
1184 // Skip to the translated value of the register specified 1183 // Skip to the translated value of the register specified
1185 // in the handler table. 1184 // in the handler table.
1186 for (int i = 0; i < catch_handler_data_ + 1; ++i) { 1185 for (int i = 0; i < catch_handler_data_ + 1; ++i) {
1187 context_pos++; 1186 context_pos++;
1188 context_input_index++; 1187 context_input_index++;
1189 } 1188 }
1190 } 1189 }
1191 // Read the context from the translations. 1190 // Read the context from the translations.
1192 Object* context = context_pos->GetRawValue(); 1191 Object* context = context_pos->GetRawValue();
1193 // The context should not be a placeholder for a materialized object.
1194 CHECK(context != isolate_->heap()->arguments_marker());
1195 value = reinterpret_cast<intptr_t>(context); 1192 value = reinterpret_cast<intptr_t>(context);
1196 output_frame->SetContext(value); 1193 output_frame->SetContext(value);
1197 if (is_topmost) output_frame->SetRegister(context_reg.code(), value); 1194 if (is_topmost) {
1195 Register context_reg = InterpretedFrame::context_register();
1196 output_frame->SetRegister(context_reg.code(), value);
1197 }
1198 WriteValueToOutput(context, context_input_index, frame_index, output_offset, 1198 WriteValueToOutput(context, context_input_index, frame_index, output_offset,
1199 "context "); 1199 "context ");
1200 if (context == isolate_->heap()->arguments_marker()) {
1201 Address output_address =
1202 reinterpret_cast<Address>(output_[frame_index]->GetTop()) +
1203 output_offset;
1204 values_to_materialize_.push_back({output_address, context_pos});
1205 }
1200 value_iterator++; 1206 value_iterator++;
1201 input_index++; 1207 input_index++;
1202 1208
1203 // The function was mentioned explicitly in the BEGIN_FRAME. 1209 // The function was mentioned explicitly in the BEGIN_FRAME.
1204 output_offset -= kPointerSize; 1210 output_offset -= kPointerSize;
1205 value = reinterpret_cast<intptr_t>(function); 1211 value = reinterpret_cast<intptr_t>(function);
1206 WriteValueToOutput(function, 0, frame_index, output_offset, "function "); 1212 WriteValueToOutput(function, 0, frame_index, output_offset, "function ");
1207 1213
1208 // The new.target slot is only used during function activiation which is 1214 // The new.target slot is only used during function activiation which is
1209 // before the first deopt point, so should never be needed. Just set it to 1215 // before the first deopt point, so should never be needed. Just set it to
(...skipping 2788 matching lines...) Expand 10 before | Expand all | Expand 10 after
3998 CHECK(value_info->IsMaterializedObject()); 4004 CHECK(value_info->IsMaterializedObject());
3999 4005
4000 value_info->value_ = 4006 value_info->value_ =
4001 Handle<Object>(previously_materialized_objects->get(i), isolate_); 4007 Handle<Object>(previously_materialized_objects->get(i), isolate_);
4002 } 4008 }
4003 } 4009 }
4004 } 4010 }
4005 4011
4006 } // namespace internal 4012 } // namespace internal
4007 } // namespace v8 4013 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698