OLD | NEW |
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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/disasm.h" | 10 #include "src/disasm.h" |
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
919 BailoutId node_id = BailoutId(iterator->Next()); | 919 BailoutId node_id = BailoutId(iterator->Next()); |
920 JSFunction* function; | 920 JSFunction* function; |
921 if (frame_index != 0) { | 921 if (frame_index != 0) { |
922 function = JSFunction::cast(ComputeLiteral(iterator->Next())); | 922 function = JSFunction::cast(ComputeLiteral(iterator->Next())); |
923 } else { | 923 } else { |
924 int closure_id = iterator->Next(); | 924 int closure_id = iterator->Next(); |
925 USE(closure_id); | 925 USE(closure_id); |
926 CHECK_EQ(Translation::kSelfLiteralId, closure_id); | 926 CHECK_EQ(Translation::kSelfLiteralId, closure_id); |
927 function = function_; | 927 function = function_; |
928 } | 928 } |
929 unsigned height = iterator->Next(); | 929 unsigned height = iterator->Next() - 1; // Do not count the context. |
930 unsigned height_in_bytes = height * kPointerSize; | 930 unsigned height_in_bytes = height * kPointerSize; |
931 if (trace_scope_ != NULL) { | 931 if (trace_scope_ != NULL) { |
932 PrintF(trace_scope_->file(), " translating "); | 932 PrintF(trace_scope_->file(), " translating "); |
933 function->PrintName(trace_scope_->file()); | 933 function->PrintName(trace_scope_->file()); |
934 PrintF(trace_scope_->file(), | 934 PrintF(trace_scope_->file(), |
935 " => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes); | 935 " => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes); |
936 } | 936 } |
937 | 937 |
938 // The 'fixed' part of the frame consists of the incoming parameters and | 938 // The 'fixed' part of the frame consists of the incoming parameters and |
939 // the part described by JavaScriptFrameConstants. | 939 // the part described by JavaScriptFrameConstants. |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1054 top_address + output_offset, output_offset, value); | 1054 top_address + output_offset, output_offset, value); |
1055 } | 1055 } |
1056 } | 1056 } |
1057 | 1057 |
1058 // For the bottommost output frame the context can be gotten from the input | 1058 // For the bottommost output frame the context can be gotten from the input |
1059 // frame. For all subsequent output frames it can be gotten from the function | 1059 // frame. For all subsequent output frames it can be gotten from the function |
1060 // so long as we don't inline functions that need local contexts. | 1060 // so long as we don't inline functions that need local contexts. |
1061 Register context_reg = JavaScriptFrame::context_register(); | 1061 Register context_reg = JavaScriptFrame::context_register(); |
1062 output_offset -= kPointerSize; | 1062 output_offset -= kPointerSize; |
1063 input_offset -= kPointerSize; | 1063 input_offset -= kPointerSize; |
1064 if (is_bottommost) { | 1064 // Read the context from the translations. |
1065 value = input_->GetFrameSlot(input_offset); | 1065 DoTranslateCommand(iterator, frame_index, output_offset); |
1066 } else { | 1066 value = output_frame->GetFrameSlot(output_offset); |
1067 value = reinterpret_cast<intptr_t>(function->context()); | 1067 // The context should not be a placeholder for a materialized object. |
1068 } | 1068 CHECK(value != |
1069 output_frame->SetFrameSlot(output_offset, value); | 1069 reinterpret_cast<intptr_t>(isolate_->heap()->arguments_marker())); |
1070 output_frame->SetContext(value); | 1070 output_frame->SetContext(value); |
1071 if (is_topmost) output_frame->SetRegister(context_reg.code(), value); | 1071 if (is_topmost) output_frame->SetRegister(context_reg.code(), value); |
1072 if (trace_scope_ != NULL) { | 1072 if (trace_scope_ != NULL) { |
1073 PrintF(trace_scope_->file(), | 1073 PrintF(trace_scope_->file(), |
1074 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" | 1074 " 0x%08" V8PRIxPTR ": [top + %d] <- 0x%08" |
1075 V8PRIxPTR "; context\n", | 1075 V8PRIxPTR "; context\n", |
1076 top_address + output_offset, output_offset, value); | 1076 top_address + output_offset, output_offset, value); |
1077 } | 1077 } |
1078 | 1078 |
1079 // The function was mentioned explicitly in the BEGIN_FRAME. | 1079 // The function was mentioned explicitly in the BEGIN_FRAME. |
(...skipping 2543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3623 return new_array; | 3623 return new_array; |
3624 } | 3624 } |
3625 | 3625 |
3626 | 3626 |
3627 DeoptimizedFrameInfo::DeoptimizedFrameInfo(Deoptimizer* deoptimizer, | 3627 DeoptimizedFrameInfo::DeoptimizedFrameInfo(Deoptimizer* deoptimizer, |
3628 int frame_index, | 3628 int frame_index, |
3629 bool has_arguments_adaptor, | 3629 bool has_arguments_adaptor, |
3630 bool has_construct_stub) { | 3630 bool has_construct_stub) { |
3631 FrameDescription* output_frame = deoptimizer->output_[frame_index]; | 3631 FrameDescription* output_frame = deoptimizer->output_[frame_index]; |
3632 function_ = output_frame->GetFunction(); | 3632 function_ = output_frame->GetFunction(); |
| 3633 context_ = reinterpret_cast<Object*>(output_frame->GetContext()); |
3633 has_construct_stub_ = has_construct_stub; | 3634 has_construct_stub_ = has_construct_stub; |
3634 expression_count_ = output_frame->GetExpressionCount(); | 3635 expression_count_ = output_frame->GetExpressionCount(); |
3635 expression_stack_ = new Object*[expression_count_]; | 3636 expression_stack_ = new Object*[expression_count_]; |
3636 // Get the source position using the unoptimized code. | 3637 // Get the source position using the unoptimized code. |
3637 Address pc = reinterpret_cast<Address>(output_frame->GetPc()); | 3638 Address pc = reinterpret_cast<Address>(output_frame->GetPc()); |
3638 Code* code = Code::cast(deoptimizer->isolate()->FindCodeObject(pc)); | 3639 Code* code = Code::cast(deoptimizer->isolate()->FindCodeObject(pc)); |
3639 source_position_ = code->SourcePosition(pc); | 3640 source_position_ = code->SourcePosition(pc); |
3640 | 3641 |
3641 for (int i = 0; i < expression_count_; i++) { | 3642 for (int i = 0; i < expression_count_; i++) { |
3642 SetExpression(i, output_frame->GetExpression(i)); | 3643 SetExpression(i, output_frame->GetExpression(i)); |
(...skipping 13 matching lines...) Expand all Loading... |
3656 | 3657 |
3657 | 3658 |
3658 DeoptimizedFrameInfo::~DeoptimizedFrameInfo() { | 3659 DeoptimizedFrameInfo::~DeoptimizedFrameInfo() { |
3659 delete[] expression_stack_; | 3660 delete[] expression_stack_; |
3660 delete[] parameters_; | 3661 delete[] parameters_; |
3661 } | 3662 } |
3662 | 3663 |
3663 | 3664 |
3664 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { | 3665 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { |
3665 v->VisitPointer(BitCast<Object**>(&function_)); | 3666 v->VisitPointer(BitCast<Object**>(&function_)); |
| 3667 v->VisitPointer(&context_); |
3666 v->VisitPointers(parameters_, parameters_ + parameters_count_); | 3668 v->VisitPointers(parameters_, parameters_ + parameters_count_); |
3667 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); | 3669 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); |
3668 } | 3670 } |
3669 | 3671 |
3670 } } // namespace v8::internal | 3672 } } // namespace v8::internal |
OLD | NEW |