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

Unified Diff: src/deoptimizer.cc

Issue 2729163002: [turbofan] compute arguments length in deoptimizer (Closed)
Patch Set: fix comment Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/deoptimizer.h ('k') | src/objects.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/deoptimizer.cc
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
index 89a06c2d353f95ddeacd527ce297d18e7a120884..4247e5535b0779c38f6a057c24c4e37564d358a1 100644
--- a/src/deoptimizer.cc
+++ b/src/deoptimizer.cc
@@ -2407,6 +2407,11 @@ void Translation::ArgumentsElements(bool is_rest) {
buffer_->Add(is_rest);
}
+void Translation::ArgumentsLength(bool is_rest) {
+ buffer_->Add(ARGUMENTS_LENGTH);
+ buffer_->Add(is_rest);
+}
+
void Translation::BeginCapturedObject(int length) {
buffer_->Add(CAPTURED_OBJECT);
buffer_->Add(length);
@@ -2540,6 +2545,7 @@ int Translation::NumberOfOperandsFor(Opcode opcode) {
case CONSTRUCT_STUB_FRAME:
return 3;
case ARGUMENTS_ELEMENTS:
+ case ARGUMENTS_LENGTH:
return 1;
}
FATAL("Unexpected translation type");
@@ -3309,6 +3315,7 @@ TranslatedFrame TranslatedState::CreateNextTranslatedFrame(
case Translation::DUPLICATED_OBJECT:
case Translation::ARGUMENTS_OBJECT:
case Translation::ARGUMENTS_ELEMENTS:
+ case Translation::ARGUMENTS_LENGTH:
case Translation::CAPTURED_OBJECT:
case Translation::REGISTER:
case Translation::INT32_REGISTER:
@@ -3344,38 +3351,48 @@ void TranslatedFrame::AdvanceIterator(
}
}
-// Creates translated values for an arguments backing store, or the backing
-// store for the rest parameters if {is_rest} is true. The TranslatedValue
-// objects for the fields are not read from the TranslationIterator, but instead
-// created on-the-fly based on dynamic information in the optimized frame.
-void TranslatedState::CreateArgumentsElementsTranslatedValues(
- int frame_index, Address input_frame_pointer, bool is_rest) {
- TranslatedFrame& frame = frames_[frame_index];
-
+Address TranslatedState::ComputeArgumentsPosition(Address input_frame_pointer,
+ bool is_rest, int* length) {
Address parent_frame_pointer = *reinterpret_cast<Address*>(
input_frame_pointer + StandardFrameConstants::kCallerFPOffset);
intptr_t parent_frame_type = Memory::intptr_at(
parent_frame_pointer + CommonFrameConstants::kContextOrFrameTypeOffset);
- int length;
+
Address arguments_frame;
if (parent_frame_type ==
StackFrame::TypeToMarker(StackFrame::ARGUMENTS_ADAPTOR)) {
- length = Smi::cast(*reinterpret_cast<Object**>(
- parent_frame_pointer +
- ArgumentsAdaptorFrameConstants::kLengthOffset))
- ->value();
+ if (length)
+ *length = Smi::cast(*reinterpret_cast<Object**>(
+ parent_frame_pointer +
+ ArgumentsAdaptorFrameConstants::kLengthOffset))
+ ->value();
arguments_frame = parent_frame_pointer;
} else {
- length = formal_parameter_count_;
+ if (length) *length = formal_parameter_count_;
arguments_frame = input_frame_pointer;
}
if (is_rest) {
// If the actual number of arguments is less than the number of formal
// parameters, we have zero rest parameters.
- length = std::max(0, length - formal_parameter_count_);
+ if (length) *length = std::max(0, *length - formal_parameter_count_);
}
+ return arguments_frame;
+}
+
+// Creates translated values for an arguments backing store, or the backing
+// store for the rest parameters if {is_rest} is true. The TranslatedValue
+// objects for the fields are not read from the TranslationIterator, but instead
+// created on-the-fly based on dynamic information in the optimized frame.
+void TranslatedState::CreateArgumentsElementsTranslatedValues(
+ int frame_index, Address input_frame_pointer, bool is_rest) {
+ TranslatedFrame& frame = frames_[frame_index];
+
+ int length;
+ Address arguments_frame =
+ ComputeArgumentsPosition(input_frame_pointer, is_rest, &length);
+
int object_index = static_cast<int>(object_positions_.size());
int value_index = static_cast<int>(frame.values_.size());
object_positions_.push_back({frame_index, value_index});
@@ -3459,6 +3476,14 @@ int TranslatedState::CreateNextTranslatedValue(
return 0;
}
+ case Translation::ARGUMENTS_LENGTH: {
+ bool is_rest = iterator->Next();
+ int length;
+ ComputeArgumentsPosition(fp, is_rest, &length);
+ frame.Add(TranslatedValue::NewInt32(this, length));
+ return 0;
+ }
+
case Translation::CAPTURED_OBJECT: {
int field_count = iterator->Next();
int object_index = static_cast<int>(object_positions_.size());
« no previous file with comments | « src/deoptimizer.h ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698