|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: lobject.h,v 2.71 2012/09/11 18:21:44 roberto Exp roberto $
|
|
|
+** $Id: lobject.h,v 2.70 2012/05/11 14:10:50 roberto Exp $
|
|
|
** Type definitions for Lua objects
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -57,6 +57,11 @@
|
|
|
#define LUA_TLNGSTR (LUA_TSTRING | (1 << 4)) /* long strings */
|
|
|
|
|
|
|
|
|
+/* Variant tags for numbers */
|
|
|
+#define LUA_TNUMFLT (LUA_TNUMBER | (0 << 4)) /* float numbers */
|
|
|
+#define LUA_TNUMINT (LUA_TNUMBER | (1 << 4)) /* integer numbers */
|
|
|
+
|
|
|
+
|
|
|
/* Bit mark for collectable types */
|
|
|
#define BIT_ISCOLLECTABLE (1 << 6)
|
|
|
|
|
@@ -92,8 +97,6 @@ typedef struct GCheader {
|
|
|
typedef union Value Value;
|
|
|
|
|
|
|
|
|
-#define numfield lua_Number n; /* numbers */
|
|
|
-
|
|
|
|
|
|
|
|
|
/*
|
|
@@ -111,7 +114,6 @@ typedef struct lua_TValue TValue;
|
|
|
|
|
|
|
|
|
#define val_(o) ((o)->value_)
|
|
|
-#define num_(o) (val_(o).n)
|
|
|
|
|
|
|
|
|
/* raw type tag of a TValue */
|
|
@@ -130,7 +132,9 @@ typedef struct lua_TValue TValue;
|
|
|
/* Macros to test type */
|
|
|
#define checktag(o,t) (rttype(o) == (t))
|
|
|
#define checktype(o,t) (ttnov(o) == (t))
|
|
|
-#define ttisnumber(o) checktag((o), LUA_TNUMBER)
|
|
|
+#define ttisnumber(o) checktype((o), LUA_TNUMBER)
|
|
|
+#define ttisfloat(o) checktag((o), LUA_TNUMFLT)
|
|
|
+#define ttisinteger(o) checktag((o), LUA_TNUMINT)
|
|
|
#define ttisnil(o) checktag((o), LUA_TNIL)
|
|
|
#define ttisboolean(o) checktag((o), LUA_TBOOLEAN)
|
|
|
#define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA)
|
|
@@ -147,10 +151,13 @@ typedef struct lua_TValue TValue;
|
|
|
#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD))
|
|
|
#define ttisdeadkey(o) checktag((o), LUA_TDEADKEY)
|
|
|
|
|
|
-#define ttisequal(o1,o2) (rttype(o1) == rttype(o2))
|
|
|
|
|
|
/* Macros to access values */
|
|
|
-#define nvalue(o) check_exp(ttisnumber(o), num_(o))
|
|
|
+#define nvalue(o) \
|
|
|
+ check_exp(ttisnumber(o), (ttisfloat(o) ? val_(o).n : cast_num(val_(o).i)))
|
|
|
+
|
|
|
+#define ivalue(o) check_exp(ttisinteger(o), val_(o).i)
|
|
|
+#define fltvalue(o) check_exp(ttisfloat(o), val_(o).n)
|
|
|
#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc)
|
|
|
#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p)
|
|
|
#define rawtsvalue(o) check_exp(ttisstring(o), &val_(o).gc->ts)
|
|
@@ -185,7 +192,10 @@ typedef struct lua_TValue TValue;
|
|
|
#define settt_(o,t) ((o)->tt_=(t))
|
|
|
|
|
|
#define setnvalue(obj,x) \
|
|
|
- { TValue *io=(obj); num_(io)=(x); settt_(io, LUA_TNUMBER); }
|
|
|
+ { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); }
|
|
|
+
|
|
|
+#define setivalue(obj,x) \
|
|
|
+ { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); }
|
|
|
|
|
|
#define setnilvalue(obj) settt_(obj, LUA_TNIL)
|
|
|
|
|
@@ -267,115 +277,6 @@ typedef struct lua_TValue TValue;
|
|
|
#define luai_checknum(L,o,c) { /* empty */ }
|
|
|
|
|
|
|
|
|
-/*
|
|
|
-** {======================================================
|
|
|
-** NaN Trick
|
|
|
-** =======================================================
|
|
|
-*/
|
|
|
-#if defined(LUA_NANTRICK)
|
|
|
-
|
|
|
-/*
|
|
|
-** numbers are represented in the 'd_' field. All other values have the
|
|
|
-** value (NNMARK | 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')
|
|
|
-*/
|
|
|
-
|
|
|
-/* allows for external implementation for part of the trick */
|
|
|
-#if !defined(NNMARK) /* { */
|
|
|
-
|
|
|
-
|
|
|
-#if !defined(LUA_IEEEENDIAN)
|
|
|
-#error option 'LUA_NANTRICK' needs 'LUA_IEEEENDIAN'
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
-#define NNMARK 0x7FF7A500
|
|
|
-#define NNMASK 0x7FFFFF00
|
|
|
-
|
|
|
-#undef TValuefields
|
|
|
-#undef NILCONSTANT
|
|
|
-
|
|
|
-#if (LUA_IEEEENDIAN == 0) /* { */
|
|
|
-
|
|
|
-/* little endian */
|
|
|
-#define TValuefields \
|
|
|
- union { struct { Value v__; int tt__; } i; double d__; } u
|
|
|
-#define NILCONSTANT {{{NULL}, tag2tt(LUA_TNIL)}}
|
|
|
-/* field-access macros */
|
|
|
-#define v_(o) ((o)->u.i.v__)
|
|
|
-#define d_(o) ((o)->u.d__)
|
|
|
-#define tt_(o) ((o)->u.i.tt__)
|
|
|
-
|
|
|
-#else /* }{ */
|
|
|
-
|
|
|
-/* big endian */
|
|
|
-#define TValuefields \
|
|
|
- union { struct { int tt__; Value v__; } i; double d__; } u
|
|
|
-#define NILCONSTANT {{tag2tt(LUA_TNIL), {NULL}}}
|
|
|
-/* field-access macros */
|
|
|
-#define v_(o) ((o)->u.i.v__)
|
|
|
-#define d_(o) ((o)->u.d__)
|
|
|
-#define tt_(o) ((o)->u.i.tt__)
|
|
|
-
|
|
|
-#endif /* } */
|
|
|
-
|
|
|
-#endif /* } */
|
|
|
-
|
|
|
-
|
|
|
-/* correspondence with standard representation */
|
|
|
-#undef val_
|
|
|
-#define val_(o) v_(o)
|
|
|
-#undef num_
|
|
|
-#define num_(o) d_(o)
|
|
|
-
|
|
|
-
|
|
|
-#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) ((tt_(o) & NNMASK) != NNMARK)
|
|
|
-
|
|
|
-#define tag2tt(t) (NNMARK | (t))
|
|
|
-
|
|
|
-#undef rttype
|
|
|
-#define rttype(o) (ttisnumber(o) ? LUA_TNUMBER : tt_(o) & 0xff)
|
|
|
-
|
|
|
-#undef settt_
|
|
|
-#define settt_(o,t) (tt_(o) = 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
|
|
|
-#undef checktype
|
|
|
-#define checktag(o,t) (tt_(o) == tag2tt(t))
|
|
|
-#define checktype(o,t) (ctb(tt_(o) | VARBITS) == ctb(tag2tt(t) | VARBITS))
|
|
|
-
|
|
|
-#undef ttisequal
|
|
|
-#define ttisequal(o1,o2) \
|
|
|
- (ttisnumber(o1) ? ttisnumber(o2) : (tt_(o1) == tt_(o2)))
|
|
|
-
|
|
|
-
|
|
|
-#undef luai_checknum
|
|
|
-#define luai_checknum(L,o,c) { if (!ttisnumber(o)) c; }
|
|
|
-
|
|
|
-#endif
|
|
|
-/* }====================================================== */
|
|
|
-
|
|
|
|
|
|
|
|
|
/*
|
|
@@ -390,7 +291,8 @@ union Value {
|
|
|
void *p; /* light userdata */
|
|
|
int b; /* booleans */
|
|
|
lua_CFunction f; /* light C functions */
|
|
|
- numfield /* numbers */
|
|
|
+ lua_Integer i; /* integer numbers */
|
|
|
+ lua_Number n; /* float numbers */
|
|
|
};
|
|
|
|
|
|
|