2727#include " lldb/Utility/LLDBLog.h"
2828#include " lldb/Utility/Log.h"
2929#include " llvm/ADT/SmallPtrSet.h"
30+ #include " llvm/Support/ConvertUTF.h"
3031
3132#include < memory>
3233
@@ -928,11 +929,42 @@ StackFrameList::GetStackFrameSPForStackFramePtr(StackFrame *stack_frame_ptr) {
928929 return ret_sp;
929930}
930931
932+ bool StackFrameList::IsNextFrameHidden (lldb_private::StackFrame &frame) {
933+ uint32_t frame_idx = frame.GetFrameIndex ();
934+ StackFrameSP frame_sp = GetFrameAtIndex (frame_idx + 1 );
935+ if (!frame_sp)
936+ return false ;
937+ return frame_sp->IsHidden ();
938+ }
939+
940+ bool StackFrameList::IsPreviousFrameHidden (lldb_private::StackFrame &frame) {
941+ uint32_t frame_idx = frame.GetFrameIndex ();
942+ if (frame_idx == 0 )
943+ return false ;
944+ StackFrameSP frame_sp = GetFrameAtIndex (frame_idx - 1 );
945+ if (!frame_sp)
946+ return false ;
947+ return frame_sp->IsHidden ();
948+ }
949+
950+ std::wstring StackFrameList::FrameMarker (lldb::StackFrameSP frame_sp,
951+ lldb::StackFrameSP selected_frame_sp) {
952+ if (frame_sp == selected_frame_sp)
953+ return Terminal::SupportsUnicode () ? L" * " : L" * " ;
954+ else if (!Terminal::SupportsUnicode ())
955+ return L" " ;
956+ else if (IsPreviousFrameHidden (*frame_sp))
957+ return L" ﹉" ;
958+ else if (IsNextFrameHidden (*frame_sp))
959+ return L" ﹍" ;
960+ return L" " ;
961+ }
962+
931963size_t StackFrameList::GetStatus (Stream &strm, uint32_t first_frame,
932964 uint32_t num_frames, bool show_frame_info,
933965 uint32_t num_frames_with_source,
934966 bool show_unique, bool show_hidden,
935- const char *selected_frame_marker ) {
967+ bool show_selected_frame ) {
936968 size_t num_frames_displayed = 0 ;
937969
938970 if (num_frames == 0 )
@@ -950,25 +982,17 @@ size_t StackFrameList::GetStatus(Stream &strm, uint32_t first_frame,
950982
951983 StackFrameSP selected_frame_sp =
952984 m_thread.GetSelectedFrame (DoNoSelectMostRelevantFrame);
953- const char *unselected_marker = nullptr ;
954985 std::string buffer;
955- if (selected_frame_marker) {
956- size_t len = strlen (selected_frame_marker);
957- buffer.insert (buffer.begin (), len, ' ' );
958- unselected_marker = buffer.c_str ();
959- }
960- const char *marker = nullptr ;
986+ std::wstring marker;
961987 for (frame_idx = first_frame; frame_idx < last_frame; ++frame_idx) {
962988 frame_sp = GetFrameAtIndex (frame_idx);
963989 if (!frame_sp)
964990 break ;
965991
966- if (selected_frame_marker != nullptr ) {
967- if (frame_sp == selected_frame_sp)
968- marker = selected_frame_marker;
969- else
970- marker = unselected_marker;
971- }
992+ if (show_selected_frame)
993+ marker = FrameMarker (frame_sp, selected_frame_sp);
994+ else
995+ marker = FrameMarker (frame_sp, nullptr );
972996
973997 // Hide uninteresting frames unless it's the selected frame.
974998 if (!show_hidden && frame_sp != selected_frame_sp && frame_sp->IsHidden ())
@@ -982,10 +1006,11 @@ size_t StackFrameList::GetStatus(Stream &strm, uint32_t first_frame,
9821006 m_thread.GetID (), num_frames_displayed))
9831007 break ;
9841008
985-
1009+ std::string marker_utf8;
1010+ llvm::convertWideToUTF8 (marker, marker_utf8);
9861011 if (!frame_sp->GetStatus (strm, show_frame_info,
9871012 num_frames_with_source > (first_frame - frame_idx),
988- show_unique, marker ))
1013+ show_unique, marker_utf8 ))
9891014 break ;
9901015 ++num_frames_displayed;
9911016 }
0 commit comments