mirror of
https://github.com/holub/mame
synced 2025-04-29 19:37:17 +03:00

Compile Lua as C++. When Lua is compiled as C, it uses setjmp/longjmp for error handling, resulting in failure to unwind intermediate stack frames. Trying to ensure no objects with non-trivial destructors are in scope when raising a Lua error is error-prone. In particular, converting an exception to a Lua error becomes convoluted, and raising a Lua error from a constructor is effectively impossible. Updated Lua to 5.4.4 - this includes a brand-new garbage collector implementation with better performance. The main thing removed is the deprecated bitlib. Updated sol2 to version 3.3.0 - this adds support for Lua 5.4 and fixes a number of issues, including not correctly handling errors when Lua is built as C++. Updated LuaFileSystem to version 1.8.0 - this adds support for symbolic links on Windows, as well as Lua 5.4 compatibility. Updated LuaSQLite3 to version 0.9.5 - this fixes issues in multi-threaded environments, as well as Lua 5.4 compatibility. Fixed double-free after attempting to construct a debugger expression from Lua with an invalid string, and exposed expression error to Lua in a better way. Added warning level print function to Lua. Fixed saving cheats with shift operators in expressions, although this code isn't actually used as there's no cheat editor.
137 lines
4.3 KiB
C
137 lines
4.3 KiB
C
/*
|
|
** $Id: lvm.h $
|
|
** Lua virtual machine
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#ifndef lvm_h
|
|
#define lvm_h
|
|
|
|
|
|
#include "ldo.h"
|
|
#include "lobject.h"
|
|
#include "ltm.h"
|
|
|
|
|
|
#if !defined(LUA_NOCVTN2S)
|
|
#define cvt2str(o) ttisnumber(o)
|
|
#else
|
|
#define cvt2str(o) 0 /* no conversion from numbers to strings */
|
|
#endif
|
|
|
|
|
|
#if !defined(LUA_NOCVTS2N)
|
|
#define cvt2num(o) ttisstring(o)
|
|
#else
|
|
#define cvt2num(o) 0 /* no conversion from strings to numbers */
|
|
#endif
|
|
|
|
|
|
/*
|
|
** You can define LUA_FLOORN2I if you want to convert floats to integers
|
|
** by flooring them (instead of raising an error if they are not
|
|
** integral values)
|
|
*/
|
|
#if !defined(LUA_FLOORN2I)
|
|
#define LUA_FLOORN2I F2Ieq
|
|
#endif
|
|
|
|
|
|
/*
|
|
** Rounding modes for float->integer coercion
|
|
*/
|
|
typedef enum {
|
|
F2Ieq, /* no rounding; accepts only integral values */
|
|
F2Ifloor, /* takes the floor of the number */
|
|
F2Iceil /* takes the ceil of the number */
|
|
} F2Imod;
|
|
|
|
|
|
/* convert an object to a float (including string coercion) */
|
|
#define tonumber(o,n) \
|
|
(ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n))
|
|
|
|
|
|
/* convert an object to a float (without string coercion) */
|
|
#define tonumberns(o,n) \
|
|
(ttisfloat(o) ? ((n) = fltvalue(o), 1) : \
|
|
(ttisinteger(o) ? ((n) = cast_num(ivalue(o)), 1) : 0))
|
|
|
|
|
|
/* convert an object to an integer (including string coercion) */
|
|
#define tointeger(o,i) \
|
|
(l_likely(ttisinteger(o)) ? (*(i) = ivalue(o), 1) \
|
|
: luaV_tointeger(o,i,LUA_FLOORN2I))
|
|
|
|
|
|
/* convert an object to an integer (without string coercion) */
|
|
#define tointegerns(o,i) \
|
|
(l_likely(ttisinteger(o)) ? (*(i) = ivalue(o), 1) \
|
|
: luaV_tointegerns(o,i,LUA_FLOORN2I))
|
|
|
|
|
|
#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2))
|
|
|
|
#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2)
|
|
|
|
|
|
/*
|
|
** fast track for 'gettable': if 't' is a table and 't[k]' is present,
|
|
** return 1 with 'slot' pointing to 't[k]' (position of final result).
|
|
** Otherwise, return 0 (meaning it will have to check metamethod)
|
|
** with 'slot' pointing to an empty 't[k]' (if 't' is a table) or NULL
|
|
** (otherwise). 'f' is the raw get function to use.
|
|
*/
|
|
#define luaV_fastget(L,t,k,slot,f) \
|
|
(!ttistable(t) \
|
|
? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \
|
|
: (slot = f(hvalue(t), k), /* else, do raw access */ \
|
|
!isempty(slot))) /* result not empty? */
|
|
|
|
|
|
/*
|
|
** Special case of 'luaV_fastget' for integers, inlining the fast case
|
|
** of 'luaH_getint'.
|
|
*/
|
|
#define luaV_fastgeti(L,t,k,slot) \
|
|
(!ttistable(t) \
|
|
? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \
|
|
: (slot = (l_castS2U(k) - 1u < hvalue(t)->alimit) \
|
|
? &hvalue(t)->array[k - 1] : luaH_getint(hvalue(t), k), \
|
|
!isempty(slot))) /* result not empty? */
|
|
|
|
|
|
/*
|
|
** Finish a fast set operation (when fast get succeeds). In that case,
|
|
** 'slot' points to the place to put the value.
|
|
*/
|
|
#define luaV_finishfastset(L,t,slot,v) \
|
|
{ setobj2t(L, cast(TValue *,slot), v); \
|
|
luaC_barrierback(L, gcvalue(t), v); }
|
|
|
|
|
|
|
|
|
|
LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);
|
|
LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);
|
|
LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r);
|
|
LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n);
|
|
LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode);
|
|
LUAI_FUNC int luaV_tointegerns (const TValue *obj, lua_Integer *p,
|
|
F2Imod mode);
|
|
LUAI_FUNC int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode);
|
|
LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key,
|
|
StkId val, const TValue *slot);
|
|
LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
|
|
TValue *val, const TValue *slot);
|
|
LUAI_FUNC void luaV_finishOp (lua_State *L);
|
|
LUAI_FUNC void luaV_execute (lua_State *L, CallInfo *ci);
|
|
LUAI_FUNC void luaV_concat (lua_State *L, int total);
|
|
LUAI_FUNC lua_Integer luaV_idiv (lua_State *L, lua_Integer x, lua_Integer y);
|
|
LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y);
|
|
LUAI_FUNC lua_Number luaV_modf (lua_State *L, lua_Number x, lua_Number y);
|
|
LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y);
|
|
LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb);
|
|
|
|
#endif
|