From 25b4e35ee894f6075efff93e39cd1e3ec220f7cc Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 5 May 2011 12:53:23 -0300 Subject: new macros abstracting TValue representation (to easy change to other representations) --- lobject.h | 91 +++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 48 insertions(+), 43 deletions(-) (limited to 'lobject.h') diff --git a/lobject.h b/lobject.h index 300f018f..671915f0 100644 --- a/lobject.h +++ b/lobject.h @@ -1,5 +1,5 @@ /* -** $Id: lobject.h,v 2.50 2011/05/03 16:01:57 roberto Exp roberto $ +** $Id: lobject.h,v 2.51 2011/05/04 17:04:06 roberto Exp roberto $ ** Type definitions for Lua objects ** See Copyright Notice in lua.h */ @@ -99,6 +99,9 @@ typedef struct lua_TValue { #define NILCONSTANT {NULL}, LUA_TNIL +#define val_(o) ((o)->value_) + + /* raw type tag of a TValue */ #define rttype(o) ((o)->tt_) @@ -111,10 +114,10 @@ typedef struct lua_TValue { /* Macros to test type */ +#define ttisnumber(o) (rttype(o) == LUA_TNUMBER) #define ttisnil(o) (rttype(o) == LUA_TNIL) #define ttisboolean(o) (rttype(o) == LUA_TBOOLEAN) #define ttislightuserdata(o) (rttype(o) == LUA_TLIGHTUSERDATA) -#define ttisnumber(o) (rttype(o) == LUA_TNUMBER) #define ttisstring(o) (rttype(o) == ctb(LUA_TSTRING)) #define ttistable(o) (rttype(o) == ctb(LUA_TTABLE)) #define ttisfunction(o) (ttypenv(o) == LUA_TFUNCTION) @@ -127,18 +130,18 @@ typedef struct lua_TValue { #define ttisequal(o1,o2) (rttype(o1) == rttype(o2)) /* Macros to access values */ -#define gcvalue(o) check_exp(iscollectable(o), (o)->value_.gc) -#define pvalue(o) check_exp(ttislightuserdata(o), (o)->value_.p) -#define nvalue(o) check_exp(ttisnumber(o), (o)->value_.n) -#define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value_.gc->ts) +#define nvalue(o) check_exp(ttisnumber(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) #define tsvalue(o) (&rawtsvalue(o)->tsv) -#define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value_.gc->u) +#define rawuvalue(o) check_exp(ttisuserdata(o), &val_(o).gc->u) #define uvalue(o) (&rawuvalue(o)->uv) -#define clvalue(o) check_exp(ttisclosure(o), &(o)->value_.gc->cl) -#define fvalue(o) check_exp(ttislcf(o), (o)->value_.f) -#define hvalue(o) check_exp(ttistable(o), &(o)->value_.gc->h) -#define bvalue(o) check_exp(ttisboolean(o), (o)->value_.b) -#define thvalue(o) check_exp(ttisthread(o), &(o)->value_.gc->th) +#define clvalue(o) check_exp(ttisclosure(o), &val_(o).gc->cl) +#define fvalue(o) check_exp(ttislcf(o), val_(o).f) +#define hvalue(o) check_exp(ttistable(o), &val_(o).gc->h) +#define bvalue(o) check_exp(ttisboolean(o), val_(o).b) +#define thvalue(o) check_exp(ttisthread(o), &val_(o).gc->th) #define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) @@ -156,64 +159,66 @@ typedef struct lua_TValue { /* Macros to set values */ -#define setnilvalue(obj) ((obj)->tt_=LUA_TNIL) +#define settt_(o,t) ((o)->tt_=(t)) #define setnvalue(obj,x) \ - { TValue *io_=(obj); io_->value_.n=(x); io_->tt_=LUA_TNUMBER; } + { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMBER); } -#define setfvalue(obj,x) \ - { TValue *io_=(obj); io_->value_.f=(x); io_->tt_=LUA_TLCF; } +#define changenvalue(o,x) check_exp(ttisnumber(o), val_(o).n=(x)) + +#define setnilvalue(obj) settt_(obj, LUA_TNIL) -#define changenvalue(o,x) check_exp(ttisnumber(o), (o)->value_.n=(x)) +#define setfvalue(obj,x) \ + { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); } #define setpvalue(obj,x) \ - { TValue *io_=(obj); io_->value_.p=(x); io_->tt_=LUA_TLIGHTUSERDATA; } + { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); } #define setbvalue(obj,x) \ - { TValue *io_=(obj); io_->value_.b=(x); io_->tt_=LUA_TBOOLEAN; } + { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); } #define setgcovalue(L,obj,x) \ - { TValue *io_=(obj); GCObject *i_g=(x); \ - io_->value_.gc=i_g; io_->tt_=ctb(gch(i_g)->tt); } + { TValue *io=(obj); GCObject *i_g=(x); \ + val_(io).gc=i_g; settt_(io, ctb(gch(i_g)->tt)); } #define setsvalue(L,obj,x) \ - { TValue *io_=(obj); \ - io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TSTRING); \ - checkliveness(G(L),io_); } + { TValue *io=(obj); \ + val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TSTRING)); \ + checkliveness(G(L),io); } #define setuvalue(L,obj,x) \ - { TValue *io_=(obj); \ - io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TUSERDATA); \ - checkliveness(G(L),io_); } + { TValue *io=(obj); \ + val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TUSERDATA)); \ + checkliveness(G(L),io); } #define setthvalue(L,obj,x) \ - { TValue *io_=(obj); \ - io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TTHREAD); \ - checkliveness(G(L),io_); } + { TValue *io=(obj); \ + val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TTHREAD)); \ + checkliveness(G(L),io); } #define setclvalue(L,obj,x) \ - { TValue *io_=(obj); \ - io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TFUNCTION); \ - checkliveness(G(L),io_); } + { TValue *io=(obj); \ + val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TFUNCTION)); \ + checkliveness(G(L),io); } #define sethvalue(L,obj,x) \ - { TValue *io_=(obj); \ - io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TTABLE); \ - checkliveness(G(L),io_); } + { TValue *io=(obj); \ + val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TTABLE)); \ + checkliveness(G(L),io); } #define setptvalue(L,obj,x) \ - { TValue *io_=(obj); \ - io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TPROTO); \ - checkliveness(G(L),io_); } + { TValue *io=(obj); \ + val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TPROTO)); \ + checkliveness(G(L),io); } -#define setdeadvalue(obj) ((obj)->tt_=ctb(LUA_TDEADKEY)) +#define setdeadvalue(obj) settt_(obj, ctb(LUA_TDEADKEY)) #define setobj(L,obj1,obj2) \ - { const TValue *o2_=(obj2); TValue *o1_=(obj1); \ - o1_->value_ = o2_->value_; o1_->tt_=o2_->tt_; \ - checkliveness(G(L),o1_); } + { const TValue *io2=(obj2); TValue *io1=(obj1); \ + io1->value_ = io2->value_; io1->tt_ = io2->tt_; \ + checkliveness(G(L),io1); } /* -- cgit v1.2.3-55-g6feb