1// Here one comprehension creates a number of distinct values, each of which
2// with a disjunction, then another comprehension maps them back to the
3// same value, creating a large number of disjunctions.
4//
5// The disjunctions cannot be identified as equal in the general case. If no
6// care is taken, disjunction elimination will be exponential, causing over
7// a billion disjuncts to process in the below example. With the proper
8// optimizations, there is a small, constant number of disjunction ops per
9// disjunct.
10//
11// Issue #651
12-- stats.txt --
13Leaks: 0
14Freed: 283
15Reused: 275
16Allocs: 8
17Retain: 0
18
19Unifications: 99
20Conjuncts: 530
21Disjuncts: 283
22
23-- in.cue --
24list: [
25 0, 1, 2, 3, 4, 5, 6, 7, 8,
26 9, 10, 11, 12, 13, 14, 15, 16,
27 17, 18, 19, 20, 21, 22, 23, 24,
28 25, 26, 27, 28, 29, 30,
29]
30a: [X=string]: text: *"default" | string
31
32a: {
33 for i in list {
34 "\(i)": text: string
35 }
36}
37
38b: {
39 for x in a {
40 "\(x.text)": {text: x.text}
41 }
42}
43-- out/eval/stats --
44Leaks: 0
45Freed: 283
46Reused: 275
47Allocs: 8
48Retain: 0
49
50Unifications: 99
51Conjuncts: 530
52Disjuncts: 283
53-- out/eval --
54(struct){
55 list: (#list){
56 0: (int){ 0 }
57 1: (int){ 1 }
58 2: (int){ 2 }
59 3: (int){ 3 }
60 4: (int){ 4 }
61 5: (int){ 5 }
62 6: (int){ 6 }
63 7: (int){ 7 }
64 8: (int){ 8 }
65 9: (int){ 9 }
66 10: (int){ 10 }
67 11: (int){ 11 }
68 12: (int){ 12 }
69 13: (int){ 13 }
70 14: (int){ 14 }
71 15: (int){ 15 }
72 16: (int){ 16 }
73 17: (int){ 17 }
74 18: (int){ 18 }
75 19: (int){ 19 }
76 20: (int){ 20 }
77 21: (int){ 21 }
78 22: (int){ 22 }
79 23: (int){ 23 }
80 24: (int){ 24 }
81 25: (int){ 25 }
82 26: (int){ 26 }
83 27: (int){ 27 }
84 28: (int){ 28 }
85 29: (int){ 29 }
86 30: (int){ 30 }
87 }
88 a: (struct){
89 "0": (struct){
90 text: (string){ |(*(string){ "default" }, (string){ string }) }
91 }
92 "1": (struct){
93 text: (string){ |(*(string){ "default" }, (string){ string }) }
94 }
95 "2": (struct){
96 text: (string){ |(*(string){ "default" }, (string){ string }) }
97 }
98 "3": (struct){
99 text: (string){ |(*(string){ "default" }, (string){ string }) }
100 }
101 "4": (struct){
102 text: (string){ |(*(string){ "default" }, (string){ string }) }
103 }
104 "5": (struct){
105 text: (string){ |(*(string){ "default" }, (string){ string }) }
106 }
107 "6": (struct){
108 text: (string){ |(*(string){ "default" }, (string){ string }) }
109 }
110 "7": (struct){
111 text: (string){ |(*(string){ "default" }, (string){ string }) }
112 }
113 "8": (struct){
114 text: (string){ |(*(string){ "default" }, (string){ string }) }
115 }
116 "9": (struct){
117 text: (string){ |(*(string){ "default" }, (string){ string }) }
118 }
119 "10": (struct){
120 text: (string){ |(*(string){ "default" }, (string){ string }) }
121 }
122 "11": (struct){
123 text: (string){ |(*(string){ "default" }, (string){ string }) }
124 }
125 "12": (struct){
126 text: (string){ |(*(string){ "default" }, (string){ string }) }
127 }
128 "13": (struct){
129 text: (string){ |(*(string){ "default" }, (string){ string }) }
130 }
131 "14": (struct){
132 text: (string){ |(*(string){ "default" }, (string){ string }) }
133 }
134 "15": (struct){
135 text: (string){ |(*(string){ "default" }, (string){ string }) }
136 }
137 "16": (struct){
138 text: (string){ |(*(string){ "default" }, (string){ string }) }
139 }
140 "17": (struct){
141 text: (string){ |(*(string){ "default" }, (string){ string }) }
142 }
143 "18": (struct){
144 text: (string){ |(*(string){ "default" }, (string){ string }) }
145 }
146 "19": (struct){
147 text: (string){ |(*(string){ "default" }, (string){ string }) }
148 }
149 "20": (struct){
150 text: (string){ |(*(string){ "default" }, (string){ string }) }
151 }
152 "21": (struct){
153 text: (string){ |(*(string){ "default" }, (string){ string }) }
154 }
155 "22": (struct){
156 text: (string){ |(*(string){ "default" }, (string){ string }) }
157 }
158 "23": (struct){
159 text: (string){ |(*(string){ "default" }, (string){ string }) }
160 }
161 "24": (struct){
162 text: (string){ |(*(string){ "default" }, (string){ string }) }
163 }
164 "25": (struct){
165 text: (string){ |(*(string){ "default" }, (string){ string }) }
166 }
167 "26": (struct){
168 text: (string){ |(*(string){ "default" }, (string){ string }) }
169 }
170 "27": (struct){
171 text: (string){ |(*(string){ "default" }, (string){ string }) }
172 }
173 "28": (struct){
174 text: (string){ |(*(string){ "default" }, (string){ string }) }
175 }
176 "29": (struct){
177 text: (string){ |(*(string){ "default" }, (string){ string }) }
178 }
179 "30": (struct){
180 text: (string){ |(*(string){ "default" }, (string){ string }) }
181 }
182 }
183 b: (struct){
184 default: (struct){
185 text: (string){ |(*(string){ "default" }, (string){ string }) }
186 }
187 }
188}
189-- out/compile --
190--- in.cue
191{
192 list: [
193 0,
194 1,
195 2,
196 3,
197 4,
198 5,
199 6,
200 7,
201 8,
202 9,
203 10,
204 11,
205 12,
206 13,
207 14,
208 15,
209 16,
210 17,
211 18,
212 19,
213 20,
214 21,
215 22,
216 23,
217 24,
218 25,
219 26,
220 27,
221 28,
222 29,
223 30,
224 ]
225 a: {
226 [string]: {
227 text: (*"default"|string)
228 }
229 }
230 a: {
231 for _, i in 〈1;list〉 {
232 "\(〈1;i〉)": {
233 text: string
234 }
235 }
236 }
237 b: {
238 for _, x in 〈1;a〉 {
239 "\(〈1;x〉.text)": {
240 text: 〈2;x〉.text
241 }
242 }
243 }
244}
View as plain text