efront 3.37.0 → 3.38.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coms/basic/#loader.js +3 -2
- package/coms/basic/assert.js +21 -9
- package/coms/basic_/Array2.js +2 -1
- package/coms/basic_/JSON.js +8 -8
- package/coms/basic_/JSON_test.js +80 -2
- package/coms/basic_/Symbol.js +4 -1
- package/coms/basic_/exec_.js +21 -10
- package/coms/basic_/extends_.js +1 -0
- package/coms/compile/Javascript.js +36 -12
- package/coms/compile/Program.js +11 -4
- package/coms/compile/breakcode.js +6 -8
- package/coms/compile/common.js +170 -51
- package/coms/compile/downLevel.js +727 -275
- package/coms/compile/downLevel_test.js +195 -53
- package/coms/compile/powermap.js +2 -2
- package/coms/compile/scanner2.js +23 -2
- package/coms/compile/translate.js +45 -19
- package/coms/compile/unstruct.js +506 -280
- package/coms/compile/unstruct_test.js +66 -40
- package/coms/reptile/colored_console.js +2 -2
- package/coms/zimoli/appendChild.js +1 -1
- package/coms/zimoli/css.js +1 -0
- package/coms/zimoli/deepEqual_test.js +2 -2
- package/coms/zimoli/zimoli.js +1 -0
- package/package.json +1 -1
- package/public/efront.js +1 -1
|
@@ -1,37 +1,24 @@
|
|
|
1
1
|
var scanner2 = require("./scanner2");
|
|
2
2
|
var strings = require("../basic/strings");
|
|
3
3
|
var Program = scanner2.Program;
|
|
4
|
-
var { STAMP, SCOPED, STRAP, EXPRESS, COMMENT, SPACE, PROPERTY, VALUE, QUOTED, rename, getDeclared, skipAssignment, createString, relink,
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
if (
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var index2 = to ? q.indexOf(to) : q.length;
|
|
12
|
-
if (index1 > index2) index2 = index1;
|
|
13
|
-
if (a.length) {
|
|
14
|
-
link(q[index1 - 1], a[0]);
|
|
15
|
-
link(a[a.length - 1], q[index2]);
|
|
16
|
-
}
|
|
17
|
-
else if (index1 !== index2) {
|
|
18
|
-
link(q[index1 - 1], q[index2]);
|
|
19
|
-
}
|
|
20
|
-
var res = q.splice(index1, index2 - index1, ...a);
|
|
21
|
-
if (res[0]) delete res[0].prev, res.first = res[0];
|
|
22
|
-
if (res[res.length - 1]) delete res[res.length - 1].next;
|
|
23
|
-
q.first = q.find(o => o.type !== COMMENT && o.type !== SPACE);
|
|
24
|
-
return res;
|
|
4
|
+
var { STAMP, SCOPED, STRAP, EXPRESS, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, rename, getDeclared, skipAssignment, createScoped, createString, splice, relink, snapExpressHead } = require("./common");
|
|
5
|
+
var splice2 = function (q, from, to, ...a) {
|
|
6
|
+
var cx = q.indexOf(from);
|
|
7
|
+
if (cx < 0) throw console.log(splice2.caller, console.format('\r\n<red2>自</red2>'), from && createString([from]), console.format('\r\n<yellow>至</yellow>'), to && createString([to]), console.format(`\r\n<cyan>码列</cyan>`), createString(q)), '结构异常';
|
|
8
|
+
var dx = to ? q.indexOf(to, cx) : q.length;
|
|
9
|
+
if (dx < 0) throw console.log(splice2.caller, console.format('\r\n<yellow>自</yellow>'), from && createString([from]), console.format('\r\n<red2>至</red2>'), to && createString([to]), console.format(`\r\n<cyan>码列</cyan>`), createString(q)), '结构异常';
|
|
10
|
+
return splice(q, cx, dx - cx, ...a);
|
|
25
11
|
};
|
|
26
12
|
var insert1 = function (q, r, ...a) {
|
|
27
|
-
|
|
13
|
+
if (r) splice2(q, r, r, ...a);
|
|
14
|
+
else splice(q, q.length, 0, ...a);
|
|
28
15
|
};
|
|
29
16
|
// 解构赋值
|
|
30
|
-
var killdec = function (queue,
|
|
17
|
+
var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
31
18
|
var tmpname = '';
|
|
32
19
|
var index = 0;
|
|
33
20
|
var deep = 0;
|
|
34
|
-
var dec = function (d,
|
|
21
|
+
var dec = function (d, x) {
|
|
35
22
|
var previx = tmpname;
|
|
36
23
|
var [k, v] = d;
|
|
37
24
|
var dp = 0;
|
|
@@ -47,8 +34,7 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
|
|
|
47
34
|
if (dp) {
|
|
48
35
|
deep += dp;
|
|
49
36
|
var n = getobjname(deep);
|
|
50
|
-
|
|
51
|
-
index++;
|
|
37
|
+
write(n, k);
|
|
52
38
|
k = tmpname = n;
|
|
53
39
|
}
|
|
54
40
|
dog(v);
|
|
@@ -56,13 +42,13 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
|
|
|
56
42
|
}
|
|
57
43
|
else {
|
|
58
44
|
deep++;
|
|
59
|
-
var n = getobjname(deep)
|
|
60
|
-
|
|
61
|
-
var skiped =
|
|
45
|
+
var n = getobjname(deep);
|
|
46
|
+
write(n, `${tmpname}!==undefined?${tmpname}:`);
|
|
47
|
+
var skiped = splice2(d[2], d[3], d[4]);
|
|
62
48
|
killobj(skiped);
|
|
63
|
-
|
|
49
|
+
splice(queue, i, 0, ...skiped);
|
|
50
|
+
i += skiped.length;
|
|
64
51
|
k = tmpname = n;
|
|
65
|
-
index++;
|
|
66
52
|
dog(v);
|
|
67
53
|
deep--;
|
|
68
54
|
}
|
|
@@ -71,16 +57,17 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
|
|
|
71
57
|
}
|
|
72
58
|
|
|
73
59
|
if (!tmpname) {
|
|
74
|
-
write(v, null,
|
|
60
|
+
write(v, null, x < total - 1);
|
|
75
61
|
}
|
|
76
62
|
else if (d.length === 2) {
|
|
77
|
-
write(v, k,
|
|
63
|
+
write(v, k, x < total - 1);
|
|
78
64
|
}
|
|
79
65
|
else {
|
|
80
|
-
write(v,
|
|
81
|
-
var skiped =
|
|
66
|
+
write(v, `${k}!==undefined?${k}:`, x < total - 1);
|
|
67
|
+
var skiped = splice2(d[2], d[3], d[4]);
|
|
82
68
|
killobj(skiped);
|
|
83
|
-
|
|
69
|
+
splice(queue, i, 0, ...skiped);
|
|
70
|
+
i += skiped.length;
|
|
84
71
|
}
|
|
85
72
|
index++;
|
|
86
73
|
};
|
|
@@ -88,12 +75,19 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
|
|
|
88
75
|
var write = function (name, value, hasnext) {
|
|
89
76
|
if (name === tmpname && hasnext) {
|
|
90
77
|
tmpname = getobjname(deep++);
|
|
91
|
-
|
|
78
|
+
if (index > 0) queue.splice(i++, 0, { type: STAMP, text: ',' });
|
|
79
|
+
var q = scanner2(`${tmpname}=${name}`);
|
|
80
|
+
queue.splice(i, 0, ...q);
|
|
81
|
+
i += q.length;
|
|
92
82
|
index++;
|
|
93
83
|
}
|
|
94
|
-
if (
|
|
95
|
-
|
|
96
|
-
|
|
84
|
+
if (index > 0) queue.splice(i++, 0, { type: STAMP, text: ',' });
|
|
85
|
+
queue.splice(i++, 0, { type: EXPRESS, text: name });
|
|
86
|
+
if (value) {
|
|
87
|
+
var q = scanner2("=" + value);
|
|
88
|
+
queue.splice(i, 0, ...q);
|
|
89
|
+
i += q.length;
|
|
90
|
+
}
|
|
97
91
|
index++;
|
|
98
92
|
};
|
|
99
93
|
var dog = function (d) {
|
|
@@ -149,73 +143,87 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
|
|
|
149
143
|
if (!v.attributes) return [p, v];
|
|
150
144
|
return single(v, p);
|
|
151
145
|
};
|
|
152
|
-
if (_var)
|
|
153
|
-
loop: while (
|
|
146
|
+
if (_var && i < queue.length) queue.splice(i++, 0, { type: STRAP, text: _var });
|
|
147
|
+
loop: while (i < queue.length) {
|
|
148
|
+
var o = queue[i];
|
|
154
149
|
var next = o.next;
|
|
155
150
|
tmpname = '';
|
|
156
151
|
if (!next || next.type !== STAMP || next.text !== '=') {
|
|
152
|
+
// 只声明不赋值的语句
|
|
157
153
|
var hasnext = next && next.type === STAMP && next.text === ',';
|
|
154
|
+
if (hasnext) next = next.next;
|
|
155
|
+
var n = indexof(queue, next, i);
|
|
158
156
|
if (o.type === SCOPED) {
|
|
159
|
-
var [o0] =
|
|
157
|
+
var [o0] = queue.splice(i, n - i);
|
|
160
158
|
var [[d]] = getDeclared(o0);
|
|
161
159
|
dog(d);
|
|
160
|
+
n = i = indexof(queue, next, i);
|
|
162
161
|
if (hasnext) continue loop;
|
|
163
162
|
}
|
|
164
163
|
else if (hasnext) {
|
|
165
|
-
|
|
166
|
-
o = next.next;
|
|
164
|
+
i = n;
|
|
167
165
|
index++;
|
|
168
166
|
continue;
|
|
169
|
-
}
|
|
170
|
-
|
|
167
|
+
}
|
|
168
|
+
i = n;
|
|
171
169
|
break;
|
|
172
170
|
}
|
|
173
171
|
var objs = [];
|
|
174
172
|
do {
|
|
175
173
|
var next = o.next;
|
|
176
174
|
if (!next || next.type !== STAMP || next.text !== "=") {
|
|
175
|
+
// 赋值结束
|
|
177
176
|
if (tmpname) {
|
|
178
|
-
|
|
177
|
+
var n = skipAssignment(queue, i);
|
|
178
|
+
o = queue[n];
|
|
179
|
+
var skiped = queue.splice(i, n - i);
|
|
180
|
+
killobj(skiped);
|
|
181
|
+
queue.splice(i, 0, ...skiped);
|
|
182
|
+
i += skiped.length;
|
|
179
183
|
break;
|
|
180
184
|
}
|
|
181
185
|
if (!next || next.type === STAMP && /^[,;]$/.test(next.text)) {
|
|
182
186
|
if (o.type === EXPRESS && !/\./.test(o.text)) {
|
|
183
187
|
tmpname = o.text;
|
|
184
|
-
|
|
188
|
+
queue.splice(i, indexof(queue, o = next, i) - i);
|
|
189
|
+
i = indexof(queue, o, i);
|
|
185
190
|
}
|
|
186
191
|
}
|
|
187
192
|
break;
|
|
188
193
|
}
|
|
189
194
|
if (o.type === SCOPED) {
|
|
190
|
-
var
|
|
195
|
+
var n = indexof(queue, next.next, i);
|
|
196
|
+
var [o0] = queue.splice(i, n - i);
|
|
191
197
|
delete o0.next;
|
|
192
198
|
if (o0.length && getDeclared(o0).length > 0) objs.push(o0);
|
|
193
199
|
}
|
|
194
200
|
else if (o.type === EXPRESS && !/\.\[/.test(o.text)) {
|
|
195
201
|
if (!tmpname) tmpname = o.text, index++;
|
|
196
|
-
o = next.next;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
o = next.next;
|
|
200
202
|
}
|
|
203
|
+
o = next.next;
|
|
204
|
+
i = indexof(queue, o, i);
|
|
201
205
|
} while (o);
|
|
202
206
|
if (!tmpname) {
|
|
203
207
|
if (objs.length === 1) {
|
|
204
208
|
var [[d]] = getDeclared(objs[0]);
|
|
205
209
|
var a = single(d, '');
|
|
206
210
|
if (a) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
+
splice(queue, i, 0, { type: EXPRESS, text: a[1] }, { type: STAMP, text: "=" });
|
|
212
|
+
i += 2;
|
|
213
|
+
var i2 = skipAssignment(queue, i);
|
|
214
|
+
killobj(queue.slice(i, i = i2));
|
|
215
|
+
var q = scanner2(a[0])
|
|
216
|
+
queue.splice(i, 0, ...q);
|
|
217
|
+
i += q.length;
|
|
211
218
|
index++;
|
|
212
219
|
continue;
|
|
213
220
|
}
|
|
214
221
|
}
|
|
215
222
|
tmpname = getobjname();
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
223
|
+
splice(queue, i, 0, { type: EXPRESS, text: tmpname }, { type: STAMP, text: "=" });
|
|
224
|
+
i += 2;
|
|
225
|
+
var i2 = skipAssignment(queue, i);
|
|
226
|
+
killobj(queue.slice(i, i = i2));
|
|
219
227
|
index++;
|
|
220
228
|
}
|
|
221
229
|
for (var o0 of objs) {
|
|
@@ -223,34 +231,80 @@ var killdec = function (queue, o, getobjname, _var = 'var', killobj, islet) {
|
|
|
223
231
|
dog(d);
|
|
224
232
|
}
|
|
225
233
|
}
|
|
226
|
-
|
|
234
|
+
relink(queue);
|
|
235
|
+
return i;
|
|
227
236
|
};
|
|
228
237
|
// 键值对重组
|
|
229
|
-
var killmap = function (body,
|
|
230
|
-
|
|
238
|
+
var killmap = function (body, i, _getobjname, killobj) {
|
|
239
|
+
var o = body[i];
|
|
240
|
+
if (!o.length) return indexof(body, o.next, i);
|
|
231
241
|
var m = o.first;
|
|
232
|
-
var s = m;
|
|
233
|
-
|
|
242
|
+
var s = m, p;
|
|
243
|
+
|
|
244
|
+
loop: while (m) {
|
|
245
|
+
s = m, p = m.prev;
|
|
234
246
|
if (m.type === EXPRESS) break;
|
|
235
|
-
s = m;
|
|
236
247
|
while (m && (m.type === STRAP || m.type === STAMP)) m = m.next;
|
|
237
|
-
if (m.isprop && (m.type === SCOPED || m.type === PROPERTY && /\[/.test(m.text) || m.short || m.next && m.next.type === SCOPED)) {
|
|
248
|
+
if (!m || m.isprop && (m.type === SCOPED || m.type === PROPERTY && /\[/.test(m.text) || m.short || m.next && m.next.type === SCOPED)) {
|
|
238
249
|
break;
|
|
239
250
|
}
|
|
240
251
|
m = m.next;
|
|
241
|
-
|
|
252
|
+
if (!m) break;
|
|
253
|
+
if (m && m.type === STAMP && m.text === ':') m = m.next;
|
|
254
|
+
if (!m) break;
|
|
255
|
+
var n = skipAssignment(m);
|
|
256
|
+
while (m !== n) {
|
|
257
|
+
if (m.type === STAMP && m.text === '=>') {
|
|
258
|
+
body.await_ = true;
|
|
259
|
+
break loop;
|
|
260
|
+
}
|
|
261
|
+
if (m.type === STRAP) {
|
|
262
|
+
if (/^await$/.test(m.text)) {
|
|
263
|
+
body.await_ = true;
|
|
264
|
+
break loop;
|
|
265
|
+
}
|
|
266
|
+
if (/^function$/.test(m.text)) {
|
|
267
|
+
while (m && (m.type !== SCOPED || m.entry !== '{')) m = m.next;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
if (/^class$/.test(m.text)) {
|
|
271
|
+
while (m && !m.isClass) m = m.next;
|
|
272
|
+
while (m && m.isClass) m = m.next;
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (m.type === SCOPED) {
|
|
277
|
+
if (m.entry === "(" && m.next && m.next.type === STAMP && m.next.text === '=>') {
|
|
278
|
+
s = skipAssignment(m);
|
|
279
|
+
var mi = o.indexOf(m);
|
|
280
|
+
var si = o.indexOf(s, mi);
|
|
281
|
+
if (si < 0) si = o.length;
|
|
282
|
+
var ms = o.slice(mi, si);
|
|
283
|
+
killobj(ms);
|
|
284
|
+
splice(o, mi, si - mi, ...ms);
|
|
285
|
+
m = s;
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
killobj(m);
|
|
289
|
+
if (m.await_) break loop;
|
|
290
|
+
}
|
|
291
|
+
m = m.next;
|
|
292
|
+
}
|
|
293
|
+
if (m && m.type === STAMP && /^[,;]$/.test(m.text)) m = m.next;
|
|
242
294
|
}
|
|
243
|
-
if (!m) return o.next;
|
|
295
|
+
if (!m) return indexof(body, o.next, i);
|
|
244
296
|
m = s;
|
|
245
|
-
if (
|
|
246
|
-
|
|
297
|
+
if (p && p.type === STAMP && p.text === ',') {
|
|
298
|
+
var mi = o.indexOf(m);
|
|
299
|
+
var pi = o.lastIndexOf(p, mi);
|
|
300
|
+
if (pi > 0) splice(o, pi, mi - pi);
|
|
247
301
|
}
|
|
248
|
-
var q
|
|
302
|
+
var q;
|
|
249
303
|
var next = o.next;
|
|
250
|
-
|
|
304
|
+
var l = 1;
|
|
251
305
|
var initq = function () {
|
|
252
306
|
q = scanner2(`(${_getobjname()}=)`)[0];
|
|
253
|
-
var qo =
|
|
307
|
+
var qo = splice(body, i, l, q);
|
|
254
308
|
insert1(q, null, ...qo);
|
|
255
309
|
insert1(q, null, { type: STAMP, text: ',' });
|
|
256
310
|
}
|
|
@@ -262,41 +316,57 @@ var killmap = function (body, o, _getobjname, killobj) {
|
|
|
262
316
|
m = skipAssignment(m);
|
|
263
317
|
if (/^\.\.\./.test(s.text)) {
|
|
264
318
|
s.text = s.text.replace(/^\.\.\./, '');
|
|
319
|
+
if (!s.text) {
|
|
320
|
+
splice2(o, s, s = s.next);
|
|
321
|
+
}
|
|
265
322
|
if (q) {
|
|
266
323
|
t = scanner2(`extend(${_getobjname()},)`);
|
|
324
|
+
rootenvs.extend = true;
|
|
267
325
|
insert1(q, null, ...t);
|
|
268
326
|
}
|
|
269
327
|
else {
|
|
270
328
|
if (!t) {
|
|
271
329
|
t = scanner2(`extend()`);
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
330
|
+
rootenvs.extend = true;
|
|
331
|
+
var [o0] = body.splice(i, 1, ...t);
|
|
332
|
+
t[1].push(o0);
|
|
333
|
+
l = 2;
|
|
276
334
|
}
|
|
277
335
|
insert1(t[1], null, { type: STAMP, text: "," });
|
|
278
336
|
}
|
|
279
|
-
var e =
|
|
337
|
+
var e = splice2(o, s, m);
|
|
280
338
|
insert1(t[1], null, ...e);
|
|
281
339
|
if (q) {
|
|
282
340
|
if (m) {
|
|
283
|
-
e =
|
|
341
|
+
e = splice2(o, m, m = m.next);
|
|
284
342
|
killobj(e);
|
|
285
343
|
insert1(q, null, ...e);
|
|
286
344
|
}
|
|
287
345
|
}
|
|
288
|
-
if (m && m.type === STAMP && m.text === ',')
|
|
346
|
+
if (m && m.type === STAMP && m.text === ',') splice2(o, m, m = m.next);
|
|
289
347
|
}
|
|
290
348
|
continue;
|
|
291
349
|
}
|
|
350
|
+
if (m && m.type === STAMP && m.text === ',') {
|
|
351
|
+
splice2(o, m, m = m.next);
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
292
354
|
if (!q) initq();
|
|
355
|
+
|
|
293
356
|
var [prop, m] = getprop(o, m);
|
|
294
357
|
if (!prop.value.length) insert1(prop.value, null, { type: EXPRESS, text: prop.name })
|
|
295
|
-
else killobj(prop.value);
|
|
358
|
+
else if (prop.sfunc === false) killobj(prop.value);
|
|
296
359
|
setprop(prop, _getobjname(), define_, q);
|
|
297
360
|
}
|
|
298
|
-
|
|
299
|
-
|
|
361
|
+
|
|
362
|
+
if (q) {
|
|
363
|
+
relink(q);
|
|
364
|
+
var qe = q.last;
|
|
365
|
+
if (qe.type !== STAMP || qe.text !== ',') q.push({ type: STAMP, text: ',' });
|
|
366
|
+
q.push(...scanner2(_getobjname()));
|
|
367
|
+
relink(q);
|
|
368
|
+
}
|
|
369
|
+
return indexof(body, next, i);
|
|
300
370
|
};
|
|
301
371
|
var getprop = function (o, m) {
|
|
302
372
|
var prop = {};
|
|
@@ -328,9 +398,9 @@ var getprop = function (o, m) {
|
|
|
328
398
|
}
|
|
329
399
|
else {
|
|
330
400
|
prop.sfunc = false;
|
|
331
|
-
if (m &&
|
|
401
|
+
if (m && /^[\=\:]$/.test(m.text)) m = m.next;
|
|
332
402
|
}
|
|
333
|
-
|
|
403
|
+
splice2(o, s, m);
|
|
334
404
|
var s = m;
|
|
335
405
|
if (m && prop.sfunc !== false && m.type === SCOPED && m.entry === '(') {
|
|
336
406
|
m = m.next;
|
|
@@ -338,33 +408,42 @@ var getprop = function (o, m) {
|
|
|
338
408
|
}
|
|
339
409
|
else m = skipAssignment(m);
|
|
340
410
|
if (m && !m.isprop) m = m.next;
|
|
341
|
-
if (!prop.short) prop.value =
|
|
342
|
-
else
|
|
411
|
+
if (!prop.short) prop.value = splice2(o, s, m);
|
|
412
|
+
else if (s) splice2(o, s, m);
|
|
343
413
|
return [prop, m];
|
|
344
414
|
};
|
|
345
415
|
var setprop = function (prop, k, d, q) {
|
|
346
|
-
if (prop.sfunc !== false)
|
|
416
|
+
if (prop.sfunc !== false)
|
|
417
|
+
// insert1(prop.value, prop.value[0], ...scanner2(`${prop.async ? "async " : ""}function${prop["*"] ? "*" : ''}`));
|
|
418
|
+
insert1(prop.value, prop.value[0], ...scanner2(`function`));
|
|
347
419
|
if (prop.get || prop.set) {
|
|
348
|
-
|
|
349
|
-
if (
|
|
420
|
+
var pv = prop.value;
|
|
421
|
+
if (pv) {
|
|
422
|
+
while (pv.length && pv[pv.length - 1].type & (SPACE | COMMENT)) pv.pop();
|
|
423
|
+
var pe = pv[pv.length - 1];
|
|
424
|
+
if (pe && pe.type === STAMP && /^[,;]$/.test(pe.text)) pv.pop();
|
|
425
|
+
else pe = null;
|
|
426
|
+
}
|
|
350
427
|
if (!d[prop.name]) {
|
|
351
|
-
let tmp = scanner2(
|
|
428
|
+
let tmp = scanner2(`\r\nObject.defineProperty(${k},${prop.name},{})`);
|
|
352
429
|
insert1(q, null, ...tmp);
|
|
353
|
-
if (
|
|
354
|
-
d[prop.name] = tmp[1][4];
|
|
430
|
+
if (pe) insert1(q, null, pe);
|
|
431
|
+
d[prop.name] = tmp[tmp.length - 1][4];
|
|
355
432
|
}
|
|
356
433
|
if (d[prop.name].length) insert1(d[prop.name], null, { type: STAMP, text: ',' });
|
|
357
434
|
insert1(d[prop.name], null, { type: PROPERTY, text: prop.get ? "get" : "set" });
|
|
358
435
|
insert1(d[prop.name], null, { type: STAMP, text: ":" });
|
|
359
|
-
insert1(d[prop.name], null, ...
|
|
436
|
+
if (pv && pv.length) insert1(d[prop.name], null, ...pv);
|
|
360
437
|
}
|
|
361
438
|
else {
|
|
362
|
-
insert1(q, null, ...scanner2(`${k}${prop.name}=`));
|
|
439
|
+
insert1(q, null, ...scanner2(`${q && q.length ? "\r\n" : ''}${k}${prop.name}=`));
|
|
363
440
|
insert1(q, null, ...prop.value);
|
|
364
441
|
}
|
|
365
442
|
}
|
|
366
|
-
var
|
|
443
|
+
var rootenvs = null, rootHyper;
|
|
444
|
+
var killcls = function (body, i, getname_) {
|
|
367
445
|
var extends_ = [];
|
|
446
|
+
var o = body[i];
|
|
368
447
|
var start = o;
|
|
369
448
|
var decName = !o.isExpress && o.next.type === EXPRESS && o.next.text;
|
|
370
449
|
while (o) {
|
|
@@ -392,94 +471,130 @@ var killcls = function (body, o, getname_) {
|
|
|
392
471
|
if (o) {
|
|
393
472
|
var next = o;
|
|
394
473
|
while (next && !next.isClass) next = next.next;
|
|
395
|
-
base = createString(
|
|
474
|
+
base = createString(splice2(body, o, o = next));
|
|
396
475
|
}
|
|
397
|
-
|
|
476
|
+
if (base === 'Array') base = 'Array2', rootenvs.Array2 = true;
|
|
398
477
|
var index = 0;
|
|
399
478
|
while (o && o.isClass) {
|
|
479
|
+
var scoped = o.scoped;
|
|
400
480
|
var m = o.first;
|
|
401
481
|
var name = extends_.pop();
|
|
402
|
-
if (!name && (base || extends_.length)) name = getname_('
|
|
482
|
+
if (!name && (base || extends_.length)) name = getname_('cls' + index);
|
|
403
483
|
var assign = [];
|
|
404
484
|
var constructor = scanner2('(){}');
|
|
405
485
|
var define_ = Object.create(null);
|
|
406
486
|
var static_ = Object.create(null);
|
|
407
487
|
var clz = { name };
|
|
488
|
+
if (!clz.name) clz.name = getname_("cls" + index);
|
|
408
489
|
while (m) {
|
|
409
490
|
var [prop, m] = getprop(o, m);
|
|
410
491
|
if (!prop.value.length) prop.value = scanner2('undefined;');
|
|
411
492
|
var k = prop.static ? clz.name : `${clz.name}.prototype`;
|
|
412
493
|
var d = prop.static ? static_ : define_;
|
|
413
|
-
if (prop.get || prop.set || prop.
|
|
494
|
+
if (prop.get || prop.set || prop.static) {
|
|
414
495
|
setprop(prop, k, d, defines);
|
|
415
496
|
}
|
|
416
|
-
else if (/^(
|
|
497
|
+
else if (/^(?:\.constructor|\[(['"`])constructor\1\])$/.test(prop.name)) {
|
|
417
498
|
constructor = prop.value;
|
|
499
|
+
var ce = constructor[constructor.length - 1];
|
|
500
|
+
while (ce.type & (SPACE | COMMENT) || ce.type === STAMP && /^[,;]$/.test(ce.text)) constructor.pop(), ce = constructor[constructor.length - 1];
|
|
501
|
+
}
|
|
502
|
+
else if (prop.sfunc !== false) {
|
|
503
|
+
setprop(prop, k, d, defines);
|
|
418
504
|
}
|
|
419
505
|
else {
|
|
420
506
|
insert1(assign, null, ...scanner2(`this${prop.name}=`));
|
|
421
507
|
insert1(assign, null, ...prop.value);
|
|
422
508
|
}
|
|
423
509
|
}
|
|
510
|
+
relink(o);
|
|
424
511
|
if (invokes.length) insert1(invokes, null, { type: STAMP, text: ',' });
|
|
425
512
|
insert1(invokes, null, ...scanner2('function ' + name));
|
|
426
|
-
|
|
513
|
+
if (base) {
|
|
514
|
+
constructor[1].push(...scanner2('return this'))
|
|
515
|
+
relink(constructor[1]);
|
|
516
|
+
var cs = createScoped(constructor[1]);
|
|
517
|
+
var newt = getname(cs.vars, cs.envs, 'this_');
|
|
518
|
+
if (cs.used.this) rename(cs.used, 'this', newt);
|
|
519
|
+
var inited = false;
|
|
520
|
+
assign.forEach(o => {
|
|
521
|
+
if (o.type === EXPRESS) o.text = o.text.replace(/^this\./g, newt);
|
|
522
|
+
});
|
|
523
|
+
if (cs.used.super) {
|
|
524
|
+
cs.used.super.forEach(o => {
|
|
525
|
+
if (o.text !== 'super') return;
|
|
526
|
+
var n = o.next;
|
|
527
|
+
if (!n || n.type !== SCOPED || n.entry !== "(") return;
|
|
528
|
+
o.text = base + '.call';
|
|
529
|
+
if (!inited) {
|
|
530
|
+
insert1(o.queue, o, ...assign);
|
|
531
|
+
}
|
|
532
|
+
inited = true;
|
|
533
|
+
insert1(o.queue, o, ...scanner2(`var ${newt}=`));
|
|
534
|
+
if (n.length) n.unshift({ type: STAMP, text: ',' });
|
|
535
|
+
n.unshift({ type: EXPRESS, text: 'this' });
|
|
536
|
+
insert1(o.queue, n.next, ...scanner2(`||this;`));
|
|
537
|
+
})
|
|
538
|
+
}
|
|
539
|
+
if (scoped.used.super) {
|
|
540
|
+
scoped.used.super.forEach(o => {
|
|
541
|
+
if (!/^super(\.|\[|$)/.test(o.text)) return;
|
|
542
|
+
o.text = `${base}.prototype` + o.text.replace(/^super/, '');
|
|
543
|
+
insert1(o.queue, o.next, ...scanner2('.bind(this)'));
|
|
544
|
+
})
|
|
545
|
+
}
|
|
546
|
+
if (!inited) constructor[1].unshift(...scanner2(`\r\nvar ${newt}=${base}.apply(this,arguments)||this;\r\n`), ...assign);
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
constructor[1].unshift(...assign);
|
|
550
|
+
}
|
|
427
551
|
insert1(invokes, null, ...constructor);
|
|
428
552
|
o = o.next;
|
|
429
|
-
if (base)
|
|
553
|
+
if (base) defines.unshift(...scanner2(`extends_(${clz.name},${base})${defines.length ? "\r\n" : ""}`)), rootenvs.extends_ = true;
|
|
430
554
|
base = clz.name;
|
|
431
555
|
if (clz.name) insert1(head, null, ...scanner2(`${head.length ? ',' : ''}${clz.name}`));
|
|
432
556
|
index++;
|
|
433
557
|
}
|
|
434
558
|
insert1(defines, null, ...foot);
|
|
559
|
+
var s = i;
|
|
560
|
+
i = body.indexOf(o, i);
|
|
561
|
+
if (i < 0) i = body.length;
|
|
435
562
|
if (head.length > 1 || start.isExpress) {
|
|
436
|
-
|
|
437
|
-
if (decName)
|
|
438
|
-
|
|
563
|
+
splice(defines, defines.length, 0, ...scanner2(`\r\nreturn ${clz.name}`))
|
|
564
|
+
if (decName) splice(func, 0, 0, ...scanner2(`var ${decName}=`));
|
|
565
|
+
splice(body, s, i - s, ...func);
|
|
439
566
|
}
|
|
440
567
|
else {
|
|
441
|
-
splice1(body, start, o, ...invokes);
|
|
442
568
|
if (defines.length) {
|
|
443
|
-
|
|
444
|
-
insert1(body, o, ...defines);
|
|
569
|
+
splice(invokes, invokes.length, 0, { text: ';', type: STAMP }, ...defines);
|
|
445
570
|
}
|
|
571
|
+
splice(body, s, i - s, ...invokes);
|
|
572
|
+
if (o) insert1(body, o, { type: SPACE, text: '\r\n' });
|
|
446
573
|
}
|
|
447
|
-
return
|
|
574
|
+
return i;
|
|
448
575
|
};
|
|
449
|
-
var
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
if (
|
|
453
|
-
if (o.type === EXPRESS) {
|
|
454
|
-
if (prev.type === STRAP && /^(class|function|new|extends)$/.test(prev.text));
|
|
455
|
-
else if (!/^\.|\[/.test(o.text) || /^\.\.\./.test(o.text)) break;
|
|
456
|
-
}
|
|
457
|
-
else if (o.type === VALUE || o.type === QUOTED) break;
|
|
458
|
-
else if (prev.type === STAMP) {
|
|
459
|
-
if (prev.text === '*') {
|
|
460
|
-
if (prev.prev && prev.prev.type !== STRAP) break;
|
|
461
|
-
}
|
|
462
|
-
else if (prev.text !== "=>" || o.type !== SCOPED || o.entry !== '{') {
|
|
463
|
-
break;
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
else if (prev.type === STRAP) break;
|
|
467
|
-
o = prev;
|
|
576
|
+
var indexof = function (list, o, i) {
|
|
577
|
+
if (o) {
|
|
578
|
+
i = list.indexOf(o, i);
|
|
579
|
+
if (i < 0) i = list.length;
|
|
468
580
|
}
|
|
469
|
-
|
|
581
|
+
else i++;
|
|
582
|
+
return i;
|
|
470
583
|
};
|
|
471
584
|
// 数组或参数展开
|
|
472
|
-
var killspr = function (body,
|
|
585
|
+
var killspr = function (body, i, _getobjname, setsolid, killobj) {
|
|
586
|
+
var o = body[i];
|
|
473
587
|
var m = o.first;
|
|
474
|
-
if (!m) return
|
|
588
|
+
if (!m) return i + 1;
|
|
589
|
+
killobj(o);
|
|
475
590
|
var index = 0;
|
|
476
591
|
var spr = function () {
|
|
477
592
|
var s = m;
|
|
478
593
|
s.text = s.text.replace(/^\.\.\./, '');
|
|
479
594
|
m = skipAssignment(m);
|
|
480
595
|
var q = scanner2(`Array.prototype.slice.call()`);
|
|
481
|
-
var v =
|
|
482
|
-
if (m)
|
|
596
|
+
var v = splice2(o, s, m);
|
|
597
|
+
if (m) splice2(o, m, m = m.next);
|
|
483
598
|
killobj(v);
|
|
484
599
|
insert1(q[1], null, ...v);
|
|
485
600
|
setsolid(q, q[0]);
|
|
@@ -487,7 +602,6 @@ var killspr = function (body, o, _getobjname, setsolid, killobj) {
|
|
|
487
602
|
};
|
|
488
603
|
var killnext = function (m) {
|
|
489
604
|
while (m && (m.type !== STAMP || m.text !== ',')) {
|
|
490
|
-
if (m.length) killobj(m);
|
|
491
605
|
m = m.next;
|
|
492
606
|
}
|
|
493
607
|
return m;
|
|
@@ -498,57 +612,67 @@ var killspr = function (body, o, _getobjname, setsolid, killobj) {
|
|
|
498
612
|
if (m) m = m.next;
|
|
499
613
|
index++;
|
|
500
614
|
}
|
|
501
|
-
if (!m) return
|
|
615
|
+
if (!m) return i + 1;
|
|
502
616
|
var c = scanner2('.concat()');
|
|
503
617
|
var next = o.next;
|
|
504
618
|
if (o.entry === '(') {
|
|
505
|
-
var r =
|
|
619
|
+
var r = snapExpressHead(o);
|
|
620
|
+
var rt = r.type === EXPRESS && r.text.replace(/^\.\.\./, '');
|
|
506
621
|
if (r === o);
|
|
507
|
-
else if (
|
|
622
|
+
else if (
|
|
623
|
+
r === o.prev && r.type === EXPRESS && !/\.[\s\S]*\./.test(rt) && !/\[[^\]]*\]\[[^\]]*\]/.test(rt)) {
|
|
508
624
|
var p = r;
|
|
509
|
-
var n =
|
|
510
|
-
|
|
625
|
+
var n = /\.|\[/.test(rt) ? rt.replace(/\.[^\.]*|\[[^\]]*\]$/, '') : "null";
|
|
626
|
+
splice(o, 0, 0, ...scanner2(n + ","));
|
|
511
627
|
}
|
|
512
628
|
else {
|
|
513
|
-
var p = o.prev;
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
629
|
+
var p = o.prev, n = null, hasdot = false;
|
|
630
|
+
var pt = p.type === EXPRESS && p.text.replace(/^\.\.\./, '');
|
|
631
|
+
if (p.type === EXPRESS && (n = /^(?:[\s\S]*[^\.])?(\.[^\.]*|\[[^\]]*\])$/.exec(pt))) {
|
|
632
|
+
hasdot = p.text.length !== pt.length;
|
|
633
|
+
var n = n[1];
|
|
634
|
+
p.text = pt.slice(0, pt.length - n.length);
|
|
635
|
+
splice(body, i++, 0, { type: EXPRESS, text: n });
|
|
636
|
+
}
|
|
637
|
+
else if (p.type === SCOPED && p.entry === '[') {
|
|
638
|
+
p = p.prev;
|
|
518
639
|
}
|
|
519
640
|
else {
|
|
520
|
-
|
|
641
|
+
splice(body, i++, 0, { type: VALUE, text: "null" });
|
|
521
642
|
}
|
|
522
|
-
|
|
523
|
-
var h = scanner2(
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
643
|
+
splice(o, 0, 0, ...scanner2(`${_getobjname()},`));
|
|
644
|
+
var h = scanner2(`${hasdot ? "..." : ''}(${_getobjname()}=)`);
|
|
645
|
+
var cx = body.lastIndexOf(r, i);
|
|
646
|
+
var dx = body.indexOf(p, cx) + 1;
|
|
647
|
+
var h1 = h[h.length - 1];
|
|
648
|
+
splice(h1, h1.length, 0, ...splice(body, cx, dx - cx, ...h));
|
|
649
|
+
i += cx - dx + h.length;
|
|
650
|
+
if (p.type === EXPRESS && !p.text) {
|
|
651
|
+
var cx = h[0].lastIndexOf(p);
|
|
652
|
+
if (cx >= 0) splice(h1, cx, 1);
|
|
528
653
|
}
|
|
529
654
|
}
|
|
530
|
-
|
|
655
|
+
splice(body, i++, 0, ...scanner2('.apply'));
|
|
531
656
|
var m1 = skipAssignment(m);
|
|
532
657
|
if (index > 0 || m1 && m1.next) {
|
|
533
|
-
var h =
|
|
658
|
+
var h = splice(o, 2, o.length);
|
|
534
659
|
var c = scanner2(`[]`);
|
|
535
|
-
|
|
660
|
+
splice(c[0], 0, 0, ...h);
|
|
536
661
|
killobj(c);
|
|
537
|
-
|
|
538
|
-
return next;
|
|
662
|
+
splice(o, o.length, 0, ...c);
|
|
663
|
+
return indexof(body, next, i);
|
|
539
664
|
};
|
|
540
665
|
killnext(m);
|
|
541
666
|
m.text = m.text.replace(/^\.\.\./, '');
|
|
542
|
-
return next;
|
|
667
|
+
return indexof(body, next, i);
|
|
543
668
|
}
|
|
544
669
|
if (index > 0) {
|
|
545
|
-
if (m)
|
|
546
|
-
|
|
670
|
+
if (m) splice2(o, m.prev, m);
|
|
671
|
+
splice(body, i + 1, 0, ...c);
|
|
547
672
|
insert1(c[1], null, ...spr());
|
|
548
673
|
}
|
|
549
674
|
else {
|
|
550
|
-
|
|
551
|
-
if (m) insert1(body, next, ...c);
|
|
675
|
+
splice(body, i, 1, ...spr(), ...(m ? c : []));
|
|
552
676
|
}
|
|
553
677
|
var d;
|
|
554
678
|
while (m) {
|
|
@@ -566,14 +690,14 @@ var killspr = function (body, o, _getobjname, setsolid, killobj) {
|
|
|
566
690
|
insert1(c[1], null, ...d);
|
|
567
691
|
}
|
|
568
692
|
if (d[0].length) insert1(d[0], null, { type: STAMP, text: "," });
|
|
569
|
-
insert1(d[0], null, ...
|
|
570
|
-
if (m)
|
|
693
|
+
insert1(d[0], null, ...splice2(o, s, m));
|
|
694
|
+
if (m) splice2(o, m, m = m.next);
|
|
571
695
|
}
|
|
572
|
-
return next;
|
|
696
|
+
return indexof(body, next, i);
|
|
573
697
|
};
|
|
574
698
|
|
|
575
|
-
var killobj = function (body, getobjname, getname_, setsolid, deep = 0) {
|
|
576
|
-
var
|
|
699
|
+
var killobj = function (body, getobjname, getletname, getname_, letname_, setsolid, deep = 0) {
|
|
700
|
+
var i = 0;
|
|
577
701
|
var _getdeep = function () {
|
|
578
702
|
deep++;
|
|
579
703
|
_getdeep = function () {
|
|
@@ -588,80 +712,123 @@ var killobj = function (body, getobjname, getname_, setsolid, deep = 0) {
|
|
|
588
712
|
return getobjname(deep + i);
|
|
589
713
|
};
|
|
590
714
|
var deepkill = function (o) {
|
|
591
|
-
killobj(o, getobjname, getname_, setsolid, deep);
|
|
715
|
+
killobj(o, getobjname, getletname, getname_, letname_, setsolid, deep);
|
|
716
|
+
if (o.await_) body.await_ = true;
|
|
592
717
|
};
|
|
593
|
-
while (
|
|
718
|
+
while (i < body.length) {
|
|
719
|
+
var o = body[i];
|
|
594
720
|
var islet = false;
|
|
595
721
|
if (o.type === STRAP) {
|
|
596
722
|
switch (o.text) {
|
|
597
723
|
case "await":
|
|
598
|
-
body.
|
|
599
|
-
|
|
724
|
+
body.await_ = true;
|
|
725
|
+
i++;
|
|
726
|
+
break;
|
|
727
|
+
case "yield":
|
|
728
|
+
var o = o.next;
|
|
729
|
+
if (o.type === STAMP && o.text === '*') {
|
|
730
|
+
i++;
|
|
731
|
+
var n = body.indexOf(o, i) + 1;
|
|
732
|
+
o = o.next;
|
|
733
|
+
splice(body, i, n - i);
|
|
734
|
+
n = skipAssignment(body, i - 1);
|
|
735
|
+
var name = getname_("_");
|
|
736
|
+
var y = scanner2(`for(var ${name} of) yield ${name};`);
|
|
737
|
+
y[2].type = STRAP;
|
|
738
|
+
splice(y[1], y[1].length, 0, ...splice(body, i, n - i));
|
|
739
|
+
unforof(y[1], getname_.bind(null, '_'), y.used);
|
|
740
|
+
splice(body, i - 1, 1, ...y);
|
|
741
|
+
}
|
|
742
|
+
i++;
|
|
600
743
|
break;
|
|
601
744
|
case "let":
|
|
602
745
|
case "const":
|
|
603
746
|
islet = body.keeplet !== false;
|
|
604
747
|
case "var":
|
|
605
|
-
|
|
606
|
-
|
|
748
|
+
splice(body, i, 1);
|
|
749
|
+
i = killdec(body, i, getletname, 'var', deepkill, islet);
|
|
750
|
+
break;
|
|
751
|
+
case "catch":
|
|
752
|
+
var n = o.next;
|
|
753
|
+
if (n.type !== SCOPED || n.entry !== '(') {
|
|
754
|
+
splice(body, ++i, 0, scanner2(`(${letname_('e')})`)[0])
|
|
755
|
+
}
|
|
756
|
+
i++;
|
|
607
757
|
break;
|
|
608
758
|
case "class":
|
|
609
|
-
|
|
759
|
+
i = killcls(body, i, letname_);
|
|
610
760
|
break;
|
|
611
761
|
case "function":
|
|
612
762
|
o = o.next;
|
|
613
|
-
if (o && o.type === STAMP)
|
|
763
|
+
if (o && o.type === STAMP) {
|
|
764
|
+
i++;
|
|
765
|
+
var n = body.indexOf(o, i) + 1;
|
|
766
|
+
o = o.next;
|
|
767
|
+
splice(body, i, n - i);
|
|
768
|
+
}
|
|
614
769
|
if (o && o.type === EXPRESS) o = o.next;
|
|
615
770
|
if (o && o.type === SCOPED) o = o.next;// ()
|
|
616
771
|
if (o && o.type === SCOPED) o = o.next;// {}
|
|
772
|
+
i = body.indexOf(o, i);
|
|
773
|
+
if (i < 0) i = body.length;
|
|
617
774
|
break;
|
|
618
775
|
case "async":
|
|
619
|
-
|
|
776
|
+
body.splice(i, 1);
|
|
620
777
|
break;
|
|
621
778
|
default:
|
|
622
|
-
|
|
779
|
+
i++;
|
|
623
780
|
}
|
|
624
781
|
continue;
|
|
625
782
|
}
|
|
626
783
|
else if (o.type === SCOPED) {
|
|
627
784
|
if (o.isObject) {
|
|
628
785
|
if (o.next && o.next.type === STAMP && o.next.text === '=') {
|
|
629
|
-
|
|
786
|
+
i = killdec(body, i, _getdeepname, '', deepkill);
|
|
630
787
|
continue;
|
|
631
788
|
}
|
|
632
789
|
else {
|
|
633
|
-
|
|
790
|
+
i = killmap(body, i, _getobjname, deepkill);
|
|
791
|
+
// i = indexof(body, o, i);
|
|
634
792
|
continue;
|
|
635
793
|
}
|
|
636
794
|
}
|
|
637
795
|
else if (o.entry === '[') {
|
|
638
|
-
|
|
639
|
-
|
|
796
|
+
var a = snapExpressHead(o);
|
|
797
|
+
if (a === o && o.next && o.next.type === STAMP && o.next.text === '=' || o.next && o.next.type === STRAP && /^(in|of)$/.test(o.next.type) && body.entry === '(' && body.prev && body.prev.type === STRAP && body.prev.text === 'for') {
|
|
798
|
+
i = killdec(body, i, _getdeepname, '', deepkill);
|
|
640
799
|
}
|
|
641
800
|
else {
|
|
642
|
-
|
|
801
|
+
i = killspr(body, i, _getobjname, setsolid, deepkill);
|
|
643
802
|
}
|
|
644
803
|
continue;
|
|
645
804
|
}
|
|
646
805
|
else if (o.entry === '(') {
|
|
647
806
|
if (o.next && o.next.type === STAMP && o.next.text === '=>');
|
|
648
|
-
else if (o.prev && o.prev.type === STRAP)
|
|
807
|
+
else if (o.prev && o.prev.type === STRAP) {
|
|
808
|
+
var p = o.prev;
|
|
809
|
+
if (p.transive || /^(if|else|while|with|switch)$/.test(p.text)) deepkill(o);
|
|
810
|
+
}
|
|
649
811
|
else if (!o.prev || o.prev.type === STAMP || o.prev.type === STRAP) {
|
|
650
812
|
deepkill(o);
|
|
651
813
|
}
|
|
652
814
|
else {
|
|
653
|
-
|
|
815
|
+
i = killspr(body, i, _getobjname, setsolid, deepkill);
|
|
654
816
|
continue;
|
|
655
817
|
}
|
|
656
818
|
}
|
|
657
819
|
}
|
|
658
820
|
else if (o.type === STAMP) {
|
|
659
821
|
if (o.text === "=>") {
|
|
660
|
-
|
|
822
|
+
i = unarrow(body, i, deepkill, letname_);
|
|
661
823
|
continue;
|
|
662
824
|
}
|
|
663
825
|
}
|
|
664
|
-
|
|
826
|
+
else if (o.isdigit) {
|
|
827
|
+
if (/^0[^\.]/.test(o.text)) {
|
|
828
|
+
o.text = String(eval(o.text));
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
i++;
|
|
665
832
|
}
|
|
666
833
|
};
|
|
667
834
|
|
|
@@ -683,33 +850,51 @@ var unawait = function (body, getname, argname) {
|
|
|
683
850
|
return getname("_");
|
|
684
851
|
}, argname);
|
|
685
852
|
};
|
|
686
|
-
var
|
|
687
|
-
|
|
853
|
+
var isbreak = function (m) {
|
|
854
|
+
return /^(yield|await|throw)$/.test(m.text) || /^(break|continue)/.test(m.text) && !m.isend;
|
|
855
|
+
}
|
|
856
|
+
var getsync = function (m, killobj) {
|
|
857
|
+
if (m.type === SCOPED && m.await_) return null;
|
|
688
858
|
var n = skipAssignment(m);
|
|
689
859
|
while (m !== n) {
|
|
690
|
-
if (m.
|
|
860
|
+
if (m.type === STRAP && isbreak(m)) return null;
|
|
861
|
+
if (m.length) {
|
|
862
|
+
killobj(m);
|
|
863
|
+
if (m.await_) return null;
|
|
864
|
+
if (hasbreak(m)) return null;
|
|
865
|
+
}
|
|
691
866
|
m = m.next;
|
|
692
867
|
}
|
|
868
|
+
return n;
|
|
869
|
+
};
|
|
870
|
+
var hasbreak = function (body) {
|
|
871
|
+
for (var o of body) {
|
|
872
|
+
if (o.type !== STRAP) continue;
|
|
873
|
+
if (isbreak(o)) return true;
|
|
874
|
+
}
|
|
875
|
+
for (var o of body) {
|
|
876
|
+
if (o.length && hasbreak(o)) return true;
|
|
877
|
+
}
|
|
878
|
+
return false;
|
|
693
879
|
};
|
|
694
|
-
var ises3 = function (o) {
|
|
880
|
+
var ises3 = function (o, killobj) {
|
|
695
881
|
if (o && o.type === SCOPED && o.entry === "{") {
|
|
696
|
-
|
|
882
|
+
killobj(o);
|
|
883
|
+
if (o.await_) return false;
|
|
884
|
+
if (hasbreak(o)) return false;
|
|
697
885
|
}
|
|
698
886
|
else while (o) {
|
|
699
|
-
o = getsync(o);
|
|
700
|
-
if (o === null) return
|
|
887
|
+
o = getsync(o, killobj);
|
|
888
|
+
if (o === null) return false;
|
|
701
889
|
if (!o || o.type !== STAMP || o.text !== ',') {
|
|
702
890
|
break;
|
|
703
891
|
}
|
|
704
892
|
o = o.next;
|
|
705
893
|
}
|
|
706
|
-
return
|
|
894
|
+
return true;
|
|
707
895
|
}
|
|
708
|
-
var unforin = function (o,
|
|
896
|
+
var unforin = function (o, getnewname_, killobj) {
|
|
709
897
|
// 仅处理有 await 或 yield 的代码
|
|
710
|
-
if (!o.await) {
|
|
711
|
-
if (!ises3(o.next)) return;
|
|
712
|
-
}
|
|
713
898
|
var m = o.first;
|
|
714
899
|
var hasdeclare = false;
|
|
715
900
|
if (m.type === STRAP) {
|
|
@@ -718,23 +903,32 @@ var unforin = function (o, body, getnewname_) {
|
|
|
718
903
|
}
|
|
719
904
|
var n = m.next;
|
|
720
905
|
if (n.type !== STRAP || n.text !== 'in') {
|
|
721
|
-
return;
|
|
906
|
+
return false;
|
|
907
|
+
}
|
|
908
|
+
if (ises3(o, killobj) && ises3(o.next, killobj)) return;
|
|
909
|
+
var prev = o.prev;
|
|
910
|
+
while (prev && prev.type === LABEL) prev = prev.prev;
|
|
911
|
+
var pp = prev && prev.prev;
|
|
912
|
+
var ppp = pp && pp.prev;
|
|
913
|
+
if (pp && pp.type === STRAP && pp.text === 'else' ||
|
|
914
|
+
ppp && pp.type === SCOPED && pp.entry === '(' && ppp.type === STRAP && /^(with|for|while|if)$/.test(ppp.text)) {
|
|
915
|
+
var brace = scanner2("{}")[0];
|
|
916
|
+
var nn = skipAssignment(prev);
|
|
917
|
+
var os = splice2(o.queue, prev, nn, brace);
|
|
918
|
+
splice(brace, 0, 0, ...os);
|
|
722
919
|
}
|
|
723
920
|
n = n.next;
|
|
724
921
|
var tname = getnewname_();
|
|
725
922
|
var sname = getnewname_();
|
|
726
923
|
var kname = getnewname_();
|
|
727
924
|
var s = scanner2(`${sname}=`);
|
|
728
|
-
insert1(s, null, ...
|
|
925
|
+
insert1(s, null, ...splice2(o, n));
|
|
729
926
|
insert1(s, null,
|
|
730
|
-
...scanner2(`,${tname}=[];for(${
|
|
927
|
+
...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${m.text} in ${sname})${tname}.push(${m.text});`)
|
|
731
928
|
);
|
|
732
|
-
insert1(
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
insert1(o, o.first, ...scanner2(`${kname}=0;${kname}<${tname}.length`));
|
|
736
|
-
var c = scanner2(`(=${tname}[${kname}]);${kname}++`);
|
|
737
|
-
insert1(c[0], c[0].first, m);
|
|
929
|
+
insert1(o.queue, o.prev, ...s);
|
|
930
|
+
splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}.length&&`));
|
|
931
|
+
var c = scanner2(`(${m.text}=${tname}[${kname}]);${kname}++`);
|
|
738
932
|
insert1(o, null, ...c);
|
|
739
933
|
};
|
|
740
934
|
|
|
@@ -750,85 +944,92 @@ var unforof = function (o, getnewname, used) {
|
|
|
750
944
|
m = m.next;
|
|
751
945
|
hasdeclare = true;
|
|
752
946
|
}
|
|
753
|
-
|
|
754
947
|
var n = m.next;
|
|
755
948
|
if (n.type !== STRAP || n.text !== 'of') {
|
|
756
949
|
return o.next;
|
|
757
950
|
}
|
|
758
951
|
var f = n.next;
|
|
759
|
-
var p =
|
|
952
|
+
var p = splice2(o, m, m = n)[0];
|
|
760
953
|
if (hasdeclare) {
|
|
761
954
|
var [d] = getDeclared(p);
|
|
762
|
-
insert1(o, m, ...scanner2(d.
|
|
955
|
+
if (d.length) insert1(o, m, ...scanner2(d.join(",") + ","));
|
|
763
956
|
}
|
|
764
957
|
var iname = getnewname();
|
|
765
958
|
var gname = getnewname();
|
|
766
959
|
var oname;
|
|
767
|
-
|
|
768
|
-
|
|
960
|
+
var useSimpleLoop = !(rootHyper || used.Symbol || hasawait);
|
|
961
|
+
if (!f.next && f.type === EXPRESS && !/\./.test(f.text) && used[f.origin || f.text.replace(/[\.\[][\s\S]*$/, '')].length === 1) {
|
|
962
|
+
splice2(o, m);
|
|
769
963
|
oname = f.text;
|
|
770
964
|
}
|
|
771
965
|
else {
|
|
772
966
|
oname = getnewname();
|
|
773
|
-
|
|
774
|
-
var mo =
|
|
775
|
-
|
|
776
|
-
|
|
967
|
+
splice2(o, n, f);
|
|
968
|
+
var mo = splice2(o, f);
|
|
969
|
+
if (useSimpleLoop) useSimpleLoop = mo.length === 1 && (mo[0].type === EXPRESS || mo[0].type === SCOPED && mo[0].entry === "[");
|
|
970
|
+
o.push(...scanner2(`${oname}=`));
|
|
971
|
+
o.push(...mo);
|
|
972
|
+
o.push({ type: STAMP, text: ',' });
|
|
777
973
|
}
|
|
778
|
-
|
|
974
|
+
if (useSimpleLoop) o.push(...scanner2(`${iname}=0,${gname}=${oname}.length;${iname}<${gname}&&(${createString([p])}=${oname}[${iname}],true);${iname}++`));
|
|
975
|
+
else rootenvs.Symbol = true, o.push(...scanner2(`${gname}=${hasawait ? `${oname}[Symbol.asyncIterator]||${oname}[Symbol.iterator]` : `${oname}[Symbol.iterator]||${oname}[Symbol.asyncIterator]`}||Array.prototype[Symbol.iterator],${gname}=${gname}.call(${oname}),${iname}=${hasawait ? "await " : ''}${gname}.next();!${iname}.done&&(${createString([p])}=${iname}.value,true);${iname}=${gname}.next()`));
|
|
976
|
+
relink(o);
|
|
779
977
|
};
|
|
780
|
-
var unarrow = function (body,
|
|
978
|
+
var unarrow = function (body, i, killobj, letname_) {
|
|
979
|
+
var o = body[i];
|
|
781
980
|
var p = o.prev;
|
|
782
981
|
var n = o.next;
|
|
783
982
|
var b = n, h = p;
|
|
784
|
-
|
|
983
|
+
var pi = body.lastIndexOf(p, i);
|
|
984
|
+
if (pi < 0) pi = 0;
|
|
985
|
+
body.splice(i, 1);
|
|
986
|
+
body.splice(pi, 0, { type: STRAP, text: 'function' });
|
|
987
|
+
var ni = body.indexOf(n, i);
|
|
988
|
+
if (ni < 0) ni = body.length;
|
|
785
989
|
if (p && p.type !== SCOPED || p.entry !== "(") {
|
|
786
|
-
h = scanner2("()");
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
b
|
|
794
|
-
b = b[0];
|
|
795
|
-
killarg(h, b, getname_);
|
|
796
|
-
insert1(b, null, { type: STRAP, text: "return" });
|
|
797
|
-
insert1(b, null, ...splice1(body, n, nn));
|
|
798
|
-
insert1(body, o, b);
|
|
990
|
+
h = scanner2("()")[0];
|
|
991
|
+
h.splice(0, 0, ...body.splice(i, 1, h));
|
|
992
|
+
}
|
|
993
|
+
if (n.type !== SCOPED || n.entry !== "{") {
|
|
994
|
+
var nni = skipAssignment(body, ni);
|
|
995
|
+
b = scanner2('{}')[0];
|
|
996
|
+
b.push({ type: STRAP, text: "return" }, ...body.splice(ni, nni - ni, b));
|
|
997
|
+
killarg(h, b, letname_);
|
|
799
998
|
killobj(b);
|
|
999
|
+
ni = nni;
|
|
800
1000
|
}
|
|
801
|
-
|
|
802
|
-
return
|
|
1001
|
+
else nni = ni + 1;
|
|
1002
|
+
return nni;
|
|
803
1003
|
};
|
|
804
1004
|
var getname = function (vars, envs, k) {
|
|
805
1005
|
if (!(k in vars) && !(k in envs)) return vars[k] = true, k;
|
|
806
1006
|
var inc = /\d+$/.exec(k);
|
|
807
1007
|
if (inc) k = k.slice(0, k.length - inc[0].length), inc = 1 + +inc[0];
|
|
808
1008
|
else inc = 0;
|
|
809
|
-
while ((k + inc) in vars) inc++;
|
|
1009
|
+
while ((k + inc) in vars || (k + inc) in envs) inc++;
|
|
810
1010
|
vars[k + inc] = true;
|
|
811
1011
|
return k + inc;
|
|
812
1012
|
};
|
|
813
|
-
var killarg = function (head, body, _getname) {
|
|
1013
|
+
var killarg = function (head, body, _getname, setarg = true) {
|
|
814
1014
|
var argcodes = [];
|
|
815
1015
|
var o = head.first;
|
|
816
1016
|
var index = 0;
|
|
817
1017
|
var collect = 0, cname, anames = [];
|
|
1018
|
+
var namemap = Object.create(null);
|
|
818
1019
|
while (o) {
|
|
819
|
-
var aname;
|
|
1020
|
+
var aname = null;
|
|
820
1021
|
if (o.type === SCOPED) {
|
|
821
1022
|
aname = _getname(head.length > 1 ? 'arg' + index : 'arg');
|
|
822
|
-
var dec =
|
|
1023
|
+
var dec = splice2(head, o, o = o.next, { type: EXPRESS, text: aname });
|
|
823
1024
|
dec = `${createString(dec)}=${aname}`;
|
|
824
1025
|
if (/^var\s/.test(argcodes[argcodes.length - 1])) argcodes[argcodes.length - 1] += ',' + dec;
|
|
825
1026
|
else argcodes.push(`var ` + dec);
|
|
826
1027
|
}
|
|
827
|
-
else if (o.type === EXPRESS) {
|
|
1028
|
+
else if (o.type === EXPRESS || o.type === VALUE) {
|
|
828
1029
|
aname = o.text;
|
|
829
1030
|
if (/^\.\.\./.test(aname)) {
|
|
830
1031
|
cname = aname.replace(/^\.\.\./, '');
|
|
831
|
-
|
|
1032
|
+
splice2(head, o.prev ? o.prev : o, o = o.next);
|
|
832
1033
|
collect = index + 1;
|
|
833
1034
|
continue;
|
|
834
1035
|
}
|
|
@@ -844,10 +1045,11 @@ var killarg = function (head, body, _getname) {
|
|
|
844
1045
|
}
|
|
845
1046
|
var start = o;
|
|
846
1047
|
while (o && (o.type !== STAMP || o.text !== ',')) o = o.next;
|
|
847
|
-
var assign =
|
|
1048
|
+
var assign = splice2(head, start, o);
|
|
848
1049
|
argcodes.push(`if(${aname}===undefined)${aname}${createString(assign)}`);
|
|
1050
|
+
if (o) o = o.next;
|
|
849
1051
|
}
|
|
850
|
-
|
|
1052
|
+
namemap[aname] = true;
|
|
851
1053
|
}
|
|
852
1054
|
if (collect > 0) {
|
|
853
1055
|
collect--;
|
|
@@ -859,29 +1061,249 @@ var killarg = function (head, body, _getname) {
|
|
|
859
1061
|
|
|
860
1062
|
if (cname) argcodes.unshift(`var ${cname}=Array.prototype.slice.call(arguments,${collect}${index > collect ? `,${collect - index}` : ""})`);
|
|
861
1063
|
}
|
|
862
|
-
if (argcodes.length
|
|
1064
|
+
if (argcodes.length && setarg) {
|
|
1065
|
+
if (!body) {
|
|
1066
|
+
var next = head.next;
|
|
1067
|
+
if (next.type === STAMP && /^=>$/.test(next.text)) next = next.next;
|
|
1068
|
+
var end = skipAssignment(next);
|
|
1069
|
+
var body = scanner2(`{${argcodes.join(";")};return}`)[0];
|
|
1070
|
+
while (next !== end) {
|
|
1071
|
+
body.push(next);
|
|
1072
|
+
next = next.next;
|
|
1073
|
+
};
|
|
1074
|
+
relink(body);
|
|
1075
|
+
var hq = head.queue;
|
|
1076
|
+
var i = hq.indexOf(head.next);
|
|
1077
|
+
var j = end ? hq.indexOf(end) : hq.length;
|
|
1078
|
+
splice(hq, i + 1, j - i, body);
|
|
1079
|
+
}
|
|
1080
|
+
else body.unshift(...scanner2(argcodes.join(";") + ";")), relink(body);
|
|
1081
|
+
}
|
|
1082
|
+
return [namemap, argcodes];
|
|
863
1083
|
};
|
|
864
|
-
|
|
1084
|
+
var revar = function (scoped) {
|
|
1085
|
+
if (!scoped.body) return;
|
|
1086
|
+
var killed = [];
|
|
1087
|
+
var rm = function (o, i) {
|
|
1088
|
+
if (o.type === STRAP && /^(const|let|var)$/.test(o.text)) {
|
|
1089
|
+
var q = o.queue;
|
|
1090
|
+
if (!q) return;
|
|
1091
|
+
var n = o;
|
|
1092
|
+
var s = i, v = o;
|
|
1093
|
+
if (o.next) do {
|
|
1094
|
+
o = n.next;
|
|
1095
|
+
n = o.next;
|
|
1096
|
+
if (n && n.type === STRAP && n.text === 'in') break;
|
|
1097
|
+
if (n && n.text === '=') {
|
|
1098
|
+
n = skipAssignment(n);
|
|
1099
|
+
}
|
|
1100
|
+
else {
|
|
1101
|
+
i = q.indexOf(o.prev, i);
|
|
1102
|
+
var j = n ? q.indexOf(n, i) : q.length;
|
|
1103
|
+
q.splice(i, j - i);
|
|
1104
|
+
}
|
|
1105
|
+
} while (n && n.type === STAMP && n.text === ',');
|
|
1106
|
+
if (q[s] === v) q.splice(s, 1);
|
|
1107
|
+
if (killed.indexOf(q) < 0) killed.push(q);
|
|
1108
|
+
}
|
|
1109
|
+
else if (o.length) {
|
|
1110
|
+
backEach(o, rm);
|
|
1111
|
+
}
|
|
1112
|
+
};
|
|
1113
|
+
backEach(scoped.body, rm);
|
|
1114
|
+
killed.forEach(relink);
|
|
1115
|
+
};
|
|
1116
|
+
var killret = function (body, labels = Object.create(null), gettmpname) {
|
|
1117
|
+
var o = body.first;
|
|
1118
|
+
var breakmap = {};
|
|
1119
|
+
var breakIndex = 4;
|
|
1120
|
+
var tmpname = null;
|
|
1121
|
+
var gettmp = function () {
|
|
1122
|
+
if (tmpname) return tmpname;
|
|
1123
|
+
return tmpname = gettmpname();
|
|
1124
|
+
}
|
|
1125
|
+
var lbls = [];
|
|
1126
|
+
while (o) {
|
|
1127
|
+
var unlabel = false;
|
|
1128
|
+
if (o.type === LABEL) {
|
|
1129
|
+
var lbl = o.text.slice(0, o.text.length - 1);
|
|
1130
|
+
if (!labels[lbl]) {
|
|
1131
|
+
labels[lbl] = true;
|
|
1132
|
+
lbls.push(lbl);
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
else if (o.type === SCOPED) {
|
|
1136
|
+
killret(o, labels, gettmpname);
|
|
1137
|
+
if (o.entry === '{') unlabel = true;
|
|
1138
|
+
}
|
|
1139
|
+
else if (o.type === STAMP && o.text === ';') {
|
|
1140
|
+
unlabel = true;
|
|
1141
|
+
}
|
|
1142
|
+
if (unlabel) {
|
|
1143
|
+
for (var lbl of lbls) delete labels[lbl];
|
|
1144
|
+
lbls = [];
|
|
1145
|
+
}
|
|
1146
|
+
if (o.type !== STRAP) {
|
|
1147
|
+
o = o.next;
|
|
1148
|
+
continue;
|
|
1149
|
+
}
|
|
1150
|
+
switch (o.text) {
|
|
1151
|
+
case "function":
|
|
1152
|
+
while (o && o.type !== SCOPED || o.entry !== '{') o = o.next;
|
|
1153
|
+
break;
|
|
1154
|
+
case "return":
|
|
1155
|
+
if (o.next && !o.isend) insert1(body, o.next, ...scanner2(`${gettmp()}=1,`));
|
|
1156
|
+
else insert1(body, o.next, ...scanner2(`${gettmp()}=1,void 0`)), o.isend = false;
|
|
1157
|
+
breakmap[o.text] = 1;
|
|
1158
|
+
break;
|
|
1159
|
+
case "break":
|
|
1160
|
+
case "continue":
|
|
1161
|
+
if (o.next && !o.isend) {
|
|
1162
|
+
var lbl = o.next.text;
|
|
1163
|
+
if (labels[lbl]) break;
|
|
1164
|
+
var k = `${o.text} ${lbl}`;
|
|
1165
|
+
var v = breakmap[k] || breakIndex++;
|
|
1166
|
+
breakmap[k] = [v, o.text, o.next];
|
|
1167
|
+
splice2(body, o.next, o.next.next, ...scanner2(`${gettmp()}=${v}`));
|
|
1168
|
+
}
|
|
1169
|
+
else {
|
|
1170
|
+
if (labels[o.text]) break;
|
|
1171
|
+
var v = breakmap[o.text] = o.text === 'break' ? 2 : 3;
|
|
1172
|
+
insert1(body, o.next, ...scanner2(`${gettmp()}=${v}`));
|
|
1173
|
+
o.isend = false;
|
|
1174
|
+
}
|
|
1175
|
+
o.text = 'return';
|
|
1176
|
+
break;
|
|
1177
|
+
case "for":
|
|
1178
|
+
case "do":
|
|
1179
|
+
case "while":
|
|
1180
|
+
if (!labels.continue) {
|
|
1181
|
+
lbls.push('continue');
|
|
1182
|
+
labels.continue = true;
|
|
1183
|
+
}
|
|
1184
|
+
case "switch":
|
|
1185
|
+
if (!labels.break) {
|
|
1186
|
+
labels.break = true;
|
|
1187
|
+
lbls.push('break');
|
|
1188
|
+
}
|
|
1189
|
+
break;
|
|
1190
|
+
}
|
|
1191
|
+
o = o.next;
|
|
1192
|
+
}
|
|
1193
|
+
return breakmap;
|
|
1194
|
+
}
|
|
865
1195
|
var down = function (scoped) {
|
|
1196
|
+
var inAsync = scoped.async;
|
|
1197
|
+
var inAster = scoped.yield;
|
|
1198
|
+
var funcMark = [, "aster_", "async_", "asyncAster_"][inAsync << 1 | inAster];
|
|
1199
|
+
if (funcMark) rootenvs[funcMark] = true;
|
|
866
1200
|
var vars = Object.assign(Object.create(null), scoped.vars);
|
|
1201
|
+
var envs = Object.assign(Object.create(null), scoped.envs);
|
|
867
1202
|
var objnames = [];
|
|
868
1203
|
|
|
869
|
-
var _getname = getname.bind(null, vars,
|
|
1204
|
+
var _getname = getname.bind(null, vars, envs);
|
|
1205
|
+
var _letname = getname.bind(null, envs, vars);
|
|
870
1206
|
var gettmpname = function (i = 0) {
|
|
871
1207
|
if (!objnames[i]) objnames[i] = _getname("_");
|
|
872
1208
|
return objnames[i];
|
|
873
1209
|
};
|
|
874
|
-
var
|
|
875
|
-
|
|
1210
|
+
var letnames = [];
|
|
1211
|
+
var getletname = function (i = 0) {
|
|
1212
|
+
if (!letnames[i]) letnames[i] = _letname("_");
|
|
1213
|
+
return letnames[i];
|
|
876
1214
|
};
|
|
877
1215
|
// let 转 var
|
|
878
1216
|
var killlet = function (scoped) {
|
|
1217
|
+
if (!scoped.lets || scoped.isfunc) return;
|
|
879
1218
|
for (var k in scoped.lets) {
|
|
880
|
-
var nk =
|
|
881
|
-
if (nk !== k)
|
|
1219
|
+
var nk = _letname(k);
|
|
1220
|
+
if (nk !== k) {
|
|
1221
|
+
delete scoped.lets[k];
|
|
1222
|
+
scoped.lets[nk] = true;
|
|
1223
|
+
rename(scoped.used, k, nk);
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
var lets = Object.keys(scoped.lets);
|
|
1227
|
+
var hasChildFunc = false;
|
|
1228
|
+
var checkScope = function (s) {
|
|
1229
|
+
if (s.length) {
|
|
1230
|
+
for (var c of s) {
|
|
1231
|
+
if (hasChildFunc) return;
|
|
1232
|
+
checkScope(c);
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
if (!s.isfunc) return;
|
|
1236
|
+
var sused = s.used;
|
|
1237
|
+
for (var k of lets) {
|
|
1238
|
+
if (k in sused) {
|
|
1239
|
+
hasChildFunc = true;
|
|
1240
|
+
break;
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
};
|
|
1244
|
+
checkScope(scoped);
|
|
1245
|
+
if (!hasChildFunc) return;
|
|
1246
|
+
var tmp0 = _getname("tmp");
|
|
1247
|
+
var tmp1 = null;
|
|
1248
|
+
var wrapper = scanner2(`(${inAsync ? 'async ' : ''}function${inAster ? "*" : ''}(${lets}){}(${lets}))`)[0];
|
|
1249
|
+
var body = scoped.body;
|
|
1250
|
+
var bp = body.prev;
|
|
1251
|
+
var bn = body.next;
|
|
1252
|
+
var bq = body.queue;
|
|
1253
|
+
var bpp = bp && bp.prev;
|
|
1254
|
+
var isswitch = bp && bp.type === SCOPED && bp.entry === '(' && bpp && bpp.type === STRAP && bpp.text === 'switch';
|
|
1255
|
+
var wbody = wrapper[wrapper.length - 2];
|
|
1256
|
+
for (var k of lets) vars[k] = true, delete envs[k];
|
|
1257
|
+
backEach(body, function (o, i) {
|
|
1258
|
+
if (o.type === STRAP && /^(const|let|var)$/.test(o.text)) splice(body, i, 1);
|
|
1259
|
+
});
|
|
1260
|
+
if (isswitch) splice(wbody, 0, 0, bpp, bp, body);
|
|
1261
|
+
else splice(wrapper, wrapper.length - 2, 1, body), wbody = body;
|
|
1262
|
+
var retmap = killret(wbody, scoped.lets, function () {
|
|
1263
|
+
if (!tmp0) tmp0 = _getname("tmp");
|
|
1264
|
+
return tmp0;
|
|
1265
|
+
});
|
|
1266
|
+
var hasret = false;
|
|
1267
|
+
for (var k in retmap) {
|
|
1268
|
+
hasret = true;
|
|
1269
|
+
break;
|
|
1270
|
+
}
|
|
1271
|
+
var pre = [];
|
|
1272
|
+
var fix = [];
|
|
1273
|
+
if (hasret) {
|
|
1274
|
+
pre.push({ text: 'if', type: STRAP });
|
|
1275
|
+
fix = scanner2('{}');
|
|
1276
|
+
var fix0 = fix[0];
|
|
1277
|
+
for (var k in retmap) {
|
|
1278
|
+
var v = retmap[k];
|
|
1279
|
+
if (v === 1) {
|
|
1280
|
+
if (!tmp1) tmp1 = _getname('tmp');
|
|
1281
|
+
fix0.push(...scanner2(`if(${tmp0}===${v}) return ${tmp1}`), { text: ';', type: STAMP });
|
|
1282
|
+
}
|
|
1283
|
+
else if (v === 2 || v === 3) {
|
|
1284
|
+
fix0.push(...scanner2(`if(${tmp0}===${v}) ${k}`), { text: ';', type: STAMP });
|
|
1285
|
+
}
|
|
1286
|
+
else {
|
|
1287
|
+
fix0.push(...scanner2(`if(${tmp0}===${v[0]}) ${v[1]}`), v[2], { text: ';', type: STAMP });
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
wrapper.unshift(...scanner2(`${tmp0}=0,${tmp1 ? tmp1 + '=' : ''}`));
|
|
1291
|
+
}
|
|
1292
|
+
if (!pre.length && bn && !(bn.type === STAMP && /^[,;]/.test(bn.text))) fix.push({ type: SPACE, text: ';' });
|
|
1293
|
+
if (isswitch) {
|
|
1294
|
+
splice2(bq, bpp, bn, ...pre, wrapper, ...fix);
|
|
1295
|
+
}
|
|
1296
|
+
else if (body.entry === '{' && (!bp || !bpp && (bp.type !== STRAP || !/^(do|try)$/.test(bp.text)) || bp.type === SCOPED && bp.entry === '(' && bpp && bpp.type === STRAP || bp.type === LABEL)) {
|
|
1297
|
+
splice2(bq, body, bn, ...pre, wrapper, ...fix);
|
|
1298
|
+
}
|
|
1299
|
+
else {
|
|
1300
|
+
var wrap = scanner2('{}')[0];
|
|
1301
|
+
splice(wrap, 0, 0, wrapper);
|
|
1302
|
+
splice2(bq, body, bn, wrap);
|
|
882
1303
|
}
|
|
883
1304
|
};
|
|
884
1305
|
var precode = function (text) {
|
|
1306
|
+
if (!scoped.body) return;
|
|
885
1307
|
var codelist = typeof text === 'string' ? scanner2(text) : text;
|
|
886
1308
|
var first = codelist[0];
|
|
887
1309
|
var last = codelist[codelist.length - 1];
|
|
@@ -893,7 +1315,6 @@ var down = function (scoped) {
|
|
|
893
1315
|
scoped.body.unshift.apply(scoped.body, codelist);
|
|
894
1316
|
};
|
|
895
1317
|
|
|
896
|
-
var argcodes = [];
|
|
897
1318
|
var solidmap = {};
|
|
898
1319
|
var setsolid = function (q, o) {
|
|
899
1320
|
var k = o.text;
|
|
@@ -913,17 +1334,23 @@ var down = function (scoped) {
|
|
|
913
1334
|
}
|
|
914
1335
|
o.text = solidmap[k] + c;
|
|
915
1336
|
};
|
|
916
|
-
|
|
1337
|
+
var markcodes = [];
|
|
1338
|
+
if (scoped.isfunc && scoped.used.this && (funcMark || scoped.insett)) {
|
|
917
1339
|
let tn = _getname("this_");
|
|
918
1340
|
rename(scoped.used, "this", tn);
|
|
919
|
-
|
|
1341
|
+
scoped.used.this.forEach(o => o.origin = 'this');
|
|
1342
|
+
markcodes.push(`${tn}=this`);
|
|
920
1343
|
}
|
|
921
|
-
if (scoped.used.arguments) {
|
|
1344
|
+
if (scoped.isfunc && scoped.used.arguments && (funcMark || scoped.inseta)) {
|
|
922
1345
|
let an = _getname("arguments_");
|
|
1346
|
+
scoped.used.arguments.forEach(o => o.origin = 'arguments');
|
|
923
1347
|
rename(scoped.used, "arguments", an);
|
|
924
|
-
|
|
1348
|
+
markcodes.push(`${an}=arguments`);
|
|
925
1349
|
}
|
|
926
1350
|
var fordeep = 0;
|
|
1351
|
+
var _killobj = function (_getlocal, o) {
|
|
1352
|
+
return killobj(o, gettmpname, getletname, _getlocal, _letname, setsolid);
|
|
1353
|
+
};
|
|
927
1354
|
var kill = function (scoped, _, body) {
|
|
928
1355
|
if (scoped.isfunc) return down(scoped);
|
|
929
1356
|
killlet(scoped);
|
|
@@ -932,45 +1359,62 @@ var down = function (scoped) {
|
|
|
932
1359
|
var getdeepname = function () {
|
|
933
1360
|
return gettmpname(--fordeep);
|
|
934
1361
|
};
|
|
1362
|
+
var killed = false;
|
|
935
1363
|
a: if (scoped.head) {
|
|
936
1364
|
var hp = scoped.head.prev;
|
|
937
1365
|
if (hp && hp.type === STRAP) {
|
|
938
1366
|
if (hp.text === 'for') {
|
|
939
1367
|
unforof(scoped.head, getdeepname, scoped.used);
|
|
940
|
-
unforin(scoped.head,
|
|
1368
|
+
killed = unforin(scoped.head, getdeepname, _killobj.bind(null, _getlocal)) !== false;
|
|
941
1369
|
// unforcx(scoped.head, getdeepname);
|
|
942
1370
|
}
|
|
943
1371
|
else if (hp.text === 'catch') {
|
|
944
|
-
killarg(scoped.head, scoped.body,
|
|
1372
|
+
killarg(scoped.head, scoped.body, _letname);
|
|
945
1373
|
break a;
|
|
946
1374
|
}
|
|
947
1375
|
}
|
|
948
|
-
|
|
1376
|
+
if (!killed) _killobj(_getlocal, scoped.head);
|
|
949
1377
|
}
|
|
950
|
-
if (scoped.body)
|
|
1378
|
+
if (!killed && scoped.body) _killobj(_getlocal, scoped.body);
|
|
951
1379
|
if (scoped.length) scoped.forEach(kill);
|
|
952
1380
|
fordeep = saveddeep;
|
|
953
1381
|
};
|
|
954
1382
|
if (scoped.isfunc) {
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
if (argcodes.length) precode(argcodes.join(";") + ";");
|
|
958
|
-
if (scoped.body) scoped.body.keeplet = false,
|
|
1383
|
+
if (scoped.head) var [argsmap, argcodes] = killarg(scoped.head, scoped.body, _letname, false);
|
|
1384
|
+
else argcodes = [];
|
|
1385
|
+
if ((markcodes.length || argcodes.length) && !funcMark) precode(markcodes.concat(argcodes).join(";") + ";");
|
|
1386
|
+
if (scoped.body) scoped.body.keeplet = false, _killobj(_getname, scoped.body);
|
|
1387
|
+
|
|
959
1388
|
scoped.forEach(kill);
|
|
960
|
-
if (
|
|
961
|
-
var argname =
|
|
1389
|
+
if (funcMark) {
|
|
1390
|
+
var argname = _letname("_");
|
|
1391
|
+
unstruct.debug = downLevel.debug;
|
|
962
1392
|
var code = unawait(scoped.body, _getname, argname);
|
|
963
|
-
var body = scanner2(`return ${
|
|
1393
|
+
var body = scanner2(`return ${funcMark}()`);
|
|
964
1394
|
code.forEach(function (c) {
|
|
965
|
-
var f = scanner2(`function(${
|
|
966
|
-
if (!c.length)
|
|
967
|
-
else
|
|
968
|
-
|
|
969
|
-
|
|
1395
|
+
var f = scanner2(`function(${c.awaited ? argname : ''}){\r\n}`);
|
|
1396
|
+
if (!c.length) f[2].push(...scanner2('return [1,0]'));
|
|
1397
|
+
else f[2].push(...c);
|
|
1398
|
+
f[2].push({ type: SPACE, text: "\r\n" });
|
|
1399
|
+
if (body[2].length) body[2].push({ type: STAMP, text: "," });
|
|
1400
|
+
body[2].push({ type: SPACE, text: '\r\n' }, ...f);
|
|
970
1401
|
});
|
|
971
|
-
scoped.body
|
|
972
|
-
|
|
1402
|
+
splice(scoped.body, 0, scoped.body.length);
|
|
1403
|
+
if (markcodes.length || argcodes.length) {
|
|
1404
|
+
splice(scoped.body, 0, 0, ...scanner2(markcodes.concat(argcodes).join(';') + ";\r\n"));
|
|
1405
|
+
}
|
|
1406
|
+
splice(scoped.body, scoped.body.length, 0, ...body);
|
|
1407
|
+
for (var k in envs) if (!(k in scoped.envs)) vars[k] = true;
|
|
1408
|
+
delete vars[argname];
|
|
1409
|
+
revar(scoped);
|
|
1410
|
+
scoped.vars = Object.create(null);
|
|
1411
|
+
scoped.async = false;
|
|
1412
|
+
scoped.yield = false;
|
|
973
1413
|
}
|
|
1414
|
+
var vars1 = Object.keys(vars).filter(k => !(k in scoped.vars));
|
|
1415
|
+
if (argsmap) vars1 = vars1.filter(k => !(k in argsmap));
|
|
1416
|
+
if (vars1.length && scoped.body) scoped.body.push(...scanner2(`\r\nvar ${vars1}`));
|
|
1417
|
+
if (scoped.body) relink(scoped.body);
|
|
974
1418
|
}
|
|
975
1419
|
else {
|
|
976
1420
|
kill(scoped);
|
|
@@ -981,7 +1425,15 @@ var down = function (scoped) {
|
|
|
981
1425
|
*/
|
|
982
1426
|
function downLevel(data) {
|
|
983
1427
|
var code = scanner2(data);
|
|
984
|
-
|
|
1428
|
+
code = downcode(code);
|
|
985
1429
|
return code.toString();
|
|
986
1430
|
}
|
|
1431
|
+
var downcode = downLevel.code = function (code) {
|
|
1432
|
+
rootenvs = code.envs;
|
|
1433
|
+
rootHyper = rootenvs.Symbol || code.yield || code.async;
|
|
1434
|
+
down(code.scoped);
|
|
1435
|
+
code.keepcolor = false;
|
|
1436
|
+
rootenvs = null;
|
|
1437
|
+
return code;
|
|
1438
|
+
};
|
|
987
1439
|
module.exports = downLevel;
|