-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtight.lua
106 lines (94 loc) · 2.33 KB
/
tight.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
function OR_all (me, t)
t = t or me
me.awaits = false
me.breaks = false
me.returns = false
me.brk_awt_ret = false
for _, sub in ipairs(t) do
me.awaits = me.awaits or sub.awaits
me.breaks = me.breaks or sub.breaks
me.returns = me.returns or sub.returns
me.brk_awt_ret = me.brk_awt_ret or sub.brk_awt_ret
end
end
function AND_all (me, t)
t = t or me
me.awaits = true
me.breaks = true
me.returns = true
me.brk_awt_ret = true
for _, sub in ipairs(t) do
me.awaits = me.awaits and sub.awaits
me.breaks = me.breaks and sub.breaks
me.returns = me.returns and sub.returns
me.brk_awt_ret = me.brk_awt_ret and sub.brk_awt_ret
end
end
function same (me, sub)
me.awaits = sub.awaits
me.breaks = sub.breaks
me.returns = sub.returns
me.brk_awt_ret = sub.brk_awt_ret
end
F = {
Node_pre = function (me)
me.awaits = false
me.breaks = false
me.returns = false
me.brk_awt_ret = false
end,
Node = function (me)
if (not F[me.id]) and _ISNODE(me[#me]) then
same(me, me[#me])
end
end,
Block = OR_all,
ParEver = OR_all,
ParAnd = OR_all,
If = function (me)
local c, t, f = unpack(me)
t = t or c
f = f or c
AND_all(me, {t,f})
end,
ParOr = AND_all,
Break = function (me)
me.breaks = true
me.brk_awt_ret = true
end,
Loop = function (me)
local body = unpack(me)
same(me, body)
ASR(_ITER'Async'() or body.brk_awt_ret, me,'tight loop')
me.breaks = false
me.brk_awt_ret = body.awaits or body.returns
end,
SetBlock = function (me)
local acc, sub = unpack(me)
same(me, sub)
me.returns = false
end,
Return = function (me)
me.returns = true
me.brk_awt_ret = true
end,
Async = function (me)
local body = unpack(me)
same(me, body)
me.awaits = true
me.brk_awt_ret = true
end,
AwaitE = function (me)
me.awaits = true
me.brk_awt_ret = true
end,
AwaitT = function (me)
me.awaits = true
me.brk_awt_ret = true
end,
AwaitN = function (me)
me.awaits = true
me.brk_awt_ret = true
end,
}
_VISIT(F)