diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-03-18 15:56:32 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-03-18 15:56:32 -0300 |
| commit | ce6f5502c99ce9a367e25b678e375db6f8164d73 (patch) | |
| tree | 47f36dc2f6da96dfda325d7b587f3a20599e9317 /lobject.h | |
| parent | ba710603811c68fe3a69b3bb98e9038d37489a79 (diff) | |
| download | lua-ce6f5502c99ce9a367e25b678e375db6f8164d73.tar.gz lua-ce6f5502c99ce9a367e25b678e375db6f8164d73.tar.bz2 lua-ce6f5502c99ce9a367e25b678e375db6f8164d73.zip | |
'luaH_get' functions return 'TValue'
Instead of receiving a parameter telling them where to put the result
of the query, these functions return the TValue directly. (That is,
they return a structure.)
Diffstat (limited to 'lobject.h')
| -rw-r--r-- | lobject.h | 19 |
1 files changed, 19 insertions, 0 deletions
| @@ -75,6 +75,7 @@ typedef struct TValue { | |||
| 75 | 75 | ||
| 76 | /* raw type tag of a TValue */ | 76 | /* raw type tag of a TValue */ |
| 77 | #define rawtt(o) ((o)->tt_) | 77 | #define rawtt(o) ((o)->tt_) |
| 78 | #define rawttV(o) ((o).tt_) | ||
| 78 | 79 | ||
| 79 | /* tag with no variants (bits 0-3) */ | 80 | /* tag with no variants (bits 0-3) */ |
| 80 | #define novariant(t) ((t) & 0x0F) | 81 | #define novariant(t) ((t) & 0x0F) |
| @@ -82,14 +83,18 @@ typedef struct TValue { | |||
| 82 | /* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ | 83 | /* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ |
| 83 | #define withvariant(t) ((t) & 0x3F) | 84 | #define withvariant(t) ((t) & 0x3F) |
| 84 | #define ttypetag(o) withvariant(rawtt(o)) | 85 | #define ttypetag(o) withvariant(rawtt(o)) |
| 86 | #define ttypetagV(o) withvariant(rawttV(o)) | ||
| 85 | 87 | ||
| 86 | /* type of a TValue */ | 88 | /* type of a TValue */ |
| 87 | #define ttype(o) (novariant(rawtt(o))) | 89 | #define ttype(o) (novariant(rawtt(o))) |
| 90 | #define ttypeV(o) (novariant(rawttV(o))) | ||
| 88 | 91 | ||
| 89 | 92 | ||
| 90 | /* Macros to test type */ | 93 | /* Macros to test type */ |
| 91 | #define checktag(o,t) (rawtt(o) == (t)) | 94 | #define checktag(o,t) (rawtt(o) == (t)) |
| 95 | #define checktagV(o,t) (rawttV(o) == (t)) | ||
| 92 | #define checktype(o,t) (ttype(o) == (t)) | 96 | #define checktype(o,t) (ttype(o) == (t)) |
| 97 | #define checktypeV(o,t) (ttypeV(o) == (t)) | ||
| 93 | 98 | ||
| 94 | 99 | ||
| 95 | /* Macros for internal tests */ | 100 | /* Macros for internal tests */ |
| @@ -112,6 +117,7 @@ typedef struct TValue { | |||
| 112 | 117 | ||
| 113 | /* set a value's tag */ | 118 | /* set a value's tag */ |
| 114 | #define settt_(o,t) ((o)->tt_=(t)) | 119 | #define settt_(o,t) ((o)->tt_=(t)) |
| 120 | #define setttV_(o,t) ((o).tt_=(t)) | ||
| 115 | 121 | ||
| 116 | 122 | ||
| 117 | /* main macro to copy values (from 'obj2' to 'obj1') */ | 123 | /* main macro to copy values (from 'obj2' to 'obj1') */ |
| @@ -120,6 +126,11 @@ typedef struct TValue { | |||
| 120 | io1->value_ = io2->value_; settt_(io1, io2->tt_); \ | 126 | io1->value_ = io2->value_; settt_(io1, io2->tt_); \ |
| 121 | checkliveness(L,io1); lua_assert(!isnonstrictnil(io1)); } | 127 | checkliveness(L,io1); lua_assert(!isnonstrictnil(io1)); } |
| 122 | 128 | ||
| 129 | #define setobjV(L,obj1,obj2) \ | ||
| 130 | { TValue *io1=(obj1); const TValue io2=(obj2); \ | ||
| 131 | io1->value_ = io2.value_; settt_(io1, io2.tt_); \ | ||
| 132 | checkliveness(L,io1); lua_assert(!isnonstrictnil(io1)); } | ||
| 133 | |||
| 123 | /* | 134 | /* |
| 124 | ** Different types of assignments, according to source and destination. | 135 | ** Different types of assignments, according to source and destination. |
| 125 | ** (They are mostly equal now, but may be different in the future.) | 136 | ** (They are mostly equal now, but may be different in the future.) |
| @@ -188,9 +199,15 @@ typedef union { | |||
| 188 | /* Value returned for a key not found in a table (absent key) */ | 199 | /* Value returned for a key not found in a table (absent key) */ |
| 189 | #define LUA_VABSTKEY makevariant(LUA_TNIL, 2) | 200 | #define LUA_VABSTKEY makevariant(LUA_TNIL, 2) |
| 190 | 201 | ||
| 202 | /* Special "value" to signal that a fast get is accessing a non-table */ | ||
| 203 | #define LUA_VNOTABLE makevariant(LUA_TNIL, 3) | ||
| 204 | |||
| 205 | #define setnotableV(obj) setttV_(obj, LUA_VNOTABLE) | ||
| 206 | |||
| 191 | 207 | ||
| 192 | /* macro to test for (any kind of) nil */ | 208 | /* macro to test for (any kind of) nil */ |
| 193 | #define ttisnil(v) checktype((v), LUA_TNIL) | 209 | #define ttisnil(v) checktype((v), LUA_TNIL) |
| 210 | #define ttisnilV(v) checktypeV((v), LUA_TNIL) | ||
| 194 | 211 | ||
| 195 | #define tagisempty(tag) (novariant(tag) == LUA_TNIL) | 212 | #define tagisempty(tag) (novariant(tag) == LUA_TNIL) |
| 196 | 213 | ||
| @@ -217,6 +234,7 @@ typedef union { | |||
| 217 | ** be accepted as empty.) | 234 | ** be accepted as empty.) |
| 218 | */ | 235 | */ |
| 219 | #define isempty(v) ttisnil(v) | 236 | #define isempty(v) ttisnil(v) |
| 237 | #define isemptyV(v) checktypeV((v), LUA_TNIL) | ||
| 220 | 238 | ||
| 221 | 239 | ||
| 222 | /* macro defining a value corresponding to an absent key */ | 240 | /* macro defining a value corresponding to an absent key */ |
| @@ -328,6 +346,7 @@ typedef struct GCObject { | |||
| 328 | #define ttisnumber(o) checktype((o), LUA_TNUMBER) | 346 | #define ttisnumber(o) checktype((o), LUA_TNUMBER) |
| 329 | #define ttisfloat(o) checktag((o), LUA_VNUMFLT) | 347 | #define ttisfloat(o) checktag((o), LUA_VNUMFLT) |
| 330 | #define ttisinteger(o) checktag((o), LUA_VNUMINT) | 348 | #define ttisinteger(o) checktag((o), LUA_VNUMINT) |
| 349 | #define ttisintegerV(o) checktagV((o), LUA_VNUMINT) | ||
| 331 | 350 | ||
| 332 | #define nvalue(o) check_exp(ttisnumber(o), \ | 351 | #define nvalue(o) check_exp(ttisnumber(o), \ |
| 333 | (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) | 352 | (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) |
