diff options
author | 2022-03-16 04:13:18 +1100 | |
---|---|---|
committer | 2022-03-16 04:13:18 +1100 | |
commit | 394e5f18b6fb034b04fae0f35575dc24a4a1d620 (patch) | |
tree | 86875ae05bd30adcd3d25fa66f6dbe1093f4d3df /src/frontend/mame/luaengine_debug.cpp | |
parent | c074526b03e51a8a1368813cee130a543a560c0f (diff) |
Fixed some debugger memory view annoyances and cleaned up Lua bindings.
Made the debugger memory view not depend on isprint which is affected by
the global locale. Assume the OSD will display as ISO-8869-1 and
replace problematic printable characters.
Started changing Lua function bindings to use set_function to avoid
potential issues related to ThePhD/sol2#608, and worked out what was
causing problems with symbol table read_memory/write_memory. (They
aren't really essential - you can do the same thing with the address
space object itself, but they're easier to parameterise.)
Diffstat (limited to 'src/frontend/mame/luaengine_debug.cpp')
-rw-r--r-- | src/frontend/mame/luaengine_debug.cpp | 177 |
1 files changed, 90 insertions, 87 deletions
diff --git a/src/frontend/mame/luaengine_debug.cpp b/src/frontend/mame/luaengine_debug.cpp index 749d4c34aa0..94748d5a897 100644 --- a/src/frontend/mame/luaengine_debug.cpp +++ b/src/frontend/mame/luaengine_debug.cpp @@ -30,7 +30,61 @@ struct wrap_textbuf }; -class symbol_table_wrapper +template <bool Enable> +sol::object do_breakpoint_enable(device_debug &dev, sol::this_state s, sol::object index) +{ + if (index == sol::lua_nil) + { + dev.breakpoint_enable_all(Enable); + dev.device().machine().debug_view().update_all(DVT_DISASSEMBLY); + dev.device().machine().debug_view().update_all(DVT_BREAK_POINTS); + return sol::lua_nil; + } + else if (index.is<int>()) + { + bool result(dev.breakpoint_enable(index.as<int>(), Enable)); + if (result) + { + dev.device().machine().debug_view().update_all(DVT_DISASSEMBLY); + dev.device().machine().debug_view().update_all(DVT_BREAK_POINTS); + } + return sol::make_object(s, result); + } + else + { + osd_printf_error("[LUA ERROR] must call bpenable with integer or nil\n"); + return sol::lua_nil; + } +} + + +template <bool Enable> +sol::object do_watchpoint_enable(device_debug &dev, sol::this_state s, sol::object index) +{ + if (index == sol::lua_nil) + { + dev.watchpoint_enable_all(Enable); + dev.device().machine().debug_view().update_all(DVT_WATCH_POINTS); + return sol::lua_nil; + } + else if (index.is<int>()) + { + bool result(dev.watchpoint_enable(index.as<int>(), Enable)); + if (result) + dev.device().machine().debug_view().update_all(DVT_WATCH_POINTS); + return sol::make_object(s, result); + } + else + { + osd_printf_error("[LUA ERROR] must call wpenable with integer or nil"); + return sol::lua_nil; + } +} + +} // anonymous namespace + + +class lua_engine::symbol_table_wrapper { public: symbol_table_wrapper(symbol_table_wrapper const &) = delete; @@ -53,13 +107,16 @@ public: u64 value(const char *symbol) { return m_table.value(symbol); } void set_value(const char *symbol, u64 value) { m_table.set_value(symbol, value); } + u64 read_memory(addr_space &space, offs_t address, int size, bool translate) { return m_table.read_memory(space.space, address, size, translate); } + void write_memory(addr_space &space, offs_t address, u64 data, int size, bool translate) { m_table.write_memory(space.space, address, data, size, translate); } + private: symbol_table m_table; std::shared_ptr<symbol_table_wrapper> const m_parent; }; -class expression_wrapper +class lua_engine::expression_wrapper { public: expression_wrapper(expression_wrapper const &) = delete; @@ -102,60 +159,6 @@ private: }; -template <bool Enable> -sol::object do_breakpoint_enable(device_debug &dev, sol::this_state s, sol::object index) -{ - if (index == sol::lua_nil) - { - dev.breakpoint_enable_all(Enable); - dev.device().machine().debug_view().update_all(DVT_DISASSEMBLY); - dev.device().machine().debug_view().update_all(DVT_BREAK_POINTS); - return sol::lua_nil; - } - else if (index.is<int>()) - { - bool result(dev.breakpoint_enable(index.as<int>(), Enable)); - if (result) - { - dev.device().machine().debug_view().update_all(DVT_DISASSEMBLY); - dev.device().machine().debug_view().update_all(DVT_BREAK_POINTS); - } - return sol::make_object(s, result); - } - else - { - osd_printf_error("[LUA ERROR] must call bpenable with integer or nil\n"); - return sol::lua_nil; - } -} - - -template <bool Enable> -sol::object do_watchpoint_enable(device_debug &dev, sol::this_state s, sol::object index) -{ - if (index == sol::lua_nil) - { - dev.watchpoint_enable_all(Enable); - dev.device().machine().debug_view().update_all(DVT_WATCH_POINTS); - return sol::lua_nil; - } - else if (index.is<int>()) - { - bool result(dev.watchpoint_enable(index.as<int>(), Enable)); - if (result) - dev.device().machine().debug_view().update_all(DVT_WATCH_POINTS); - return sol::make_object(s, result); - } - else - { - osd_printf_error("[LUA ERROR] must call wpenable with integer or nil"); - return sol::lua_nil; - } -} - -} // anonymous namespace - - void lua_engine::initialize_debug(sol::table &emu) { @@ -213,7 +216,7 @@ void lua_engine::initialize_debug(sol::table &emu) { return std::make_shared<symbol_table_wrapper>(parent->table().machine(), parent, nullptr); }, [] (device_t &device) { return std::make_shared<symbol_table_wrapper>(device.machine(), nullptr, &device); })); - symbol_table_type["set_memory_modified_func"] = + symbol_table_type.set_function("set_memory_modified_func", [this] (symbol_table_wrapper &st, sol::object cb) { if (cb == sol::lua_nil) @@ -222,7 +225,7 @@ void lua_engine::initialize_debug(sol::table &emu) st.table().set_memory_modified_func([this, cbfunc = cb.as<sol::protected_function>()] () { invoke(cbfunc); }); else osd_printf_error("[LUA ERROR] must call set_memory_modified_func with function or nil\n"); - }; + }); symbol_table_type["add"] = sol::overload( static_cast<symbol_entry &(symbol_table_wrapper::*)(char const *)>(&symbol_table_wrapper::add), static_cast<symbol_entry &(symbol_table_wrapper::*)(char const *, u64)>(&symbol_table_wrapper::add), @@ -261,24 +264,24 @@ void lua_engine::initialize_debug(sol::table &emu) return result ? *result : 0; }); }); - symbol_table_type["find"] = &symbol_table_wrapper::find; - symbol_table_type["find_deep"] = &symbol_table_wrapper::find_deep; - symbol_table_type["value"] = &symbol_table_wrapper::value; - symbol_table_type["set_value"] = &symbol_table_wrapper::set_value; - symbol_table_type["memory_value"] = + symbol_table_type.set_function("find", &symbol_table_wrapper::find); + symbol_table_type.set_function("find_deep", &symbol_table_wrapper::find_deep); + symbol_table_type.set_function("value", &symbol_table_wrapper::value); + symbol_table_type.set_function("set_value", &symbol_table_wrapper::set_value); + symbol_table_type.set_function("memory_value", [] (symbol_table_wrapper &st, char const *name, char const *space, u32 offset, int size, bool disable_se) { expression_space const es = s_expression_space_parser(space); return st.table().memory_value(name, es, offset, size, disable_se); - }; - symbol_table_type["set_memory_value"] = + }); + symbol_table_type.set_function("set_memory_value", [] (symbol_table_wrapper &st, char const *name, char const *space, u32 offset, int size, u64 value, bool disable_se) { expression_space const es = s_expression_space_parser(space); st.table().set_memory_value(name, es, offset, size, value, disable_se); - }; - //symbol_table_type["read_memory"] = &symbol_table::read_memory; crashes if you try to use it, need to work out why - //symbol_table_type["write_memory"] = &symbol_table::write_memory; crashes if you try to use it, need to work out why + }); + symbol_table_type.set_function("read_memory", &symbol_table_wrapper::read_memory); + symbol_table_type.set_function("write_memory", &symbol_table_wrapper::write_memory); symbol_table_type["entries"] = sol::property([] (symbol_table_wrapper const &st) { return standard_tag_object_ptr_map<symbol_entry>(st.table().entries()); }); symbol_table_type["parent"] = sol::property(&symbol_table_wrapper::parent); @@ -289,9 +292,9 @@ void lua_engine::initialize_debug(sol::table &emu) expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &), expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &, char const *, int), expression_wrapper(std::shared_ptr<symbol_table_wrapper> const &, char const *)>()); - parsed_expression_type["set_default_base"] = &expression_wrapper::set_default_base; - parsed_expression_type["parse"] = &expression_wrapper::parse; - parsed_expression_type["execute"] = &expression_wrapper::execute; + parsed_expression_type.set_function("set_default_base", &expression_wrapper::set_default_base); + parsed_expression_type.set_function("parse", &expression_wrapper::parse); + parsed_expression_type.set_function("execute", &expression_wrapper::execute); parsed_expression_type["is_empty"] = sol::property(&expression_wrapper::is_empty); parsed_expression_type["original_string"] = sol::property(&expression_wrapper::original_string); parsed_expression_type["symbols"] = sol::property(&expression_wrapper::symbols, &expression_wrapper::set_symbols); @@ -306,7 +309,7 @@ void lua_engine::initialize_debug(sol::table &emu) auto debugger_type = sol().registry().new_usertype<debugger_manager>("debugger", sol::no_constructor); - debugger_type["command"] = [] (debugger_manager &debug, std::string const &cmd) { debug.console().execute_command(cmd, false); }; + debugger_type.set_function("command", [] (debugger_manager &debug, std::string const &cmd) { debug.console().execute_command(cmd, false); }); debugger_type["consolelog"] = sol::property([] (debugger_manager &debug) { return wrap_textbuf(debug.console().get_console_textbuf()); }); debugger_type["errorlog"] = sol::property([](debugger_manager &debug) { return wrap_textbuf(debug.console().get_errorlog_textbuf()); }); debugger_type["visible_cpu"] = sol::property( @@ -340,23 +343,23 @@ void lua_engine::initialize_debug(sol::table &emu) auto device_debug_type = sol().registry().new_usertype<device_debug>("device_debug", sol::no_constructor); - device_debug_type["step"] = + device_debug_type.set_function("step", [] (device_debug &dev, sol::object num) { int steps = 1; if (num.is<int>()) steps = num.as<int>(); dev.single_step(steps); - }; - device_debug_type["go"] = &device_debug::go; - device_debug_type["bpset"] = + }); + device_debug_type.set_function("go", &device_debug::go); + device_debug_type.set_function("bpset", [] (device_debug &dev, offs_t address, char const *cond, char const *act) { int result(dev.breakpoint_set(address, cond, act)); dev.device().machine().debug_view().update_all(DVT_DISASSEMBLY); dev.device().machine().debug_view().update_all(DVT_BREAK_POINTS); return result; - }; + }); device_debug_type["bpclear"] = sol::overload( [] (device_debug &dev, int index) { @@ -374,24 +377,24 @@ void lua_engine::initialize_debug(sol::table &emu) dev.device().machine().debug_view().update_all(DVT_DISASSEMBLY); dev.device().machine().debug_view().update_all(DVT_BREAK_POINTS); }); - device_debug_type["bpenable"] = &do_breakpoint_enable<true>; - device_debug_type["bpdisable"] = &do_breakpoint_enable<false>; - device_debug_type["bplist"] = + device_debug_type.set_function("bpenable", &do_breakpoint_enable<true>); + device_debug_type.set_function("bpdisable", &do_breakpoint_enable<false>); + device_debug_type.set_function("bplist", [this] (device_debug &dev) { sol::table table = sol().create_table(); for (auto const &bpp : dev.breakpoint_list()) table[bpp.second->index()] = sol::make_reference(sol(), bpp.second.get()); return table; - }; - device_debug_type["wpset"] = + }); + device_debug_type.set_function("wpset", [] (device_debug &dev, addr_space &sp, std::string const &type, offs_t addr, offs_t len, char const *cond, char const *act) { read_or_write const wptype = s_read_or_write_parser(type); int result(dev.watchpoint_set(sp.space, wptype, addr, len, cond, act)); dev.device().machine().debug_view().update_all(DVT_WATCH_POINTS); return result; - }; + }); device_debug_type["wpclear"] = sol::overload( [] (device_debug &dev, int index) { @@ -405,16 +408,16 @@ void lua_engine::initialize_debug(sol::table &emu) dev.watchpoint_clear_all(); dev.device().machine().debug_view().update_all(DVT_WATCH_POINTS); }); - device_debug_type["wpenable"] = &do_watchpoint_enable<true>; - device_debug_type["wpdisable"] = &do_watchpoint_enable<false>; - device_debug_type["wplist"] = + device_debug_type.set_function("wpenable", &do_watchpoint_enable<true>); + device_debug_type.set_function("wpdisable", &do_watchpoint_enable<false>); + device_debug_type.set_function("wplist", [this] (device_debug &dev, addr_space &sp) { sol::table table = sol().create_table(); for (auto &wpp : dev.watchpoint_vector(sp.space.spacenum())) table[wpp->index()] = sol::make_reference(sol(), wpp.get()); return table; - }; + }); auto breakpoint_type = sol().registry().new_usertype<debug_breakpoint>("breakpoint", sol::no_constructor); |