summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2011-05-05 12:53:23 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2011-05-05 12:53:23 -0300
commit25b4e35ee894f6075efff93e39cd1e3ec220f7cc (patch)
treedc4bcccdc32c4623e778499e925c0f8d3a52915a
parent7e1facaa4e06a3cf120d03d30ea295962095e462 (diff)
downloadlua-25b4e35ee894f6075efff93e39cd1e3ec220f7cc.tar.gz
lua-25b4e35ee894f6075efff93e39cd1e3ec220f7cc.tar.bz2
lua-25b4e35ee894f6075efff93e39cd1e3ec220f7cc.zip
new macros abstracting TValue representation (to easy change to
other representations)
-rw-r--r--lobject.h91
1 files changed, 48 insertions, 43 deletions
diff --git a/lobject.h b/lobject.h
index 300f018f..671915f0 100644
--- a/lobject.h
+++ b/lobject.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.h,v 2.50 2011/05/03 16:01:57 roberto Exp roberto $ 2** $Id: lobject.h,v 2.51 2011/05/04 17:04:06 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*/
@@ -99,6 +99,9 @@ typedef struct lua_TValue {
99#define NILCONSTANT {NULL}, LUA_TNIL 99#define NILCONSTANT {NULL}, LUA_TNIL
100 100
101 101
102#define val_(o) ((o)->value_)
103
104
102/* raw type tag of a TValue */ 105/* raw type tag of a TValue */
103#define rttype(o) ((o)->tt_) 106#define rttype(o) ((o)->tt_)
104 107
@@ -111,10 +114,10 @@ typedef struct lua_TValue {
111 114
112 115
113/* Macros to test type */ 116/* Macros to test type */
117#define ttisnumber(o) (rttype(o) == LUA_TNUMBER)
114#define ttisnil(o) (rttype(o) == LUA_TNIL) 118#define ttisnil(o) (rttype(o) == LUA_TNIL)
115#define ttisboolean(o) (rttype(o) == LUA_TBOOLEAN) 119#define ttisboolean(o) (rttype(o) == LUA_TBOOLEAN)
116#define ttislightuserdata(o) (rttype(o) == LUA_TLIGHTUSERDATA) 120#define ttislightuserdata(o) (rttype(o) == LUA_TLIGHTUSERDATA)
117#define ttisnumber(o) (rttype(o) == LUA_TNUMBER)
118#define ttisstring(o) (rttype(o) == ctb(LUA_TSTRING)) 121#define ttisstring(o) (rttype(o) == ctb(LUA_TSTRING))
119#define ttistable(o) (rttype(o) == ctb(LUA_TTABLE)) 122#define ttistable(o) (rttype(o) == ctb(LUA_TTABLE))
120#define ttisfunction(o) (ttypenv(o) == LUA_TFUNCTION) 123#define ttisfunction(o) (ttypenv(o) == LUA_TFUNCTION)
@@ -127,18 +130,18 @@ typedef struct lua_TValue {
127#define ttisequal(o1,o2) (rttype(o1) == rttype(o2)) 130#define ttisequal(o1,o2) (rttype(o1) == rttype(o2))
128 131
129/* Macros to access values */ 132/* Macros to access values */
130#define gcvalue(o) check_exp(iscollectable(o), (o)->value_.gc) 133#define nvalue(o) check_exp(ttisnumber(o), val_(o).n)
131#define pvalue(o) check_exp(ttislightuserdata(o), (o)->value_.p) 134#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc)
132#define nvalue(o) check_exp(ttisnumber(o), (o)->value_.n) 135#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p)
133#define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value_.gc->ts) 136#define rawtsvalue(o) check_exp(ttisstring(o), &val_(o).gc->ts)
134#define tsvalue(o) (&rawtsvalue(o)->tsv) 137#define tsvalue(o) (&rawtsvalue(o)->tsv)
135#define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value_.gc->u) 138#define rawuvalue(o) check_exp(ttisuserdata(o), &val_(o).gc->u)
136#define uvalue(o) (&rawuvalue(o)->uv) 139#define uvalue(o) (&rawuvalue(o)->uv)
137#define clvalue(o) check_exp(ttisclosure(o), &(o)->value_.gc->cl) 140#define clvalue(o) check_exp(ttisclosure(o), &val_(o).gc->cl)
138#define fvalue(o) check_exp(ttislcf(o), (o)->value_.f) 141#define fvalue(o) check_exp(ttislcf(o), val_(o).f)
139#define hvalue(o) check_exp(ttistable(o), &(o)->value_.gc->h) 142#define hvalue(o) check_exp(ttistable(o), &val_(o).gc->h)
140#define bvalue(o) check_exp(ttisboolean(o), (o)->value_.b) 143#define bvalue(o) check_exp(ttisboolean(o), val_(o).b)
141#define thvalue(o) check_exp(ttisthread(o), &(o)->value_.gc->th) 144#define thvalue(o) check_exp(ttisthread(o), &val_(o).gc->th)
142 145
143#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) 146#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
144 147
@@ -156,64 +159,66 @@ typedef struct lua_TValue {
156 159
157 160
158/* Macros to set values */ 161/* Macros to set values */
159#define setnilvalue(obj) ((obj)->tt_=LUA_TNIL) 162#define settt_(o,t) ((o)->tt_=(t))
160 163
161#define setnvalue(obj,x) \ 164#define setnvalue(obj,x) \
162 { TValue *io_=(obj); io_->value_.n=(x); io_->tt_=LUA_TNUMBER; } 165 { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMBER); }
163 166
164#define setfvalue(obj,x) \ 167#define changenvalue(o,x) check_exp(ttisnumber(o), val_(o).n=(x))
165 { TValue *io_=(obj); io_->value_.f=(x); io_->tt_=LUA_TLCF; } 168
169#define setnilvalue(obj) settt_(obj, LUA_TNIL)
166 170
167#define changenvalue(o,x) check_exp(ttisnumber(o), (o)->value_.n=(x)) 171#define setfvalue(obj,x) \
172 { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); }
168 173
169#define setpvalue(obj,x) \ 174#define setpvalue(obj,x) \
170 { TValue *io_=(obj); io_->value_.p=(x); io_->tt_=LUA_TLIGHTUSERDATA; } 175 { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); }
171 176
172#define setbvalue(obj,x) \ 177#define setbvalue(obj,x) \
173 { TValue *io_=(obj); io_->value_.b=(x); io_->tt_=LUA_TBOOLEAN; } 178 { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); }
174 179
175#define setgcovalue(L,obj,x) \ 180#define setgcovalue(L,obj,x) \
176 { TValue *io_=(obj); GCObject *i_g=(x); \ 181 { TValue *io=(obj); GCObject *i_g=(x); \
177 io_->value_.gc=i_g; io_->tt_=ctb(gch(i_g)->tt); } 182 val_(io).gc=i_g; settt_(io, ctb(gch(i_g)->tt)); }
178 183
179#define setsvalue(L,obj,x) \ 184#define setsvalue(L,obj,x) \
180 { TValue *io_=(obj); \ 185 { TValue *io=(obj); \
181 io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TSTRING); \ 186 val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TSTRING)); \
182 checkliveness(G(L),io_); } 187 checkliveness(G(L),io); }
183 188
184#define setuvalue(L,obj,x) \ 189#define setuvalue(L,obj,x) \
185 { TValue *io_=(obj); \ 190 { TValue *io=(obj); \
186 io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TUSERDATA); \ 191 val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TUSERDATA)); \
187 checkliveness(G(L),io_); } 192 checkliveness(G(L),io); }
188 193
189#define setthvalue(L,obj,x) \ 194#define setthvalue(L,obj,x) \
190 { TValue *io_=(obj); \ 195 { TValue *io=(obj); \
191 io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TTHREAD); \ 196 val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TTHREAD)); \
192 checkliveness(G(L),io_); } 197 checkliveness(G(L),io); }
193 198
194#define setclvalue(L,obj,x) \ 199#define setclvalue(L,obj,x) \
195 { TValue *io_=(obj); \ 200 { TValue *io=(obj); \
196 io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TFUNCTION); \ 201 val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TFUNCTION)); \
197 checkliveness(G(L),io_); } 202 checkliveness(G(L),io); }
198 203
199#define sethvalue(L,obj,x) \ 204#define sethvalue(L,obj,x) \
200 { TValue *io_=(obj); \ 205 { TValue *io=(obj); \
201 io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TTABLE); \ 206 val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TTABLE)); \
202 checkliveness(G(L),io_); } 207 checkliveness(G(L),io); }
203 208
204#define setptvalue(L,obj,x) \ 209#define setptvalue(L,obj,x) \
205 { TValue *io_=(obj); \ 210 { TValue *io=(obj); \
206 io_->value_.gc=cast(GCObject *, (x)); io_->tt_=ctb(LUA_TPROTO); \ 211 val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TPROTO)); \
207 checkliveness(G(L),io_); } 212 checkliveness(G(L),io); }
208 213
209#define setdeadvalue(obj) ((obj)->tt_=ctb(LUA_TDEADKEY)) 214#define setdeadvalue(obj) settt_(obj, ctb(LUA_TDEADKEY))
210 215
211 216
212 217
213#define setobj(L,obj1,obj2) \ 218#define setobj(L,obj1,obj2) \
214 { const TValue *o2_=(obj2); TValue *o1_=(obj1); \ 219 { const TValue *io2=(obj2); TValue *io1=(obj1); \
215 o1_->value_ = o2_->value_; o1_->tt_=o2_->tt_; \ 220 io1->value_ = io2->value_; io1->tt_ = io2->tt_; \
216 checkliveness(G(L),o1_); } 221 checkliveness(G(L),io1); }
217 222
218 223
219/* 224/*