Lua: Deprecate global addresses

These are a frequent source of bugs in Lua scripts, so deprecate those.
This commit is contained in:
Ilari Liusvaara 2014-04-21 16:16:55 +03:00
parent ceed4f622f
commit c594082dfa
4 changed files with 65 additions and 57 deletions

View file

@ -253,6 +253,10 @@ public:
* Table tag.
*/
table_parameter_tag& table(int& fnidx) { return *new table_parameter_tag(fnidx); }
/**
* Get Lua state.
*/
state& get_state() { return L; }
private:
state& L;
std::string fname;

103
lua.lyx
View file

@ -415,10 +415,6 @@ Create a new MMAP_STRUCT (with no mappings) and return it.
operator(): Bind key in mmap structure
\end_layout
\begin_layout Itemize
Syntax: obj(key, address, type)
\end_layout
\begin_layout Itemize
Syntax: obj(key, marea, address, type)
\end_layout
@ -3611,11 +3607,11 @@ Static function new: Create a checker
\end_layout
\begin_layout Itemize
Syntax: handle classes.COMPARE_OBJ.new([marea], offset, size, [rows, stride])
Syntax: handle classes.COMPARE_OBJ.new(marea, offset, size, [rows, stride])
\end_layout
\begin_layout Itemize
Syntax: handle memory.compare_new([marea], offset, size, rows, stride)
Syntax: handle memory.compare_new(marea, offset, size, rows, stride)
\end_layout
\begin_layout Standard
@ -3624,7 +3620,6 @@ Parameters:
\begin_layout Itemize
marea: string: The memory area to interpret <offset> against.
Default is global space.
\end_layout
\begin_layout Itemize
@ -6676,43 +6671,43 @@ memory.read{,s}{byte,{,h,d,q}word}: Read memory
\end_layout
\begin_layout Itemize
Syntax: none memory.readbyte([string marea, ]number address)
Syntax: none memory.readbyte(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readword([string marea, ]number address)
Syntax: none memory.readword(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readhword([string marea, ]number address)
Syntax: none memory.readhword(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readdword([string marea, ]number address)
Syntax: none memory.readdword(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readqword([string marea, ]number address)
Syntax: none memory.readqword(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readsbyte([string marea, ]number address)
Syntax: none memory.readsbyte(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readsword([string marea, ]number address)
Syntax: none memory.readsword(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readshword([string marea, ]number address)
Syntax: none memory.readshword(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readsdword([string marea, ]number address)
Syntax: none memory.readsdword(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readsqword([string marea, ]number address)
Syntax: none memory.readsqword(string marea, number address)
\end_layout
\begin_layout Standard
@ -6788,11 +6783,11 @@ memory.read{float,double}: Read memory
\end_layout
\begin_layout Itemize
Syntax: none memory.readfloat([string marea, ]number address)
Syntax: none memory.readfloat(string marea, number address)
\end_layout
\begin_layout Itemize
Syntax: none memory.readdouble([string marea, ]number address)
Syntax: none memory.readdouble(string marea, number address)
\end_layout
\begin_layout Standard
@ -6804,31 +6799,31 @@ memory.write{byte,{,h,d,q}word,float,double}: Write memory
\end_layout
\begin_layout Itemize
Syntax: none memory.writebyte([string marea, ]number address, number value)
Syntax: none memory.writebyte(string marea, number address, number value)
\end_layout
\begin_layout Itemize
Syntax: none memory.writeword([string marea, ]number address, number value)
Syntax: none memory.writeword(string marea, number address, number value)
\end_layout
\begin_layout Itemize
Syntax: none memory.writehword([string marea, ]number address, number value)
Syntax: none memory.writehword(string marea, number address, number value)
\end_layout
\begin_layout Itemize
Syntax: none memory.writedword([string marea, ]number address, number value)
Syntax: none memory.writedword(string marea, number address, number value)
\end_layout
\begin_layout Itemize
Syntax: none memory.writeqword([string marea, ]number address, number value)
Syntax: none memory.writeqword(string marea, number address, number value)
\end_layout
\begin_layout Itemize
Syntax: none memory.writefloat([string marea, ]number address, number value)
Syntax: none memory.writefloat(string marea, number address, number value)
\end_layout
\begin_layout Itemize
Syntax: none memory.writedouble([string marea, ]number address, number value)
Syntax: none memory.writedouble(string marea, number address, number value)
\end_layout
\begin_layout Standard
@ -6841,12 +6836,11 @@ memory.map{{,s}{byte,{,h,d,q}word},float,double}: Map an array
\end_layout
\begin_layout Itemize
Syntax: userdata memory.map<type>([[string marea, ]number base, number size])
Syntax: userdata memory.map<type>(string marea, number base, number size)
\end_layout
\begin_layout Standard
Returns a table mapping specified memory aperture for read/write.
If parameters are omitted, entiere map space is the aperture.
\end_layout
\begin_layout Itemize
@ -6859,7 +6853,7 @@ memory.hash_region: Hash region of memory
\end_layout
\begin_layout Itemize
Syntax: string memory.hash_region([string marea, ]number base, number size)
Syntax: string memory.hash_region(string marea, number base, number size)
\end_layout
\begin_layout Standard
@ -6872,7 +6866,7 @@ memory.hash_region2: Hash region of memory
\end_layout
\begin_layout Itemize
Syntax: string memory.hash_region2([string marea, ]number base, number size[,
Syntax: string memory.hash_region2(string marea, number base, number size[,
number rows, number stride])
\end_layout
@ -6887,7 +6881,7 @@ memory.hash_region_skein: Hash region of memory
\end_layout
\begin_layout Itemize
Syntax: string memory.hash_region_skein([string marea, ]number base, number
Syntax: string memory.hash_region_skein(string marea, number base, number
size[, number rows, number stride])
\end_layout
@ -6901,7 +6895,7 @@ memory.store: Store region of memory
\end_layout
\begin_layout Itemize
Syntax: none memory.store([string marea, ]number addr, number daddr[, number
Syntax: none memory.store(string marea, number addr, number daddr[, number
rows, number stride]
\end_layout
@ -6917,8 +6911,8 @@ memory.storecmp: Compare and store region of memory
\end_layout
\begin_layout Itemize
Syntax: bool memory.storecmp([string marea, ]number addr, number daddr[,
number rows, number stride]
Syntax: bool memory.storecmp(string marea, number addr, number daddr[, number
rows, number stride]
\end_layout
\begin_layout Standard
@ -6945,7 +6939,7 @@ memory.readregion: Read region of memory
\end_layout
\begin_layout Itemize
Syntax: table memory.readregion([string marea, ]number base, number size)
Syntax: table memory.readregion(string marea, number base, number size)
\end_layout
\begin_layout Standard
@ -6961,8 +6955,8 @@ memory.writeregion: Write region of memory
\end_layout
\begin_layout Itemize
Syntax: none memory.writeregion([string marea, ]number base, number size,
table data)
Syntax: none memory.writeregion(string marea, number base, number size, table
data)
\end_layout
\begin_layout Standard
@ -7047,40 +7041,36 @@ memory.{,un}register{read,write,exec}: (Un)Register read / write / execute
\end_layout
\begin_layout Itemize
Syntax: function memory.registerread([string marea, ] number addr, function
Syntax: function memory.registerread(string marea, number addr, function
fn);
\end_layout
\begin_layout Itemize
Syntax: function memory.registerwrite([string marea, ] number addr, function
Syntax: function memory.registerwrite(string marea, number addr, function
fn);
\end_layout
\begin_layout Itemize
Syntax: function memory.registerexec([string marea, ] number addr, function
Syntax: function memory.registerexec(string marea, number addr, function
fn);
\end_layout
\begin_layout Itemize
Syntax: none memory.unregisterread([string marea, ] number addr, function
fn);
Syntax: none memory.unregisterread(string marea, number addr, function fn);
\end_layout
\begin_layout Itemize
Syntax: none memory.unregisterwrite([string marea, ] number addr, function
fn);
Syntax: none memory.unregisterwrite(string marea, number addr, function fn);
\end_layout
\begin_layout Itemize
Syntax: none memory.unregisterexec([string marea, ] number addr, function
fn);
Syntax: none memory.unregisterexec(string marea, number addr, function fn);
\end_layout
\begin_layout Standard
Add or remove callback on memory read, write or execute (depending on the
function).
If <marea> is specified, <addr> is relative to it, otherwise <addr> is
global.
<addr> is relative to <marea>.
<fn> is the callback.
The register* functions return <fn> (which can then be passed to unregister*
functions.
@ -7121,16 +7111,15 @@ memory.cheat: Set cheat
\end_layout
\begin_layout Itemize
Syntax: none memory.cheat([string marea, ] number addr, number value);
Syntax: none memory.cheat(string marea, number addr, number value);
\end_layout
\begin_layout Itemize
Syntax: none memory.cheat([string marea, ] number addr);
Syntax: none memory.cheat(string marea, number addr);
\end_layout
\begin_layout Standard
Set or clear cheat (value <value>) on address <addr>.
If <marea> is specified, <addr> is relative to that.
Set or clear cheat (value <value>) on address <addr> (relative to <marea>).
If <value> is not speicified, clear a cheat.
\end_layout
@ -7650,7 +7639,7 @@ bsnes.dump_sprite: Dump a sprite
\end_layout
\begin_layout Itemize
Syntax: BITMAP bsnes.dump_sprite([string marea, ] number addr, number width,
Syntax: BITMAP bsnes.dump_sprite(string marea, number addr, number width,
number height[, number stride])
\end_layout
@ -7674,7 +7663,7 @@ bsnes.dump_palette: Dump a palette
\end_layout
\begin_layout Itemize
Syntax: PALETTE bsnes.dump_palette([string marea, ] number addr, bool full256,
Syntax: PALETTE bsnes.dump_palette(string marea, number addr, bool full256,
bool first_trans)
\end_layout
@ -7710,7 +7699,7 @@ bsnes.redump_sprite: Redump a sprite
\end_layout
\begin_layout Itemize
Syntax: none bsnes.redump_sprite(BITMAP bitmap, [string marea, ] number addr[,
Syntax: none bsnes.redump_sprite(BITMAP bitmap, string marea, number addr[,
number stride])
\end_layout
@ -7724,8 +7713,8 @@ bsnes.redump_palette: Redump a palette
\end_layout
\begin_layout Itemize
Syntax: none bsnes.dump_palette(PALETTE pal, [string marea, ] number addr,
bool first_trans)
Syntax: none bsnes.dump_palette(PALETTE pal, string marea, number addr, bool
first_trans)
\end_layout
\begin_layout Standard

BIN
lua.pdf

Binary file not shown.

View file

@ -23,9 +23,16 @@ uint64_t lua_get_vmabase(const std::string& vma)
uint64_t lua_get_read_address(lua::parameters& P)
{
static std::map<std::string, char> deprecation_keys;
char* deprecation = &deprecation_keys[P.get_fname()];
uint64_t vmabase = 0;
if(P.is_string())
vmabase = lua_get_vmabase(P.arg<std::string>());
else {
//Deprecated.
if(P.get_state().do_once(deprecation))
messages << P.get_fname() << ": Global memory form is deprecated." << std::endl;
}
auto addr = P.arg<uint64_t>();
return addr + vmabase;
}
@ -372,6 +379,9 @@ namespace
int lua_mmap_memory(lua::state& L, lua::parameters& P)
{
if(P.is_novalue()) {
static char deprecation;
if(L.do_once(&deprecation))
messages << P.get_fname() << ": Mapping entiere space is deprecated." << std::endl;
aperture_make_fun<T, rfun, wfun>(L.get_master(), 0, 0xFFFFFFFFFFFFFFFFULL);
return 1;
}
@ -415,10 +425,12 @@ namespace
template<bool write, bool sign> int memory_scattergather(lua::state& L, lua::parameters& P)
{
static char deprecation;
uint64_t val = 0;
unsigned shift = 0;
uint64_t addr = 0;
uint64_t vmabase = 0;
bool have_vmabase = false;
if(write)
val = P.arg<uint64_t>();
while(P.more()) {
@ -429,9 +441,12 @@ namespace
addr--;
} else if(P.is_string()) {
vmabase = lua_get_vmabase(P.arg<std::string>());
have_vmabase = true;
continue;
} else
addr = P.arg<uint64_t>();
if(!have_vmabase && L.do_once(&deprecation))
messages << P.get_fname() << ": Global memory form is deprecated." << std::endl;
if(write)
lsnes_memory.write<uint8_t>(addr + vmabase, val >> shift);
else