00001 /* 00002 ** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $ 00003 ** Type definitions for Lua objects 00004 ** See Copyright Notice in lua.h 00005 */ 00006 00007 00008 #ifndef lobject_h 00009 #define lobject_h 00010 00011 00012 #include <stdarg.h> 00013 00014 00015 #include "llimits.h" 00016 #include "lua.h" 00017 00018 00019 /* tags for values visible from Lua */ 00020 #define LAST_TAG LUA_TTHREAD 00021 00022 #define NUM_TAGS (LAST_TAG+1) 00023 00024 00025 /* 00026 ** Extra tags for non-values 00027 */ 00028 #define LUA_TPROTO (LAST_TAG+1) 00029 #define LUA_TUPVAL (LAST_TAG+2) 00030 #define LUA_TDEADKEY (LAST_TAG+3) 00031 00032 00033 /* 00034 ** Union of all collectable objects 00035 */ 00036 typedef union GCObject GCObject; 00037 00038 00039 /* 00040 ** Common Header for all collectable objects (in macro form, to be 00041 ** included in other objects) 00042 */ 00043 #define CommonHeader GCObject *next; lu_byte tt; lu_byte marked 00044 00045 00046 /* 00047 ** Common header in struct form 00048 */ 00049 typedef struct GCheader { 00050 CommonHeader; 00051 } GCheader; 00052 00053 00054 00055 00056 /* 00057 ** Union of all Lua values 00058 */ 00059 typedef union { 00060 GCObject *gc; 00061 void *p; 00062 lua_Number n; 00063 int b; 00064 } Value; 00065 00066 00067 /* 00068 ** Tagged Values 00069 */ 00070 00071 #define TValuefields Value value; int tt 00072 00073 typedef struct lua_TValue { 00074 TValuefields; 00075 } TValue; 00076 00077 00078 /* Macros to test type */ 00079 #define ttisnil(o) (ttype(o) == LUA_TNIL) 00080 #define ttisnumber(o) (ttype(o) == LUA_TNUMBER) 00081 #define ttisstring(o) (ttype(o) == LUA_TSTRING) 00082 #define ttistable(o) (ttype(o) == LUA_TTABLE) 00083 #define ttisfunction(o) (ttype(o) == LUA_TFUNCTION) 00084 #define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN) 00085 #define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA) 00086 #define ttisthread(o) (ttype(o) == LUA_TTHREAD) 00087 #define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA) 00088 00089 /* Macros to access values */ 00090 #define ttype(o) ((o)->tt) 00091 #define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc) 00092 #define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p) 00093 #define nvalue(o) check_exp(ttisnumber(o), (o)->value.n) 00094 #define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts) 00095 #define tsvalue(o) (&rawtsvalue(o)->tsv) 00096 #define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u) 00097 #define uvalue(o) (&rawuvalue(o)->uv) 00098 #define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl) 00099 #define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h) 00100 #define bvalue(o) check_exp(ttisboolean(o), (o)->value.b) 00101 #define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th) 00102 00103 #define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) 00104 00105 /* 00106 ** for internal debug only 00107 */ 00108 #define checkconsistency(obj) \ 00109 lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt)) 00110 00111 #define checkliveness(g,obj) \ 00112 lua_assert(!iscollectable(obj) || \ 00113 ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc))) 00114 00115 00116 /* Macros to set values */ 00117 #define setnilvalue(obj) ((obj)->tt=LUA_TNIL) 00118 00119 #define setnvalue(obj,x) \ 00120 { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; } 00121 00122 #define setpvalue(obj,x) \ 00123 { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; } 00124 00125 #define setbvalue(obj,x) \ 00126 { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; } 00127 00128 #define setsvalue(L,obj,x) \ 00129 { TValue *i_o=(obj); \ 00130 i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \ 00131 checkliveness(G(L),i_o); } 00132 00133 #define setuvalue(L,obj,x) \ 00134 { TValue *i_o=(obj); \ 00135 i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \ 00136 checkliveness(G(L),i_o); } 00137 00138 #define setthvalue(L,obj,x) \ 00139 { TValue *i_o=(obj); \ 00140 i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \ 00141 checkliveness(G(L),i_o); } 00142 00143 #define setclvalue(L,obj,x) \ 00144 { TValue *i_o=(obj); \ 00145 i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \ 00146 checkliveness(G(L),i_o); } 00147 00148 #define sethvalue(L,obj,x) \ 00149 { TValue *i_o=(obj); \ 00150 i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \ 00151 checkliveness(G(L),i_o); } 00152 00153 #define setptvalue(L,obj,x) \ 00154 { TValue *i_o=(obj); \ 00155 i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \ 00156 checkliveness(G(L),i_o); } 00157 00158 00159 00160 00161 #define setobj(L,obj1,obj2) \ 00162 { const TValue *o2=(obj2); TValue *o1=(obj1); \ 00163 o1->value = o2->value; o1->tt=o2->tt; \ 00164 checkliveness(G(L),o1); } 00165 00166 00167 /* 00168 ** different types of sets, according to destination 00169 */ 00170 00171 /* from stack to (same) stack */ 00172 #define setobjs2s setobj 00173 /* to stack (not from same stack) */ 00174 #define setobj2s setobj 00175 #define setsvalue2s setsvalue 00176 #define sethvalue2s sethvalue 00177 #define setptvalue2s setptvalue 00178 /* from table to same table */ 00179 #define setobjt2t setobj 00180 /* to table */ 00181 #define setobj2t setobj 00182 /* to new object */ 00183 #define setobj2n setobj 00184 #define setsvalue2n setsvalue 00185 00186 #define setttype(obj, tt) (ttype(obj) = (tt)) 00187 00188 00189 #define iscollectable(o) (ttype(o) >= LUA_TSTRING) 00190 00191 00192 00193 typedef TValue *StkId; /* index to stack elements */ 00194 00195 00196 /* 00197 ** String headers for string table 00198 */ 00199 typedef union TString { 00200 L_Umaxalign dummy; /* ensures maximum alignment for strings */ 00201 struct { 00202 CommonHeader; 00203 lu_byte reserved; 00204 unsigned int hash; 00205 size_t len; 00206 } tsv; 00207 } TString; 00208 00209 00210 #define getstr(ts) cast(const char *, (ts) + 1) 00211 #define svalue(o) getstr(rawtsvalue(o)) 00212 00213 00214 00215 typedef union Udata { 00216 L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ 00217 struct { 00218 CommonHeader; 00219 struct Table *metatable; 00220 struct Table *env; 00221 size_t len; 00222 } uv; 00223 } Udata; 00224 00225 00226 00227 00228 /* 00229 ** Function Prototypes 00230 */ 00231 typedef struct Proto { 00232 CommonHeader; 00233 TValue *k; /* constants used by the function */ 00234 Instruction *code; 00235 struct Proto **p; /* functions defined inside the function */ 00236 int *lineinfo; /* map from opcodes to source lines */ 00237 struct LocVar *locvars; /* information about local variables */ 00238 TString **upvalues; /* upvalue names */ 00239 TString *source; 00240 int sizeupvalues; 00241 int sizek; /* size of `k' */ 00242 int sizecode; 00243 int sizelineinfo; 00244 int sizep; /* size of `p' */ 00245 int sizelocvars; 00246 int linedefined; 00247 int lastlinedefined; 00248 GCObject *gclist; 00249 lu_byte nups; /* number of upvalues */ 00250 lu_byte numparams; 00251 lu_byte is_vararg; 00252 lu_byte maxstacksize; 00253 } Proto; 00254 00255 00256 /* masks for new-style vararg */ 00257 #define VARARG_HASARG 1 00258 #define VARARG_ISVARARG 2 00259 #define VARARG_NEEDSARG 4 00260 00261 00262 typedef struct LocVar { 00263 TString *varname; 00264 int startpc; /* first point where variable is active */ 00265 int endpc; /* first point where variable is dead */ 00266 } LocVar; 00267 00268 00269 00270 /* 00271 ** Upvalues 00272 */ 00273 00274 typedef struct UpVal { 00275 CommonHeader; 00276 TValue *v; /* points to stack or to its own value */ 00277 union { 00278 TValue value; /* the value (when closed) */ 00279 struct { /* double linked list (when open) */ 00280 struct UpVal *prev; 00281 struct UpVal *next; 00282 } l; 00283 } u; 00284 } UpVal; 00285 00286 00287 /* 00288 ** Closures 00289 */ 00290 00291 #define ClosureHeader \ 00292 CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \ 00293 struct Table *env 00294 00295 typedef struct CClosure { 00296 ClosureHeader; 00297 lua_CFunction f; 00298 TValue upvalue[1]; 00299 } CClosure; 00300 00301 00302 typedef struct LClosure { 00303 ClosureHeader; 00304 struct Proto *p; 00305 UpVal *upvals[1]; 00306 } LClosure; 00307 00308 00309 typedef union Closure { 00310 CClosure c; 00311 LClosure l; 00312 } Closure; 00313 00314 00315 #define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC) 00316 #define isLfunction(o) (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC) 00317 00318 00319 /* 00320 ** Tables 00321 */ 00322 00323 /* TKey renamed as TKeyLua to avoid Symbian "e32std.h" naming conflict */ 00324 typedef union TKeyLua { 00325 struct { 00326 TValuefields; 00327 struct Node *next; /* for chaining */ 00328 } nk; 00329 TValue tvk; 00330 } TKeyLua; 00331 00332 00333 typedef struct Node { 00334 TValue i_val; 00335 TKeyLua i_key; 00336 } Node; 00337 00338 00339 typedef struct Table { 00340 CommonHeader; 00341 lu_byte flags; /* 1<<p means tagmethod(p) is not present */ 00342 lu_byte lsizenode; /* log2 of size of `node' array */ 00343 struct Table *metatable; 00344 TValue *array; /* array part */ 00345 Node *node; 00346 Node *lastfree; /* any free position is before this position */ 00347 GCObject *gclist; 00348 int sizearray; /* size of `array' array */ 00349 } Table; 00350 00351 00352 00353 /* 00354 ** `module' operation for hashing (size is always a power of 2) 00355 */ 00356 #define lmod(s,size) \ 00357 (check_exp((size&(size-1))==0, (cast(int, (s) & ((size)-1))))) 00358 00359 00360 #define twoto(x) (1<<(x)) 00361 #define sizenode(t) (twoto((t)->lsizenode)) 00362 00363 00364 #define luaO_nilobject (&luaO_nilobject_) 00365 00366 LUAI_DATA const TValue luaO_nilobject_; 00367 00368 #define ceillog2(x) (luaO_log2((x)-1) + 1) 00369 00370 LUAI_FUNC int luaO_log2 (unsigned int x); 00371 LUAI_FUNC int luaO_int2fb (unsigned int x); 00372 LUAI_FUNC int luaO_fb2int (int x); 00373 LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2); 00374 LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result); 00375 LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, 00376 va_list argp); 00377 LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); 00378 LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); 00379 00380 00381 #endif 00382
ContextLogger2—ContextLogger2 Logger Daemon Internals—Generated on Mon May 2 13:49:54 2011 by Doxygen 1.6.1