summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2016-07-25 23:20:52 -0400
committer AJR <ajrhacker@users.noreply.github.com>2016-07-25 23:20:52 -0400
commit566c12db31c034355bb66cffa66f0fb438a012f0 (patch)
tree298409828e766f76d45f57b42a277c051043ea36
parent0184946dd8623782725b5d34d3ef97eb8afe5531 (diff)
debugcpu: prevent nullptr exceptions when devices named in expressions lack memory interfaces
-rw-r--r--src/emu/debug/debugcpu.cpp70
1 files changed, 48 insertions, 22 deletions
diff --git a/src/emu/debug/debugcpu.cpp b/src/emu/debug/debugcpu.cpp
index b9062d3894d..b631e094d23 100644
--- a/src/emu/debug/debugcpu.cpp
+++ b/src/emu/debug/debugcpu.cpp
@@ -1050,13 +1050,18 @@ UINT64 debugger_cpu::expression_read_memory(void *param, const char *name, expre
case EXPSPACE_SPACE3_LOGICAL:
{
device_t *device = nullptr;
+ device_memory_interface *memory;
+
if (name != nullptr)
device = expression_get_device(name);
- if (device == nullptr)
+ if (device == nullptr || !device->interface(memory))
+ {
device = m_machine.debugger().cpu().get_visible_cpu();
- if (device->memory().has_space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL)))
+ memory = &device->memory();
+ }
+ if (memory->has_space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL)))
{
- address_space &space = device->memory().space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL));
+ address_space &space = memory->space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL));
return read_memory(space, space.address_to_byte(address), size, true);
}
break;
@@ -1068,13 +1073,18 @@ UINT64 debugger_cpu::expression_read_memory(void *param, const char *name, expre
case EXPSPACE_SPACE3_PHYSICAL:
{
device_t *device = nullptr;
+ device_memory_interface *memory;
+
if (name != nullptr)
device = expression_get_device(name);
- if (device == nullptr)
+ if (device == nullptr || !device->interface(memory))
+ {
device = m_machine.debugger().cpu().get_visible_cpu();
- if (device->memory().has_space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL)))
+ memory = &device->memory();
+ }
+ if (memory->has_space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL)))
{
- address_space &space = device->memory().space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL));
+ address_space &space = memory->space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL));
return read_memory(space, space.address_to_byte(address), size, false);
}
break;
@@ -1084,11 +1094,16 @@ UINT64 debugger_cpu::expression_read_memory(void *param, const char *name, expre
case EXPSPACE_RAMWRITE:
{
device_t *device = nullptr;
+ device_memory_interface *memory;
+
if (name != nullptr)
device = expression_get_device(name);
- if (device == nullptr)
+ if (device == nullptr || !device->interface(memory))
+ {
device = m_machine.debugger().cpu().get_visible_cpu();
- return expression_read_program_direct(device->memory().space(AS_PROGRAM), (spacenum == EXPSPACE_OPCODE), address, size);
+ memory = &device->memory();
+ }
+ return expression_read_program_direct(memory->space(AS_PROGRAM), (spacenum == EXPSPACE_OPCODE), address, size);
break;
}
@@ -1215,6 +1230,7 @@ UINT64 debugger_cpu::expression_read_memory_region(const char *rgntag, offs_t ad
void debugger_cpu::expression_write_memory(void *param, const char *name, expression_space spacenum, UINT32 address, int size, UINT64 data)
{
device_t *device = nullptr;
+ device_memory_interface *memory;
switch (spacenum)
{
@@ -1224,11 +1240,14 @@ void debugger_cpu::expression_write_memory(void *param, const char *name, expres
case EXPSPACE_SPACE3_LOGICAL:
if (name != nullptr)
device = expression_get_device(name);
- if (device == nullptr)
+ if (device == nullptr || !device->interface(memory))
+ {
device = m_machine.debugger().cpu().get_visible_cpu();
- if (device->memory().has_space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL)))
+ memory = &device->memory();
+ }
+ if (memory->has_space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL)))
{
- address_space &space = device->memory().space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL));
+ address_space &space = memory->space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL));
write_memory(space, space.address_to_byte(address), data, size, true);
}
break;
@@ -1239,11 +1258,14 @@ void debugger_cpu::expression_write_memory(void *param, const char *name, expres
case EXPSPACE_SPACE3_PHYSICAL:
if (name != nullptr)
device = expression_get_device(name);
- if (device == nullptr)
+ if (device == nullptr || !device->interface(memory))
+ {
device = m_machine.debugger().cpu().get_visible_cpu();
- if (device->memory().has_space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL)))
+ memory = &device->memory();
+ }
+ if (memory->has_space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL)))
{
- address_space &space = device->memory().space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL));
+ address_space &space = memory->space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL));
write_memory(space, space.address_to_byte(address), data, size, false);
}
break;
@@ -1252,9 +1274,12 @@ void debugger_cpu::expression_write_memory(void *param, const char *name, expres
case EXPSPACE_RAMWRITE:
if (name != nullptr)
device = expression_get_device(name);
- if (device == nullptr)
+ if (device == nullptr || !device->interface(memory))
+ {
device = m_machine.debugger().cpu().get_visible_cpu();
- expression_write_program_direct(device->memory().space(AS_PROGRAM), (spacenum == EXPSPACE_OPCODE), address, size, data);
+ memory = &device->memory();
+ }
+ expression_write_program_direct(memory->space(AS_PROGRAM), (spacenum == EXPSPACE_OPCODE), address, size, data);
break;
case EXPSPACE_REGION:
@@ -1393,6 +1418,7 @@ void debugger_cpu::expression_write_memory_region(const char *rgntag, offs_t add
expression_error::error_code debugger_cpu::expression_validate(void *param, const char *name, expression_space space)
{
device_t *device = nullptr;
+ device_memory_interface *memory;
switch (space)
{
@@ -1403,12 +1429,12 @@ expression_error::error_code debugger_cpu::expression_validate(void *param, cons
if (name)
{
device = expression_get_device(name);
- if (!device)
+ if (device == nullptr)
return expression_error::INVALID_MEMORY_NAME;
}
if (!device)
device = m_machine.debugger().cpu().get_visible_cpu();
- if (!device->memory().has_space(AS_PROGRAM + (space - EXPSPACE_PROGRAM_LOGICAL)))
+ if (!device->interface(memory) || !memory->has_space(AS_PROGRAM + (space - EXPSPACE_PROGRAM_LOGICAL)))
return expression_error::NO_SUCH_MEMORY_SPACE;
break;
@@ -1419,12 +1445,12 @@ expression_error::error_code debugger_cpu::expression_validate(void *param, cons
if (name)
{
device = expression_get_device(name);
- if (!device)
+ if (device == nullptr)
return expression_error::INVALID_MEMORY_NAME;
}
if (!device)
device = m_machine.debugger().cpu().get_visible_cpu();
- if (!device->memory().has_space(AS_PROGRAM + (space - EXPSPACE_PROGRAM_PHYSICAL)))
+ if (!device->interface(memory) || !memory->has_space(AS_PROGRAM + (space - EXPSPACE_PROGRAM_PHYSICAL)))
return expression_error::NO_SUCH_MEMORY_SPACE;
break;
@@ -1433,12 +1459,12 @@ expression_error::error_code debugger_cpu::expression_validate(void *param, cons
if (name)
{
device = expression_get_device(name);
- if (!device)
+ if (device == nullptr || !device->interface(memory))
return expression_error::INVALID_MEMORY_NAME;
}
if (!device)
device = m_machine.debugger().cpu().get_visible_cpu();
- if (!device->memory().has_space(AS_PROGRAM))
+ if (!device->interface(memory) || !memory->has_space(AS_PROGRAM))
return expression_error::NO_SUCH_MEMORY_SPACE;
break;