efront 4.0.20 → 4.0.22
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/queue.js +3 -2
- package/coms/basic_/Symbol.js +2 -2
- package/coms/basic_/aster_.js +6 -6
- package/coms/basic_/asyncAster_.js +19 -13
- package/coms/basic_/exec_.js +21 -5
- package/coms/compile/Javascript.js +70 -30
- package/coms/compile/Program.js +13 -6
- package/coms/compile/common.js +76 -79
- package/coms/compile/downLevel.js +251 -100
- package/coms/compile/downLevel_test.js +55 -31
- package/coms/compile/run-test262.js +141 -0
- package/coms/compile/unstruct.js +42 -40
- package/coms/compile/unstruct_test.js +10 -5
- package/coms/kugou/dance.js +1 -0
- package/coms/kugou/player.js +4 -27
- package/coms/reptile/colored_console.js +9 -9
- package/package.json +1 -1
- package/public/efront.js +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
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, LABEL, QUOTED, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, snapExpressHead, needBreakBetween } = require("./common");
|
|
4
|
+
var { STAMP, SCOPED, STRAP, EXPRESS, COMMENT, SPACE, PROPERTY, VALUE, LABEL, QUOTED, snapExpressFoot, rename, isHalfSentence, skipFunction, getDeclared, skipAssignment, skipSentenceQueue, createScoped, createString, splice, relink, snapExpressHead, needBreakBetween } = require("./common");
|
|
5
5
|
var splice2 = function (q, from, to, ...a) {
|
|
6
6
|
var cx = q.indexOf(from);
|
|
7
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)), '结构异常';
|
|
@@ -13,6 +13,35 @@ var insert1 = function (q, r, ...a) {
|
|
|
13
13
|
if (r) splice2(q, r, r, ...a);
|
|
14
14
|
else splice(q, q.length, 0, ...a);
|
|
15
15
|
};
|
|
16
|
+
var unslice = function (arr) {
|
|
17
|
+
var rest = [arr];
|
|
18
|
+
while (rest.length) {
|
|
19
|
+
arr = rest.pop();
|
|
20
|
+
for (var cx = arr.length - 1; cx >= 0; cx--) {
|
|
21
|
+
var o = arr[cx];
|
|
22
|
+
if (o.type === SCOPED) {
|
|
23
|
+
if (o.entry !== "[") {
|
|
24
|
+
if (o.isObject) rest.push(o);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
var n = o.next;
|
|
28
|
+
if (n && (n.type !== STAMP || n.text !== ',')) {
|
|
29
|
+
rest.push(o);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
var p = o.prev;
|
|
33
|
+
if (p && p.type === EXPRESS && p.text === '...') {
|
|
34
|
+
var px = arr.lastIndexOf(p, cx);
|
|
35
|
+
splice(arr, px, cx - px + 1, ...o);
|
|
36
|
+
cx += o.length - 1;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
rest.push(o);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
};
|
|
16
45
|
// 解构赋值
|
|
17
46
|
var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
18
47
|
var tmpname = '';
|
|
@@ -23,10 +52,17 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
23
52
|
var [k, v] = d;
|
|
24
53
|
var dp = 0;
|
|
25
54
|
if (typeof k === 'number' && k < 0) {
|
|
55
|
+
if (iter) throw "暂不支持在当前语境读取尾部非剩余元素";
|
|
26
56
|
dp = 1;
|
|
27
57
|
k = `${tmpname}["length"]>${doged - k - 1}?${tmpname}[${tmpname}["length"] - ${-k}]:undefined`;
|
|
28
58
|
} else {
|
|
29
|
-
|
|
59
|
+
if (rootenvs.Symbol && /\[\d+\]/.test(k)) {
|
|
60
|
+
var inc = parseInt(k.slice(1, k.length - 1));
|
|
61
|
+
inc++;
|
|
62
|
+
while (iter.index < inc) iter.next();
|
|
63
|
+
k = iter.tname + `["value"]`;
|
|
64
|
+
}
|
|
65
|
+
else k = tmpname + k;
|
|
30
66
|
}
|
|
31
67
|
if (v.attributes) {
|
|
32
68
|
tmpname = k;
|
|
@@ -34,28 +70,25 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
34
70
|
if (dp) {
|
|
35
71
|
deep += dp;
|
|
36
72
|
var n = getobjname(deep);
|
|
37
|
-
write(n, k);
|
|
73
|
+
write([{ text: n, type: EXPRESS, istmp: true }], k);
|
|
38
74
|
k = tmpname = n;
|
|
39
75
|
}
|
|
40
76
|
dog(v);
|
|
41
77
|
deep -= dp;
|
|
42
78
|
}
|
|
43
79
|
else {
|
|
44
|
-
deep++;
|
|
45
80
|
var n = getobjname(deep);
|
|
46
|
-
write(n, `${tmpname}!==undefined?${
|
|
81
|
+
write([{ text: n, type: EXPRESS, istmp: true }], `${tmpname},${n}=${n}!==undefined?${n}:`);
|
|
47
82
|
var skiped = splice2(d[2], d[3], d[4]);
|
|
48
83
|
killobj(skiped);
|
|
49
84
|
splice(queue, i, 0, ...skiped);
|
|
50
85
|
i += skiped.length;
|
|
51
86
|
k = tmpname = n;
|
|
52
87
|
dog(v);
|
|
53
|
-
deep--;
|
|
54
88
|
}
|
|
55
89
|
if (tmpname === k) tmpname = previx;
|
|
56
90
|
return;
|
|
57
91
|
}
|
|
58
|
-
|
|
59
92
|
if (!tmpname) {
|
|
60
93
|
write(v, null, x < total - 1);
|
|
61
94
|
}
|
|
@@ -63,7 +96,11 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
63
96
|
write(v, k, x < total - 1);
|
|
64
97
|
}
|
|
65
98
|
else {
|
|
66
|
-
|
|
99
|
+
var objname = getobjname(deep);
|
|
100
|
+
var tmpv = scanner2(`${index++ > 0 ? ',' : ''}${objname}=${k}`)
|
|
101
|
+
splice(queue, i, 0, ...tmpv);
|
|
102
|
+
i += tmpv.length;
|
|
103
|
+
write(v, `${objname}!==undefined?${objname}:`, x < total - 1);
|
|
67
104
|
var skiped = splice2(d[2], d[3], d[4]);
|
|
68
105
|
killobj(skiped);
|
|
69
106
|
splice(queue, i, 0, ...skiped);
|
|
@@ -72,25 +109,69 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
72
109
|
index++;
|
|
73
110
|
};
|
|
74
111
|
var doged, total;
|
|
75
|
-
var write = function (
|
|
76
|
-
if (
|
|
112
|
+
var write = function (sname, value, hasnext) {
|
|
113
|
+
if (value && (sname.length === 1 && sname[0].text === tmpname) && hasnext) {
|
|
77
114
|
tmpname = getobjname(deep++);
|
|
78
|
-
if (index > 0)
|
|
79
|
-
var q = scanner2(`${tmpname}=${
|
|
80
|
-
|
|
115
|
+
if (index > 0) splice(queue, i++, 0, { type: STAMP, text: ',' });
|
|
116
|
+
var q = scanner2(`${tmpname}=${sname[0].text}`);
|
|
117
|
+
splice(queue, i, 0, ...q);
|
|
81
118
|
i += q.length;
|
|
82
119
|
index++;
|
|
83
120
|
}
|
|
84
|
-
if (index > 0)
|
|
85
|
-
|
|
121
|
+
if (index > 0) splice(queue, i++, 0, { type: STAMP, text: ',' });
|
|
122
|
+
if (sname[0].type === SCOPED && snapExpressFoot(sname[0]) === sname[0]) {
|
|
123
|
+
var [[d]] = getDeclared(sname[0]);
|
|
124
|
+
if (sname[0].entry === '{') {
|
|
125
|
+
sname = scanner2(tmpname = getobjname(deep));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
splice(queue, i, 0, ...sname);
|
|
129
|
+
i += sname.length;
|
|
86
130
|
if (value) {
|
|
87
131
|
var q = scanner2("=" + value);
|
|
88
|
-
|
|
132
|
+
splice(queue, i, 0, ...q);
|
|
89
133
|
i += q.length;
|
|
90
134
|
}
|
|
91
135
|
index++;
|
|
136
|
+
if (d) dog(d);
|
|
92
137
|
};
|
|
93
138
|
var dog = function (d) {
|
|
139
|
+
var deepback = deep++;
|
|
140
|
+
var iterbackup = iter;
|
|
141
|
+
dog_(d);
|
|
142
|
+
if (iter && !iter.done) iter.return();
|
|
143
|
+
iter = iterbackup;
|
|
144
|
+
deep = deepback;
|
|
145
|
+
}
|
|
146
|
+
var iter = null;
|
|
147
|
+
var Iter = class {
|
|
148
|
+
index = 0;
|
|
149
|
+
iname = getobjname(deep++);
|
|
150
|
+
tname = getobjname(deep);
|
|
151
|
+
init() {
|
|
152
|
+
var init = scanner2(`${index++ > 0 ? ',' : ''}${this.iname}=(${tmpname}[Symbol["iterator"]]||Array["prototype"][Symbol["iterator"]])["call"](${tmpname}),${this.tname}=undefined`);
|
|
153
|
+
splice(queue, i, 0, ...init);
|
|
154
|
+
i += init.length;
|
|
155
|
+
}
|
|
156
|
+
return() {
|
|
157
|
+
var retn = scanner2(`${index++ > 0 ? "," : ''}${this.tname}=(!${this.tname}||!${this.tname}["done"])&& isFunction(${this.iname}["return"])&&${this.iname}["return"]()`);
|
|
158
|
+
rootenvs.isFunction = true;
|
|
159
|
+
splice(queue, i, 0, ...retn);
|
|
160
|
+
i += retn.length;
|
|
161
|
+
}
|
|
162
|
+
next() {
|
|
163
|
+
var inext = scanner2(`${index++ > 0 ? "," : ""}${this.tname}=${this.iname}["next"]()`);
|
|
164
|
+
splice(queue, i, 0, ...inext);
|
|
165
|
+
i += inext.length;
|
|
166
|
+
this.index++;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
var dog_ = function (d) {
|
|
170
|
+
if (!d) return;
|
|
171
|
+
if (rootenvs.Symbol && d.entry === '[') {
|
|
172
|
+
iter = new Iter;
|
|
173
|
+
iter.init();
|
|
174
|
+
};
|
|
94
175
|
var _d = doged, _t = total;
|
|
95
176
|
total = d.attributes.length;
|
|
96
177
|
var at = total;
|
|
@@ -103,6 +184,8 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
103
184
|
var head = d.attributes.slice(0, at);
|
|
104
185
|
for (var r of rest) if (r[1] === name) return d.attributes.forEach(dec);
|
|
105
186
|
var [name, at, a] = d["..."];
|
|
187
|
+
if (name[0].text === "...") name.shift();
|
|
188
|
+
else name[0].text = name[0].text.replace(/^\.\.\./, '');
|
|
106
189
|
var dp = 0;
|
|
107
190
|
if (d.entry === '{') {
|
|
108
191
|
var map = Object.create(null);
|
|
@@ -128,8 +211,12 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
128
211
|
else {
|
|
129
212
|
doged = at + 1;
|
|
130
213
|
head.forEach(dec);
|
|
131
|
-
|
|
132
|
-
|
|
214
|
+
if (iter) {
|
|
215
|
+
while (iter.index < a) iter.next();
|
|
216
|
+
iter.done = true;
|
|
217
|
+
write(name, `restIter_(${tmpname})`);
|
|
218
|
+
}
|
|
219
|
+
else write(name, `slice_["call"](${tmpname},${at}${a > at ? `,${at - a}` : ''})`, rest.length > 0), rootenvs.slice_ = true;
|
|
133
220
|
total = rest.length;
|
|
134
221
|
rest.forEach(dec);
|
|
135
222
|
}
|
|
@@ -137,16 +224,17 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
137
224
|
total = _t;
|
|
138
225
|
};
|
|
139
226
|
var single = function (d, p) {
|
|
140
|
-
if (d.attributes.length !== 1 || d["..."]) return;
|
|
141
|
-
var [k, v] = d.attributes[0];
|
|
227
|
+
if (!d || d.attributes.length !== 1 || d["..."]) return;
|
|
228
|
+
var [k, v, q, f1, f2] = d.attributes[0];
|
|
229
|
+
if (rootenvs.Symbol && /^\[\d+\]$/.test(k)) return;
|
|
142
230
|
p += k;
|
|
143
|
-
if (!v.attributes) return [p, v];
|
|
231
|
+
if (!v.attributes) return [p, v, q, f1, f2];
|
|
144
232
|
return single(v, p);
|
|
145
233
|
};
|
|
146
|
-
if (_var && i < queue.length)
|
|
234
|
+
if (_var && i < queue.length) splice(queue, i++, 0, { type: STRAP, text: _var });
|
|
147
235
|
loop: while (i < queue.length) {
|
|
148
236
|
var o = queue[i];
|
|
149
|
-
var next = o.next;
|
|
237
|
+
var next = snapExpressFoot(o).next;
|
|
150
238
|
tmpname = '';
|
|
151
239
|
if (!next || next.type !== STAMP || next.text !== '=') {
|
|
152
240
|
// 只声明不赋值的语句
|
|
@@ -154,7 +242,8 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
154
242
|
if (hasnext) next = next.next;
|
|
155
243
|
var n = indexof(queue, next, i);
|
|
156
244
|
if (o.type === SCOPED) {
|
|
157
|
-
var [o0] =
|
|
245
|
+
var [o0] = splice(queue, i, n - i);
|
|
246
|
+
unslice(o0);
|
|
158
247
|
var [[d]] = getDeclared(o0);
|
|
159
248
|
dog(d);
|
|
160
249
|
n = i = indexof(queue, next, i);
|
|
@@ -170,22 +259,22 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
170
259
|
}
|
|
171
260
|
var objs = [];
|
|
172
261
|
do {
|
|
173
|
-
var next = o.next;
|
|
262
|
+
var next = snapExpressFoot(o).next;
|
|
174
263
|
if (!next || next.type !== STAMP || next.text !== "=") {
|
|
175
264
|
// 赋值结束
|
|
176
265
|
if (tmpname) {
|
|
177
266
|
var n = skipAssignment(queue, i);
|
|
178
267
|
o = queue[n];
|
|
179
|
-
var skiped =
|
|
268
|
+
var skiped = splice(queue, i, n - i);
|
|
180
269
|
killobj(skiped);
|
|
181
|
-
|
|
270
|
+
splice(queue, i, 0, ...skiped);
|
|
182
271
|
i += skiped.length;
|
|
183
272
|
break;
|
|
184
273
|
}
|
|
185
274
|
if (!next || next.type === STAMP && /^[,;]$/.test(next.text)) {
|
|
186
|
-
if (o.type === EXPRESS &&
|
|
275
|
+
if (o.type === EXPRESS && !/[\.\[]/.test(o.text) && snapExpressFoot(o) === o) {
|
|
187
276
|
tmpname = o.text;
|
|
188
|
-
|
|
277
|
+
splice(queue, i, indexof(queue, o = next, i) - i);
|
|
189
278
|
i = indexof(queue, o, i);
|
|
190
279
|
}
|
|
191
280
|
}
|
|
@@ -193,11 +282,12 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
193
282
|
}
|
|
194
283
|
if (o.type === SCOPED) {
|
|
195
284
|
var n = indexof(queue, next.next, i);
|
|
196
|
-
var [o0] =
|
|
285
|
+
var [o0] = splice(queue, i, n - i);
|
|
286
|
+
unslice(o0);
|
|
197
287
|
delete o0.next;
|
|
198
288
|
if (o0.length && getDeclared(o0).length > 0) objs.push(o0);
|
|
199
289
|
}
|
|
200
|
-
else if (o.type === EXPRESS &&
|
|
290
|
+
else if (o.type === EXPRESS && !/[\.\[]/.test(o.text) && snapExpressFoot(o) === o) {
|
|
201
291
|
if (!tmpname) tmpname = o.text, index++;
|
|
202
292
|
}
|
|
203
293
|
o = next.next;
|
|
@@ -208,18 +298,25 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
208
298
|
var [[d]] = getDeclared(objs[0]);
|
|
209
299
|
var a = single(d, '');
|
|
210
300
|
if (a) {
|
|
211
|
-
splice(queue, i, 0,
|
|
301
|
+
splice(queue, i, 0, ...a[1], { type: STAMP, text: "=" });
|
|
212
302
|
i += 2;
|
|
213
303
|
var i2 = skipAssignment(queue, i);
|
|
214
|
-
killobj(queue.slice(i,
|
|
215
|
-
var q = scanner2(a[0])
|
|
216
|
-
|
|
304
|
+
killobj(queue.slice(i, i2));
|
|
305
|
+
if (!a[2]) var q = scanner2(a[0]);
|
|
306
|
+
else {
|
|
307
|
+
var objname = getobjname(0);
|
|
308
|
+
q = scanner2(`(${objname} =)`);
|
|
309
|
+
q[0].push(...splice(queue, i, i2));
|
|
310
|
+
q[0].push(...scanner2(`${a[0]},${objname}!== undefined ? ${objname}: `), ...splice2(a[2], a[3], a[4]));
|
|
311
|
+
i2 = i;
|
|
312
|
+
}
|
|
313
|
+
splice(queue, i = i2, 0, ...q);
|
|
217
314
|
i += q.length;
|
|
218
315
|
index++;
|
|
219
316
|
continue;
|
|
220
317
|
}
|
|
221
318
|
}
|
|
222
|
-
tmpname = getobjname();
|
|
319
|
+
tmpname = getobjname(0);
|
|
223
320
|
splice(queue, i, 0, { type: EXPRESS, text: tmpname }, { type: STAMP, text: "=" });
|
|
224
321
|
i += 2;
|
|
225
322
|
var i2 = skipAssignment(queue, i);
|
|
@@ -227,11 +324,12 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
227
324
|
index++;
|
|
228
325
|
}
|
|
229
326
|
for (var o0 of objs) {
|
|
327
|
+
deep = 0;
|
|
230
328
|
var [[d]] = getDeclared(o0);
|
|
231
329
|
dog(d);
|
|
232
330
|
}
|
|
233
331
|
}
|
|
234
|
-
relink(queue);
|
|
332
|
+
// relink(queue);
|
|
235
333
|
return i;
|
|
236
334
|
};
|
|
237
335
|
// 键值对重组
|
|
@@ -303,7 +401,7 @@ var killmap = function (body, i, _getobjname, killobj) {
|
|
|
303
401
|
var next = o.next;
|
|
304
402
|
var l = 1;
|
|
305
403
|
var initq = function () {
|
|
306
|
-
q = scanner2(`(${_getobjname()}=)`)[0];
|
|
404
|
+
q = scanner2(`(${_getobjname()} =)`)[0];
|
|
307
405
|
var qo = splice(body, i, l, q);
|
|
308
406
|
insert1(q, null, ...qo);
|
|
309
407
|
insert1(q, null, { type: STAMP, text: ',' });
|
|
@@ -328,7 +426,7 @@ var killmap = function (body, i, _getobjname, killobj) {
|
|
|
328
426
|
if (!t) {
|
|
329
427
|
t = scanner2(`extend()`);
|
|
330
428
|
rootenvs.extend = true;
|
|
331
|
-
var [o0] =
|
|
429
|
+
var [o0] = splice(body, i, 1, ...t);
|
|
332
430
|
t[1].push(o0);
|
|
333
431
|
l = 2;
|
|
334
432
|
}
|
|
@@ -408,8 +506,11 @@ var getprop = function (o, m) {
|
|
|
408
506
|
}
|
|
409
507
|
else m = skipAssignment(m);
|
|
410
508
|
if (m && !m.isprop) m = m.next;
|
|
411
|
-
if (
|
|
412
|
-
|
|
509
|
+
if (s) {
|
|
510
|
+
if (!prop.short) prop.value = splice2(o, s, m);
|
|
511
|
+
else splice2(o, s, m);
|
|
512
|
+
}
|
|
513
|
+
else if (!prop.value) prop.value = [];
|
|
413
514
|
return [prop, m];
|
|
414
515
|
};
|
|
415
516
|
var setprop = function (prop, k, d, q) {
|
|
@@ -449,6 +550,7 @@ var killcls = function (body, i, getname_) {
|
|
|
449
550
|
var ishalf = isHalfSentence(body, i - 1);
|
|
450
551
|
var start = o;
|
|
451
552
|
var decName = !o.isExpress && o.next.type === EXPRESS && o.next.text;
|
|
553
|
+
var isExpress = o.isExpress;
|
|
452
554
|
while (o) {
|
|
453
555
|
o = o.next;
|
|
454
556
|
if (!o) break;
|
|
@@ -519,7 +621,9 @@ var killcls = function (body, i, getname_) {
|
|
|
519
621
|
}
|
|
520
622
|
relink(o);
|
|
521
623
|
if (invokes.length) insert1(invokes, null, { type: STAMP, text: ',' });
|
|
522
|
-
|
|
624
|
+
var fname = scanner2('function ' + name);
|
|
625
|
+
if (isExpress) fname[0].isExpress = true;
|
|
626
|
+
insert1(invokes, null, ...fname);
|
|
523
627
|
if (base) {
|
|
524
628
|
constructor[1].push(...scanner2('return this'))
|
|
525
629
|
relink(constructor[1]);
|
|
@@ -569,7 +673,7 @@ var killcls = function (body, i, getname_) {
|
|
|
569
673
|
var s = i;
|
|
570
674
|
i = body.indexOf(o, i);
|
|
571
675
|
if (i < 0) i = body.length;
|
|
572
|
-
if (head.length > 1 || start.isExpress || ishalf && defines.length) {
|
|
676
|
+
if (head.length > 1 || start.isExpress && (defines.length) || ishalf && defines.length) {
|
|
573
677
|
splice(defines, defines.length, 0, ...scanner2(`\r\nreturn ${clz.name}`))
|
|
574
678
|
if (decName) splice(func, 0, 0, ...scanner2(`var ${decName}=`));
|
|
575
679
|
splice(body, s, i - s, ...func);
|
|
@@ -588,7 +692,7 @@ var indexof = function (list, o, i) {
|
|
|
588
692
|
i = list.indexOf(o, i);
|
|
589
693
|
if (i < 0) i = list.length;
|
|
590
694
|
}
|
|
591
|
-
else i++;
|
|
695
|
+
else if (i < list.length) i++;
|
|
592
696
|
return i;
|
|
593
697
|
};
|
|
594
698
|
// 数组或参数展开
|
|
@@ -596,7 +700,9 @@ var killspr = function (body, i, _getobjname, killobj) {
|
|
|
596
700
|
var o = body[i];
|
|
597
701
|
var m = o.first;
|
|
598
702
|
if (!m) return i + 1;
|
|
703
|
+
unslice(o);
|
|
599
704
|
killobj(o);
|
|
705
|
+
m = o.first;
|
|
600
706
|
var index = 0;
|
|
601
707
|
var spr = function () {
|
|
602
708
|
var s = m;
|
|
@@ -745,18 +851,21 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
|
|
|
745
851
|
break;
|
|
746
852
|
case "yield":
|
|
747
853
|
var o = o.next;
|
|
748
|
-
if (o.type === STAMP && o.text === '*') {
|
|
854
|
+
if (o && o.type === STAMP && o.text === '*') {
|
|
749
855
|
i++;
|
|
750
856
|
var n = body.indexOf(o, i) + 1;
|
|
751
857
|
o = o.next;
|
|
752
858
|
splice(body, i, n - i);
|
|
753
859
|
n = skipAssignment(body, i - 1);
|
|
754
860
|
var name = getname_("_");
|
|
755
|
-
var y = scanner2(`for(var ${name} of)
|
|
756
|
-
y[2].
|
|
757
|
-
splice
|
|
758
|
-
unforof(y[0], getname_.bind(null, '_'), y.used);
|
|
861
|
+
var y = scanner2(`for await(var ${name} of)yield ${name}`, innerJs);
|
|
862
|
+
splice(y[2], y[2].length, 0, ...splice(body, i, n - i));
|
|
863
|
+
splice.debug = true;
|
|
759
864
|
splice(body, i - 1, 1, ...y);
|
|
865
|
+
splice.debug = false;
|
|
866
|
+
innerJs.setType(y[1]);
|
|
867
|
+
if (y[1].type === EXPRESS) splice(body, i, 1);
|
|
868
|
+
unforof(y[0], getname_.bind(null, '_'), y.used, deepkill);
|
|
760
869
|
}
|
|
761
870
|
i++;
|
|
762
871
|
break;
|
|
@@ -765,7 +874,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
|
|
|
765
874
|
islet = body.keeplet !== false;
|
|
766
875
|
case "var":
|
|
767
876
|
splice(body, i, 1);
|
|
768
|
-
i = killdec(body, i,
|
|
877
|
+
i = killdec(body, i, _getdeepname, 'var', deepkill, islet);
|
|
769
878
|
break;
|
|
770
879
|
case "catch":
|
|
771
880
|
var n = o.next;
|
|
@@ -794,7 +903,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
|
|
|
794
903
|
if (i < 0) i = body.length;
|
|
795
904
|
break;
|
|
796
905
|
case "async":
|
|
797
|
-
|
|
906
|
+
splice(body, i, 1);
|
|
798
907
|
break;
|
|
799
908
|
default:
|
|
800
909
|
i++;
|
|
@@ -914,6 +1023,12 @@ var ises3 = function (o, killobj) {
|
|
|
914
1023
|
}
|
|
915
1024
|
return true;
|
|
916
1025
|
}
|
|
1026
|
+
var getexplist = function (f, m) {
|
|
1027
|
+
var explist = [];
|
|
1028
|
+
while (f !== m) explist.push(f), f = f.next;
|
|
1029
|
+
explist.push(m);
|
|
1030
|
+
return explist;
|
|
1031
|
+
}
|
|
917
1032
|
var unforin = function (o, getnewname_, killobj) {
|
|
918
1033
|
// 仅处理有 await 或 yield 的代码
|
|
919
1034
|
var m = o.first;
|
|
@@ -922,6 +1037,8 @@ var unforin = function (o, getnewname_, killobj) {
|
|
|
922
1037
|
m = m.next;
|
|
923
1038
|
hasdeclare = true;
|
|
924
1039
|
}
|
|
1040
|
+
var f = m;
|
|
1041
|
+
m = snapExpressFoot(m);
|
|
925
1042
|
var n = m.next;
|
|
926
1043
|
if (n.type !== STRAP || n.text !== 'in') {
|
|
927
1044
|
return false;
|
|
@@ -945,15 +1062,18 @@ var unforin = function (o, getnewname_, killobj) {
|
|
|
945
1062
|
var s = scanner2(`${sname}=`);
|
|
946
1063
|
insert1(s, null, ...splice2(o, n));
|
|
947
1064
|
insert1(s, null,
|
|
948
|
-
...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${
|
|
1065
|
+
...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${hasdeclare ? f.text : kname} in ${sname})${tname}.push(${hasdeclare ? f.text : kname});`)
|
|
949
1066
|
);
|
|
950
1067
|
insert1(o.queue, o.prev, ...s);
|
|
951
|
-
splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}
|
|
952
|
-
var c = scanner2(`(
|
|
1068
|
+
splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}["length"]&&`));
|
|
1069
|
+
var c = scanner2(`(=${tname}[${kname}],true);${kname}++`);
|
|
1070
|
+
splice(c[0], 0, 0, ...getexplist(f, m));
|
|
953
1071
|
insert1(o, null, ...c);
|
|
954
1072
|
};
|
|
955
|
-
|
|
956
|
-
var
|
|
1073
|
+
var Javascript = require("./Javascript");
|
|
1074
|
+
var innerJs = new Javascript;
|
|
1075
|
+
innerJs.defaultType = STRAP;
|
|
1076
|
+
var unforof = function (o, getnewname, used, killobj) {
|
|
957
1077
|
var hasawait = false;
|
|
958
1078
|
var r = o;
|
|
959
1079
|
o = o.next;
|
|
@@ -968,15 +1088,18 @@ var unforof = function (o, getnewname, used) {
|
|
|
968
1088
|
m = m.next;
|
|
969
1089
|
hasdeclare = true;
|
|
970
1090
|
}
|
|
1091
|
+
var m0 = m;
|
|
1092
|
+
m = snapExpressFoot(m);
|
|
971
1093
|
var n = m.next;
|
|
972
1094
|
if (n.type !== STRAP || n.text !== 'of') {
|
|
973
1095
|
return o.next;
|
|
974
1096
|
}
|
|
975
1097
|
var f = n.next;
|
|
976
|
-
var p = splice2(o,
|
|
1098
|
+
var p = splice2(o, m0, m = n);
|
|
977
1099
|
if (hasdeclare) {
|
|
978
|
-
var [d] = getDeclared(
|
|
1100
|
+
var [d] = getDeclared(m0);
|
|
979
1101
|
if (d.length) insert1(o, m, ...scanner2(d.join(",") + ","));
|
|
1102
|
+
else splice(o, o.first, m0);
|
|
980
1103
|
}
|
|
981
1104
|
var iname = getnewname();
|
|
982
1105
|
var gname = getnewname();
|
|
@@ -995,16 +1118,32 @@ var unforof = function (o, getnewname, used) {
|
|
|
995
1118
|
splice(o, o.length, 0, ...mo);
|
|
996
1119
|
splice(o, o.length, 0, { type: STAMP, text: ',' });
|
|
997
1120
|
}
|
|
998
|
-
|
|
1121
|
+
var pnames = [];
|
|
1122
|
+
var getpname = function (i) {
|
|
1123
|
+
var n = pnames[i];
|
|
1124
|
+
if (!n) n = pnames[i] = getnewname();
|
|
1125
|
+
return n;
|
|
1126
|
+
}
|
|
1127
|
+
if (useSimpleLoop) {
|
|
1128
|
+
splice(o, o.length, 0, ...scanner2(`${iname}=0;${iname}<${oname}["length"]&&(,true);${iname}++`));
|
|
1129
|
+
splice(p, p.length, 0, ...scanner2(`=${oname}[${iname}]`));
|
|
1130
|
+
killdec(p, 0, getpname, null, killobj);
|
|
1131
|
+
if (p.length) splice(o[o.length - 4], 0, 0, ...p);
|
|
1132
|
+
else splice(o[o.length - 4], 0, 1);
|
|
1133
|
+
}
|
|
999
1134
|
else {
|
|
1000
|
-
rootenvs.Symbol = true
|
|
1135
|
+
rootenvs.Symbol = true;
|
|
1136
|
+
splice(o, o.length, 0, ...scanner2(`${gname}=${hasawait ? `${oname}[Symbol["asyncIterator"]]||${oname}[Symbol["iterator"]]` : `${oname}[Symbol["iterator"]]`}||Array["prototype"][Symbol["iterator"]],${gname}=${gname}["call"](${oname}),${iname}=${hasawait ? "await " : ''}${gname}["next"]();!${iname}["done"]&&(,true);${iname}=${hasawait ? 'await ' : ''}${gname}["next"]()`, innerJs));
|
|
1137
|
+
splice(p, p.length, 0, ...scanner2(`=${hasawait ? 'await ' : ''}${iname}["value"]`, innerJs));
|
|
1138
|
+
killdec(p, 0, getpname, null, killobj);
|
|
1139
|
+
if (p.length) splice(o[o.length - 7 - hasawait], 0, 0, ...p);
|
|
1140
|
+
else splice(o[o.length - 7 - hasawait], 0, 1);
|
|
1001
1141
|
var n = o.next;
|
|
1002
1142
|
n = skipSentenceQueue(n);
|
|
1003
1143
|
var tf = scanner2(`try{}finally{if(${iname}&&!${iname}["done"]&&isFunction(${gname}["return"]))${gname}["return"]()}`);
|
|
1004
1144
|
splice(tf[1], 0, 0, ...splice2(r.queue, r, n, ...tf));
|
|
1005
1145
|
rootenvs.isFunction = true;
|
|
1006
1146
|
}
|
|
1007
|
-
relink(o);
|
|
1008
1147
|
};
|
|
1009
1148
|
var unarrow = function (body, i, killobj, letname_) {
|
|
1010
1149
|
var o = body[i];
|
|
@@ -1013,13 +1152,13 @@ var unarrow = function (body, i, killobj, letname_) {
|
|
|
1013
1152
|
var b = n, h = p;
|
|
1014
1153
|
var pi = body.lastIndexOf(p, i);
|
|
1015
1154
|
if (pi < 0) pi = 0;
|
|
1016
|
-
|
|
1017
|
-
|
|
1155
|
+
splice(body, i, 1);
|
|
1156
|
+
splice(body, pi, 0, { type: STRAP, text: 'function' });
|
|
1018
1157
|
var ni = body.indexOf(n, i);
|
|
1019
1158
|
if (ni < 0) ni = body.length;
|
|
1020
1159
|
if (p && p.type !== SCOPED || p.entry !== "(") {
|
|
1021
1160
|
h = scanner2("()")[0];
|
|
1022
|
-
|
|
1161
|
+
splice(h, 0, 0, ...splice(body, i, 1, h));
|
|
1023
1162
|
}
|
|
1024
1163
|
if (n.type !== SCOPED || n.entry !== "{") {
|
|
1025
1164
|
var nni = skipAssignment(body, ni);
|
|
@@ -1056,20 +1195,22 @@ var killarg = function (head, body, _getname, setarg = true) {
|
|
|
1056
1195
|
if (/^var\s/.test(argcodes[argcodes.length - 1])) argcodes[argcodes.length - 1] += ',' + dec;
|
|
1057
1196
|
else argcodes.push(`var ` + dec);
|
|
1058
1197
|
}
|
|
1059
|
-
else if (o.type
|
|
1198
|
+
else if (o.type & (EXPRESS | VALUE)) {
|
|
1060
1199
|
aname = o.text;
|
|
1061
1200
|
if (/^\.\.\./.test(aname)) {
|
|
1062
1201
|
cname = aname.replace(/^\.\.\./, '');
|
|
1063
1202
|
splice2(head, o.prev ? o.prev : o, o = o.next);
|
|
1064
1203
|
collect = index + 1;
|
|
1065
|
-
continue;
|
|
1066
1204
|
}
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1205
|
+
else {
|
|
1206
|
+
o = o.next;
|
|
1207
|
+
if (collect) {
|
|
1208
|
+
anames.push(aname);
|
|
1209
|
+
}
|
|
1210
|
+
index++;
|
|
1070
1211
|
}
|
|
1071
|
-
index++;
|
|
1072
1212
|
}
|
|
1213
|
+
else throw "参数声明异常!"
|
|
1073
1214
|
if (o && o.type === STAMP) {
|
|
1074
1215
|
if (o.text === ',') {
|
|
1075
1216
|
o = o.next; continue;
|
|
@@ -1112,37 +1253,39 @@ var killarg = function (head, body, _getname, setarg = true) {
|
|
|
1112
1253
|
}
|
|
1113
1254
|
return [namemap, argcodes];
|
|
1114
1255
|
};
|
|
1115
|
-
var revar = function (
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
o
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1256
|
+
var revar = function (body) {
|
|
1257
|
+
for (var i = 0; i < body.length; i++) {
|
|
1258
|
+
var o = body[i];
|
|
1259
|
+
if (o.type === STRAP) {
|
|
1260
|
+
if (/^(const|let|var)$/.test(o.text)) {
|
|
1261
|
+
var q = body;
|
|
1262
|
+
if (!q) return;
|
|
1263
|
+
splice(q, i, 1)
|
|
1264
|
+
o = o.next;
|
|
1265
|
+
var s = i, v = o;
|
|
1266
|
+
if (o) do {
|
|
1267
|
+
var n = snapExpressFoot(o).next;
|
|
1268
|
+
if (n && n.type === STRAP && /^(in|of)$/.test(n.text)) break;
|
|
1269
|
+
if (n && n.text === '=') {
|
|
1270
|
+
n = skipAssignment(n);
|
|
1271
|
+
}
|
|
1272
|
+
else {
|
|
1273
|
+
i = q.indexOf(o, i);
|
|
1274
|
+
var j = n ? q.indexOf(n, i) + 1 : q.length;
|
|
1275
|
+
splice(q, i, j - i);
|
|
1276
|
+
}
|
|
1277
|
+
} while (n && n.type === STAMP && n.text === ',');
|
|
1278
|
+
i = s - 1;
|
|
1279
|
+
}
|
|
1280
|
+
else if (/^function$/.test(o.text)) {
|
|
1281
|
+
o = skipFunction(o);
|
|
1282
|
+
i = indexof(body, o, i);
|
|
1283
|
+
}
|
|
1139
1284
|
}
|
|
1140
1285
|
else if (o.length) {
|
|
1141
|
-
|
|
1286
|
+
revar(o);
|
|
1142
1287
|
}
|
|
1143
|
-
}
|
|
1144
|
-
backEach(scoped.body, rm);
|
|
1145
|
-
killed.forEach(relink);
|
|
1288
|
+
}
|
|
1146
1289
|
};
|
|
1147
1290
|
var killret = function (body, labels = Object.create(null), gettmpname) {
|
|
1148
1291
|
var o = body.first;
|
|
@@ -1286,6 +1429,14 @@ var down = function (scoped) {
|
|
|
1286
1429
|
var tmp1 = null;
|
|
1287
1430
|
var wrapper = scanner2(`(${inAsync ? 'async ' : ''}function${inAster ? "*" : ''}(${lets}){}(${lets}))`)[0];
|
|
1288
1431
|
var body = scoped.body;
|
|
1432
|
+
if (!body) {
|
|
1433
|
+
var btemp = scoped.head.next;
|
|
1434
|
+
if (!btemp) throw "语句不完整";
|
|
1435
|
+
var btmp2 = skipSentenceQueue(btemp);
|
|
1436
|
+
body = scoped.body = scanner2('{}')[0];
|
|
1437
|
+
splice(body, 0, 0, ...splice2(btemp.queue, btemp, btmp2, body));
|
|
1438
|
+
}
|
|
1439
|
+
if (body.isClass) return;
|
|
1289
1440
|
var bp = body.prev;
|
|
1290
1441
|
var bn = body.next;
|
|
1291
1442
|
var bq = body.queue;
|
|
@@ -1386,7 +1537,7 @@ var down = function (scoped) {
|
|
|
1386
1537
|
if (hp && hp.type === STRAP && hp.text === 'await') hp = hp.prev;
|
|
1387
1538
|
if (!hp) break a;
|
|
1388
1539
|
if (hp.text === 'for') {
|
|
1389
|
-
unforof(hp, getdeepname, scoped.used);
|
|
1540
|
+
unforof(hp, getdeepname, scoped.used, _killobj.bind(null, _getlocal));
|
|
1390
1541
|
if (funcMark) killed = unforin(scoped.head, getdeepname, _killobj.bind(null, _getlocal)) !== false;
|
|
1391
1542
|
// unforcx(scoped.head, getdeepname);
|
|
1392
1543
|
}
|
|
@@ -1415,6 +1566,7 @@ var down = function (scoped) {
|
|
|
1415
1566
|
var body = scanner2(`return ${funcMark}()`);
|
|
1416
1567
|
var code = unawait(scoped.body, _getname, argname);
|
|
1417
1568
|
code.forEach(function (c) {
|
|
1569
|
+
revar(c);
|
|
1418
1570
|
var f = scanner2(`function(${c.awaited ? argname : ''}){\r\n}`);
|
|
1419
1571
|
if (!c.length) f[2].push(...scanner2('return [1,0]'));
|
|
1420
1572
|
else f[2].push(...c);
|
|
@@ -1431,7 +1583,6 @@ var down = function (scoped) {
|
|
|
1431
1583
|
splice(scoped.body, scoped.body.length, 0, ...body);
|
|
1432
1584
|
for (var k in envs) if (!(k in scoped.envs)) vars[k] = true;
|
|
1433
1585
|
delete vars[argname];
|
|
1434
|
-
revar(scoped);
|
|
1435
1586
|
scoped.vars = Object.create(null);
|
|
1436
1587
|
scoped.async = false;
|
|
1437
1588
|
scoped.yield = false;
|