diff --git a/src/data.h b/src/data.h index ebf90a0..49aa5d5 100644 --- a/src/data.h +++ b/src/data.h @@ -174,6 +174,14 @@ namespace dbgui::data // TODO: move this to target as its target dependent? size_t byte_size(const std::vector &) const; + bool is_integral() const + { + return type == Type::u8 || type == Type::u16 || type == Type::u32 + || type == Type::u64 || type == Type::u128 || type == Type::i8 + || type == Type::i16 || type == Type::i32 || type == Type::i64 + || type == Type::i128; + } + bool is_basic() const { return type != Type::none && type != Type::custom && type != Type::array diff --git a/src/frontend/window.cpp b/src/frontend/window.cpp index d1acc9b..1de9c23 100644 --- a/src/frontend/window.cpp +++ b/src/frontend/window.cpp @@ -1015,7 +1015,7 @@ bool WatchWindow::draw(Frontend &frontend) } // ImGuiTableFlags_SizingFixedFit - if (ImGui::BeginTable("##Variables", 2)) + if (ImGui::BeginTable("##Variables", 2, ImGuiTableFlags_RowBg)) { ImGui::TableSetupColumn("Name"); ImGui::TableSetupColumn("Value"); @@ -1105,14 +1105,64 @@ void WatchWindow::draw_value(Frontend &frontend, for (size_t i = 0; i < members.size(); ++i) { const auto &member = members[i]; - // Skip bitfield if (member.bitfield_size) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); ImGui::Text("%s", member.name.c_str()); ImGui::TableNextColumn(); - ImGui::TextDisabled(""); + + auto member_type = member.type_id; + while (member_type.type == Type::alias) + { + member_type = std::get( + frontend.target->types[member_type.idx].member_types); + } + + // TODO: handle u128/i128 + assert(member_type.type != Type::i128 + && member_type.type != Type::u128); + assert(member_type.is_integral() + || member_type.type == Type::_enum); + assert(member.bitfield_size <= 8 * 8); + auto byte_off = member.offset / 8; + auto bit_off = member.offset % 8; + auto byte_size = (member.bitfield_size + 7) / 8; + uint64_t value = 0; + uint8_t arr[8] = {}; + const auto &data = node.vec_data(); + std::copy(data.begin() + off + byte_off, + data.begin() + off + byte_off + byte_size, arr); + value = *reinterpret_cast(arr); + + assert(bit_off + member.bitfield_size <= 64); + value = value >> bit_off; + value = + value & (0xFFFFFFFF'FFFFFFFF >> (64 - member.bitfield_size)); + + if (member_type.type == Type::_enum) + { + const auto &members = + frontend.target->types[type_id.idx].member_vec(); + auto printed = false; + for (const auto &member : members) + { + if (value == member.enum_val) + { + ImGui::Text("%s", member.name.c_str()); + printed = true; + break; + } + } + if (!printed) + { + ImGui::Text("", value); + } + } else + { + ImGui::Text("%ld", value); + } + continue; } diff --git a/tmp/main b/tmp/main index 5c35f55..5b76443 100755 Binary files a/tmp/main and b/tmp/main differ diff --git a/tmp/sec.cpp b/tmp/sec.cpp index 023fb04..a8a6011 100644 --- a/tmp/sec.cpp +++ b/tmp/sec.cpp @@ -20,7 +20,7 @@ namespace test { } void helper_fn() { - test::MyType tmp = test::MyType{1}; + test::MyType tmp = test::MyType{1, 22, 4000}; std::string test = "Hello World"; uint32_t x = 25; unsigned int y = 30;