[NFC] Simplify StackTrace class by storing a pair inside a vector instead of two pairs
PiperOrigin-RevId: 346931686 Change-Id: I8f171113c65fc0604d14d775ba357e9450a75c15
This commit is contained in:
parent
5a85d44038
commit
43a080a530
@ -46,9 +46,10 @@ std::vector<StackFrame> StackTrace::ToStackFrames(
|
||||
result.reserve(code_objs_.size());
|
||||
|
||||
for (int i = code_objs_.size() - 1; i >= 0; --i) {
|
||||
const char* file_name = GetPythonString(code_objs_[i]->co_filename);
|
||||
const std::pair<PyCodeObject*, int>& code_obj = code_objs_[i];
|
||||
const char* file_name = GetPythonString(code_obj.first->co_filename);
|
||||
const int line_number =
|
||||
PyCode_Addr2Line(code_objs_[i], last_instructions_[i]);
|
||||
PyCode_Addr2Line(code_objs_[i].first, code_obj.second);
|
||||
|
||||
if (!result.empty() && filtered.count(file_name)) {
|
||||
continue; // Never filter the innermost frame.
|
||||
@ -60,7 +61,7 @@ std::vector<StackFrame> StackTrace::ToStackFrames(
|
||||
result.push_back(it->second);
|
||||
} else {
|
||||
result.emplace_back(StackFrame{file_name, line_number,
|
||||
GetPythonString(code_objs_[i]->co_name)});
|
||||
GetPythonString(code_obj.first->co_name)});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,8 +74,7 @@ class StackTrace final {
|
||||
DCHECK(code_obj != nullptr);
|
||||
|
||||
Py_INCREF(code_obj);
|
||||
result.code_objs_.push_back(code_obj);
|
||||
result.last_instructions_.push_back(frame->f_lasti);
|
||||
result.code_objs_.push_back(std::make_pair(code_obj, frame->f_lasti));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -84,18 +83,13 @@ class StackTrace final {
|
||||
ABSL_ATTRIBUTE_HOT
|
||||
~StackTrace() { Clear(); }
|
||||
|
||||
StackTrace(StackTrace&& other) {
|
||||
code_objs_ = std::move(other.code_objs_);
|
||||
last_instructions_ = std::move(other.last_instructions_);
|
||||
other.code_objs_ = {};
|
||||
}
|
||||
StackTrace(StackTrace&& other) { std::swap(code_objs_, other.code_objs_); }
|
||||
|
||||
// Python GIL must be acquired beforehand.
|
||||
ABSL_ATTRIBUTE_HOT
|
||||
StackTrace& operator=(StackTrace&& other) {
|
||||
Clear();
|
||||
std::swap(code_objs_, other.code_objs_);
|
||||
std::swap(last_instructions_, other.last_instructions_);
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -111,14 +105,13 @@ class StackTrace final {
|
||||
ABSL_ATTRIBUTE_HOT
|
||||
void Clear() {
|
||||
if (!code_objs_.empty()) DCheckPyGilStateForStackTrace();
|
||||
for (PyCodeObject* obj : code_objs_) Py_DECREF(obj);
|
||||
for (const auto& p : code_objs_) Py_DECREF(p.first);
|
||||
code_objs_.clear();
|
||||
last_instructions_.clear();
|
||||
}
|
||||
|
||||
private:
|
||||
absl::InlinedVector<PyCodeObject*, kStackTraceInitialSize> code_objs_;
|
||||
absl::InlinedVector<int, kStackTraceInitialSize> last_instructions_;
|
||||
absl::InlinedVector<std::pair<PyCodeObject*, int>, kStackTraceInitialSize>
|
||||
code_objs_;
|
||||
|
||||
StackTrace(const StackTrace&) = delete;
|
||||
StackTrace& operator=(const StackTrace&) = delete;
|
||||
|
Loading…
Reference in New Issue
Block a user