From 0aa29030da68a22c97b6e65e30217d8b44319e1e Mon Sep 17 00:00:00 2001 From: cracyc Date: Mon, 31 Oct 2016 21:57:40 -0500 Subject: [PATCH] luaengine: use templated accessor for call_plugin (nw) --- src/frontend/mame/luaengine.cpp | 54 +++++++++++++------------------ src/frontend/mame/luaengine.h | 31 +++++++++++++++++- src/frontend/mame/mame.cpp | 2 +- src/frontend/mame/ui/datmenu.cpp | 21 +++++++----- src/frontend/mame/ui/mainmenu.cpp | 2 +- src/frontend/mame/ui/selgame.cpp | 8 ++--- src/frontend/mame/ui/selmenu.cpp | 26 +++++++++------ src/frontend/mame/ui/selsoft.cpp | 4 +-- 8 files changed, 89 insertions(+), 59 deletions(-) diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index 908bd311232..5184587e019 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -724,32 +724,22 @@ lua_engine::~lua_engine() close(); } -const char *lua_engine::call_plugin(const char *data, const char *name) +sol::object lua_engine::call_plugin(const std::string &name, sol::object in) { - std::string field("cb_"); - const char *ret = nullptr; - field += name; - lua_settop(m_lua_state, 0); - lua_getfield(m_lua_state, LUA_REGISTRYINDEX, field.c_str()); - - if(!lua_isfunction(m_lua_state, -1)) + std::string field = "cb_" + name; + sol::object obj = sol().registry()[field]; + if(obj.is()) { - lua_pop(m_lua_state, 1); - return nullptr; + auto res = (obj.as())(in); + if(!res.valid()) + { + sol::error err = res; + osd_printf_error("[LUA ERROR] in call_plugin: %s\n", err.what()); + } + else + return res.get(); } - lua_pushstring(m_lua_state, data); - int error; - if((error = lua_pcall(m_lua_state, 1, 1, 0)) != LUA_OK) - { - if(error == LUA_ERRRUN) - printf("%s\n", lua_tostring(m_lua_state, -1)); - lua_pop(m_lua_state, 1); - return nullptr; - } - if(lua_isstring(m_lua_state, -1)) - ret = lua_tostring(m_lua_state, -1); - lua_pop(m_lua_state, 1); - return ret; + return sol::make_object(sol(), sol::nil); } void lua_engine::menu_populate(const std::string &menu, std::vector> &menu_list) @@ -772,7 +762,7 @@ void lua_engine::menu_populate(const std::string &menu, std::vector()) { sol::table enttable = entry.second.as(); - menu_list.emplace_back(std::make_tuple(enttable.get(1), enttable.get(2), enttable.get(3))); + menu_list.emplace_back(enttable.get(1, 2, 3)); } } } @@ -1188,14 +1178,14 @@ void lua_engine::initialize() */ sol().new_usertype("game_driver", "new", sol::no_constructor, - "source_file", &game_driver::source_file, - "parent", &game_driver::parent, - "name", &game_driver::name, - "description", &game_driver::description, - "year", &game_driver::year, - "manufacturer", &game_driver::manufacturer, - "compatible_with", &game_driver::compatible_with, - "default_layout", &game_driver::default_layout); + "source_file", sol::readonly(&game_driver::source_file), + "parent", sol::readonly(&game_driver::parent), + "name", sol::readonly(&game_driver::name), + "description", sol::readonly(&game_driver::description), + "year", sol::readonly(&game_driver::year), + "manufacturer", sol::readonly(&game_driver::manufacturer), + "compatible_with", sol::readonly(&game_driver::compatible_with), + "default_layout", sol::readonly(&game_driver::default_layout)); /* machine.devices[device_tag] * device:name() - device long name diff --git a/src/frontend/mame/luaengine.h b/src/frontend/mame/luaengine.h index c3527ff50ce..0abdb24716e 100644 --- a/src/frontend/mame/luaengine.h +++ b/src/frontend/mame/luaengine.h @@ -56,7 +56,35 @@ public: std::vector &get_menu() { return m_menu; } void attach_notifiers(); void on_frame_done(); - const char *call_plugin(const char *data, const char *name); + + template + bool call_plugin(const std::string &name, T in, U& out) + { + bool ret = false; + sol::object outobj = call_plugin(name, sol::make_object(sol(), in)); + if(outobj.is()) + { + out = outobj.as(); + ret = true; + } + return ret; + } + + template + bool call_plugin_check(const std::string &name, U in) + { + bool ret = false; + sol::object outobj = call_plugin(name, sol::make_object(sol(), in)); + if(outobj.is()) + ret = true; + return ret; + } + + template + void call_plugin_set(const std::string &name, T in) + { + call_plugin(name, sol::make_object(sol(), in)); + } private: // internal state @@ -82,6 +110,7 @@ private: void register_function(sol::function func, const char *id); bool execute_function(const char *id); + sol::object call_plugin(const std::string &name, sol::object in); struct addr_space { addr_space(address_space &space, device_memory_interface &dev) : diff --git a/src/frontend/mame/mame.cpp b/src/frontend/mame/mame.cpp index 72c1315ab06..5a8b0c01581 100644 --- a/src/frontend/mame/mame.cpp +++ b/src/frontend/mame/mame.cpp @@ -341,7 +341,7 @@ void emulator_info::layout_file_cb(xml_data_node &layout) { xml_data_node *script = xml_get_sibling(mamelayout->child, "script"); if(script) - mame_machine_manager::instance()->lua()->call_plugin(script->value, "layout"); + mame_machine_manager::instance()->lua()->call_plugin_set("layout", script->value); } } diff --git a/src/frontend/mame/ui/datmenu.cpp b/src/frontend/mame/ui/datmenu.cpp index 108f838cfcb..1d6f458721c 100644 --- a/src/frontend/mame/ui/datmenu.cpp +++ b/src/frontend/mame/ui/datmenu.cpp @@ -45,15 +45,17 @@ menu_dats_view::menu_dats_view(mame_ui_manager &mui, render_container &container m_parent = image.software_entry()->parentname(); } } - const char *lua_list = mame_machine_manager::instance()->lua()->call_plugin(driver ? driver->name : "", "data_list"); - if(lua_list) + std::string lua_list; + if(mame_machine_manager::instance()->lua()->call_plugin("data_list", driver ? driver->name : "", lua_list)) { std::string list(lua_list); char *token = strtok((char *)list.c_str(), ","); int count = 0; while(token) { - m_items_list.emplace_back(_(token), count, mame_machine_manager::instance()->lua()->call_plugin(util::string_format("%d", count).c_str(), "data_version")); + std::string item; + mame_machine_manager::instance()->lua()->call_plugin("data_version", util::string_format("%d", count).c_str(), item); + m_items_list.emplace_back(_(token), count, item); count++; token = strtok(nullptr, ","); } @@ -78,15 +80,17 @@ menu_dats_view::menu_dats_view(mame_ui_manager &mui, render_container &container { if (swinfo != nullptr && !swinfo->usage.empty()) m_items_list.emplace_back(_("Software Usage"), 0, ""); - const char *lua_list = mame_machine_manager::instance()->lua()->call_plugin(std::string(m_short).append(1, ',').append(m_list).c_str(), "data_list"); - if(lua_list) + std::string lua_list; + if(mame_machine_manager::instance()->lua()->call_plugin("data_list", std::string(m_short).append(1, ',').append(m_list).c_str(), lua_list)) { std::string list(lua_list); char *token = strtok((char *)list.c_str(), ","); int count = 1; while(token) { - m_items_list.emplace_back(_(token), count, mame_machine_manager::instance()->lua()->call_plugin(util::string_format("%d", count - 1).c_str(), "data_version")); + std::string item; + mame_machine_manager::instance()->lua()->call_plugin("data_version", util::string_format("%d", count - 1).c_str(), item); + m_items_list.emplace_back(_(token), count, item); count++; token = strtok(nullptr, ","); } @@ -390,7 +394,8 @@ void menu_dats_view::custom_render(void *selectedref, float top, float bottom, f void menu_dats_view::get_data() { std::vector xstart, xend; - std::string buffer(mame_machine_manager::instance()->lua()->call_plugin(util::string_format("%d", m_items_list[m_actual].option).c_str(), "data")); + std::string buffer; + mame_machine_manager::instance()->lua()->call_plugin("data", util::string_format("%d", m_items_list[m_actual].option).c_str(), buffer); auto lines = ui().wrap_text(container(), buffer.c_str(), 0.0f, 0.0f, 1.0f - (4.0f * UI_BOX_LR_BORDER), xstart, xend); @@ -409,7 +414,7 @@ void menu_dats_view::get_data_sw() if (m_items_list[m_actual].option == 0) buffer = m_swinfo->usage; else - buffer = mame_machine_manager::instance()->lua()->call_plugin(util::string_format("%d", m_items_list[m_actual].option - 1).c_str(), "data"); + mame_machine_manager::instance()->lua()->call_plugin("data", util::string_format("data", "%d", m_items_list[m_actual].option - 1).c_str(), buffer); auto lines = ui().wrap_text(container(), buffer.c_str(), 0.0f, 0.0f, 1.0f - (4.0f * UI_BOX_LR_BORDER), xstart, xend); for (int x = 0; x < lines; ++x) diff --git a/src/frontend/mame/ui/mainmenu.cpp b/src/frontend/mame/ui/mainmenu.cpp index 61f8fef7764..d0f0cb50d14 100644 --- a/src/frontend/mame/ui/mainmenu.cpp +++ b/src/frontend/mame/ui/mainmenu.cpp @@ -130,7 +130,7 @@ void menu_main::populate() item_append(_("Plugin Options"), "", 0, (void *)PLUGINS); // add dats menu - if (mame_machine_manager::instance()->lua()->call_plugin("", "data_list")) + if (mame_machine_manager::instance()->lua()->call_plugin_check("data_list", "")) item_append(_("External DAT View"), "", 0, (void *)EXTERNAL_DATS); item_append(menu_item_type::SEPARATOR); diff --git a/src/frontend/mame/ui/selgame.cpp b/src/frontend/mame/ui/selgame.cpp index 8a471c2a76f..fa6d4c7ac67 100644 --- a/src/frontend/mame/ui/selgame.cpp +++ b/src/frontend/mame/ui/selgame.cpp @@ -347,7 +347,7 @@ void menu_select_game::handle() if (!isfavorite()) { const game_driver *driver = (const game_driver *)menu_event->itemref; - if ((uintptr_t)driver > skip_main_items && mame_machine_manager::instance()->lua()->call_plugin(driver->name, "data_list")) + if ((uintptr_t)driver > skip_main_items && mame_machine_manager::instance()->lua()->call_plugin_check("data_list", driver->name)) menu::stack_push(ui(), container(), driver); } else @@ -356,10 +356,10 @@ void menu_select_game::handle() if ((uintptr_t)ui_swinfo > skip_main_items) { - if (ui_swinfo->startempty == 1 && mame_machine_manager::instance()->lua()->call_plugin(ui_swinfo->driver->name, "data_list")) + if (ui_swinfo->startempty == 1 && mame_machine_manager::instance()->lua()->call_plugin_check("data_list", ui_swinfo->driver->name)) menu::stack_push(ui(), container(), ui_swinfo->driver); - else if (mame_machine_manager::instance()->lua()->call_plugin(std::string(ui_swinfo->shortname).append(1, ',').append(ui_swinfo->listname).c_str(), "data_list") || !ui_swinfo->usage.empty()) - menu::stack_push(ui(), container(), ui_swinfo); + else if (mame_machine_manager::instance()->lua()->call_plugin_check("data_list", std::string(ui_swinfo->shortname).append(1, ',').append(ui_swinfo->listname).c_str()) || !ui_swinfo->usage.empty()) + menu::stack_push(ui(), container(), ui_swinfo); } } } diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp index 98fa5590e69..d70e31490db 100644 --- a/src/frontend/mame/ui/selmenu.cpp +++ b/src/frontend/mame/ui/selmenu.cpp @@ -1913,12 +1913,12 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2, ui_globals::cur_sw_dats_view = 0; ui_globals::cur_sw_dats_total = 1; - const char *lua_list = mame_machine_manager::instance()->lua()->call_plugin(std::string(software->shortname).append(1, ',').append(software->listname).c_str(), "data_list"); + std::string lua_list; + mame_machine_manager::instance()->lua()->call_plugin("data_list", std::string(software->shortname).append(1, ',').append(software->listname).c_str(), lua_list); m_items_list.clear(); - if(lua_list) + if(lua_list.length()) { - std::string list(lua_list); - char *token = strtok((char *)list.c_str(), ","); + char *token = strtok((char *)lua_list.c_str(), ","); while(token) { ui_globals::cur_sw_dats_total++; @@ -1931,7 +1931,10 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2, if (m_info_view == 0) m_info_buffer = software->usage; else - m_info_buffer = mame_machine_manager::instance()->lua()->call_plugin(util::string_format("%d", m_info_view - 1).c_str(), "data"); + { + m_info_buffer = ""; + mame_machine_manager::instance()->lua()->call_plugin("data", util::string_format("%d", m_info_view - 1).c_str(), m_info_buffer); + } } total = ui_globals::cur_sw_dats_total; } @@ -1954,12 +1957,12 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2, ui_globals::curdats_view = 0; ui_globals::curdats_total = 1; - const char *lua_list = mame_machine_manager::instance()->lua()->call_plugin(driver->name, "data_list"); + std::string lua_list; + mame_machine_manager::instance()->lua()->call_plugin("data_list", driver->name, lua_list); m_items_list.clear(); - if(lua_list) + if(lua_list.length()) { - std::string list(lua_list); - char *token = strtok((char *)list.c_str(), ","); + char *token = strtok((char *)lua_list.c_str(), ","); while(token) { ui_globals::curdats_total++; @@ -1972,7 +1975,10 @@ void menu_select_launch::infos_render(float origx1, float origy1, float origx2, if (m_info_view == 0) general_info(driver, m_info_buffer); else - m_info_buffer = mame_machine_manager::instance()->lua()->call_plugin(util::string_format("%d", m_info_view - 1).c_str(), "data"); + { + m_info_buffer = ""; + mame_machine_manager::instance()->lua()->call_plugin("data", util::string_format("%d", m_info_view - 1).c_str(), m_info_buffer); + } } total = ui_globals::curdats_total; } diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp index 8556f29dc2f..807061887e4 100644 --- a/src/frontend/mame/ui/selsoft.cpp +++ b/src/frontend/mame/ui/selsoft.cpp @@ -247,9 +247,9 @@ void menu_select_software::handle() // handle UI_DATS ui_software_info *ui_swinfo = (ui_software_info *)menu_event->itemref; - if (ui_swinfo->startempty == 1 && mame_machine_manager::instance()->lua()->call_plugin(ui_swinfo->driver->name, "data_list")) + if (ui_swinfo->startempty == 1 && mame_machine_manager::instance()->lua()->call_plugin_check("data_list", ui_swinfo->driver->name)) menu::stack_push(ui(), container(), ui_swinfo->driver); - else if (mame_machine_manager::instance()->lua()->call_plugin(std::string(ui_swinfo->shortname).append(1, ',').append(ui_swinfo->listname).c_str(), "data_list") || !ui_swinfo->usage.empty()) + else if (mame_machine_manager::instance()->lua()->call_plugin_check("data_list", std::string(ui_swinfo->shortname).append(1, ',').append(ui_swinfo->listname).c_str()) || !ui_swinfo->usage.empty()) menu::stack_push(ui(), container(), ui_swinfo); } else if (menu_event->iptkey == IPT_UI_LEFT_PANEL)