summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2019-11-18 19:14:31 +1100
committer Vas Crabb <vas@vastheman.com>2019-11-18 19:14:31 +1100
commit080d711ac5b2e5180b43e8c4aa8f90e5f39328b8 (patch)
treee30e2fc0ebd7ab1ae4bbbd627f8f242513bf5ea1
parenta829064e83f711588a6c261af0e6d07573da3a10 (diff)
Make debugger view startup more efficient - it's still not going to be practical with 200k save items, but it's better than before
-rw-r--r--src/emu/debug/debugvw.cpp4
-rw-r--r--src/emu/debug/debugvw.h2
-rw-r--r--src/emu/debug/dvbpoints.cpp7
-rw-r--r--src/emu/debug/dvdisasm.cpp17
-rw-r--r--src/emu/debug/dvdisasm.h2
-rw-r--r--src/emu/debug/dvmemory.cpp96
-rw-r--r--src/emu/debug/dvmemory.h6
-rw-r--r--src/emu/debug/dvstate.cpp11
-rw-r--r--src/emu/debug/dvstate.h2
-rw-r--r--src/emu/debug/dvwpoints.cpp7
10 files changed, 83 insertions, 71 deletions
diff --git a/src/emu/debug/debugvw.cpp b/src/emu/debug/debugvw.cpp
index f3b71698dbb..1a87cce5441 100644
--- a/src/emu/debug/debugvw.cpp
+++ b/src/emu/debug/debugvw.cpp
@@ -31,8 +31,8 @@
// debug_view_source - constructor
//-------------------------------------------------
-debug_view_source::debug_view_source(const char *name, device_t *device)
- : m_name(name),
+debug_view_source::debug_view_source(std::string &&name, device_t *device)
+ : m_name(std::move(name)),
m_device(device)
{
}
diff --git a/src/emu/debug/debugvw.h b/src/emu/debug/debugvw.h
index 1386b996b1a..e4ae810de45 100644
--- a/src/emu/debug/debugvw.h
+++ b/src/emu/debug/debugvw.h
@@ -115,7 +115,7 @@ class debug_view_source
public:
// construction/destruction
- debug_view_source(const char *name, device_t *device = nullptr);
+ debug_view_source(std::string &&name, device_t *device = nullptr);
virtual ~debug_view_source();
// getters
diff --git a/src/emu/debug/dvbpoints.cpp b/src/emu/debug/dvbpoints.cpp
index 51b9fcffcf7..2ab47b906f2 100644
--- a/src/emu/debug/dvbpoints.cpp
+++ b/src/emu/debug/dvbpoints.cpp
@@ -123,9 +123,10 @@ void debug_view_breakpoints::enumerate_sources()
// iterate over devices with disassembly interfaces
for (device_disasm_interface &dasm : disasm_interface_iterator(machine().root_device()))
{
- std::string name;
- name = string_format("%s '%s'", dasm.device().name(), dasm.device().tag());
- m_source_list.emplace_back(std::make_unique<debug_view_source>(name.c_str(), &dasm.device()));
+ m_source_list.emplace_back(
+ std::make_unique<debug_view_source>(
+ util::string_format("%s '%s'", dasm.device().name(), dasm.device().tag()),
+ &dasm.device()));
}
// reset the source to a known good entry
diff --git a/src/emu/debug/dvdisasm.cpp b/src/emu/debug/dvdisasm.cpp
index f7361ee2229..84d228ce3ef 100644
--- a/src/emu/debug/dvdisasm.cpp
+++ b/src/emu/debug/dvdisasm.cpp
@@ -22,8 +22,8 @@
// debug_view_disasm_source - constructor
//-------------------------------------------------
-debug_view_disasm_source::debug_view_disasm_source(const char *name, device_t &device)
- : debug_view_source(name, &device),
+debug_view_disasm_source::debug_view_disasm_source(std::string &&name, device_t &device)
+ : debug_view_source(std::move(name), &device),
m_space(device.memory().space(AS_PROGRAM)),
m_decrypted_space(device.memory().has_space(AS_OPCODES) ? device.memory().space(AS_OPCODES) : device.memory().space(AS_PROGRAM))
{
@@ -89,12 +89,15 @@ void debug_view_disasm::enumerate_sources()
m_source_list.clear();
// iterate over devices with disassembly interfaces
- std::string name;
- for(device_disasm_interface &dasm : disasm_interface_iterator(machine().root_device()))
+ for (device_disasm_interface &dasm : disasm_interface_iterator(machine().root_device()))
{
- name = string_format("%s '%s'", dasm.device().name(), dasm.device().tag());
- if(dasm.device().memory().space_config(AS_PROGRAM)!=nullptr)
- m_source_list.emplace_back(std::make_unique<debug_view_disasm_source>(name.c_str(), dasm.device()));
+ if (dasm.device().memory().space_config(AS_PROGRAM))
+ {
+ m_source_list.emplace_back(
+ std::make_unique<debug_view_disasm_source>(
+ util::string_format("%s '%s'", dasm.device().name(), dasm.device().tag()),
+ dasm.device()));
+ }
}
// reset the source to a known good entry
diff --git a/src/emu/debug/dvdisasm.h b/src/emu/debug/dvdisasm.h
index d66f569e050..e445481a0e3 100644
--- a/src/emu/debug/dvdisasm.h
+++ b/src/emu/debug/dvdisasm.h
@@ -45,7 +45,7 @@ class debug_view_disasm_source : public debug_view_source
public:
// construction/destruction
- debug_view_disasm_source(const char *name, device_t &device);
+ debug_view_disasm_source(std::string &&name, device_t &device);
// getters
address_space &space() const { return m_space; }
diff --git a/src/emu/debug/dvmemory.cpp b/src/emu/debug/dvmemory.cpp
index 282f6a14f3a..95fb412ba89 100644
--- a/src/emu/debug/dvmemory.cpp
+++ b/src/emu/debug/dvmemory.cpp
@@ -49,39 +49,39 @@ const debug_view_memory::memory_view_pos debug_view_memory::s_memory_pos_table[1
// debug_view_memory_source - constructors
//-------------------------------------------------
-debug_view_memory_source::debug_view_memory_source(const char *name, address_space &space)
- : debug_view_source(name, &space.device()),
- m_space(&space),
- m_memintf(dynamic_cast<device_memory_interface *>(&space.device())),
- m_base(nullptr),
- m_length(0),
- m_offsetxor(0),
- m_endianness(space.endianness()),
- m_prefsize(space.data_width() / 8)
+debug_view_memory_source::debug_view_memory_source(std::string &&name, address_space &space)
+ : debug_view_source(std::move(name), &space.device())
+ , m_space(&space)
+ , m_memintf(dynamic_cast<device_memory_interface *>(&space.device()))
+ , m_base(nullptr)
+ , m_length(0)
+ , m_offsetxor(0)
+ , m_endianness(space.endianness())
+ , m_prefsize(space.data_width() / 8)
{
}
-debug_view_memory_source::debug_view_memory_source(const char *name, memory_region &region)
- : debug_view_source(name),
- m_space(nullptr),
- m_memintf(nullptr),
- m_base(region.base()),
- m_length(region.bytes()),
- m_offsetxor(ENDIAN_VALUE_NE_NNE(region.endianness(), 0, region.bytewidth() - 1)),
- m_endianness(region.endianness()),
- m_prefsize(std::min<u8>(region.bytewidth(), 8))
+debug_view_memory_source::debug_view_memory_source(std::string &&name, memory_region &region)
+ : debug_view_source(std::move(name))
+ , m_space(nullptr)
+ , m_memintf(nullptr)
+ , m_base(region.base())
+ , m_length(region.bytes())
+ , m_offsetxor(ENDIAN_VALUE_NE_NNE(region.endianness(), 0, region.bytewidth() - 1))
+ , m_endianness(region.endianness())
+ , m_prefsize(std::min<u8>(region.bytewidth(), 8))
{
}
-debug_view_memory_source::debug_view_memory_source(const char *name, void *base, int element_size, int num_elements)
- : debug_view_source(name),
- m_space(nullptr),
- m_memintf(nullptr),
- m_base(base),
- m_length(element_size * num_elements),
- m_offsetxor(0),
- m_endianness(ENDIANNESS_NATIVE),
- m_prefsize(std::min(element_size, 8))
+debug_view_memory_source::debug_view_memory_source(std::string &&name, void *base, int element_size, int num_elements)
+ : debug_view_source(std::move(name))
+ , m_space(nullptr)
+ , m_memintf(nullptr)
+ , m_base(base)
+ , m_length(element_size * num_elements)
+ , m_offsetxor(0)
+ , m_endianness(ENDIANNESS_NATIVE)
+ , m_prefsize(std::min(element_size, 8))
{
}
@@ -136,45 +136,51 @@ void debug_view_memory::enumerate_sources()
{
// start with an empty list
m_source_list.clear();
- std::string name;
+ m_source_list.reserve(machine().save().registration_count());
// first add all the devices' address spaces
for (device_memory_interface &memintf : memory_interface_iterator(machine().root_device()))
+ {
for (int spacenum = 0; spacenum < memintf.max_space_count(); ++spacenum)
+ {
if (memintf.has_space(spacenum))
{
- address_space &space = memintf.space(spacenum);
- name = string_format("%s '%s' %s space memory", memintf.device().name(), memintf.device().tag(), space.name());
- m_source_list.emplace_back(std::make_unique<debug_view_memory_source>(name.c_str(), space));
+ address_space &space(memintf.space(spacenum));
+ m_source_list.emplace_back(
+ std::make_unique<debug_view_memory_source>(
+ util::string_format("%s '%s' %s space memory", memintf.device().name(), memintf.device().tag(), space.name()),
+ space));
}
+ }
+ }
// then add all the memory regions
for (auto &region : machine().memory().regions())
{
- name = string_format("Region '%s'", region.second->name());
- m_source_list.emplace_back(std::make_unique<debug_view_memory_source>(name.c_str(), *region.second.get()));
+ m_source_list.emplace_back(
+ std::make_unique<debug_view_memory_source>(
+ util::string_format("Region '%s'", region.second->name()),
+ *region.second.get()));
}
- // finally add all global array symbols in alphabetical order
- std::vector<std::tuple<std::string, void *, u32, u32> > itemnames;
- itemnames.reserve(machine().save().registration_count());
-
+ // finally add all global array symbols in ASCII order
+ std::string name;
+ std::size_t const firstsave = m_source_list.size();
for (int itemnum = 0; itemnum < machine().save().registration_count(); itemnum++)
{
u32 valsize, valcount;
void *base;
- std::string name_string(machine().save().indexed_item(itemnum, base, valsize, valcount));
+ name = machine().save().indexed_item(itemnum, base, valsize, valcount);
// add pretty much anything that's not a timer (we may wish to cull other items later)
// also, don't trim the front of the name, it's important to know which VIA6522 we're looking at, e.g.
- if (strncmp(name_string.c_str(), "timer/", 6))
- itemnames.emplace_back(std::move(name_string), base, valsize, valcount);
+ if (strncmp(name.c_str(), "timer/", 6))
+ m_source_list.emplace_back(std::make_unique<debug_view_memory_source>(std::move(name), base, valsize, valcount));
}
-
- std::sort(itemnames.begin(), itemnames.end(), [] (auto const &x, auto const &y) { return std::get<0>(x) < std::get<0>(y); });
-
- for (auto const &item : itemnames)
- m_source_list.emplace_back(std::make_unique<debug_view_memory_source>(std::get<0>(item).c_str(), std::get<1>(item), std::get<2>(item), std::get<3>(item)));
+ std::sort(
+ std::next(m_source_list.begin(), firstsave),
+ m_source_list.end(),
+ [] (auto const &x, auto const &y) { return 0 > std::strcmp(x->name(), y->name()); });
// reset the source to a known good entry
if (!m_source_list.empty())
diff --git a/src/emu/debug/dvmemory.h b/src/emu/debug/dvmemory.h
index cae15317575..de7cf8b5af5 100644
--- a/src/emu/debug/dvmemory.h
+++ b/src/emu/debug/dvmemory.h
@@ -28,9 +28,9 @@ class debug_view_memory_source : public debug_view_source
friend class debug_view_memory;
public:
- debug_view_memory_source(const char *name, address_space &space);
- debug_view_memory_source(const char *name, memory_region &region);
- debug_view_memory_source(const char *name, void *base, int element_size, int num_elements);
+ debug_view_memory_source(std::string &&name, address_space &space);
+ debug_view_memory_source(std::string &&name, memory_region &region);
+ debug_view_memory_source(std::string &&name, void *base, int element_size, int num_elements);
address_space *space() const { return m_space; }
diff --git a/src/emu/debug/dvstate.cpp b/src/emu/debug/dvstate.cpp
index 4ec9cc3bfa3..46956db2286 100644
--- a/src/emu/debug/dvstate.cpp
+++ b/src/emu/debug/dvstate.cpp
@@ -31,8 +31,8 @@ const int debug_view_state::REG_FRAME;
// debug_view_state_source - constructor
//-------------------------------------------------
-debug_view_state_source::debug_view_state_source(const char *name, device_t &device)
- : debug_view_source(name, &device)
+debug_view_state_source::debug_view_state_source(std::string &&name, device_t &device)
+ : debug_view_source(std::move(name), &device)
, m_stateintf(dynamic_cast<device_state_interface *>(&device))
, m_execintf(dynamic_cast<device_execute_interface *>(&device))
{
@@ -81,11 +81,12 @@ void debug_view_state::enumerate_sources()
m_source_list.clear();
// iterate over devices that have state interfaces
- std::string name;
for (device_state_interface &state : state_interface_iterator(machine().root_device()))
{
- name = string_format("%s '%s'", state.device().name(), state.device().tag());
- m_source_list.emplace_back(std::make_unique<debug_view_state_source>(name.c_str(), state.device()));
+ m_source_list.emplace_back(
+ std::make_unique<debug_view_state_source>(
+ util::string_format("%s '%s'", state.device().name(), state.device().tag()),
+ state.device()));
}
// reset the source to a known good entry
diff --git a/src/emu/debug/dvstate.h b/src/emu/debug/dvstate.h
index 80c3365b17e..63c0eb38822 100644
--- a/src/emu/debug/dvstate.h
+++ b/src/emu/debug/dvstate.h
@@ -27,7 +27,7 @@ class debug_view_state_source : public debug_view_source
public:
// construction/destruction
- debug_view_state_source(const char *name, device_t &device);
+ debug_view_state_source(std::string &&name, device_t &device);
private:
// internal state
diff --git a/src/emu/debug/dvwpoints.cpp b/src/emu/debug/dvwpoints.cpp
index c20332e46eb..fb713ac58e7 100644
--- a/src/emu/debug/dvwpoints.cpp
+++ b/src/emu/debug/dvwpoints.cpp
@@ -136,13 +136,14 @@ void debug_view_watchpoints::enumerate_sources()
{
// start with an empty list
m_source_list.clear();
- std::string name;
// iterate over devices with disassembly interfaces
for (device_disasm_interface &dasm : disasm_interface_iterator(machine().root_device()))
{
- name = string_format("%s '%s'", dasm.device().name(), dasm.device().tag());
- m_source_list.emplace_back(std::make_unique<debug_view_source>(name.c_str(), &dasm.device()));
+ m_source_list.emplace_back(
+ std::make_unique<debug_view_source>(
+ util::string_format("%s '%s'", dasm.device().name(), dasm.device().tag()),
+ &dasm.device()));
}
// reset the source to a known good entry