aboutsummaryrefslogtreecommitdiff
path: root/lobject.h
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-10-25 17:05:28 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-10-25 17:05:28 -0300
commit96e15b8501e5d8fc40c475cbac573f910ab5853b (patch)
tree2c8efededa6849704f0db3075d0cbe0efaa40b2d /lobject.h
parent0fd91b1b087b478fffa36f96bc0f608d86627a4b (diff)
downloadlua-96e15b8501e5d8fc40c475cbac573f910ab5853b.tar.gz
lua-96e15b8501e5d8fc40c475cbac573f910ab5853b.tar.bz2
lua-96e15b8501e5d8fc40c475cbac573f910ab5853b.zip
threads now are real Lua objects, subject to garbage collection
Diffstat (limited to 'lobject.h')
-rw-r--r--lobject.h67
1 files changed, 29 insertions, 38 deletions
diff --git a/lobject.h b/lobject.h
index 580848aa..28edc661 100644
--- a/lobject.h
+++ b/lobject.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.h,v 1.148 2002/10/16 20:40:58 roberto Exp roberto $ 2** $Id: lobject.h,v 1.149 2002/10/22 17:18:28 roberto Exp roberto $
3** Type definitions for Lua objects 3** Type definitions for Lua objects
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -13,7 +13,7 @@
13 13
14 14
15/* tags for values visible from Lua */ 15/* tags for values visible from Lua */
16#define NUM_TAGS LUA_TUSERDATA 16#define NUM_TAGS LUA_TTHREAD
17 17
18 18
19/* 19/*
@@ -24,22 +24,33 @@
24 24
25 25
26/* 26/*
27** Union of all collectable objects
28*/
29typedef union GCObject GCObject;
30
31
32/*
27** Common header for all collectable objects 33** Common header for all collectable objects
28*/ 34*/
29typedef struct GCheader { 35typedef struct GCheader {
30 union GCObject *next; /* pointer to next object */ 36 GCObject *next; /* pointer to next object */
31 lu_byte tt; /* object type */ 37 lu_byte tt; /* object type */
32 lu_byte marked; /* GC informations */ 38 lu_byte marked; /* GC informations */
33} GCheader; 39} GCheader;
34 40
35 41
42/*
43** common header in macro form, to be included in other objects
44*/
45#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked
46
36 47
37 48
38/* 49/*
39** Union of all Lua values 50** Union of all Lua values
40*/ 51*/
41typedef union { 52typedef union {
42 union GCObject *gc; 53 GCObject *gc;
43 void *p; 54 void *p;
44 lua_Number n; 55 lua_Number n;
45 int b; 56 int b;
@@ -63,6 +74,7 @@ typedef struct lua_TObject {
63#define ttisfunction(o) (ttype(o) == LUA_TFUNCTION) 74#define ttisfunction(o) (ttype(o) == LUA_TFUNCTION)
64#define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN) 75#define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN)
65#define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA) 76#define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA)
77#define ttisthread(o) (ttype(o) == LUA_TTHREAD)
66#define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA) 78#define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA)
67 79
68/* Macros to access values */ 80/* Macros to access values */
@@ -75,6 +87,7 @@ typedef struct lua_TObject {
75#define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl) 87#define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl)
76#define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h) 88#define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h)
77#define bvalue(o) check_exp(ttisboolean(o), (o)->value.b) 89#define bvalue(o) check_exp(ttisboolean(o), (o)->value.b)
90#define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th)
78 91
79#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) 92#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
80 93
@@ -101,6 +114,11 @@ typedef struct lua_TObject {
101 i_o->value.gc=cast(GCObject *, (x)); \ 114 i_o->value.gc=cast(GCObject *, (x)); \
102 lua_assert(i_o->value.gc->gch.tt == LUA_TUSERDATA); } 115 lua_assert(i_o->value.gc->gch.tt == LUA_TUSERDATA); }
103 116
117#define setthvalue(obj,x) \
118 { TObject *i_o=(obj); i_o->tt=LUA_TTHREAD; \
119 i_o->value.gc=cast(GCObject *, (x)); \
120 lua_assert(i_o->value.gc->gch.tt == LUA_TTHREAD); }
121
104#define setclvalue(obj,x) \ 122#define setclvalue(obj,x) \
105 { TObject *i_o=(obj); i_o->tt=LUA_TFUNCTION; \ 123 { TObject *i_o=(obj); i_o->tt=LUA_TFUNCTION; \
106 i_o->value.gc=cast(GCObject *, (x)); \ 124 i_o->value.gc=cast(GCObject *, (x)); \
@@ -142,9 +160,7 @@ typedef TObject *StkId; /* index to stack elements */
142typedef union TString { 160typedef union TString {
143 L_Umaxalign dummy; /* ensures maximum alignment for strings */ 161 L_Umaxalign dummy; /* ensures maximum alignment for strings */
144 struct { 162 struct {
145 union GCObject *next; /* pointer to next object */ 163 CommonHeader;
146 lu_byte tt; /* object type */
147 lu_byte marked; /* GC informations */
148 lu_byte reserved; 164 lu_byte reserved;
149 lu_hash hash; 165 lu_hash hash;
150 size_t len; 166 size_t len;
@@ -160,9 +176,7 @@ typedef union TString {
160typedef union Udata { 176typedef union Udata {
161 L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ 177 L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */
162 struct { 178 struct {
163 union GCObject *next; /* pointer to next object */ 179 CommonHeader;
164 lu_byte tt; /* object type */
165 lu_byte marked; /* GC informations */
166 struct Table *metatable; 180 struct Table *metatable;
167 size_t len; 181 size_t len;
168 } uv; 182 } uv;
@@ -175,9 +189,7 @@ typedef union Udata {
175** Function Prototypes 189** Function Prototypes
176*/ 190*/
177typedef struct Proto { 191typedef struct Proto {
178 union GCObject *next; /* pointer to next object */ 192 CommonHeader;
179 lu_byte tt; /* object type */
180 lu_byte marked; /* GC informations */
181 TObject *k; /* constants used by the function */ 193 TObject *k; /* constants used by the function */
182 Instruction *code; 194 Instruction *code;
183 struct Proto **p; /* functions defined inside the function */ 195 struct Proto **p; /* functions defined inside the function */
@@ -210,9 +222,7 @@ typedef struct LocVar {
210*/ 222*/
211 223
212typedef struct UpVal { 224typedef struct UpVal {
213 union GCObject *next; /* pointer to next object */ 225 CommonHeader;
214 lu_byte tt; /* object type */
215 lu_byte marked; /* GC informations */
216 TObject *v; /* points to stack or to its own value */ 226 TObject *v; /* points to stack or to its own value */
217 TObject value; /* the value (when closed) */ 227 TObject value; /* the value (when closed) */
218} UpVal; 228} UpVal;
@@ -223,9 +233,7 @@ typedef struct UpVal {
223*/ 233*/
224 234
225typedef struct CClosure { 235typedef struct CClosure {
226 union GCObject *next; /* pointer to next object */ 236 CommonHeader;
227 lu_byte tt; /* object type */
228 lu_byte marked; /* GC informations */
229 lu_byte isC; /* 0 for Lua functions, 1 for C functions */ 237 lu_byte isC; /* 0 for Lua functions, 1 for C functions */
230 lu_byte nupvalues; 238 lu_byte nupvalues;
231 lua_CFunction f; 239 lua_CFunction f;
@@ -234,9 +242,7 @@ typedef struct CClosure {
234 242
235 243
236typedef struct LClosure { 244typedef struct LClosure {
237 union GCObject *next; /* pointer to next object */ 245 CommonHeader;
238 lu_byte tt; /* object type */
239 lu_byte marked; /* GC informations */
240 lu_byte isC; 246 lu_byte isC;
241 lu_byte nupvalues; /* first five fields must be equal to CClosure!! */ 247 lu_byte nupvalues; /* first five fields must be equal to CClosure!! */
242 struct Proto *p; 248 struct Proto *p;
@@ -267,9 +273,7 @@ typedef struct Node {
267 273
268 274
269typedef struct Table { 275typedef struct Table {
270 union GCObject *next; /* pointer to next object */ 276 CommonHeader;
271 lu_byte tt; /* object type */
272 lu_byte marked; /* GC informations */
273 lu_byte flags; /* 1<<p means tagmethod(p) is not present */ 277 lu_byte flags; /* 1<<p means tagmethod(p) is not present */
274 lu_byte mode; 278 lu_byte mode;
275 lu_byte lsizenode; /* log2 of size of `node' array */ 279 lu_byte lsizenode; /* log2 of size of `node' array */
@@ -298,19 +302,6 @@ typedef struct Table {
298#define sizearray(t) ((t)->sizearray) 302#define sizearray(t) ((t)->sizearray)
299 303
300 304
301/*
302** Union of all collectable objects
303*/
304typedef union GCObject {
305 GCheader gch;
306 union TString ts;
307 union Udata u;
308 union Closure cl;
309 struct Table h;
310 struct Proto p;
311 struct UpVal uv;
312} GCObject;
313
314 305
315extern const TObject luaO_nilobject; 306extern const TObject luaO_nilobject;
316 307