summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame/luaengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/luaengine.cpp')
-rw-r--r--src/frontend/mame/luaengine.cpp244
1 files changed, 112 insertions, 132 deletions
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index e0660cb8e5b..9fbaa272d79 100644
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -88,125 +88,104 @@ namespace sol
};
template<>
struct is_container<core_options> : std::false_type {}; // don't convert core_optons to a table directly
- namespace stack
+ sol::buffer *sol_lua_get(sol::types<buffer *>, lua_State *L, int index, sol::stack::record &tracking)
{
- template <>
- struct pusher<osd_file::error>
- {
- static int push(lua_State *L, osd_file::error error)
- {
- const char *strerror;
- switch(error)
- {
- case osd_file::error::NONE:
- return stack::push(L, sol::nil);
- case osd_file::error::FAILURE:
- strerror = "failure";
- break;
- case osd_file::error::OUT_OF_MEMORY:
- strerror = "out_of_memory";
- break;
- case osd_file::error::NOT_FOUND:
- strerror = "not_found";
- break;
- case osd_file::error::ACCESS_DENIED:
- strerror = "access_denied";
- break;
- case osd_file::error::ALREADY_OPEN:
- strerror = "already_open";
- break;
- case osd_file::error::TOO_MANY_FILES:
- strerror = "too_many_files";
- break;
- case osd_file::error::INVALID_DATA:
- strerror = "invalid_data";
- break;
- case osd_file::error::INVALID_ACCESS:
- strerror = "invalid_access";
- break;
- default:
- strerror = "unknown_error";
- break;
- }
- return stack::push(L, strerror);
- }
- };
- template <>
- struct checker<sol::buffer *>
- {
- template <typename Handler>
- static bool check (lua_State* L, int index, Handler&& handler, record& tracking)
- {
- return stack::check<int>(L, index, handler);
- }
- };
- template <>
- struct getter<sol::buffer *>
- {
- static sol::buffer *get(lua_State* L, int index, record& tracking)
- {
- return new sol::buffer(stack::get<int>(L, index), L);
- }
- };
- template <>
- struct pusher<sol::buffer *>
- {
- static int push(lua_State* L, sol::buffer *buff)
- {
- delete buff;
- return 1;
- }
- };
- template <>
- struct pusher<map_handler_type>
- {
- static int push(lua_State *L, map_handler_type type)
- {
- const char *typestr;
- switch(type)
- {
- case AMH_NONE:
- typestr = "none";
- break;
- case AMH_RAM:
- typestr = "ram";
- break;
- case AMH_ROM:
- typestr = "rom";
- break;
- case AMH_NOP:
- typestr = "nop";
- break;
- case AMH_UNMAP:
- typestr = "unmap";
- break;
- case AMH_DEVICE_DELEGATE:
- case AMH_DEVICE_DELEGATE_M:
- case AMH_DEVICE_DELEGATE_S:
- case AMH_DEVICE_DELEGATE_SM:
- case AMH_DEVICE_DELEGATE_MO:
- case AMH_DEVICE_DELEGATE_SMO:
- typestr = "delegate";
- break;
- case AMH_PORT:
- typestr = "port";
- break;
- case AMH_BANK:
- typestr = "bank";
- break;
- case AMH_DEVICE_SUBMAP:
- typestr = "submap";
- break;
- default:
- typestr = "unknown";
- break;
- }
- return stack::push(L, typestr);
- }
- };
+ return new sol::buffer(stack::get<int>(L, index), L);
+ }
+ int sol_lua_push(sol::types<buffer *>, lua_State *L, buffer *value)
+ {
+ delete value;
+ return 1;
}
}
+int sol_lua_push(sol::types<osd_file::error>, lua_State *L, osd_file::error &&value)
+{
+ const char *strerror;
+ switch(value)
+ {
+ case osd_file::error::NONE:
+ return sol::stack::push(L, sol::nil);
+ case osd_file::error::FAILURE:
+ strerror = "failure";
+ break;
+ case osd_file::error::OUT_OF_MEMORY:
+ strerror = "out_of_memory";
+ break;
+ case osd_file::error::NOT_FOUND:
+ strerror = "not_found";
+ break;
+ case osd_file::error::ACCESS_DENIED:
+ strerror = "access_denied";
+ break;
+ case osd_file::error::ALREADY_OPEN:
+ strerror = "already_open";
+ break;
+ case osd_file::error::TOO_MANY_FILES:
+ strerror = "too_many_files";
+ break;
+ case osd_file::error::INVALID_DATA:
+ strerror = "invalid_data";
+ break;
+ case osd_file::error::INVALID_ACCESS:
+ strerror = "invalid_access";
+ break;
+ default:
+ strerror = "unknown_error";
+ break;
+ }
+ return sol::stack::push(L, strerror);
+}
+
+template <typename Handler>
+bool sol_lua_check(sol::types<osd_file::error>, lua_State *L, int index, Handler &&handler, sol::stack::record &tracking)
+{
+ return sol::stack::check<int>(L, index, std::forward<Handler>(handler));
+}
+
+int sol_lua_push(sol::types<map_handler_type>, lua_State *L, map_handler_type &&value)
+{
+ const char *typestr;
+ switch(value)
+ {
+ case AMH_NONE:
+ typestr = "none";
+ break;
+ case AMH_RAM:
+ typestr = "ram";
+ break;
+ case AMH_ROM:
+ typestr = "rom";
+ break;
+ case AMH_NOP:
+ typestr = "nop";
+ break;
+ case AMH_UNMAP:
+ typestr = "unmap";
+ break;
+ case AMH_DEVICE_DELEGATE:
+ case AMH_DEVICE_DELEGATE_M:
+ case AMH_DEVICE_DELEGATE_S:
+ case AMH_DEVICE_DELEGATE_SM:
+ case AMH_DEVICE_DELEGATE_MO:
+ case AMH_DEVICE_DELEGATE_SMO:
+ typestr = "delegate";
+ break;
+ case AMH_PORT:
+ typestr = "port";
+ break;
+ case AMH_BANK:
+ typestr = "bank";
+ break;
+ case AMH_DEVICE_SUBMAP:
+ typestr = "submap";
+ break;
+ default:
+ typestr = "unknown";
+ break;
+ }
+ return sol::stack::push(L, typestr);
+}
namespace
{
@@ -1966,7 +1945,7 @@ void lua_engine::initialize()
return port_table;
}));
ioport_manager_type.set("type_seq", [](ioport_manager &m, ioport_type type, int player, input_seq_type seqtype) {
- return sol::make_user(m.type_seq(type, player, seqtype));
+ return sol::make_user(input_seq(m.type_seq(type, player, seqtype)));
});
sol().registry().set("ioport", ioport_manager_type);
@@ -2080,7 +2059,7 @@ void lua_engine::initialize()
auto ioport_field_type = sol().registry().new_usertype<ioport_field>("new", sol::no_constructor);
ioport_field_type.set("set_value", &ioport_field::set_value);
- ioport_field_type.set("set_input_seq", [](ioport_field &f, const std::string &seq_type_string, sol::user<input_seq> seq) {
+ ioport_field_type.set("set_input_seq", [](ioport_field &f, const std::string &seq_type_string, const input_seq &seq) {
input_seq_type seq_type = s_seq_type_parser(seq_type_string);
ioport_field::user_settings settings;
f.get_user_settings(settings);
@@ -2089,15 +2068,15 @@ void lua_engine::initialize()
});
ioport_field_type.set("input_seq", [](ioport_field &f, const std::string &seq_type_string) {
input_seq_type seq_type = s_seq_type_parser(seq_type_string);
- return sol::make_user(f.seq(seq_type));
+ return sol::make_user(input_seq(f.seq(seq_type)));
});
- ioport_field_type.set("set_default_input_seq", [](ioport_field &f, const std::string &seq_type_string, sol::user<input_seq> seq) {
+ ioport_field_type.set("set_default_input_seq", [](ioport_field &f, const std::string &seq_type_string, const input_seq &seq) {
input_seq_type seq_type = s_seq_type_parser(seq_type_string);
f.set_defseq(seq_type, seq);
});
ioport_field_type.set("default_input_seq", [](ioport_field &f, const std::string &seq_type_string) {
input_seq_type seq_type = s_seq_type_parser(seq_type_string);
- return sol::make_user(f.defseq(seq_type));
+ return sol::make_user(input_seq(f.defseq(seq_type)));
});
ioport_field_type.set("keyboard_codes", [this](ioport_field &f, int which) {
sol::table result = sol().create_table();
@@ -2316,14 +2295,14 @@ void lua_engine::initialize()
auto input_type = sol().registry().new_usertype<input_manager>("new", sol::no_constructor);
input_type.set("code_from_token", [](input_manager &input, const char *token) { return sol::make_user(input.code_from_token(token)); });
- input_type.set("code_pressed", [](input_manager &input, sol::user<input_code> code) { return input.code_pressed(code); });
- input_type.set("code_to_token", [](input_manager &input, sol::user<input_code> code) { return input.code_to_token(code); });
- input_type.set("code_name", [](input_manager &input, sol::user<input_code> code) { return input.code_name(code); });
- input_type.set("seq_from_tokens", [](input_manager &input, const char *tokens) { input_seq seq; input.seq_from_tokens(seq, tokens); return sol::make_user(seq); });
- input_type.set("seq_pressed", [](input_manager &input, sol::user<input_seq> seq) { return input.seq_pressed(seq); });
- input_type.set("seq_to_tokens", [](input_manager &input, sol::user<input_seq> seq) { return input.seq_to_tokens(seq); });
- input_type.set("seq_name", [](input_manager &input, sol::user<input_seq> seq) { return input.seq_name(seq); });
- input_type.set("seq_clean", [](input_manager &input, sol::user<input_seq> seq) { input_seq cleaned_seq = input.seq_clean(seq); return sol::make_user(cleaned_seq); });
+ input_type.set("code_pressed", [](input_manager &input, const input_code &code) { return input.code_pressed(code); });
+ input_type.set("code_to_token", [](input_manager &input, const input_code &code) { return input.code_to_token(code); });
+ input_type.set("code_name", [](input_manager &input, const input_code &code) { return input.code_name(code); });
+ input_type.set("seq_from_tokens", [](input_manager &input, const char *tokens) { input_seq seq; input.seq_from_tokens(seq, tokens); return sol::make_user(std::move(seq)); });
+ input_type.set("seq_pressed", [](input_manager &input, const input_seq &seq) { return input.seq_pressed(seq); });
+ input_type.set("seq_to_tokens", [](input_manager &input, const input_seq &seq) { return input.seq_to_tokens(seq); });
+ input_type.set("seq_name", [](input_manager &input, const input_seq &seq) { return input.seq_name(seq); });
+ input_type.set("seq_clean", [](input_manager &input, const input_seq &seq) { return sol::make_user(input.seq_clean(seq)); });
input_type.set("seq_poll_start", [this](input_manager &input, const char *cls_string, sol::object seq) {
if (!m_seq_poll)
m_seq_poll.reset(new input_sequence_poller(input));
@@ -2353,7 +2332,7 @@ void lua_engine::initialize()
input_type.set("seq_poll_final", [this](input_manager &input) -> sol::object {
if (!m_seq_poll)
return sol::make_object(sol(), sol::nil);
- return sol::make_object(sol(), sol::make_user(m_seq_poll->valid() ? m_seq_poll->sequence() : input_seq()));
+ return sol::make_object(sol(), sol::make_user(m_seq_poll->valid() ? input_seq(m_seq_poll->sequence()) : input_seq()));
});
input_type.set("seq_poll_modified", [this](input_manager &input) -> sol::object {
if (!m_seq_poll)
@@ -2368,7 +2347,7 @@ void lua_engine::initialize()
input_type.set("seq_poll_sequence", [this](input_manager &input) -> sol::object {
if (!m_seq_poll)
return sol::make_object(sol(), sol::nil);
- return sol::make_object(sol(), sol::make_user(m_seq_poll->sequence()));
+ return sol::make_object(sol(), sol::make_user(input_seq(m_seq_poll->sequence())));
});
input_type.set("device_classes", sol::property([this](input_manager &input) {
sol::table result = sol().create_table();
@@ -2449,7 +2428,7 @@ void lua_engine::initialize()
input_device_item_type.set("token", sol::property(&input_device_item::token));
input_device_item_type.set("code", [](input_device_item &item) {
input_code code(item.device().devclass(), item.device().devindex(), item.itemclass(), ITEM_MODIFIER_NONE, item.itemid());
- return sol::make_user(code);
+ return sol::make_user(std::move(code));
});
sol().registry().set("input_device_item", input_device_item_type);
@@ -2974,7 +2953,8 @@ void lua_engine::initialize()
image_type.set("create", [](device_image_interface &di, const std::string &filename) { return di.create(filename); });
image_type.set("crc", &device_image_interface::crc);
image_type.set("display", [](device_image_interface &di) { return di.call_display(); });
- image_type.set("device", sol::property(static_cast<const device_t &(device_image_interface::*)() const>(&device_image_interface::device)));
+ // FIXME: the next line is causing sol3 to try instantiating device_t for some reason
+ //image_type.set("device", sol::property(static_cast<const device_t & (device_image_interface::*)() const>(&device_image_interface::device));
image_type.set("instance_name", sol::property(&device_image_interface::instance_name));
image_type.set("brief_instance_name", sol::property(&device_image_interface::brief_instance_name));
image_type.set("is_readable", sol::property(&device_image_interface::is_readable));