diff options
| -rw-r--r-- | lobject.h | 56 |
1 files changed, 39 insertions, 17 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.h,v 2.61 2011/07/04 20:29:02 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 2.62 2011/09/24 21:12:01 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 | */ |
| @@ -264,51 +264,73 @@ typedef struct lua_TValue TValue; | |||
| 264 | ** ======================================================= | 264 | ** ======================================================= |
| 265 | */ | 265 | */ |
| 266 | 266 | ||
| 267 | #if defined(LUA_NANTRICKLE) || defined(LUA_NANTRICKBE) | 267 | #if defined(LUA_NANTRICK) \ |
| 268 | || defined(LUA_NANTRICK_LE) \ | ||
| 269 | || defined(LUA_NANTRICK_BE) | ||
| 268 | 270 | ||
| 269 | /* | 271 | /* |
| 270 | ** numbers are represented in the 'd_' field. All other values have the | 272 | ** numbers are represented in the 'd_' field. All other values have the |
| 271 | ** value (NNMARK | tag) in 'tt_'. A number with such pattern would be | 273 | ** value (NNMARK | tag) in 'tt__'. A number with such pattern would be |
| 272 | ** a "signaled NaN", which is never generated by regular operations by | 274 | ** a "signaled NaN", which is never generated by regular operations by |
| 273 | ** the CPU (nor by 'strtod') | 275 | ** the CPU (nor by 'strtod') |
| 274 | */ | 276 | */ |
| 275 | #if !defined(NNMARK) | 277 | #if !defined(NNMARK) |
| 276 | #define NNMARK 0x7FF7A500 | 278 | #define NNMARK 0x7FF7A500 |
| 279 | #define NNMASK 0x7FFFFF00 | ||
| 277 | #endif | 280 | #endif |
| 278 | 281 | ||
| 279 | #undef TValuefields | 282 | #undef TValuefields |
| 280 | #undef NILCONSTANT | 283 | #undef NILCONSTANT |
| 281 | #if defined(LUA_NANTRICKLE) | 284 | |
| 285 | #if defined(LUA_NANTRICK_LE) | ||
| 286 | |||
| 282 | /* little endian */ | 287 | /* little endian */ |
| 283 | #define TValuefields \ | 288 | #define TValuefields \ |
| 284 | union { struct { Value v_; int tt_; } i; double d_; } u | 289 | union { struct { Value v__; int tt__; } i; double d__; } u |
| 285 | #define NILCONSTANT {{{NULL}, tag2tt(LUA_TNIL)}} | 290 | #define NILCONSTANT {{{NULL}, tag2tt(LUA_TNIL)}} |
| 286 | #else | 291 | /* field-access macros */ |
| 292 | #define v_(o) ((o)->u.i.v__) | ||
| 293 | #define d_(o) ((o)->u.d__) | ||
| 294 | #define tt_(o) ((o)->u.i.tt__) | ||
| 295 | |||
| 296 | #elif defined(LUA_NANTRICK_BE) | ||
| 297 | |||
| 287 | /* big endian */ | 298 | /* big endian */ |
| 288 | #define TValuefields \ | 299 | #define TValuefields \ |
| 289 | union { struct { int tt_; Value v_; } i; double d_; } u | 300 | union { struct { int tt__; Value v__; } i; double d__; } u |
| 290 | #define NILCONSTANT {{tag2tt(LUA_TNIL), {NULL}}} | 301 | #define NILCONSTANT {{tag2tt(LUA_TNIL), {NULL}}} |
| 302 | /* field-access macros */ | ||
| 303 | #define v_(o) ((o)->u.i.v__) | ||
| 304 | #define d_(o) ((o)->u.d__) | ||
| 305 | #define tt_(o) ((o)->u.i.tt__) | ||
| 306 | |||
| 307 | #elif !defined(TValuefields) | ||
| 308 | #error option 'LUA_NANTRICK' needs declaration for 'TValuefields' | ||
| 309 | |||
| 291 | #endif | 310 | #endif |
| 292 | 311 | ||
| 312 | |||
| 313 | /* correspondence with standard representation */ | ||
| 314 | #undef val_ | ||
| 315 | #define val_(o) v_(o) | ||
| 316 | #undef num_ | ||
| 317 | #define num_(o) d_(o) | ||
| 318 | |||
| 319 | |||
| 293 | #undef numfield | 320 | #undef numfield |
| 294 | #define numfield /* no such field; numbers are the entire struct */ | 321 | #define numfield /* no such field; numbers are the entire struct */ |
| 295 | 322 | ||
| 296 | /* basic check to distinguish numbers from non-numbers */ | 323 | /* basic check to distinguish numbers from non-numbers */ |
| 297 | #undef ttisnumber | 324 | #undef ttisnumber |
| 298 | #define ttisnumber(o) (((o)->u.i.tt_ & 0x7fffff00) != NNMARK) | 325 | #define ttisnumber(o) ((tt_(o) & NNMASK) != NNMARK) |
| 299 | 326 | ||
| 300 | #define tag2tt(t) (NNMARK | (t)) | 327 | #define tag2tt(t) (NNMARK | (t)) |
| 301 | 328 | ||
| 302 | #undef val_ | ||
| 303 | #define val_(o) ((o)->u.i.v_) | ||
| 304 | #undef num_ | ||
| 305 | #define num_(o) ((o)->u.d_) | ||
| 306 | |||
| 307 | #undef rttype | 329 | #undef rttype |
| 308 | #define rttype(o) (ttisnumber(o) ? LUA_TNUMBER : (o)->u.i.tt_ & 0xff) | 330 | #define rttype(o) (ttisnumber(o) ? LUA_TNUMBER : tt_(o) & 0xff) |
| 309 | 331 | ||
| 310 | #undef settt_ | 332 | #undef settt_ |
| 311 | #define settt_(o,t) ((o)->u.i.tt_=tag2tt(t)) | 333 | #define settt_(o,t) (tt_(o) = tag2tt(t)) |
| 312 | 334 | ||
| 313 | #undef setnvalue | 335 | #undef setnvalue |
| 314 | #define setnvalue(obj,x) \ | 336 | #define setnvalue(obj,x) \ |
| @@ -326,11 +348,11 @@ typedef struct lua_TValue TValue; | |||
| 326 | */ | 348 | */ |
| 327 | 349 | ||
| 328 | #undef checktag | 350 | #undef checktag |
| 329 | #define checktag(o,t) ((o)->u.i.tt_ == tag2tt(t)) | 351 | #define checktag(o,t) (tt_(o) == tag2tt(t)) |
| 330 | 352 | ||
| 331 | #undef ttisequal | 353 | #undef ttisequal |
| 332 | #define ttisequal(o1,o2) \ | 354 | #define ttisequal(o1,o2) \ |
| 333 | (ttisnumber(o1) ? ttisnumber(o2) : ((o1)->u.i.tt_ == (o2)->u.i.tt_)) | 355 | (ttisnumber(o1) ? ttisnumber(o2) : (tt_(o1) == tt_(o2))) |
| 334 | 356 | ||
| 335 | 357 | ||
| 336 | 358 | ||
