efront 4.0.19 → 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.
@@ -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
- k = tmpname + k;
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?${tmpname}:`);
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
- write(v, `${k}!==undefined?${k}:`, x < total - 1);
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 (name, value, hasnext) {
76
- if (name === tmpname && hasnext) {
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) queue.splice(i++, 0, { type: STAMP, text: ',' });
79
- var q = scanner2(`${tmpname}=${name}`);
80
- queue.splice(i, 0, ...q);
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) queue.splice(i++, 0, { type: STAMP, text: ',' });
85
- queue.splice(i++, 0, { type: EXPRESS, text: name });
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
- queue.splice(i, 0, ...q);
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
- write(name, `slice_["call"](${tmpname},${at}${a > at ? `,${at - a}` : ''})`, rest.length > 0), rootenvs.slice_ = true;
132
- doged = at + 1;
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) queue.splice(i++, 0, { type: STRAP, text: _var });
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] = queue.splice(i, n - i);
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 = queue.splice(i, n - i);
268
+ var skiped = splice(queue, i, n - i);
180
269
  killobj(skiped);
181
- queue.splice(i, 0, ...skiped);
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 && !/\./.test(o.text)) {
275
+ if (o.type === EXPRESS && !/[\.\[]/.test(o.text) && snapExpressFoot(o) === o) {
187
276
  tmpname = o.text;
188
- queue.splice(i, indexof(queue, o = next, i) - i);
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] = queue.splice(i, n - i);
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 && !/\.\[/.test(o.text)) {
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, { type: EXPRESS, text: a[1] }, { type: STAMP, text: "=" });
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, i = i2));
215
- var q = scanner2(a[0])
216
- queue.splice(i, 0, ...q);
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] = body.splice(i, 1, ...t);
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 (!prop.short) prop.value = splice2(o, s, m);
412
- else if (s) splice2(o, s, m);
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
- insert1(invokes, null, ...scanner2('function ' + name));
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) yield ${name};`);
756
- y[2].type = STRAP;
757
- splice(y[1], y[1].length, 0, ...splice(body, i, n - i));
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, getletname, 'var', deepkill, islet);
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
- body.splice(i, 1);
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 ' : ''}${m.text} in ${sname})${tname}.push(${m.text});`)
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}.length&&`));
952
- var c = scanner2(`(${m.text}=${tname}[${kname}],true);${kname}++`);
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 unforof = function (o, getnewname, used) {
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, m, m = n)[0];
1098
+ var p = splice2(o, m0, m = n);
977
1099
  if (hasdeclare) {
978
- var [d] = getDeclared(p);
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
- if (useSimpleLoop) splice(o, o.length, 0, ...scanner2(`${iname}=0,${gname}=${oname}["length"];${iname}<${gname}&&(${createString([p])}=${oname}[${iname}],true);${iname}++`));
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, 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"]&&(${createString([p])}=${iname}["value"],true);${iname}=${hasawait ? 'await ' : ''}${gname}["next"]()`));
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
- body.splice(i, 1);
1017
- body.splice(pi, 0, { type: STRAP, text: 'function' });
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
- h.splice(0, 0, ...body.splice(i, 1, h));
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 === EXPRESS || o.type === VALUE) {
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
- o = o.next;
1068
- if (collect) {
1069
- anames.push(aname);
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 (scoped) {
1116
- if (!scoped.body) return;
1117
- var killed = [];
1118
- var rm = function (o, i) {
1119
- if (o.type === STRAP && /^(const|let|var)$/.test(o.text)) {
1120
- var q = o.queue;
1121
- if (!q) return;
1122
- var n = o;
1123
- var s = i, v = o;
1124
- if (o.next) do {
1125
- o = n.next;
1126
- n = o.next;
1127
- if (n && n.type === STRAP && n.text === 'in') break;
1128
- if (n && n.text === '=') {
1129
- n = skipAssignment(n);
1130
- }
1131
- else {
1132
- i = q.indexOf(o.prev, i);
1133
- var j = n ? q.indexOf(n, i) : q.length;
1134
- q.splice(i, j - i);
1135
- }
1136
- } while (n && n.type === STAMP && n.text === ',');
1137
- if (q[s] === v) q.splice(s, 1);
1138
- if (killed.indexOf(q) < 0) killed.push(q);
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
- backEach(o, rm);
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;