Paweł Kołodziejski 690f9d2a5c GRIM,LUA: Janitorial
2022-01-06 18:26:30 +01:00

155 lines
3.7 KiB
C++

/*
** Type definitions for Lua objects
** See Copyright Notice in lua.h
*/
#ifndef GRIM_LOBJECT_H
#define GRIM_LOBJECT_H
#include "engines/grim/lua/lua.h"
namespace Grim {
#ifdef LUA_DEBUG
#include "engines/grim/lua/lauxlib.h"
#define LUA_INTERNALERROR(s) luaL_verror("INTERNAL ERROR - %s [%s:%d]", (s), __FILE__, __LINE__)
#define LUA_ASSERT(c, s) { if (!(c)) LUA_INTERNALERROR(s); }
#else
#define LUA_INTERNALERROR(s) // empty
#define LUA_ASSERT(c, s) // empty
#endif
#define MAX_INT (2147483647 - 2) // maximum value of an int (-2 for safety)
#define MAX_WORD (65534U)
/*
** Lua TYPES
** WARNING: if you change the order of this enumeration,
** grep "ORDER LUA_T"
*/
typedef enum {
LUA_T_USERDATA = 0, // tag default for userdata
LUA_T_NUMBER = -1, // fixed tag for numbers
LUA_T_STRING = -2, // fixed tag for strings
LUA_T_ARRAY = -3, // tag default for tables (or arrays)
LUA_T_PROTO = -4, // fixed tag for functions
LUA_T_CPROTO = -5, // fixed tag for Cfunctions
LUA_T_TASK = -6, // task tag
LUA_T_NIL = -7, // last "pre-defined" tag
LUA_T_CLOSURE = -8,
LUA_T_CLMARK = -9, // mark for closures
LUA_T_PMARK = -10, // mark for Lua prototypes
LUA_T_CMARK = -11, // mark for C prototypes
LUA_T_LINE = -12
} lua_Type;
#define NUM_TYPES 12
#define NUM_TAGS 8
typedef struct UserData {
int32 id;
int32 tag;
} UserData;
typedef union {
lua_CFunction f; // LUA_T_CPROTO, LUA_T_CMARK
float n; // LUA_T_NUMBER
struct TaggedString *ts; // LUA_T_STRING
struct TProtoFunc *tf; // LUA_T_PROTO, LUA_T_PMARK
struct Closure *cl; // LUA_T_CLOSURE, LUA_T_CLMARK
struct Hash *a; // LUA_T_ARRAY
int32 i; // LUA_T_LINE
struct UserData ud; // LUA_T_USERDATA
} Value;
typedef struct TObject {
lua_Type ttype;
Value value;
} TObject;
/*
** generic header for garbage collector lists
*/
typedef struct GCnode {
struct GCnode *next;
int32 marked;
} GCnode;
/*
** String headers for string table
*/
typedef struct TaggedString {
GCnode head;
int32 constindex; // hint to reuse constants (= -1 if this is a userdata)
uint32 hash;
TObject globalval;
char str[1]; // \0 byte already reserved
} TaggedString;
/*
** Function Prototypes
*/
typedef struct TProtoFunc {
GCnode head;
struct TObject *consts;
int32 nconsts;
byte *code; // ends with opcode ENDCODE
int32 lineDefined;
TaggedString *fileName;
struct LocVar *locvars; // ends with line = -1
} TProtoFunc;
typedef struct LocVar {
TaggedString *varname; // NULL signals end of scope
int32 line;
} LocVar;
// Macros to access structure members
#define ttype(o) ((o)->ttype)
#define nvalue(o) ((o)->value.n)
#define svalue(o) ((o)->value.ts->str)
#define tsvalue(o) ((o)->value.ts)
#define clvalue(o) ((o)->value.cl)
#define avalue(o) ((o)->value.a)
#define fvalue(o) ((o)->value.f)
#define tfvalue(o) ((o)->value.tf)
#define protovalue(o) ((o)->value.cl->consts)
/*
** Closures
*/
typedef struct Closure {
GCnode head;
int32 nelems; // not included the first one (always the prototype)
TObject consts[1]; // at least one for prototype
} Closure;
typedef struct Node {
TObject ref;
TObject val;
} Node;
typedef struct Hash {
GCnode head;
Node *node;
int32 nhash;
int32 nuse;
int32 htag;
} Hash;
extern const char *luaO_typenames[];
extern TObject luaO_nilobject;
int32 luaO_equalObj(TObject *t1, TObject *t2);
int32 luaO_redimension(int32 oldsize);
int luaO_findstring(const char *name, const char *list[]);
void luaO_insertlist(GCnode *root, GCnode *node);
#define luaO_memup(d, s, n) memmove(d, s, n)
#define luaO_memdown(d, s, n) memmove(d, s, n)
} // end of namespace Grim
#endif