lobject.h

Go to the documentation of this file.
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