瀏覽代碼

more macros to try to make NaN trick work with other sizes of
IEEE float numbers. (It has not been tested with such different
sizes...)

Roberto Ierusalimschy 13 年之前
父節點
當前提交
1350a2bcb5
共有 1 個文件被更改,包括 39 次插入17 次删除
  1. 39 17
      lobject.h

+ 39 - 17
lobject.h

@@ -1,5 +1,5 @@
 /*
-** $Id: lobject.h,v 2.61 2011/07/04 20:29:02 roberto Exp roberto $
+** $Id: lobject.h,v 2.62 2011/09/24 21:12:01 roberto Exp roberto $
 ** Type definitions for Lua objects
 ** See Copyright Notice in lua.h
 */
@@ -264,51 +264,73 @@ typedef struct lua_TValue TValue;
 ** =======================================================
 */
 
-#if defined(LUA_NANTRICKLE) || defined(LUA_NANTRICKBE)
+#if defined(LUA_NANTRICK) \
+ || defined(LUA_NANTRICK_LE) \
+ || defined(LUA_NANTRICK_BE)
 
 /*
 ** numbers are represented in the 'd_' field. All other values have the
-** value (NNMARK | tag) in 'tt_'. A number with such pattern would be
+** 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')
 */
 #if !defined(NNMARK)
 #define NNMARK		0x7FF7A500
+#define NNMASK		0x7FFFFF00
 #endif
 
 #undef TValuefields
 #undef NILCONSTANT
-#if defined(LUA_NANTRICKLE)
+
+#if defined(LUA_NANTRICK_LE)
+
 /* little endian */
 #define TValuefields  \
-	union { struct { Value v_; int tt_; } i; double d_; } u
+	union { struct { Value v__; int tt__; } i; double d__; } u
 #define NILCONSTANT	{{{NULL}, tag2tt(LUA_TNIL)}}
-#else
+/* field-access macros */
+#define v_(o)		((o)->u.i.v__)
+#define d_(o)		((o)->u.d__)
+#define tt_(o)		((o)->u.i.tt__)
+
+#elif defined(LUA_NANTRICK_BE)
+
 /* big endian */
 #define TValuefields  \
-	union { struct { int tt_; Value v_; } i; double d_; } u
+	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__)
+
+#elif !defined(TValuefields)
+#error option 'LUA_NANTRICK' needs declaration for 'TValuefields'
+
 #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)	(((o)->u.i.tt_ & 0x7fffff00) != NNMARK)
+#define ttisnumber(o)	((tt_(o) & NNMASK) != NNMARK)
 
 #define tag2tt(t)	(NNMARK | (t))
 
-#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)
+#define rttype(o)	(ttisnumber(o) ? LUA_TNUMBER : tt_(o) & 0xff)
 
 #undef settt_
-#define settt_(o,t)	((o)->u.i.tt_=tag2tt(t))
+#define settt_(o,t)	(tt_(o) = tag2tt(t))
 
 #undef setnvalue
 #define setnvalue(obj,x) \
@@ -326,11 +348,11 @@ typedef struct lua_TValue TValue;
 */
 
 #undef checktag
-#define checktag(o,t)	((o)->u.i.tt_ == tag2tt(t))
+#define checktag(o,t)	(tt_(o) == tag2tt(t))
 
 #undef ttisequal
 #define ttisequal(o1,o2)  \
-	(ttisnumber(o1) ? ttisnumber(o2) : ((o1)->u.i.tt_ == (o2)->u.i.tt_))
+	(ttisnumber(o1) ? ttisnumber(o2) : (tt_(o1) == tt_(o2)))