first version with 'NANTRICK' (packing all Lua values inside a 'double')
This commit is contained in:
118
lobject.h
118
lobject.h
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lobject.h,v 2.56 2011/05/31 19:15:01 roberto Exp roberto $
|
** $Id: lobject.h,v 2.57 2011/06/02 19:31:40 roberto Exp roberto $
|
||||||
** Type definitions for Lua objects
|
** Type definitions for Lua objects
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@@ -81,13 +81,10 @@ typedef struct GCheader {
|
|||||||
/*
|
/*
|
||||||
** Union of all Lua values
|
** Union of all Lua values
|
||||||
*/
|
*/
|
||||||
typedef union {
|
typedef union Value Value;
|
||||||
GCObject *gc; /* collectable objects */
|
|
||||||
void *p; /* light userdata */
|
|
||||||
lua_Number n; /* numbers */
|
#define numfield lua_Number n; /* numbers */
|
||||||
int b; /* booleans */
|
|
||||||
lua_CFunction f; /* light C functions */
|
|
||||||
} Value;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -98,13 +95,11 @@ typedef union {
|
|||||||
|
|
||||||
#define TValuefields Value value_; int tt_
|
#define TValuefields Value value_; int tt_
|
||||||
|
|
||||||
typedef struct lua_TValue {
|
typedef struct lua_TValue TValue;
|
||||||
TValuefields;
|
|
||||||
} TValue;
|
|
||||||
|
|
||||||
|
|
||||||
/* macro defining a nil value */
|
/* macro defining a nil value */
|
||||||
#define NILCONSTANT {NULL}, LUA_TNIL
|
#define NILCONSTANT {NULL}, LUA_TNIL
|
||||||
|
|
||||||
|
|
||||||
#define val_(o) ((o)->value_)
|
#define val_(o) ((o)->value_)
|
||||||
@@ -167,8 +162,8 @@ typedef struct lua_TValue {
|
|||||||
#define righttt(obj) (ttypenv(obj) == gcvalue(obj)->gch.tt)
|
#define righttt(obj) (ttypenv(obj) == gcvalue(obj)->gch.tt)
|
||||||
|
|
||||||
#define checkliveness(g,obj) \
|
#define checkliveness(g,obj) \
|
||||||
lua_longassert(!iscollectable(obj) || \
|
lua_longassert(!iscollectable(obj) || \
|
||||||
(righttt(obj) && !isdead(g,gcvalue(obj))))
|
(righttt(obj) && !isdead(g,gcvalue(obj))))
|
||||||
|
|
||||||
|
|
||||||
/* Macros to set values */
|
/* Macros to set values */
|
||||||
@@ -177,7 +172,7 @@ typedef struct lua_TValue {
|
|||||||
#define setnvalue(obj,x) \
|
#define setnvalue(obj,x) \
|
||||||
{ TValue *io=(obj); num_(io)=(x); settt_(io, LUA_TNUMBER); }
|
{ TValue *io=(obj); num_(io)=(x); settt_(io, LUA_TNUMBER); }
|
||||||
|
|
||||||
#define changenvalue(o,x) check_exp(ttisnumber(o), num_(o)=(x))
|
#define changenvalue(o,x) check_exp(ttisnumber(o), num_(o)=(x))
|
||||||
|
|
||||||
#define setnilvalue(obj) settt_(obj, LUA_TNIL)
|
#define setnilvalue(obj) settt_(obj, LUA_TNIL)
|
||||||
|
|
||||||
@@ -260,9 +255,102 @@ typedef struct lua_TValue {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** {======================================================
|
||||||
|
** NaN Trick
|
||||||
|
** =======================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(LUA_NANTRICK)
|
||||||
|
|
||||||
|
/*
|
||||||
|
** numbers are represented in the 'd_' field. All other values have the
|
||||||
|
** value (0x7ff70000 | tag) in 'tt_'. A number with such pattern would be
|
||||||
|
** a "signaled NaN", which is never generated by regular operations by
|
||||||
|
** the CPU (nor by 'strtod')
|
||||||
|
*/
|
||||||
|
#undef TValuefields
|
||||||
|
#define TValuefields \
|
||||||
|
union { struct { Value v_; int tt_; } i; double d_; } u
|
||||||
|
|
||||||
|
#undef numfield
|
||||||
|
#define numfield /* no such field; numbers are the entire struct */
|
||||||
|
|
||||||
|
/* basic check to distinguish numbers from non-numbers */
|
||||||
|
#undef ttisnumber
|
||||||
|
#define ttisnumber(o) (((o)->u.i.tt_ & 0x7fff0000) != 0x7ff70000)
|
||||||
|
|
||||||
|
#define tag2tt(t) (0x7ff70000 | (t))
|
||||||
|
|
||||||
|
#undef NILCONSTANT
|
||||||
|
#define NILCONSTANT {{{NULL}, tag2tt(LUA_TNIL)}}
|
||||||
|
|
||||||
|
#undef val_
|
||||||
|
#define val_(o) ((o)->u.i.v_)
|
||||||
|
#undef num_
|
||||||
|
#define num_(o) ((o)->u.d_)
|
||||||
|
|
||||||
|
#undef rttype
|
||||||
|
#define rttype(o) (ttisnumber(o) ? LUA_TNUMBER : (o)->u.i.tt_ & 0xff)
|
||||||
|
|
||||||
|
#undef settt_
|
||||||
|
#define settt_(o,t) ((o)->u.i.tt_=tag2tt(t))
|
||||||
|
|
||||||
|
#undef setnvalue
|
||||||
|
#define setnvalue(obj,x) \
|
||||||
|
{ TValue *io_=(obj); num_(io_)=(x); lua_assert(ttisnumber(io_)); }
|
||||||
|
|
||||||
|
#undef setobj
|
||||||
|
#define setobj(L,obj1,obj2) \
|
||||||
|
{ const TValue *o2_=(obj2); TValue *o1_=(obj1); \
|
||||||
|
o1_->u = o2_->u; \
|
||||||
|
checkliveness(G(L),o1_); }
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** these redefinitions are not mandatory, but these forms are more efficient
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef checktag
|
||||||
|
#define checktag(o,t) ((o)->u.i.tt_ == tag2tt(t))
|
||||||
|
|
||||||
|
#undef ttisequal
|
||||||
|
#define ttisequal(o1,o2) \
|
||||||
|
(ttisnumber(o1) ? ttisnumber(o2) : ((o1)->u.i.tt_ == (o2)->u.i.tt_))
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/* }====================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** {======================================================
|
||||||
|
** types and prototypes
|
||||||
|
** =======================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
union Value {
|
||||||
|
GCObject *gc; /* collectable objects */
|
||||||
|
void *p; /* light userdata */
|
||||||
|
int b; /* booleans */
|
||||||
|
lua_CFunction f; /* light C functions */
|
||||||
|
numfield /* numbers */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct lua_TValue {
|
||||||
|
TValuefields;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef TValue *StkId; /* index to stack elements */
|
typedef TValue *StkId; /* index to stack elements */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Header for string value; string bytes follow the end of this structure
|
** Header for string value; string bytes follow the end of this structure
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user