diff options
| author | Lua Team <team@lua.org> | 1998-07-11 12:00:00 +0000 |
|---|---|---|
| committer | repogen <> | 1998-07-11 12:00:00 +0000 |
| commit | 377347776f1f3d820f92151f70bec667f96d5e6b (patch) | |
| tree | cdb3ba26158df33547dfe765547177afcee119d1 /src/lobject.h | |
| parent | 4f8c5d0f284e1f4da717aea5008915f185cd2e05 (diff) | |
| download | lua-github-377347776f1f3d820f92151f70bec667f96d5e6b.tar.gz | |
Lua 3.13.1
Diffstat (limited to 'src/lobject.h')
| -rw-r--r-- | src/lobject.h | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/src/lobject.h b/src/lobject.h new file mode 100644 index 00000000..fbd6070c --- /dev/null +++ b/src/lobject.h @@ -0,0 +1,210 @@ +/* +** $Id: lobject.h,v 1.21 1998/06/18 16:57:03 roberto Exp $ +** Type definitions for Lua objects +** See Copyright Notice in lua.h +*/ + +#ifndef lobject_h +#define lobject_h + + +#include <limits.h> + +#include "lua.h" + + +#ifdef DEBUG +#include "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 + + +/* +** "real" is the type "number" of Lua +** GREP LUA_NUMBER to change that +*/ +#ifndef LUA_NUM_TYPE +#define LUA_NUM_TYPE double +#endif + +/* +** format to convert number to strings +*/ +#define NUMBER_FMT "%g" + +typedef LUA_NUM_TYPE real; + +#define Byte lua_Byte /* some systems have Byte as a predefined type */ +typedef unsigned char Byte; /* unsigned 8 bits */ + + +#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ + +/* maximum value of a word of 2 bytes (-2 for safety); must fit in an "int" */ +#if MAX_INT < 65534 +#define MAX_WORD MAX_INT +#else +#define MAX_WORD 65534 +#endif + +typedef unsigned int IntPoint; /* unsigned with same size as a pointer (for hashing) */ + + +/* +** 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_NIL = -6, /* last "pre-defined" tag */ + LUA_T_CLOSURE = -7, + LUA_T_CLMARK = -8, /* mark for closures */ + LUA_T_PMARK = -9, /* mark for Lua prototypes */ + LUA_T_CMARK = -10, /* mark for C prototypes */ + LUA_T_LINE = -11 +} lua_Type; + +#define NUM_TYPES 11 +#define NUM_TAGS 7 + + +typedef union { + lua_CFunction f; /* LUA_T_CPROTO, LUA_T_CMARK */ + real n; /* LUA_T_NUMBER */ + struct TaggedString *ts; /* LUA_T_STRING, LUA_T_USERDATA */ + struct TProtoFunc *tf; /* LUA_T_PROTO, LUA_T_PMARK */ + struct Closure *cl; /* LUA_T_CLOSURE, LUA_T_CLMARK */ + struct Hash *a; /* LUA_T_ARRAY */ + int i; /* LUA_T_LINE */ +} Value; + + +typedef struct TObject { + lua_Type ttype; + Value value; +} TObject; + + + +/* +** generic header for garbage collector lists +*/ +typedef struct GCnode { + struct GCnode *next; + int marked; +} GCnode; + + +/* +** String headers for string table +*/ + +typedef struct TaggedString { + GCnode head; + unsigned long hash; + int constindex; /* hint to reuse constants (= -1 if this is a userdata) */ + union { + struct { + TObject globalval; + long len; /* if this is a string, here is its length */ + } s; + struct { + int tag; + void *v; /* if this is a userdata, here is its value */ + } d; + } u; + char str[1]; /* \0 byte already reserved */ +} TaggedString; + + + + +/* +** Function Prototypes +*/ +typedef struct TProtoFunc { + GCnode head; + struct TObject *consts; + int nconsts; + Byte *code; /* ends with opcode ENDCODE */ + int lineDefined; + TaggedString *fileName; + struct LocVar *locvars; /* ends with line = -1 */ +} TProtoFunc; + +typedef struct LocVar { + TaggedString *varname; /* NULL signals end of scope */ + int 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; + int 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; + int nhash; + int nuse; + int htag; +} Hash; + + +extern char *luaO_typenames[]; + +extern TObject luaO_nilobject; + +int luaO_equalObj (TObject *t1, TObject *t2); +int luaO_redimension (int oldsize); +void luaO_insertlist (GCnode *root, GCnode *node); + +#ifdef OLD_ANSI +void luaO_memup (void *dest, void *src, int size); +void luaO_memdown (void *dest, void *src, int size); +#else +#include <string.h> +#define luaO_memup(d,s,n) memmove(d,s,n) +#define luaO_memdown(d,s,n) memmove(d,s,n) +#endif + +#endif |
