From 63a822c8e199918c54e325cbc8696ed04071aba8 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 29 Jan 2001 17:34:02 -0200 Subject: all boxed types start with their tags --- lobject.h | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'lobject.h') diff --git a/lobject.h b/lobject.h index 2afb8736..78f3ba18 100644 --- a/lobject.h +++ b/lobject.h @@ -1,5 +1,5 @@ /* -** $Id: lobject.h,v 1.89 2001/01/26 15:58:50 roberto Exp roberto $ +** $Id: lobject.h,v 1.90 2001/01/29 17:16:58 roberto Exp roberto $ ** Type definitions for Lua objects ** See Copyright Notice in lua.h */ @@ -29,7 +29,7 @@ #endif -/* mark for closures active in the stack */ +/* ttype for closures active in the stack */ #define LUA_TMARK 6 @@ -41,6 +41,14 @@ #define is_T_MARK(t) (ttype(t) == LUA_TMARK) +/* +** tag at the start of all "boxed" Lua values +*/ +typedef struct TValue { + char ttype; +} TValue; + + typedef union { void *v; lua_Number n; /* LUA_TNUMBER */ @@ -87,7 +95,8 @@ typedef struct lua_TObject { { TObject *_o=(obj); struct CallInfo *_v=(x); \ _o->tt=LUA_TMARK; _o->value.v=_v; } -#define setnilvalue(obj) { (obj)->tt=LUA_TNIL; } +#define setnilvalue(obj) \ + { TObject *_o=(obj); _o->tt=LUA_TNIL; _o->value.v = (void *)&luaO_ttnil; } #define setobj(obj1,obj2) \ { TObject *o1=(obj1); const TObject *o2=(obj2); \ @@ -107,6 +116,8 @@ typedef struct lua_TObject { #define TSPACK ((int)sizeof(int)) typedef struct TString { + TValue v; + unsigned char marked; union { struct { /* for strings */ luint32 hash; @@ -119,7 +130,6 @@ typedef struct TString { } u; size_t len; struct TString *nexthash; /* chain for hash table */ - int marked; char str[TSPACK]; /* variable length string!! must be the last field! */ } TString; @@ -128,6 +138,7 @@ typedef struct TString { ** Function Prototypes */ typedef struct Proto { + TValue v; lua_Number *knum; /* numbers used by the function */ int sizeknum; /* size of `knum' */ struct TString **kstr; /* strings used by the function */ @@ -162,14 +173,15 @@ typedef struct LocVar { ** Closures */ typedef struct Closure { + TValue v; + char isC; /* 0 for Lua functions, 1 for C functions */ + short nupvalues; union { lua_CFunction c; /* C functions */ struct Proto *l; /* Lua functions */ } f; struct Closure *next; struct Closure *mark; /* marked closures (point to itself when not marked) */ - short isC; /* 0 for Lua functions, 1 for C functions */ - short nupvalues; TObject upvalue[1]; } Closure; @@ -186,6 +198,7 @@ typedef struct Node { typedef struct Hash { + TValue v; Node *node; int htag; int size; @@ -210,6 +223,7 @@ typedef struct Hash { ** informations about a call (for debugging) */ typedef struct CallInfo { + TValue v; struct Closure *func; /* function being called */ const Instruction **pc; /* current pc of called function */ int lastpc; /* last pc traced */ @@ -218,6 +232,7 @@ typedef struct CallInfo { } CallInfo; +extern const char luaO_ttnil; /* "address" of the nil value */ extern const TObject luaO_nilobject; -- cgit v1.2.3-55-g6feb