From 111620a649387bd914419e11566a648b2bec03fe Mon Sep 17 00:00:00 2001 From: Dr-Carlos Date: Sun, 18 Dec 2022 07:22:09 +1030 Subject: [PATCH] _d: determine address or range in _d --- shell/d.cpp | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/shell/d.cpp b/shell/d.cpp index d688680..d892089 100644 --- a/shell/d.cpp +++ b/shell/d.cpp @@ -71,8 +71,7 @@ static void disassemble(Session &session, Disassembly &disasm, struct _d_args { - std::optional address; - std::optional range; + std::variant location; }; static _d_args parse_d(Session &session, Parser &parser) @@ -82,32 +81,23 @@ static _d_args parse_d(Session &session, Parser &parser) if(!session.current_space) return {}; - args.address = session.current_space->cursor; - args.range = {}; - - if(!parser.at_end()) { - auto v = parser.expr_or_range(session.current_space); - - if(std::holds_alternative(v)) - args.address = std::get(v); - else - args.range = std::get(v); - } + args.location = parser.at_end() + ? session.current_space->cursor + : parser.expr_or_range(session.current_space); parser.end(); return args; } -void _d(Session &session, std::optional address_opt, - std::optional range_opt) +void _d(Session &session, std::variant location) { if(!session.current_space) return; FxOS::Disassembly disasm(*session.current_space); - if(range_opt.has_value()) { - Range range = range_opt.value(); + if(std::holds_alternative(location)) { + Range range = std::get(location); if(range.start & 1) { fmt::print("address 0x{:08x} is odd, starting at 0x{:08x}\n", range.start, range.start + 1); @@ -129,8 +119,8 @@ void _d(Session &session, std::optional address_opt, disassemble(session, disasm, {"pcrel", /*"constprop",*/ "syscall", "print"}, -1); } - else if(address_opt.has_value()) { - uint32_t address = address_opt.value(); + else { + uint32_t address = std::get(location); if(address & 1) { fmt::print("address 0x{:08x} is odd, starting at 0x{:08x}\n", @@ -151,7 +141,7 @@ static ShellCommand _d_cmd( "d", [](Session &s, Parser &p) { auto args = parse_d(s, p); - _d(s, args.address, args.range); + _d(s, args.location); }, [](Session &s, Parser &p) { parse_d(s, p); }, "Disassemble", R"( d []