Lua: Don't lua_error() out of context with pending dtors
[lsnes.git] / src / lua / hostmemory.cpp
blob41ba7973eda16c3ae9c7efdde6591d9deb61f80c
1 #include "lua/internal.hpp"
2 #include "core/instance.hpp"
3 #include "core/moviedata.hpp"
4 #include "library/serialization.hpp"
5 #include "library/int24.hpp"
7 namespace
9 template<typename S>
10 int do_read(lua::state& L, lua::parameters& P)
12 size_t address;
14 P(address);
16 auto& h = CORE().mlogic->get_mfile().host_memory;
17 if(address + sizeof(S) > h.size()) {
18 L.pushboolean(0);
19 return 1;
21 L.pushnumber(serialization::read_endian<S>(&h[address], 1));
22 return 1;
25 template<typename S>
26 int do_write(lua::state& L, lua::parameters& P)
28 size_t address;
29 S value;
31 P(address, value);
33 auto& h = CORE().mlogic->get_mfile().host_memory;
34 if(address + sizeof(S) > h.size())
35 h.resize(address + sizeof(S));
36 serialization::write_endian<S>(&h[address], value, 1);
37 return 0;
40 lua::functions LUA_hostops_fns(lua_func_misc, "hostmemory", {
41 {"read", do_read<uint8_t>},
42 {"write", do_write<uint8_t>},
43 {"readbyte", do_read<uint8_t>},
44 {"writebyte", do_write<uint8_t>},
45 {"readsbyte", do_read<int8_t>},
46 {"writesbyte", do_write<int8_t>},
47 {"readword", do_read<uint16_t>},
48 {"writeword", do_write<uint16_t>},
49 {"readsword", do_read<int16_t>},
50 {"writesword", do_write<int16_t>},
51 {"readhword", do_read<ss_uint24_t>},
52 {"writehword", do_write<ss_uint24_t>},
53 {"readshword", do_read<ss_int24_t>},
54 {"writeshword", do_write<ss_int24_t>},
55 {"readdword", do_read<uint32_t>},
56 {"writedword", do_write<uint32_t>},
57 {"readsdword", do_read<int32_t>},
58 {"writesdword", do_write<int32_t>},
59 {"readqword", do_read<uint64_t>},
60 {"writeqword", do_write<uint64_t>},
61 {"readsqword", do_read<int64_t>},
62 {"writesqword", do_write<int64_t>},
63 {"readfloat", do_read<float>},
64 {"writefloat", do_write<float>},
65 {"readdouble", do_read<double>},
66 {"writedouble", do_write<double>},
67 });