aboutsummaryrefslogtreecommitdiff
path: root/src/lua/lgc.h
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-09-11 15:31:51 +0800
committerLi Jin <dragon-fly@qq.com>2020-09-11 15:31:51 +0800
commit85b9ec82247f6e06b802188af35d09d3159625df (patch)
tree487152fb9639a74e323f7db962f558ba0514322d /src/lua/lgc.h
parentdfd4e3b2b2abc0137d26ed3df303a398741bb6a0 (diff)
downloadyuescript-85b9ec82247f6e06b802188af35d09d3159625df.tar.gz
yuescript-85b9ec82247f6e06b802188af35d09d3159625df.tar.bz2
yuescript-85b9ec82247f6e06b802188af35d09d3159625df.zip
update Lua.
Diffstat (limited to 'src/lua/lgc.h')
-rw-r--r--src/lua/lgc.h29
1 files changed, 16 insertions, 13 deletions
diff --git a/src/lua/lgc.h b/src/lua/lgc.h
index b972472..073e2a4 100644
--- a/src/lua/lgc.h
+++ b/src/lua/lgc.h
@@ -12,16 +12,16 @@
12#include "lstate.h" 12#include "lstate.h"
13 13
14/* 14/*
15** Collectable objects may have one of three colors: white, which 15** Collectable objects may have one of three colors: white, which means
16** means the object is not marked; gray, which means the 16** the object is not marked; gray, which means the object is marked, but
17** object is marked, but its references may be not marked; and 17** its references may be not marked; and black, which means that the
18** black, which means that the object and all its references are marked. 18** object and all its references are marked. The main invariant of the
19** The main invariant of the garbage collector, while marking objects, 19** garbage collector, while marking objects, is that a black object can
20** is that a black object can never point to a white one. Moreover, 20** never point to a white one. Moreover, any gray object must be in a
21** any gray object must be in a "gray list" (gray, grayagain, weak, 21** "gray list" (gray, grayagain, weak, allweak, ephemeron) so that it
22** allweak, ephemeron) so that it can be visited again before finishing 22** can be visited again before finishing the collection cycle. (Open
23** the collection cycle. These lists have no meaning when the invariant 23** upvalues are an exception to this rule.) These lists have no meaning
24** is not being enforced (e.g., sweep phase). 24** when the invariant is not being enforced (e.g., sweep phase).
25*/ 25*/
26 26
27 27
@@ -69,14 +69,16 @@
69 69
70/* 70/*
71** Layout for bit use in 'marked' field. First three bits are 71** Layout for bit use in 'marked' field. First three bits are
72** used for object "age" in generational mode. Last bit is free 72** used for object "age" in generational mode. Last bit is used
73** to be used by respective objects. 73** by tests.
74*/ 74*/
75#define WHITE0BIT 3 /* object is white (type 0) */ 75#define WHITE0BIT 3 /* object is white (type 0) */
76#define WHITE1BIT 4 /* object is white (type 1) */ 76#define WHITE1BIT 4 /* object is white (type 1) */
77#define BLACKBIT 5 /* object is black */ 77#define BLACKBIT 5 /* object is black */
78#define FINALIZEDBIT 6 /* object has been marked for finalization */ 78#define FINALIZEDBIT 6 /* object has been marked for finalization */
79 79
80#define TESTBIT 7
81
80 82
81 83
82#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) 84#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT)
@@ -94,7 +96,8 @@
94#define isdead(g,v) isdeadm(otherwhite(g), (v)->marked) 96#define isdead(g,v) isdeadm(otherwhite(g), (v)->marked)
95 97
96#define changewhite(x) ((x)->marked ^= WHITEBITS) 98#define changewhite(x) ((x)->marked ^= WHITEBITS)
97#define gray2black(x) l_setbit((x)->marked, BLACKBIT) 99#define nw2black(x) \
100 check_exp(!iswhite(x), l_setbit((x)->marked, BLACKBIT))
98 101
99#define luaC_white(g) cast_byte((g)->currentwhite & WHITEBITS) 102#define luaC_white(g) cast_byte((g)->currentwhite & WHITEBITS)
100 103