_d: determine address or range in _d

This commit is contained in:
Dr-Carlos 2022-12-18 07:22:09 +10:30
parent c66ae1d5c6
commit 111620a649
1 changed files with 10 additions and 20 deletions

View File

@ -71,8 +71,7 @@ static void disassemble(Session &session, Disassembly &disasm,
struct _d_args
{
std::optional<uint32_t> address;
std::optional<Range> range;
std::variant<long, Range> 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<long>(v))
args.address = std::get<long>(v);
else
args.range = std::get<Range>(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<uint32_t> address_opt,
std::optional<Range> range_opt)
void _d(Session &session, std::variant<long, Range> 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<Range>(location)) {
Range range = std::get<Range>(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<uint32_t> 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<long>(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 [<address|range>]