diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-02-23 10:16:18 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-02-23 10:16:18 -0300 |
| commit | 9243c414d92c253edd908f438caa31e2aa16f3f4 (patch) | |
| tree | e8959a48f4672037aef061cc6eb82bba21d0766b /lobject.h | |
| parent | 477ca2fe8ceaf79038972977915987adbef0e425 (diff) | |
| download | lua-9243c414d92c253edd908f438caa31e2aa16f3f4.tar.gz lua-9243c414d92c253edd908f438caa31e2aa16f3f4.tar.bz2 lua-9243c414d92c253edd908f438caa31e2aa16f3f4.zip | |
first version of empty entries in tables
(so that, in the future, tables can contain regular nil entries)
Diffstat (limited to 'lobject.h')
| -rw-r--r-- | lobject.h | 30 |
1 files changed, 27 insertions, 3 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.h,v 2.135 2018/02/21 16:28:12 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 2.136 2018/02/22 17:28:10 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 | */ |
| @@ -100,7 +100,7 @@ typedef struct TValue { | |||
| 100 | #define setobj(L,obj1,obj2) \ | 100 | #define setobj(L,obj1,obj2) \ |
| 101 | { TValue *io1=(obj1); const TValue *io2=(obj2); \ | 101 | { TValue *io1=(obj1); const TValue *io2=(obj2); \ |
| 102 | io1->value_ = io2->value_; io1->tt_ = io2->tt_; \ | 102 | io1->value_ = io2->value_; io1->tt_ = io2->tt_; \ |
| 103 | (void)L; checkliveness(L,io1); } | 103 | (void)L; checkliveness(L,io1); lua_assert(!isreallyempty(io1)); } |
| 104 | 104 | ||
| 105 | /* | 105 | /* |
| 106 | ** different types of assignments, according to destination | 106 | ** different types of assignments, according to destination |
| @@ -148,6 +148,30 @@ typedef StackValue *StkId; /* index to stack elements */ | |||
| 148 | /* (address of) a fixed nil value */ | 148 | /* (address of) a fixed nil value */ |
| 149 | #define luaO_nilobject (&luaO_nilobject_) | 149 | #define luaO_nilobject (&luaO_nilobject_) |
| 150 | 150 | ||
| 151 | |||
| 152 | /* | ||
| 153 | ** Variant tag, used only in tables to signal an empty slot | ||
| 154 | ** (which might be different from a slot containing nil) | ||
| 155 | */ | ||
| 156 | #define LUA_TEMPTY (LUA_TNIL | (1 << 4)) | ||
| 157 | |||
| 158 | #define ttisnilorempty(v) checktype((v), LUA_TNIL) | ||
| 159 | /* | ||
| 160 | ** By default, entries with any kind of nil are considered empty | ||
| 161 | */ | ||
| 162 | #define isempty(v) ttisnilorempty(v) | ||
| 163 | |||
| 164 | #define isreallyempty(v) checktag((v), LUA_TEMPTY) | ||
| 165 | |||
| 166 | /* macro defining an empty value */ | ||
| 167 | #define EMPTYCONSTANT {NULL}, LUA_TEMPTY | ||
| 168 | |||
| 169 | |||
| 170 | /* mark an entry as empty */ | ||
| 171 | #define setempty(v) settt_(v, LUA_TEMPTY) | ||
| 172 | |||
| 173 | |||
| 174 | |||
| 151 | /* }================================================================== */ | 175 | /* }================================================================== */ |
| 152 | 176 | ||
| 153 | 177 | ||
| @@ -644,7 +668,7 @@ typedef struct Table { | |||
| 644 | 668 | ||
| 645 | /* | 669 | /* |
| 646 | ** Use a "nil table" to mark dead keys in a table. Those keys serve | 670 | ** Use a "nil table" to mark dead keys in a table. Those keys serve |
| 647 | ** only to keep space for removed entries, which may still be part of | 671 | ** to keep space for removed entries, which may still be part of |
| 648 | ** chains. Note that the 'keytt' does not have the BIT_ISCOLLECTABLE | 672 | ** chains. Note that the 'keytt' does not have the BIT_ISCOLLECTABLE |
| 649 | ** set, so these values are considered not collectable and are different | 673 | ** set, so these values are considered not collectable and are different |
| 650 | ** from any valid value. | 674 | ** from any valid value. |
