efront 3.36.5 → 3.36.7

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,10 +1,11 @@
1
- var { SPACE, COMMENT, EXPRESS, STRAP, STAMP, SCOPED, VALUE, LABEL, createString, skipAssignment } = require("./common");
1
+ var { SPACE, COMMENT, EXPRESS, STRAP, QUOTED, STAMP, SCOPED, VALUE, LABEL, createString, skipAssignment, relink } = require("./common");
2
2
  var scanner2 = require("./scanner2");
3
3
  var RE = { type: STRAP, text: "@re" };// if (_) return
4
4
  var RZ = { type: STRAP, text: "@rz" };// if (!_) return
5
+ var RD = { type: STRAP, text: "@rd" };// if (_) return
5
6
  var RETURN = { type: STRAP, text: "@ret" };// return;
7
+ var YIELD = { type: STRAP, text: "@yield" };// return;
6
8
  var NEXT = { type: STRAP, text: "@next" };// return;
7
- var relink = scanner2.Program.prototype.relink;
8
9
  var _break = function (body, cx, result) {
9
10
  var label;
10
11
  do {
@@ -39,6 +40,47 @@ var _break = function (body, cx, result) {
39
40
  }
40
41
  return bx;
41
42
  };
43
+ var _try = function (body, cx, unblock, result, getname) {
44
+ var o = body[cx];
45
+ o = o.next;
46
+ while (body[cx++] !== o);
47
+ var trystart = scanner2(`return [,7]`);
48
+ addresult(result, trystart);
49
+ var tryoffset = result.length;
50
+ unblock(o);
51
+ var final = scanner2(`return [0,9]`);
52
+
53
+ addresult(result, final);
54
+ o = o.next;
55
+ if (o.type !== STRAP || o.text !== 'catch') throw `缺少catch语句`;
56
+ o = o.next;
57
+ var arg = [];
58
+ var catchoffset = result.length;
59
+ if (o.type === SCOPED && o.entry === "(") {
60
+ var e = o.first;
61
+ if (e) {
62
+ arg = scanner2(`${e.text}=${ret_ || "@"}`);
63
+ addresult(result, arg);
64
+ }
65
+ o = o.next;
66
+ }
67
+ unblock(o);
68
+ o = o.next;
69
+ if (o && o.type === STRAP && o.text === 'finally') {
70
+ o = o.next;
71
+ var finishoffset = result.length;
72
+ unblock(o);
73
+ }
74
+ var tse = trystart[trystart.length - 1];
75
+ tse.unshift({
76
+ text: String(catchoffset - tryoffset << 16 | finishoffset - catchoffset),
77
+ type: VALUE,
78
+ });
79
+ relink(tse);
80
+
81
+ var finalend = scanner2(`return [1,9]`);
82
+ addresult(result, finalend);
83
+ };
42
84
  var evals = [];
43
85
 
44
86
  var _with = function (body, cx, unblock, result, getname) {
@@ -46,7 +88,6 @@ var _with = function (body, cx, unblock, result, getname) {
46
88
  var c = o.next;
47
89
  while (body[cx] !== c) cx++;
48
90
  unblock(c);
49
- addresult(result, []);
50
91
  evals.push(getname(0));
51
92
  var block = getblock(body, ++cx);
52
93
  cx += block.length;
@@ -87,18 +128,20 @@ var _switch = function (body, cx, unblock, result, getname) {
87
128
  };
88
129
  var q = _express(block, getnextname, true);
89
130
  for (var q of q) addresult(result, q);
90
- addresult(result, scanner2(`if(${getname(0)}===${getname(1)})return[]`));
131
+ var case_ = scanner2(`if(${getname(0)}===${getname(1)})return[]`)
132
+ addresult(result, case_);
91
133
  var by = cy;
92
134
  m = o[cy];
93
135
  while (m && (m.type !== STRAP || m.text !== 'case')) m = o[++cy];
94
- tmp.push(result.length - 1, o.slice(by, cy));
136
+ tmp.push(result.length - 1, case_, o.slice(by, cy));
95
137
  }
96
138
  while (tmp.length) {
97
139
  cy = tmp.shift();
140
+ case_ = tmp.shift();
98
141
  block = tmp.shift();
99
- var q = result[cy];
100
- q[q.length - 1].push({ type: VALUE, text: String(result.length - cy) });
101
- relink(q[q.length - 1]);
142
+ var q = case_[case_.length - 1];
143
+ q.push({ type: VALUE, text: String(result.length - cy) }, { type: STAMP, text: "," }, { type: VALUE, text: '0' });
144
+ relink(q);
102
145
  for (var cy = 0, dy = block.length; cy < dy; cy++) {
103
146
  var b = getblock(block, cy);
104
147
  cy += b.length;
@@ -107,7 +150,6 @@ var _switch = function (body, cx, unblock, result, getname) {
107
150
  result.push(r);
108
151
  }
109
152
  }
110
- addresult(result, []);
111
153
  }
112
154
  return cx;
113
155
  };
@@ -118,11 +160,20 @@ var _for = function (body, cx, unblock, result, tmpname) {
118
160
  if (m.type === STRAP && /^(let|const|var)$/.test(m.text)) {
119
161
  m = m.next;
120
162
  }
163
+ var mn = m.next;
164
+ if (mn.type === STRAP && mn.text === 'in') {
165
+ // 含有高级语法的 for in 语句在 ./downLevel.js 中预处理
166
+ var dx = cx;
167
+ var n = o.next;
168
+ while (body[dx] !== n) dx++;
169
+ addresult(result, body.slice(cx, dx));
170
+ return dx;
171
+ }
121
172
  var cy = 0;
122
173
  while (o[cy] !== m) cy++;
123
174
  var block = getblock(o, cy);// init
124
175
  cy += block.length + 1;
125
- unblock(block, ...scanner2(`[1]`));
176
+ unblock(block, ...scanner2(`;return [1,0]`));
126
177
  var block1 = getblock(o, cy);// condition
127
178
  cy += block1.length + 1;
128
179
  var block2 = getblock(o, cy);// next
@@ -130,54 +181,131 @@ var _for = function (body, cx, unblock, result, tmpname) {
130
181
  var block_ = getblock(body, ++cx);// body
131
182
  cx += block_.length;
132
183
  unblock(block1);
133
- result[result.length - 1].pop();
134
- result[result.length - 1].pop();
135
184
  relink(result[result.length - 1]);
136
- var b = scanner2(`if(!${tmpname})return []`)
185
+ var b = scanner2(`;if(!${tmpname})return []`)
137
186
  result[result.length - 1].push(...b);
138
187
  relink(result[result.length - 1]);
139
188
  var i = result.length;
140
189
  unblock(block_);
141
190
  unblock(block2);
142
- result[result.length - 1].pop();
143
- result[result.length - 1].push(...scanner2(`[${i - result.length}]`));
144
- b[b.length - 1].push(result.length - i + 1);
191
+ result[result.length - 1].push(...scanner2(`;return [${i - result.length},0]`));
192
+ b[b.length - 1].push(...scanner2(`${result.length - i + 1},0`));
145
193
  relink(result[result.length - 1]);
146
194
  return cx;
147
195
  };
196
+ var getCondition = function (o, unblock, not_) {
197
+ var n = '';
198
+ var f = o.first;
199
+ var not = f.type === STAMP && f.text === "!";
200
+ if (not) f = f.next;
201
+ if (not_) not = !not;
202
+ if (f && f === o.last) {
203
+ if (f.type & (EXPRESS | VALUE)) {
204
+ n = f.text;
205
+ }
206
+ if (not && n) {
207
+ if (f.type === VALUE) {
208
+ n = String(eval("!" + f.text));
209
+ }
210
+ else n = "!" + n;
211
+ }
212
+ }
213
+ if (!n) {
214
+ n = unblock(o);
215
+ n = n.await ? ret_ : n.name;
216
+ if (not) n = "!" + n;
217
+ }
218
+ return n;
219
+ }
148
220
  var _while = function (body, cx, unblock, result, tmpname) {
149
221
  var o = body[cx];
150
222
  o = o.next;
151
223
  while (body[cx] !== o) cx++;
152
- var b = scanner2(`if(!${tmpname})return []`)
153
- unblock(o);
154
- result[result.length - 1].pop();
155
- result[result.length - 1].pop();
156
- result[result.length - 1].push(...b);
224
+ var b = scanner2(`if(${getCondition(o, unblock, true)})return []`)
225
+ result.push(b);
157
226
  relink(result[result.length - 1]);
158
227
  var block = getblock(body, ++cx);
159
228
  var i = result.length;
160
229
  cx += block.length;
161
230
  unblock(block);
162
- result.push(scanner2(`return [${i - result.length - 1}]`));
163
- b[b.length - 1].push(result.length - i + 1);
231
+ result.push(scanner2(`return [${i - result.length - 1},0]`));
232
+ b[b.length - 1].push(...scanner2(`${result.length - i + 1},0`));
164
233
  return cx;
165
234
  };
166
- var addresult = function (result, next) {
235
+ var pushstep = function (result, step) {
236
+ if (!step.length) return;
167
237
  var q = result[result.length - 1];
168
- if (q && q._return) {
169
- q.pop(), q.pop();
170
- if (next.length) {
171
- q.push(...next);
172
- relink(q);
238
+ if (!q) {
239
+ result.push(step);
240
+ }
241
+ else if (q.await) {
242
+ if (!step.awaited) step.unshift(...scanner2(`${q.name}=${ret_};`));
243
+ step.awaited = true;
244
+ relink(step);
245
+ result.push(step);
246
+ }
247
+ else if (q.ifrt) {
248
+ result.push(step);
249
+ }
250
+ else {
251
+ q.push({ type: STAMP, text: ";" }, ...step);
252
+ step = q;
253
+ relink(q);
254
+ }
255
+ _return(step);
256
+ };
257
+ var patchstep = function (r, nextindex, h) {
258
+ var name = r.name;
259
+ var o, i, x, p, n;
260
+ if (evals.length) for (var i = r.length - 1; i >= h; i--) {
261
+ o = r[i];
262
+ if (o.set) {
263
+ var [m, _, b] = r.splice(i, 3);
264
+ r.splice(i, 0, ...scanner2(_withset(m.text, m.set, b.text)));
173
265
  }
174
- else {
175
- q.pop();
266
+ else if (o.get) {
267
+ r.splice(i, 1, ...scanner2(_withget(b.text)));
176
268
  }
177
- q._return = next._return;
178
269
  }
179
- else {
180
- if (next.length) result.push(next);
270
+ for (i = r.length - 1; i >= h; i--) {
271
+ o = r[i];
272
+ if (o === RZ) {
273
+ x = scanner2(`if(!${name})return [${nextindex},0]`);
274
+ }
275
+ else if (o === RE) {
276
+ x = scanner2(`if(${name})return [${nextindex},0]`);
277
+ }
278
+ else if (o === RD) {
279
+ x = scanner2(`if(${name}!==null&&${name}!== undefined)return [${nextindex},0]`);
280
+ }
281
+ else continue;
282
+ var p = o.prev;
283
+ if (!p || p.type === STAMP && p.text === ";");
284
+ else x.unshift({ type: STAMP, text: ";" });
285
+ var n = o.next;
286
+ if (!n || n.type === STAMP && n.text === ';');
287
+ else x.push({ type: STAMP, text: ';' });
288
+ r.splice(i, 1, ...x);
289
+ relink(r);
290
+ }
291
+ };
292
+ var addresult = function (result, step) {
293
+ if (!step.length) return;
294
+ var savedLength = result.length;
295
+ var prev = result[savedLength - 1];
296
+ if (prev) var patch = prev.length;
297
+ var cx, mx = 0, n;
298
+ var awaited = step.awaited;
299
+ do {
300
+ cx = step.indexOf(NEXT, mx);
301
+ n = step.slice(mx, mx = cx < 0 ? step.length : cx + 1);
302
+ if (awaited) n.awaited = awaited, awaited = false;
303
+ n.name = step.name;
304
+ pushstep(result, n);
305
+ } while (mx < step.length);
306
+ if (ret_) {
307
+ if (prev) patchstep(prev, result.length - savedLength - 1, patch || 0);
308
+ result.slice(savedLength).forEach((a, i) => patchstep(a, result.length - i - savedLength, 0));
181
309
  }
182
310
  };
183
311
  var _do = function (body, cx, unblock, result, tmpname) {
@@ -186,77 +314,39 @@ var _do = function (body, cx, unblock, result, tmpname) {
186
314
  var i = result.length;
187
315
  unblock(o);
188
316
  o = o.next.next;
189
- unblock(o);
190
- var b = scanner2(`return [${tmpname}?${i - result.length}:${1}]`);
317
+ var b = scanner2(`if(${getCondition(o, unblock)})return [${i - result.length},0];return [1,0]`);
191
318
  addresult(result, b);
192
319
  while (body[cx] !== o) cx++;
193
320
  return cx;
194
321
  };
195
322
 
196
323
  var needbreak = function (o) {
197
- return o === RE || o === RZ || o === RETURN || o === NEXT;
324
+ return o === RE || o === RZ || o === RD || o === RETURN || o === NEXT || o === YIELD;
198
325
  };
199
- var _return = function (q) {
200
- var result = [];
201
- var tmp = [];
202
- for (var q of q) {
203
- tmp.push(q);
204
- if (q.type === EXPRESS && q.next && q.next.type === STAMP && q.next.text === '=') {
205
- tmp.name = q.text;
206
- }
207
-
208
- if (needbreak(q)) {
209
- result.push(tmp);
210
- tmp = [];
211
- }
326
+ var _return = function (r, nextindex) {
327
+ var name = r.name;
328
+ var e = r[r.length - 1];
329
+ if (!needbreak(e)) return;
330
+ r.ifrt = true;
331
+ r.pop();
332
+ var semicolon = r[r.length - 1];
333
+ semicolon = semicolon && semicolon.type === STAMP && /^[,;]$/.test(semicolon.text);
334
+ var x;
335
+ if (e === RETURN) {
336
+ x = scanner2(`return [${name},2]`);
212
337
  }
213
- if (tmp.length) result.push(tmp);
214
- result.forEach((r, i) => {
215
- var e = r[r.length - 1];
216
- if (!needbreak(e)) return;
217
- r.pop();
218
- var semicolon = r[r.length - 1];
219
- semicolon = semicolon && semicolon.type === STAMP && semicolon.text === ';';
220
- var x;
221
- if (e === RZ) {
222
- x = scanner2(`if(!${r.name})return [${result.length - i},]`);
223
- }
224
- else if (e === RE) {
225
- x = scanner2(`if(${r.name})return [${result.length - i},]`);
226
- }
227
- else if (e === RETURN) {
228
- if (result.length === 1) r._return = true;
229
- x = scanner2(`return [${result.length - i},]`);
230
- }
231
- else if (e === NEXT) {
232
- x = scanner2(`return [1,]`);
233
- }
234
- if (r.name) {
235
- if (!semicolon) r.push({ type: STAMP, text: ';' });
236
- x[x.length - 1].push({ type: EXPRESS, text: r.name });
237
- relink(x[x.length - 1]);
238
- r.push(...x);
239
- }
240
- else {
241
- x[x.length - 1].push(...r);
242
- r.splice(0, r.length, ...x);
243
- }
244
- relink(r);
245
- });
246
- return result;
338
+ else if (e === YIELD) {
339
+ x = scanner2(`return [${name},3]`);
340
+ }
341
+ else if (e === NEXT) {
342
+ x = scanner2(`return [${name},1]`);
343
+ r.await = true;
344
+ }
345
+ if (semicolon) r.pop();
346
+ r.push({ type: STAMP, text: ';' });
347
+ r.push(...x);
348
+ relink(r);
247
349
  };
248
- var power_map = {};
249
- [
250
- '=,+=,-=,*=,/=,%=,|=,&=,^=,**=,~='/* 1 */,
251
- '=>'/* 2 */, '?,:'/* 3 */, '&&,||'/* 4 */, '&,|,^'/* 5 */,
252
- 'instanceof,in,==,>=,<=,>,<,!=,!==,===,!in,!instanceof'/* 6 */,
253
- '>>,>>>,<<'/* 7 */, '+,-'/* 8 */, '*,/,%'/* 9 */, '**'/* 10 */,
254
- 'typeof,await,yield,new,!,~'/* 11 */, '++,--'/* 12 */
255
- ].forEach((pp, i) => {
256
- pp.split(",").forEach(p => {
257
- power_map[p] = i + 1;
258
- })
259
- });
260
350
  var remove_end_comma = function (o) {
261
351
  if (!o.length || o.type !== SCOPED || o.entry === '[') return;
262
352
  for (var cx = o.length - 1; cx >= 0; cx--) {
@@ -277,18 +367,19 @@ var _invoke = function (t, getname) {
277
367
  var result = [];
278
368
  var cache = [];
279
369
  var queue = [];
370
+ queue.name = t.name;
280
371
  var bx = 0;
281
372
  for (var cx = 0; cx < t.length; cx++) {
282
373
  var o = t[cx];
283
374
  if (o.type === STAMP && /^[,;]$/.test(o.text)) {
284
- if (queue.length) queue.push({ type: STAMP, text: ';' });
375
+ if (queue.length) queue.push({ type: STAMP, text: ',' });
285
376
  queue.push(...t.splice(bx, cx + 1));
286
377
  cx += bx - cx - 1;
287
378
  queue.pop();
288
379
  bx = cx + 1;
289
380
  continue;
290
381
  }
291
- if (o.type === SCOPED && o.entry === '[' || o.entry === "(") {
382
+ if (o.type === SCOPED && (o.entry === '[' || o.entry === "(")) {
292
383
  var _nameindex = nameindex;
293
384
  remove_end_comma(o);
294
385
  var cy = 0;
@@ -297,40 +388,35 @@ var _invoke = function (t, getname) {
297
388
  cy = skipAssignment(o, cy);
298
389
  if (by === cy) continue;
299
390
  var m = o.slice(by, cy);
300
- if (m.length === 1 && (m[0].type === EXPRESS && /\./.test(m[0].text) || m[0].type === VALUE)) {
391
+ if (m.length === 1 && (m[0].type === EXPRESS && !/\./.test(m[0].text) || m[0].type === VALUE || m[0].type === QUOTED)) {
301
392
  continue;
302
393
  }
303
394
  var q = toqueue(m, getdeepname, true);
304
395
  o.splice(by, cy, { text: getdeepname(0), type: EXPRESS });
305
396
  cy -= cy - by - 1;
306
397
  nameindex++;
307
- q.forEach(q => {
308
- if (q._return) {
309
- q.splice(q.length - 3);
310
- }
311
- cache.push(q);
312
- });
398
+ cache.push(...q);
313
399
  }
314
400
  if (!cache.length) continue;
315
401
  nameindex = _nameindex;
316
- if (queue.length) result.push(queue), queue = [];
402
+ if (queue.length) addresult(result, queue), queue = [], queue.name = getdeepname(nameindex);
317
403
  result.push(...cache);
318
404
  cache = [];
319
405
  var m = t.splice(bx, cx + 1);
406
+ m.name = queue.name;
320
407
  cx -= m.length;
321
- if (bx + 1 < t.length && (t[bx].type === SCOPED || t[bx].type === EXPRESS)) t.splice(bx, 0, ...scanner2(`${getname(0)}=${getname(nameindex)}`));
408
+ if (bx + 1 < t.length && (t[bx].type & (SCOPED | EXPRESS))) t.splice(bx, 0, ...scanner2(`${getname(0)}=${getname(nameindex)}`)), t.name = getname(0);
322
409
  relink(m);
323
- result.push(m);
410
+ addresult(result, m);
324
411
  nameindex++;
325
412
  bx = cx + 1;
326
413
  }
327
414
  }
328
- if (t.length) {
329
- if (!queue.length && result.length) queue = result.pop();
330
- if (queue.length) queue.push({ type: STAMP, text: ';' });
331
- queue.push(...t);
415
+ if (queue.length) {
416
+ if (t.length) queue.push({ type: STAMP, text: ',' }, ...t), queue.name = t.name;
417
+ addresult(result, queue);
332
418
  }
333
- if (queue.length) result.push(..._return(queue, getname(0)));
419
+ else if (t.length) addresult(result, t);
334
420
  return result;
335
421
  };
336
422
 
@@ -358,23 +444,20 @@ var ternary = function (body, getname, ret) {
358
444
  var bx = question.pop();
359
445
  if (!question.length) {
360
446
  var b = body.slice(0, bx);
361
- b = _express(b, getname, true);
362
- b[b.length - 1].pop();
363
- b[b.length - 1].pop();
447
+ relink(b);
364
448
  var c = ternary(body.slice(bx + 1, cx), getname, true);
365
449
  var d = ternary(body.slice(cx + 1), getname, true);
366
- b[b.length - 1].push(...scanner2(`return [${getname(0)}?1:${c.length + 1},${getname(0)}]${ret ? '' : ';'}`));
367
- c[c.length - 1].pop();
368
- c[c.length - 1].pop();
369
- c[c.length - 1].push(...scanner2(`return [${d.length + 1},${getname(0)}]${ret ? '' : ';'}`));
370
- res.push(...b);
450
+ addresult(c, scanner2(`return [${d.length + 1},0]`));
451
+ addresult(res, scanner2(`if(${getCondition(b, function (b) {
452
+ addresult(res, _express(b));
453
+ return res[res.length - 1];
454
+ })})return [1,0];return [${c.length + 1},0]`));
371
455
  res.push(...c);
372
456
  res.push(...d);
373
457
  }
374
458
  }
375
459
  }
376
460
  if (!res.length) return _express(body, getname, ret);
377
- if (!ret) res = Array.prototype.concat.apply([], res), relink(res);
378
461
  return res;
379
462
  };
380
463
  var _express = function (body, getname, ret) {
@@ -393,17 +476,21 @@ var _express = function (body, getname, ret) {
393
476
  var exps = [];
394
477
  for (var cx = 0, dx = body.length; cx < dx; cx++) {
395
478
  var o = body[cx];
396
- if (o.type === COMMENT || o.type === SPACE) continue;
397
- if (o.type === STRAP || o.type === STAMP) {
479
+ if (o.type & (COMMENT | SPACE)) continue;
480
+ if (o.type === STRAP && /^(var|let|const)/.test(o.text)) {
481
+ bx = cx + 1;
482
+ continue;
483
+ }
484
+ if (o.type & (STRAP | STAMP)) {
398
485
  var p = 0;
399
486
  if (o.text === '=') {
400
487
  ax = exps.length;
401
488
  bx = cx + 1;
402
489
  continue;
403
490
  }
404
- if (/[!~]|\+\-|\-\+/.test(o.text)) p = power_map["!"];
405
- if (!p && /[\+\-]/.test(o.text)) p = needpunc ? power_map["+"] : power_map["!"];
406
- if (!p) p = power_map[o.text];
491
+ if (/[!~]|\+\-|\-\+/.test(o.text)) p = powermap["!"];
492
+ if (!p && /[\+\-]/.test(o.text)) p = needpunc ? powermap["+"] : powermap["!"];
493
+ if (!p) p = powermap[o.text];
407
494
  needpunc = false;
408
495
  var b = body.slice(bx, cx + 1);
409
496
  bx = cx + 1;
@@ -412,7 +499,9 @@ var _express = function (body, getname, ret) {
412
499
  cache.push(b, p);
413
500
  continue;
414
501
  }
415
- var n = scanner2(`${getname(nameindex)}`);
502
+ var name = getname(nameindex);
503
+ var n = scanner2(name);
504
+ q.name = name;
416
505
  n.index = nameindex;
417
506
  nameindex = cache[cache.length - 2].index;
418
507
  n.push(b.pop());
@@ -421,20 +510,23 @@ var _express = function (body, getname, ret) {
421
510
  var p0 = cache.pop();
422
511
  var t = cache.pop();
423
512
  var isawait = _await(t);
424
- if (p0 > power_map["="]) q.push(...scanner2(`${getname(t.index)}=`));
513
+ if (p0 > powermap["="] || isawait) q.push(...scanner2(`${getname(t.index)}=`));
425
514
  q.push.apply(q, t);
426
515
  q.push.apply(q, b);
427
516
  if (isawait) q.push(NEXT);
428
517
  }
429
518
  nameindex++;
430
519
  if (maxindex < nameindex) maxindex = nameindex;
431
- if (p == power_map["||"]) {
520
+ if (p == powermap["||"]) {
432
521
  if (o.text === '||') {
433
522
  q.push(RE);
434
523
  }
435
524
  else if (o.text === '&&') {
436
525
  q.push(RZ);
437
526
  }
527
+ else if (o.text === '??') {
528
+ q.push(RD);
529
+ }
438
530
  nameindex = 0;
439
531
  } else {
440
532
  cache.push(n, p);
@@ -454,24 +546,14 @@ var _express = function (body, getname, ret) {
454
546
  nameindex = cache[cache.length - 1].index;
455
547
  var t = cache.pop();
456
548
  var isawait = _await(t, nameindex);
457
- if (p > power_map["="] && (ret || cache.length > 0)) q.push(...scanner2(`${getname(nameindex)}=`));
549
+ if (p > powermap["="] && (ret || ax >= 1 || cache.length > 0 || isawait)) q.push(...scanner2(`${getname(nameindex)}=`));
458
550
  q.push.apply(q, t);
459
551
  q.push.apply(q, b);
460
552
  if (isawait) q.push(NEXT);
461
553
  b = [{ type: EXPRESS, text: getname(nameindex) }];
462
554
  }
463
- else {
464
- if (ax === 1) {
465
- if (evals.length) {
466
- q.push.apply(q, scanner2(_withset(exps[0].text, getname(nameindex), createString(b))));
467
- }
468
- else {
469
- q.push(exps[0], { type: STAMP, text: "=" });
470
- q.push(...b);
471
- }
472
- exps.shift();
473
- }
474
- else if (ret && b.length || ax > 1) {
555
+ else if (ax !== 1) {
556
+ if (ret && b.length || ax > 1) {
475
557
  q.push(...scanner2(`${getname(nameindex)}=`));
476
558
  q.push(...b);
477
559
  }
@@ -479,17 +561,22 @@ var _express = function (body, getname, ret) {
479
561
  q.push(...b);
480
562
  }
481
563
  }
564
+ q.name = getname(nameindex);
565
+ if (ax === 1) {
566
+ if (q.length) q.push({ type: STAMP, text: ';' });
567
+ q.push(exps[0], { type: STAMP, text: "=" });
568
+ q.push(...b);
569
+ q.name = exps[0].text;
570
+ exps[0].set = getname(nameindex);
571
+ exps.shift();
572
+ }
482
573
  if (ax > 1) {
483
574
  while (ax > 0) {
484
575
  q.push({ type: STAMP, text: ';' });
485
576
  var [e] = exps.splice(ax - 1, 1);
486
- if (evals.length) {
487
- _withset(e.text, getname(nameindex + 1), getname(nameindex));
488
- }
489
- else {
490
- q.push(e);
491
- q.push(...scanner2(`=${getname(nameindex)}`))
492
- }
577
+ e.set = getname(nameindex + 1);
578
+ q.push(e);
579
+ q.push(...scanner2(`=${getname(nameindex)}`))
493
580
  ax--;
494
581
  }
495
582
  }
@@ -498,16 +585,14 @@ var _express = function (body, getname, ret) {
498
585
  if (o.type !== EXPRESS) continue;
499
586
  if (o === exps[exps.length - 1]) {
500
587
  exps.pop();
501
- q.splice(cx, 1, ...scanner2(_withget(o.text)));
588
+ o.get = true;
502
589
  if (!exps.length) {
503
590
  break;
504
591
  }
505
592
  }
506
593
  }
507
594
  relink(q);
508
- if (ret && !needbreak(q[q.length - 1]) && q.length) q.push(RETURN);
509
- if (ret) result = _invoke(q, getdeepname);
510
- return ret ? result : q;
595
+ return _invoke(q, getdeepname);
511
596
  };
512
597
 
513
598
  var getblock = function (body, cx) {
@@ -525,14 +610,29 @@ var getblock = function (body, cx) {
525
610
  var labels = [];
526
611
 
527
612
  function toqueue(body, getname, ret = false) {
613
+ var retn = false;
614
+ var ifpatch = function () {
615
+ var re = scanner2(`return [1,0]`);
616
+ re.awaited = true;
617
+ addresult(result, re);
618
+ }
528
619
  var uniftop = function () {
529
- for (var cx = 0, dx = iftop.length - 1; cx < dx; cx++) {
620
+ for (var cx = 2, dx = iftop.length; cx < dx; cx += 2) {
621
+ var findex = iftop[cx];
622
+ var p = result[findex - 1];
623
+ p.pop();
624
+ p.push(...scanner2(`[${result.length + 1 - findex},0]`));
625
+ relink(p);
626
+ }
627
+ for (var cx = 0, dx = iftop.length - 1; cx < dx;) {
530
628
  var findex = iftop[cx++];
531
629
  var f = result[findex];
532
- var n = iftop[cx];
533
- var c = scanner2(`if(!${n})return [${iftop[cx + 1] - findex || 1}];`);
534
- if (f) f.unshift.apply(f, c), relink(f), f[f.length - 1][0].text = String(result.length - findex);
535
- else result.push(c);
630
+ var n = iftop[cx++];
631
+ if (f) {
632
+ var c = scanner2(`if(${n})return [${iftop.length > cx ? iftop[cx] - findex : result.length - findex},0];`);
633
+ f.unshift.apply(f, c);
634
+ relink(f);
635
+ }
536
636
  };
537
637
  };
538
638
  var unblock = function (block, ...end) {
@@ -544,11 +644,11 @@ function toqueue(body, getname, ret = false) {
544
644
  });
545
645
  if (end.length) {
546
646
  var q = c[c.length - 1];
547
- q.pop();
548
647
  q.push(...end);
549
648
  relink(q);
550
649
  }
551
650
  }
651
+ return result[result.length - 1];
552
652
  };
553
653
  var poplabel = function () {
554
654
  var e = labels.pop();
@@ -560,7 +660,8 @@ function toqueue(body, getname, ret = false) {
560
660
  var r = result[cx];
561
661
  if (r[r.length - 1] === end) { break }
562
662
  }
563
- end.push({ type: VALUE, text: result.length - cx });
663
+ end.push({ type: VALUE, text: result.length - cx }, { type: STAMP, text: "," }, { type: VALUE, text: "0" });
664
+ relink(end);
564
665
  }
565
666
  }
566
667
  };
@@ -591,21 +692,36 @@ function toqueue(body, getname, ret = false) {
591
692
  }
592
693
  if (o.type === SCOPED && o.entry === '{' && !o.isExpress) {
593
694
  var b = toqueue(o, getname, false);
695
+ // addresult(result, b);
594
696
  result.push.apply(result, b);
595
697
  cx++;
596
698
  bx = cx;
597
699
  continue;
598
700
  }
599
701
  a: if (o.type === STRAP) {
600
- if (/^(new|typeof|yield|await)$/.test(o.text)) {
702
+ if (/^(new|typeof|await)$/.test(o.text)) {
703
+ break a;
704
+ }
705
+ if (o.text === 'yield') {
706
+ retn = [YIELD];
707
+ ret = true;
708
+ bx = cx + 1;
709
+ cx++;
601
710
  break a;
602
711
  }
603
712
  if (o.text === 'return') {
713
+ retn = [RETURN];
604
714
  ret = true;
605
715
  bx = cx + 1;
606
716
  cx++;
607
717
  break a;
608
718
  }
719
+ if (/^(async|function)$/.test(o.text)) {
720
+ cx = skipAssignment(body, cx);
721
+ addresult(result, body.slice(bx, cx));
722
+ bx = cx + 1;
723
+ break a;
724
+ }
609
725
  if (o.text === 'break') {
610
726
  cx = _break(body, cx, result);
611
727
  bx = cx + 1;
@@ -616,6 +732,11 @@ function toqueue(body, getname, ret = false) {
616
732
  bx = cx + 1;
617
733
  continue;
618
734
  }
735
+ if (o.text === 'try') {
736
+ cx = _try(body, cx, unblock, result, getname);
737
+ bx = cx + 1;
738
+ continue;
739
+ }
619
740
  if (o.text === 'for') {
620
741
  labels.push(o);
621
742
  cx = _for(body, cx, unblock, result, getname(0));
@@ -646,6 +767,7 @@ function toqueue(body, getname, ret = false) {
646
767
  }
647
768
  var elseif = false;
648
769
  if (o.text === 'else') {
770
+ ifpatch();
649
771
  iftop.push(result.length);
650
772
  while (body[cx] !== o.next) cx++;
651
773
  o = o.next;
@@ -654,16 +776,7 @@ function toqueue(body, getname, ret = false) {
654
776
  if (o.text === 'if') {
655
777
  while (body[cx] !== o.next) cx++;
656
778
  o = o.next;
657
- var n = '';
658
- if (o.first && o.first === o.lastUncomment) {
659
- if (o.first.type === EXPRESS) {
660
- n = o.first.text;
661
- }
662
- }
663
- if (!n) {
664
- unblock(o);
665
- n = getname(0);
666
- }
779
+ var n = getCondition(o, unblock, true);
667
780
  if (!elseif) {
668
781
  if (iftop) uniftop();
669
782
  iftop = [result.length, n];
@@ -671,10 +784,11 @@ function toqueue(body, getname, ret = false) {
671
784
  else {
672
785
  iftop.push(n);
673
786
  }
787
+ o = o.next;
674
788
  elseif = true;
675
789
  }
676
790
  if (elseif) {
677
- while (body[cx] !== o.next) cx++;
791
+ while (body[cx] !== o) cx++;
678
792
  var block = getblock(body, cx);
679
793
  cx += block.length;
680
794
  o = body[cx];
@@ -696,17 +810,28 @@ function toqueue(body, getname, ret = false) {
696
810
  cx++;
697
811
  bx = cx;
698
812
  b = ternary(b, getname, ret);
699
- if (ret) result.push.apply(result, b);
700
- else result.push(b);
813
+ result.push(...b);
814
+ if (retn) {
815
+ retn.name = b[b.length - 1].name;
816
+ addresult(result, retn);
817
+ }
818
+ retn = false;
701
819
  } while (cx < body.length);
702
820
  return result;
703
821
  }
822
+ var ret_ = '';
704
823
  module.exports = function (body, newname, ret) {
824
+ if (ret) ret = isString(ret) ? ret : newname();
825
+ var ret0 = ret_;
826
+ ret_ = ret;
705
827
  var tmpnames = [];
828
+ var p = 0;
706
829
  var getname = function (i) {
707
- i += evals.length;
830
+ i += evals.length + p;
708
831
  if (!tmpnames[i]) tmpnames[i] = newname();
709
832
  return tmpnames[i];
710
833
  };
711
- return toqueue(body, getname, ret);
834
+ var res = toqueue(body, getname, false);
835
+ ret_ = ret0;
836
+ return res;
712
837
  };