diff options
Diffstat (limited to 'lobject.h')
| -rw-r--r-- | lobject.h | 43 |
1 files changed, 27 insertions, 16 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.h,v 2.96 2014/07/17 17:27:49 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 2.97 2014/07/18 12:17:54 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 | */ |
| @@ -156,8 +156,7 @@ typedef struct lua_TValue TValue; | |||
| 156 | #define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) | 156 | #define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) |
| 157 | #define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) | 157 | #define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) |
| 158 | #define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) | 158 | #define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) |
| 159 | #define rawtsvalue(o) check_exp(ttisstring(o), rawgco2ts(val_(o).gc)) | 159 | #define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc)) |
| 160 | #define tsvalue(o) (&rawtsvalue(o)->tsv) | ||
| 161 | #define rawuvalue(o) check_exp(ttisfulluserdata(o), rawgco2u(val_(o).gc)) | 160 | #define rawuvalue(o) check_exp(ttisfulluserdata(o), rawgco2u(val_(o).gc)) |
| 162 | #define uvalue(o) (&rawuvalue(o)->uv) | 161 | #define uvalue(o) (&rawuvalue(o)->uv) |
| 163 | #define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) | 162 | #define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) |
| @@ -210,7 +209,7 @@ typedef struct lua_TValue TValue; | |||
| 210 | 209 | ||
| 211 | #define setsvalue(L,obj,x) \ | 210 | #define setsvalue(L,obj,x) \ |
| 212 | { TValue *io = (obj); TString *x_ = (x); \ | 211 | { TValue *io = (obj); TString *x_ = (x); \ |
| 213 | val_(io).gc = obj2gco(&x_->tsv); settt_(io, ctb(x_->tsv.tt)); \ | 212 | val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \ |
| 214 | checkliveness(G(L),io); } | 213 | checkliveness(G(L),io); } |
| 215 | 214 | ||
| 216 | #define setuvalue(L,obj,x) \ | 215 | #define setuvalue(L,obj,x) \ |
| @@ -299,24 +298,36 @@ typedef TValue *StkId; /* index to stack elements */ | |||
| 299 | 298 | ||
| 300 | /* | 299 | /* |
| 301 | ** Header for string value; string bytes follow the end of this structure | 300 | ** Header for string value; string bytes follow the end of this structure |
| 301 | ** (aligned according to 'UTString'; see next). | ||
| 302 | */ | 302 | */ |
| 303 | typedef union TString { | 303 | typedef struct TString { |
| 304 | L_Umaxalign dummy; /* ensures maximum alignment for strings */ | 304 | CommonHeader; |
| 305 | struct { | 305 | lu_byte extra; /* reserved words for short strings; "has hash" for longs */ |
| 306 | CommonHeader; | 306 | unsigned int hash; |
| 307 | lu_byte extra; /* reserved words for short strings; "has hash" for longs */ | 307 | size_t len; /* number of characters in string */ |
| 308 | unsigned int hash; | 308 | struct TString *hnext; /* linked list for hash table */ |
| 309 | size_t len; /* number of characters in string */ | ||
| 310 | union TString *hnext; /* linked list for hash table */ | ||
| 311 | } tsv; | ||
| 312 | } TString; | 309 | } TString; |
| 313 | 310 | ||
| 314 | 311 | ||
| 315 | /* get the actual string (array of bytes) from a TString */ | 312 | /* |
| 316 | #define getstr(ts) cast(const char *, (ts) + 1) | 313 | ** Ensures that address after this type is always fully aligned. |
| 314 | */ | ||
| 315 | typedef union UTString { | ||
| 316 | L_Umaxalign dummy; /* ensures maximum alignment for strings */ | ||
| 317 | TString tsv; | ||
| 318 | } UTString; | ||
| 319 | |||
| 320 | |||
| 321 | /* | ||
| 322 | ** Get the actual string (array of bytes) from a 'TString'. | ||
| 323 | ** (Access to 'extra' ensures that value is really a 'TString'.) | ||
| 324 | */ | ||
| 325 | #define getaddrstr(ts) (cast(char *, (ts)) + sizeof(UTString)) | ||
| 326 | #define getstr(ts) \ | ||
| 327 | ((void)(ts)->extra, cast(const char*, getaddrstr(ts))) | ||
| 317 | 328 | ||
| 318 | /* get the actual string (array of bytes) from a Lua value */ | 329 | /* get the actual string (array of bytes) from a Lua value */ |
| 319 | #define svalue(o) getstr(rawtsvalue(o)) | 330 | #define svalue(o) getstr(tsvalue(o)) |
| 320 | 331 | ||
| 321 | 332 | ||
| 322 | /* | 333 | /* |
