diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-11-06 19:41:53 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-11-06 19:41:53 -0200 |
commit | 26bf2adaceb18877d836174226d2bfdc3f1fc512 (patch) | |
tree | b23ccd2e297e7c5e732ce65e88f35145271f7faa /lobject.h | |
parent | fd48dcc7c8734091181d8d0e54b0ba3d1770f4c3 (diff) | |
download | lua-26bf2adaceb18877d836174226d2bfdc3f1fc512.tar.gz lua-26bf2adaceb18877d836174226d2bfdc3f1fc512.tar.bz2 lua-26bf2adaceb18877d836174226d2bfdc3f1fc512.zip |
optimizations for space in LClosures and time cleanning weak tables
Diffstat (limited to 'lobject.h')
-rw-r--r-- | lobject.h | 38 |
1 files changed, 20 insertions, 18 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.h,v 1.114 2001/10/02 16:45:03 roberto Exp $ | 2 | ** $Id: lobject.h,v 1.115 2001/10/25 19:14:14 roberto Exp $ |
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 | */ |
@@ -31,8 +31,13 @@ | |||
31 | #define NUM_TAGS 6 | 31 | #define NUM_TAGS 6 |
32 | 32 | ||
33 | 33 | ||
34 | /* extra tag: used locally when moving an upvalue from the stack to the heap */ | 34 | /* |
35 | ** extra tags: | ||
36 | ** first is used locally when moving an upvalue from the stack to the heap; | ||
37 | ** second prefixes upvalues in the heap | ||
38 | */ | ||
35 | #define LUA_TUPVAL 6 | 39 | #define LUA_TUPVAL 6 |
40 | #define LUA_HEAPUPVAL 7 | ||
36 | 41 | ||
37 | 42 | ||
38 | typedef union { | 43 | typedef union { |
@@ -40,7 +45,7 @@ typedef union { | |||
40 | union Udata *u; | 45 | union Udata *u; |
41 | union Closure *cl; | 46 | union Closure *cl; |
42 | struct Table *h; | 47 | struct Table *h; |
43 | struct UpVal *v; | 48 | struct lua_TObject *v; |
44 | lua_Number n; /* LUA_TNUMBER */ | 49 | lua_Number n; /* LUA_TNUMBER */ |
45 | } Value; | 50 | } Value; |
46 | 51 | ||
@@ -81,8 +86,8 @@ typedef struct lua_TObject { | |||
81 | 86 | ||
82 | #define setnilvalue(obj) ((obj)->tt=LUA_TNIL) | 87 | #define setnilvalue(obj) ((obj)->tt=LUA_TNIL) |
83 | 88 | ||
84 | #define setupvalue(obj,x) \ | 89 | #define setupvalue(obj,x,t) \ |
85 | { TObject *_o=(obj); _o->tt=LUA_TUPVAL; _o->value.v=(x); } | 90 | { TObject *_o=(obj); _o->tt=(t); _o->value.v=(x); } |
86 | 91 | ||
87 | #define setobj(obj1,obj2) \ | 92 | #define setobj(obj1,obj2) \ |
88 | { TObject *o1=(obj1); const TObject *o2=(obj2); \ | 93 | { TObject *o1=(obj1); const TObject *o2=(obj2); \ |
@@ -165,13 +170,15 @@ typedef struct LocVar { | |||
165 | 170 | ||
166 | 171 | ||
167 | /* | 172 | /* |
168 | ** Upvalues in the heap | 173 | ** Upvalues in the heap. There is a small trick here: to allow a closure to |
174 | ** diferentiate between upvalues in the heap and in the stack, upvalues in | ||
175 | ** the heap always have another TObject before them (like those in the stack), | ||
176 | ** but those `prefix' objects have a tag that cannot happen in the stack. | ||
177 | ** Moreover, we use these extra `prexif' object to store GC-related | ||
178 | ** information. | ||
169 | */ | 179 | */ |
170 | typedef struct UpVal { | 180 | |
171 | TObject val; | 181 | #define isclosed(u) (ttype((u)-1) == LUA_HEAPUPVAL) |
172 | struct UpVal *next; | ||
173 | int marked; | ||
174 | } UpVal; | ||
175 | 182 | ||
176 | 183 | ||
177 | /* | 184 | /* |
@@ -188,20 +195,16 @@ typedef struct CClosure { | |||
188 | } CClosure; | 195 | } CClosure; |
189 | 196 | ||
190 | 197 | ||
191 | typedef struct LClosureEntry { | ||
192 | TObject *val; | ||
193 | UpVal *heap; /* NULL when upvalue is still in the stack */ | ||
194 | } LClosureEntry; | ||
195 | |||
196 | typedef struct LClosure { | 198 | typedef struct LClosure { |
197 | lu_byte isC; | 199 | lu_byte isC; |
198 | lu_byte nupvalues; | 200 | lu_byte nupvalues; |
199 | lu_byte marked; | 201 | lu_byte marked; |
200 | union Closure *next; /* first four fields must be equal to CClosure!! */ | 202 | union Closure *next; /* first four fields must be equal to CClosure!! */ |
201 | struct Proto *p; | 203 | struct Proto *p; |
202 | LClosureEntry upvals[1]; | 204 | TObject *upvals[1]; |
203 | } LClosure; | 205 | } LClosure; |
204 | 206 | ||
207 | |||
205 | typedef union Closure { | 208 | typedef union Closure { |
206 | CClosure c; | 209 | CClosure c; |
207 | LClosure l; | 210 | LClosure l; |
@@ -212,7 +215,6 @@ typedef union Closure { | |||
212 | 215 | ||
213 | 216 | ||
214 | 217 | ||
215 | |||
216 | /* | 218 | /* |
217 | ** Tables | 219 | ** Tables |
218 | */ | 220 | */ |