12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- /* Read-only tables for Lua */
- #ifndef lrotable_h
- #define lrotable_h
- #include "lua.h"
- #include "luaconf.h"
- #include "lobject.h"
- #include "llimits.h"
- /* Macros one can use to define rotable entries */
- #define LRO_FUNCVAL(v) {{.p = v}, LUA_TLIGHTFUNCTION}
- #define LRO_LUDATA(v) {{.p = v}, LUA_TLIGHTUSERDATA}
- #define LRO_NUMVAL(v) {{.n = v}, LUA_TNUMBER}
- #define LRO_ROVAL(v) {{.p = (void*)v}, LUA_TROTABLE}
- #define LRO_NILVAL {{.p = NULL}, LUA_TNIL}
- #ifdef LUA_CROSS_COMPILER
- #define LRO_STRKEY(k) {LUA_TSTRING, {.strkey = k}}
- #else
- #define LRO_STRKEY(k) {LUA_TSTRING, {.strkey = (STORE_ATTR char *) k}}
- #endif
- #define LRO_NUMKEY(k) {LUA_TNUMBER, {.numkey = k}}
- #define LRO_NILKEY {LUA_TNIL, {.strkey=NULL}}
- /* Maximum length of a rotable name and of a string key*/
- #define LUA_MAX_ROTABLE_NAME 32
- /* Type of a numeric key in a rotable */
- typedef int luaR_numkey;
- /* The next structure defines the type of a key */
- typedef struct {
- int type;
- union {
- const char* strkey;
- luaR_numkey numkey;
- } id;
- } luaR_key;
- /* An entry in the read only table */
- typedef struct luaR_entry {
- const luaR_key key;
- const TValue value;
- } luaR_entry;
- /*
- * The current ROTable implmentation is a vector of luaR_entry terminated by a
- * nil record. The convention is to use ROtable * to refer to the entire vector
- * as a logical ROTable.
- */
- typedef const struct luaR_entry ROTable;
- const TValue* luaR_findentry(ROTable *tab, TString *key, unsigned *ppos);
- const TValue* luaR_findentryN(ROTable *tab, luaR_numkey numkey, unsigned *ppos);
- void luaR_next(lua_State *L, ROTable *tab, TValue *key, TValue *val);
- void* luaR_getmeta(ROTable *tab);
- int luaR_isrotable(void *p);
- /*
- * Set inRO check depending on platform. Note that this implementation needs
- * to work on both the host (luac.cross) and ESP targets. The luac.cross
- * VM is used for the -e option, and is primarily used to be able to debug
- * VM changes on the more developer-friendly hot gdb environment.
- */
- #if defined(LUA_CROSS_COMPILER)
- #if defined(_MSC_VER)
- //msvc build uses these dummy vars to locate the beginning and ending addresses of the RO data
- extern cons char _ro_start[], _ro_end[];
- #define IN_RODATA_AREA(p) (((const char*)(p)) >= _ro_start && ((const char *)(p)) <= _ro_end)
- #else /* one of the POSIX variants */
- #if defined(__CYGWIN__)
- #define _RODATA_END __end__
- #elif defined(__MINGW32__)
- #define _RODATA_END end
- #else
- #define _RODATA_END _edata
- #endif
- extern const char _RODATA_END[];
- #define IN_RODATA_AREA(p) (((const char *)(p)) < _RODATA_END)
- #endif /* defined(_MSC_VER) */
- #else /* xtensa tool chain for ESP target */
- extern const char _irom0_text_start[];
- extern const char _irom0_text_end[];
- #define IN_RODATA_AREA(p) (((const char *)(p)) >= _irom0_text_start && ((const char *)(p)) <= _irom0_text_end)
- #endif /* defined(LUA_CROSS_COMPILER) */
- /* Return 1 if the given pointer is a rotable */
- #define luaR_isrotable(p) IN_RODATA_AREA(p)
- #endif
|