_d: determine address or range in _d
This commit is contained in:
parent
c66ae1d5c6
commit
111620a649
30
shell/d.cpp
30
shell/d.cpp
|
@ -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>]
|
||||
|
|
Loading…
Reference in New Issue