efront 4.0.20 → 4.0.23
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 +281 -107
- package/coms/compile/downLevel_test.js +63 -32
- 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/playList.html +0 -4
- package/coms/kugou/playList.js +0 -1
- 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,8 +13,37 @@ 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
|
-
var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
46
|
+
var killdec = function (queue, i, getobjname, _var = 'var', killobj, islet) {
|
|
18
47
|
var tmpname = '';
|
|
19
48
|
var index = 0;
|
|
20
49
|
var deep = 0;
|
|
@@ -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,72 @@ 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;
|
|
130
|
+
if (!value && islet) {
|
|
131
|
+
value = "undefined";
|
|
132
|
+
}
|
|
86
133
|
if (value) {
|
|
87
134
|
var q = scanner2("=" + value);
|
|
88
|
-
|
|
135
|
+
splice(queue, i, 0, ...q);
|
|
89
136
|
i += q.length;
|
|
90
137
|
}
|
|
91
138
|
index++;
|
|
139
|
+
if (d) dog(d);
|
|
92
140
|
};
|
|
93
141
|
var dog = function (d) {
|
|
142
|
+
var deepback = deep++;
|
|
143
|
+
var iterbackup = iter;
|
|
144
|
+
dog_(d);
|
|
145
|
+
if (iter && !iter.done) iter.return();
|
|
146
|
+
iter = iterbackup;
|
|
147
|
+
deep = deepback;
|
|
148
|
+
}
|
|
149
|
+
var iter = null;
|
|
150
|
+
var Iter = class {
|
|
151
|
+
index = 0;
|
|
152
|
+
iname = getobjname(deep++);
|
|
153
|
+
tname = getobjname(deep);
|
|
154
|
+
init() {
|
|
155
|
+
var init = scanner2(`${index++ > 0 ? ',' : ''}${this.iname}=(${tmpname}[Symbol["iterator"]]||Array["prototype"][Symbol["iterator"]])["call"](${tmpname}),${this.tname}=undefined`);
|
|
156
|
+
splice(queue, i, 0, ...init);
|
|
157
|
+
i += init.length;
|
|
158
|
+
}
|
|
159
|
+
return() {
|
|
160
|
+
var retn = scanner2(`${index++ > 0 ? "," : ''}${this.tname}=(!${this.tname}||!${this.tname}["done"])&& isFunction(${this.iname}["return"])&&${this.iname}["return"]()`);
|
|
161
|
+
rootenvs.isFunction = true;
|
|
162
|
+
splice(queue, i, 0, ...retn);
|
|
163
|
+
i += retn.length;
|
|
164
|
+
}
|
|
165
|
+
next() {
|
|
166
|
+
var inext = scanner2(`${index++ > 0 ? "," : ""}${this.tname}=${this.iname}["next"]()`);
|
|
167
|
+
splice(queue, i, 0, ...inext);
|
|
168
|
+
i += inext.length;
|
|
169
|
+
this.index++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
var dog_ = function (d) {
|
|
173
|
+
if (!d) return;
|
|
174
|
+
if (rootenvs.Symbol && d.entry === '[') {
|
|
175
|
+
iter = new Iter;
|
|
176
|
+
iter.init();
|
|
177
|
+
};
|
|
94
178
|
var _d = doged, _t = total;
|
|
95
179
|
total = d.attributes.length;
|
|
96
180
|
var at = total;
|
|
@@ -103,6 +187,8 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
103
187
|
var head = d.attributes.slice(0, at);
|
|
104
188
|
for (var r of rest) if (r[1] === name) return d.attributes.forEach(dec);
|
|
105
189
|
var [name, at, a] = d["..."];
|
|
190
|
+
if (name[0].text === "...") name.shift();
|
|
191
|
+
else name[0].text = name[0].text.replace(/^\.\.\./, '');
|
|
106
192
|
var dp = 0;
|
|
107
193
|
if (d.entry === '{') {
|
|
108
194
|
var map = Object.create(null);
|
|
@@ -128,8 +214,12 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
128
214
|
else {
|
|
129
215
|
doged = at + 1;
|
|
130
216
|
head.forEach(dec);
|
|
131
|
-
|
|
132
|
-
|
|
217
|
+
if (iter) {
|
|
218
|
+
while (iter.index < a) iter.next();
|
|
219
|
+
iter.done = true;
|
|
220
|
+
write(name, `restIter_(${tmpname})`);
|
|
221
|
+
}
|
|
222
|
+
else write(name, `slice_["call"](${tmpname},${at}${a > at ? `,${at - a}` : ''})`, rest.length > 0), rootenvs.slice_ = true;
|
|
133
223
|
total = rest.length;
|
|
134
224
|
rest.forEach(dec);
|
|
135
225
|
}
|
|
@@ -137,27 +227,39 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
137
227
|
total = _t;
|
|
138
228
|
};
|
|
139
229
|
var single = function (d, p) {
|
|
140
|
-
if (d.attributes.length !== 1 || d["..."]) return;
|
|
141
|
-
var [k, v] = d.attributes[0];
|
|
230
|
+
if (!d || d.attributes.length !== 1 || d["..."]) return;
|
|
231
|
+
var [k, v, q, f1, f2] = d.attributes[0];
|
|
232
|
+
if (rootenvs.Symbol && /^\[\d+\]$/.test(k)) return;
|
|
142
233
|
p += k;
|
|
143
|
-
if (!v.attributes) return [p, v];
|
|
234
|
+
if (!v.attributes) return [p, v, q, f1, f2];
|
|
144
235
|
return single(v, p);
|
|
145
236
|
};
|
|
146
|
-
if (_var && i < queue.length)
|
|
237
|
+
if (_var && i < queue.length) splice(queue, i++, 0, { type: STRAP, text: _var });
|
|
147
238
|
loop: while (i < queue.length) {
|
|
148
239
|
var o = queue[i];
|
|
149
|
-
var next = o.next;
|
|
240
|
+
var next = snapExpressFoot(o).next;
|
|
150
241
|
tmpname = '';
|
|
242
|
+
var index0 = index;
|
|
243
|
+
var hasnext = false;
|
|
151
244
|
if (!next || next.type !== STAMP || next.text !== '=') {
|
|
152
245
|
// 只声明不赋值的语句
|
|
153
|
-
|
|
246
|
+
hasnext = next && next.type === STAMP && next.text === ',';
|
|
154
247
|
if (hasnext) next = next.next;
|
|
155
248
|
var n = indexof(queue, next, i);
|
|
249
|
+
if (islet && o.type === EXPRESS) {
|
|
250
|
+
if (!next || next.type !== STRAP || !/^(in|of)$/.test(next.text)) splice(queue, i + 1, 0, ...scanner2('=undefined'));
|
|
251
|
+
n += 2;
|
|
252
|
+
}
|
|
156
253
|
if (o.type === SCOPED) {
|
|
157
|
-
var
|
|
158
|
-
|
|
254
|
+
var prev = o.prev;
|
|
255
|
+
if (prev && prev.type === STAMP && prev.text === ',') i = queue.lastIndexOf(prev, i), index = 1;
|
|
256
|
+
else index = 0;
|
|
257
|
+
splice(queue, i, n - i);
|
|
258
|
+
unslice(o);
|
|
259
|
+
var [[d]] = getDeclared(o);
|
|
159
260
|
dog(d);
|
|
160
261
|
n = i = indexof(queue, next, i);
|
|
262
|
+
if (hasnext && index0 < index) splice(queue, i, 0, { type: STAMP, text: ',' }), i++, n++;
|
|
161
263
|
if (hasnext) continue loop;
|
|
162
264
|
}
|
|
163
265
|
else if (hasnext) {
|
|
@@ -170,22 +272,24 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
170
272
|
}
|
|
171
273
|
var objs = [];
|
|
172
274
|
do {
|
|
173
|
-
var next = o.next;
|
|
275
|
+
var next = snapExpressFoot(o).next;
|
|
276
|
+
hasnext = next && next.type === STAMP && next.text === ',';
|
|
174
277
|
if (!next || next.type !== STAMP || next.text !== "=") {
|
|
175
278
|
// 赋值结束
|
|
176
279
|
if (tmpname) {
|
|
177
280
|
var n = skipAssignment(queue, i);
|
|
178
281
|
o = queue[n];
|
|
179
|
-
var skiped =
|
|
282
|
+
var skiped = splice(queue, i, n - i);
|
|
180
283
|
killobj(skiped);
|
|
181
|
-
|
|
284
|
+
splice(queue, i, 0, ...skiped);
|
|
182
285
|
i += skiped.length;
|
|
183
286
|
break;
|
|
184
287
|
}
|
|
185
288
|
if (!next || next.type === STAMP && /^[,;]$/.test(next.text)) {
|
|
186
|
-
if (o.type === EXPRESS &&
|
|
289
|
+
if (o.type === EXPRESS && !/[\.\[]/.test(o.text) && snapExpressFoot(o) === o) {
|
|
187
290
|
tmpname = o.text;
|
|
188
|
-
|
|
291
|
+
if (hasnext) next = next.next;
|
|
292
|
+
splice(queue, i, indexof(queue, o = next, i) - i);
|
|
189
293
|
i = indexof(queue, o, i);
|
|
190
294
|
}
|
|
191
295
|
}
|
|
@@ -193,12 +297,16 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
193
297
|
}
|
|
194
298
|
if (o.type === SCOPED) {
|
|
195
299
|
var n = indexof(queue, next.next, i);
|
|
196
|
-
var
|
|
197
|
-
|
|
198
|
-
|
|
300
|
+
var prev = o.prev;
|
|
301
|
+
if (prev && prev.type === STAMP && prev.text === ',') i = queue.lastIndexOf(prev, i), index = 1;
|
|
302
|
+
else index = 0;
|
|
303
|
+
splice(queue, i, n - i);
|
|
304
|
+
unslice(o);
|
|
305
|
+
delete o.next;
|
|
306
|
+
if (o.length && getDeclared(o).length > 0) objs.push(o);
|
|
199
307
|
}
|
|
200
|
-
else if (o.type === EXPRESS &&
|
|
201
|
-
if (!tmpname) tmpname = o.text
|
|
308
|
+
else if (o.type === EXPRESS && !/[\.\[]/.test(o.text) && snapExpressFoot(o) === o) {
|
|
309
|
+
if (!tmpname) tmpname = o.text;
|
|
202
310
|
}
|
|
203
311
|
o = next.next;
|
|
204
312
|
i = indexof(queue, o, i);
|
|
@@ -208,18 +316,26 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
208
316
|
var [[d]] = getDeclared(objs[0]);
|
|
209
317
|
var a = single(d, '');
|
|
210
318
|
if (a) {
|
|
211
|
-
splice(queue, i
|
|
319
|
+
if (index > 0) splice(queue, i++, 0, { type: STAMP, text: ',' });
|
|
320
|
+
splice(queue, i, 0, ...a[1], { type: STAMP, text: "=" });
|
|
212
321
|
i += 2;
|
|
213
322
|
var i2 = skipAssignment(queue, i);
|
|
214
|
-
killobj(queue.slice(i,
|
|
215
|
-
var q = scanner2(a[0])
|
|
216
|
-
|
|
323
|
+
killobj(queue.slice(i, i2));
|
|
324
|
+
if (!a[2]) var q = scanner2(a[0]);
|
|
325
|
+
else {
|
|
326
|
+
var objname = getobjname(0);
|
|
327
|
+
q = scanner2(`(${objname} =)`);
|
|
328
|
+
q[0].push(...splice(queue, i, i2));
|
|
329
|
+
q[0].push(...scanner2(`${a[0]},${objname}!== undefined ? ${objname}: `), ...splice2(a[2], a[3], a[4]));
|
|
330
|
+
i2 = i;
|
|
331
|
+
}
|
|
332
|
+
splice(queue, i = i2, 0, ...q);
|
|
217
333
|
i += q.length;
|
|
218
334
|
index++;
|
|
219
335
|
continue;
|
|
220
336
|
}
|
|
221
337
|
}
|
|
222
|
-
tmpname = getobjname();
|
|
338
|
+
tmpname = getobjname(0);
|
|
223
339
|
splice(queue, i, 0, { type: EXPRESS, text: tmpname }, { type: STAMP, text: "=" });
|
|
224
340
|
i += 2;
|
|
225
341
|
var i2 = skipAssignment(queue, i);
|
|
@@ -227,11 +343,16 @@ var killdec = function (queue, i, getobjname, _var = 'var', killobj) {
|
|
|
227
343
|
index++;
|
|
228
344
|
}
|
|
229
345
|
for (var o0 of objs) {
|
|
346
|
+
deep = 0;
|
|
230
347
|
var [[d]] = getDeclared(o0);
|
|
231
348
|
dog(d);
|
|
232
349
|
}
|
|
350
|
+
if (hasnext && index > index0) {
|
|
351
|
+
splice(queue, i++, 0, { type: STAMP, text: ',' });
|
|
352
|
+
}
|
|
353
|
+
index = 0;
|
|
233
354
|
}
|
|
234
|
-
relink(queue);
|
|
355
|
+
// relink(queue);
|
|
235
356
|
return i;
|
|
236
357
|
};
|
|
237
358
|
// 键值对重组
|
|
@@ -303,7 +424,7 @@ var killmap = function (body, i, _getobjname, killobj) {
|
|
|
303
424
|
var next = o.next;
|
|
304
425
|
var l = 1;
|
|
305
426
|
var initq = function () {
|
|
306
|
-
q = scanner2(`(${_getobjname()}=)`)[0];
|
|
427
|
+
q = scanner2(`(${_getobjname()} =)`)[0];
|
|
307
428
|
var qo = splice(body, i, l, q);
|
|
308
429
|
insert1(q, null, ...qo);
|
|
309
430
|
insert1(q, null, { type: STAMP, text: ',' });
|
|
@@ -328,7 +449,7 @@ var killmap = function (body, i, _getobjname, killobj) {
|
|
|
328
449
|
if (!t) {
|
|
329
450
|
t = scanner2(`extend()`);
|
|
330
451
|
rootenvs.extend = true;
|
|
331
|
-
var [o0] =
|
|
452
|
+
var [o0] = splice(body, i, 1, ...t);
|
|
332
453
|
t[1].push(o0);
|
|
333
454
|
l = 2;
|
|
334
455
|
}
|
|
@@ -408,8 +529,11 @@ var getprop = function (o, m) {
|
|
|
408
529
|
}
|
|
409
530
|
else m = skipAssignment(m);
|
|
410
531
|
if (m && !m.isprop) m = m.next;
|
|
411
|
-
if (
|
|
412
|
-
|
|
532
|
+
if (s) {
|
|
533
|
+
if (!prop.short) prop.value = splice2(o, s, m);
|
|
534
|
+
else splice2(o, s, m);
|
|
535
|
+
}
|
|
536
|
+
else if (!prop.value) prop.value = [];
|
|
413
537
|
return [prop, m];
|
|
414
538
|
};
|
|
415
539
|
var setprop = function (prop, k, d, q) {
|
|
@@ -449,6 +573,7 @@ var killcls = function (body, i, getname_) {
|
|
|
449
573
|
var ishalf = isHalfSentence(body, i - 1);
|
|
450
574
|
var start = o;
|
|
451
575
|
var decName = !o.isExpress && o.next.type === EXPRESS && o.next.text;
|
|
576
|
+
var isExpress = o.isExpress;
|
|
452
577
|
while (o) {
|
|
453
578
|
o = o.next;
|
|
454
579
|
if (!o) break;
|
|
@@ -519,7 +644,9 @@ var killcls = function (body, i, getname_) {
|
|
|
519
644
|
}
|
|
520
645
|
relink(o);
|
|
521
646
|
if (invokes.length) insert1(invokes, null, { type: STAMP, text: ',' });
|
|
522
|
-
|
|
647
|
+
var fname = scanner2('function ' + name);
|
|
648
|
+
if (isExpress) fname[0].isExpress = true;
|
|
649
|
+
insert1(invokes, null, ...fname);
|
|
523
650
|
if (base) {
|
|
524
651
|
constructor[1].push(...scanner2('return this'))
|
|
525
652
|
relink(constructor[1]);
|
|
@@ -569,7 +696,7 @@ var killcls = function (body, i, getname_) {
|
|
|
569
696
|
var s = i;
|
|
570
697
|
i = body.indexOf(o, i);
|
|
571
698
|
if (i < 0) i = body.length;
|
|
572
|
-
if (head.length > 1 || start.isExpress || ishalf && defines.length) {
|
|
699
|
+
if (head.length > 1 || start.isExpress && (defines.length) || ishalf && defines.length) {
|
|
573
700
|
splice(defines, defines.length, 0, ...scanner2(`\r\nreturn ${clz.name}`))
|
|
574
701
|
if (decName) splice(func, 0, 0, ...scanner2(`var ${decName}=`));
|
|
575
702
|
splice(body, s, i - s, ...func);
|
|
@@ -588,7 +715,7 @@ var indexof = function (list, o, i) {
|
|
|
588
715
|
i = list.indexOf(o, i);
|
|
589
716
|
if (i < 0) i = list.length;
|
|
590
717
|
}
|
|
591
|
-
else i
|
|
718
|
+
else i = list.length;
|
|
592
719
|
return i;
|
|
593
720
|
};
|
|
594
721
|
// 数组或参数展开
|
|
@@ -596,7 +723,9 @@ var killspr = function (body, i, _getobjname, killobj) {
|
|
|
596
723
|
var o = body[i];
|
|
597
724
|
var m = o.first;
|
|
598
725
|
if (!m) return i + 1;
|
|
726
|
+
unslice(o);
|
|
599
727
|
killobj(o);
|
|
728
|
+
m = o.first;
|
|
600
729
|
var index = 0;
|
|
601
730
|
var spr = function () {
|
|
602
731
|
var s = m;
|
|
@@ -745,27 +874,30 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
|
|
|
745
874
|
break;
|
|
746
875
|
case "yield":
|
|
747
876
|
var o = o.next;
|
|
748
|
-
if (o.type === STAMP && o.text === '*') {
|
|
877
|
+
if (o && o.type === STAMP && o.text === '*') {
|
|
749
878
|
i++;
|
|
750
879
|
var n = body.indexOf(o, i) + 1;
|
|
751
880
|
o = o.next;
|
|
752
881
|
splice(body, i, n - i);
|
|
753
882
|
n = skipAssignment(body, i - 1);
|
|
754
883
|
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);
|
|
884
|
+
var y = scanner2(`for await(var ${name} of)yield ${name}`, innerJs);
|
|
885
|
+
splice(y[2], y[2].length, 0, ...splice(body, i, n - i));
|
|
886
|
+
splice.debug = true;
|
|
759
887
|
splice(body, i - 1, 1, ...y);
|
|
888
|
+
splice.debug = false;
|
|
889
|
+
innerJs.setType(y[1]);
|
|
890
|
+
if (y[1].type === EXPRESS) splice(body, i, 1);
|
|
891
|
+
unforof(y[0], getname_.bind(null, '_'), y.used, deepkill);
|
|
760
892
|
}
|
|
761
893
|
i++;
|
|
762
894
|
break;
|
|
763
895
|
case "let":
|
|
764
|
-
case "const":
|
|
765
896
|
islet = body.keeplet !== false;
|
|
897
|
+
case "const":
|
|
766
898
|
case "var":
|
|
767
899
|
splice(body, i, 1);
|
|
768
|
-
i = killdec(body, i,
|
|
900
|
+
i = killdec(body, i, _getdeepname, 'var', deepkill, islet);
|
|
769
901
|
break;
|
|
770
902
|
case "catch":
|
|
771
903
|
var n = o.next;
|
|
@@ -794,7 +926,7 @@ var killobj = function (body, getobjname, getletname, getname_, letname_, deep =
|
|
|
794
926
|
if (i < 0) i = body.length;
|
|
795
927
|
break;
|
|
796
928
|
case "async":
|
|
797
|
-
|
|
929
|
+
splice(body, i, 1);
|
|
798
930
|
break;
|
|
799
931
|
default:
|
|
800
932
|
i++;
|
|
@@ -914,6 +1046,12 @@ var ises3 = function (o, killobj) {
|
|
|
914
1046
|
}
|
|
915
1047
|
return true;
|
|
916
1048
|
}
|
|
1049
|
+
var getexplist = function (f, m) {
|
|
1050
|
+
var explist = [];
|
|
1051
|
+
while (f !== m) explist.push(f), f = f.next;
|
|
1052
|
+
explist.push(m);
|
|
1053
|
+
return explist;
|
|
1054
|
+
}
|
|
917
1055
|
var unforin = function (o, getnewname_, killobj) {
|
|
918
1056
|
// 仅处理有 await 或 yield 的代码
|
|
919
1057
|
var m = o.first;
|
|
@@ -922,6 +1060,8 @@ var unforin = function (o, getnewname_, killobj) {
|
|
|
922
1060
|
m = m.next;
|
|
923
1061
|
hasdeclare = true;
|
|
924
1062
|
}
|
|
1063
|
+
var f = m;
|
|
1064
|
+
m = snapExpressFoot(m);
|
|
925
1065
|
var n = m.next;
|
|
926
1066
|
if (n.type !== STRAP || n.text !== 'in') {
|
|
927
1067
|
return false;
|
|
@@ -945,15 +1085,18 @@ var unforin = function (o, getnewname_, killobj) {
|
|
|
945
1085
|
var s = scanner2(`${sname}=`);
|
|
946
1086
|
insert1(s, null, ...splice2(o, n));
|
|
947
1087
|
insert1(s, null,
|
|
948
|
-
...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${
|
|
1088
|
+
...scanner2(`,${tname}=[];for(${hasdeclare ? 'var ' : ''}${hasdeclare ? f.text : kname} in ${sname})${tname}.push(${hasdeclare ? f.text : kname});`)
|
|
949
1089
|
);
|
|
950
1090
|
insert1(o.queue, o.prev, ...s);
|
|
951
|
-
splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}
|
|
952
|
-
var c = scanner2(`(
|
|
1091
|
+
splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}["length"]&&`));
|
|
1092
|
+
var c = scanner2(`(=${tname}[${kname}],true);${kname}++`);
|
|
1093
|
+
splice(c[0], 0, 0, ...getexplist(f, m));
|
|
953
1094
|
insert1(o, null, ...c);
|
|
954
1095
|
};
|
|
955
|
-
|
|
956
|
-
var
|
|
1096
|
+
var Javascript = require("./Javascript");
|
|
1097
|
+
var innerJs = new Javascript;
|
|
1098
|
+
innerJs.defaultType = STRAP;
|
|
1099
|
+
var unforof = function (o, getnewname, used, killobj) {
|
|
957
1100
|
var hasawait = false;
|
|
958
1101
|
var r = o;
|
|
959
1102
|
o = o.next;
|
|
@@ -968,15 +1111,18 @@ var unforof = function (o, getnewname, used) {
|
|
|
968
1111
|
m = m.next;
|
|
969
1112
|
hasdeclare = true;
|
|
970
1113
|
}
|
|
1114
|
+
var m0 = m;
|
|
1115
|
+
m = snapExpressFoot(m);
|
|
971
1116
|
var n = m.next;
|
|
972
1117
|
if (n.type !== STRAP || n.text !== 'of') {
|
|
973
1118
|
return o.next;
|
|
974
1119
|
}
|
|
975
1120
|
var f = n.next;
|
|
976
|
-
var p = splice2(o,
|
|
1121
|
+
var p = splice2(o, m0, m = n);
|
|
977
1122
|
if (hasdeclare) {
|
|
978
|
-
var [d] = getDeclared(
|
|
1123
|
+
var [d] = getDeclared(m0);
|
|
979
1124
|
if (d.length) insert1(o, m, ...scanner2(d.join(",") + ","));
|
|
1125
|
+
else splice(o, o.first, m0);
|
|
980
1126
|
}
|
|
981
1127
|
var iname = getnewname();
|
|
982
1128
|
var gname = getnewname();
|
|
@@ -995,16 +1141,32 @@ var unforof = function (o, getnewname, used) {
|
|
|
995
1141
|
splice(o, o.length, 0, ...mo);
|
|
996
1142
|
splice(o, o.length, 0, { type: STAMP, text: ',' });
|
|
997
1143
|
}
|
|
998
|
-
|
|
1144
|
+
var pnames = [];
|
|
1145
|
+
var getpname = function (i) {
|
|
1146
|
+
var n = pnames[i];
|
|
1147
|
+
if (!n) n = pnames[i] = getnewname();
|
|
1148
|
+
return n;
|
|
1149
|
+
}
|
|
1150
|
+
if (useSimpleLoop) {
|
|
1151
|
+
splice(o, o.length, 0, ...scanner2(`${iname}=0;${iname}<${oname}["length"]&&(,true);${iname}++`));
|
|
1152
|
+
splice(p, p.length, 0, ...scanner2(`=${oname}[${iname}]`));
|
|
1153
|
+
killdec(p, 0, getpname, null, killobj);
|
|
1154
|
+
if (p.length) splice(o[o.length - 4], 0, 0, ...p);
|
|
1155
|
+
else splice(o[o.length - 4], 0, 1);
|
|
1156
|
+
}
|
|
999
1157
|
else {
|
|
1000
|
-
rootenvs.Symbol = true
|
|
1158
|
+
rootenvs.Symbol = true;
|
|
1159
|
+
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));
|
|
1160
|
+
splice(p, p.length, 0, ...scanner2(`=${hasawait ? 'await ' : ''}${iname}["value"]`, innerJs));
|
|
1161
|
+
killdec(p, 0, getpname, null, killobj);
|
|
1162
|
+
if (p.length) splice(o[o.length - 7 - hasawait], 0, 0, ...p);
|
|
1163
|
+
else splice(o[o.length - 7 - hasawait], 0, 1);
|
|
1001
1164
|
var n = o.next;
|
|
1002
1165
|
n = skipSentenceQueue(n);
|
|
1003
1166
|
var tf = scanner2(`try{}finally{if(${iname}&&!${iname}["done"]&&isFunction(${gname}["return"]))${gname}["return"]()}`);
|
|
1004
1167
|
splice(tf[1], 0, 0, ...splice2(r.queue, r, n, ...tf));
|
|
1005
1168
|
rootenvs.isFunction = true;
|
|
1006
1169
|
}
|
|
1007
|
-
relink(o);
|
|
1008
1170
|
};
|
|
1009
1171
|
var unarrow = function (body, i, killobj, letname_) {
|
|
1010
1172
|
var o = body[i];
|
|
@@ -1013,13 +1175,13 @@ var unarrow = function (body, i, killobj, letname_) {
|
|
|
1013
1175
|
var b = n, h = p;
|
|
1014
1176
|
var pi = body.lastIndexOf(p, i);
|
|
1015
1177
|
if (pi < 0) pi = 0;
|
|
1016
|
-
|
|
1017
|
-
|
|
1178
|
+
splice(body, i, 1);
|
|
1179
|
+
splice(body, pi, 0, { type: STRAP, text: 'function' });
|
|
1018
1180
|
var ni = body.indexOf(n, i);
|
|
1019
1181
|
if (ni < 0) ni = body.length;
|
|
1020
1182
|
if (p && p.type !== SCOPED || p.entry !== "(") {
|
|
1021
1183
|
h = scanner2("()")[0];
|
|
1022
|
-
|
|
1184
|
+
splice(h, 0, 0, ...splice(body, i, 1, h));
|
|
1023
1185
|
}
|
|
1024
1186
|
if (n.type !== SCOPED || n.entry !== "{") {
|
|
1025
1187
|
var nni = skipAssignment(body, ni);
|
|
@@ -1056,20 +1218,22 @@ var killarg = function (head, body, _getname, setarg = true) {
|
|
|
1056
1218
|
if (/^var\s/.test(argcodes[argcodes.length - 1])) argcodes[argcodes.length - 1] += ',' + dec;
|
|
1057
1219
|
else argcodes.push(`var ` + dec);
|
|
1058
1220
|
}
|
|
1059
|
-
else if (o.type
|
|
1221
|
+
else if (o.type & (EXPRESS | VALUE)) {
|
|
1060
1222
|
aname = o.text;
|
|
1061
1223
|
if (/^\.\.\./.test(aname)) {
|
|
1062
1224
|
cname = aname.replace(/^\.\.\./, '');
|
|
1063
1225
|
splice2(head, o.prev ? o.prev : o, o = o.next);
|
|
1064
1226
|
collect = index + 1;
|
|
1065
|
-
continue;
|
|
1066
1227
|
}
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1228
|
+
else {
|
|
1229
|
+
o = o.next;
|
|
1230
|
+
if (collect) {
|
|
1231
|
+
anames.push(aname);
|
|
1232
|
+
}
|
|
1233
|
+
index++;
|
|
1070
1234
|
}
|
|
1071
|
-
index++;
|
|
1072
1235
|
}
|
|
1236
|
+
else throw "参数声明异常!"
|
|
1073
1237
|
if (o && o.type === STAMP) {
|
|
1074
1238
|
if (o.text === ',') {
|
|
1075
1239
|
o = o.next; continue;
|
|
@@ -1112,37 +1276,39 @@ var killarg = function (head, body, _getname, setarg = true) {
|
|
|
1112
1276
|
}
|
|
1113
1277
|
return [namemap, argcodes];
|
|
1114
1278
|
};
|
|
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
|
-
|
|
1279
|
+
var revar = function (body) {
|
|
1280
|
+
for (var i = 0; i < body.length; i++) {
|
|
1281
|
+
var o = body[i];
|
|
1282
|
+
if (o.type === STRAP) {
|
|
1283
|
+
if (/^(const|let|var)$/.test(o.text)) {
|
|
1284
|
+
var q = body;
|
|
1285
|
+
if (!q) return;
|
|
1286
|
+
splice(q, i, 1)
|
|
1287
|
+
o = o.next;
|
|
1288
|
+
var s = i, v = o;
|
|
1289
|
+
if (o) do {
|
|
1290
|
+
var n = snapExpressFoot(o).next;
|
|
1291
|
+
if (n && n.type === STRAP && /^(in|of)$/.test(n.text)) break;
|
|
1292
|
+
if (n && n.text === '=') {
|
|
1293
|
+
n = skipAssignment(n);
|
|
1294
|
+
}
|
|
1295
|
+
else {
|
|
1296
|
+
i = q.indexOf(o, i);
|
|
1297
|
+
var j = n ? q.indexOf(n, i) + 1 : q.length;
|
|
1298
|
+
splice(q, i, j - i);
|
|
1299
|
+
}
|
|
1300
|
+
} while (n && n.type === STAMP && n.text === ',');
|
|
1301
|
+
i = s - 1;
|
|
1302
|
+
}
|
|
1303
|
+
else if (/^function$/.test(o.text)) {
|
|
1304
|
+
o = skipFunction(o);
|
|
1305
|
+
i = indexof(body, o, i);
|
|
1306
|
+
}
|
|
1139
1307
|
}
|
|
1140
1308
|
else if (o.length) {
|
|
1141
|
-
|
|
1309
|
+
revar(o);
|
|
1142
1310
|
}
|
|
1143
|
-
}
|
|
1144
|
-
backEach(scoped.body, rm);
|
|
1145
|
-
killed.forEach(relink);
|
|
1311
|
+
}
|
|
1146
1312
|
};
|
|
1147
1313
|
var killret = function (body, labels = Object.create(null), gettmpname) {
|
|
1148
1314
|
var o = body.first;
|
|
@@ -1286,6 +1452,14 @@ var down = function (scoped) {
|
|
|
1286
1452
|
var tmp1 = null;
|
|
1287
1453
|
var wrapper = scanner2(`(${inAsync ? 'async ' : ''}function${inAster ? "*" : ''}(${lets}){}(${lets}))`)[0];
|
|
1288
1454
|
var body = scoped.body;
|
|
1455
|
+
if (!body) {
|
|
1456
|
+
var btemp = scoped.head.next;
|
|
1457
|
+
if (!btemp) throw "语句不完整";
|
|
1458
|
+
var btmp2 = skipSentenceQueue(btemp);
|
|
1459
|
+
body = scoped.body = scanner2('{}')[0];
|
|
1460
|
+
splice(body, 0, 0, ...splice2(btemp.queue, btemp, btmp2, body));
|
|
1461
|
+
}
|
|
1462
|
+
if (body.isClass) return;
|
|
1289
1463
|
var bp = body.prev;
|
|
1290
1464
|
var bn = body.next;
|
|
1291
1465
|
var bq = body.queue;
|
|
@@ -1386,7 +1560,7 @@ var down = function (scoped) {
|
|
|
1386
1560
|
if (hp && hp.type === STRAP && hp.text === 'await') hp = hp.prev;
|
|
1387
1561
|
if (!hp) break a;
|
|
1388
1562
|
if (hp.text === 'for') {
|
|
1389
|
-
unforof(hp, getdeepname, scoped.used);
|
|
1563
|
+
unforof(hp, getdeepname, scoped.used, _killobj.bind(null, _getlocal));
|
|
1390
1564
|
if (funcMark) killed = unforin(scoped.head, getdeepname, _killobj.bind(null, _getlocal)) !== false;
|
|
1391
1565
|
// unforcx(scoped.head, getdeepname);
|
|
1392
1566
|
}
|
|
@@ -1415,6 +1589,7 @@ var down = function (scoped) {
|
|
|
1415
1589
|
var body = scanner2(`return ${funcMark}()`);
|
|
1416
1590
|
var code = unawait(scoped.body, _getname, argname);
|
|
1417
1591
|
code.forEach(function (c) {
|
|
1592
|
+
revar(c);
|
|
1418
1593
|
var f = scanner2(`function(${c.awaited ? argname : ''}){\r\n}`);
|
|
1419
1594
|
if (!c.length) f[2].push(...scanner2('return [1,0]'));
|
|
1420
1595
|
else f[2].push(...c);
|
|
@@ -1431,7 +1606,6 @@ var down = function (scoped) {
|
|
|
1431
1606
|
splice(scoped.body, scoped.body.length, 0, ...body);
|
|
1432
1607
|
for (var k in envs) if (!(k in scoped.envs)) vars[k] = true;
|
|
1433
1608
|
delete vars[argname];
|
|
1434
|
-
revar(scoped);
|
|
1435
1609
|
scoped.vars = Object.create(null);
|
|
1436
1610
|
scoped.async = false;
|
|
1437
1611
|
scoped.yield = false;
|