efront 3.36.6 → 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.
@@ -17,5 +17,16 @@ var Symbol = this.Symbol || function () {
17
17
  };
18
18
 
19
19
  Symbol.prototype = prototype;
20
+ Symbol.iterator = Symbol('iterator');
21
+ Symbol.asyncIterator = Symbol('asyncIterator');
22
+ Array.prototype[Symbol.iterator] = function () {
23
+ var arr = this, cx = 0, dx = arr.length;
24
+ return {
25
+ next() {
26
+ if (cx < dx) return { value: arr[cx++], done: false };
27
+ return { value: undefined, done: true };
28
+ }
29
+ }
30
+ };
20
31
  return Symbol;
21
32
  }();
@@ -0,0 +1,35 @@
1
+ class Generator {
2
+ constructor(f) {
3
+ this.state = "suspended";
4
+ this.exec = f;
5
+ };
6
+ throw(e) {
7
+ delete this.exec;
8
+ this.state = "closed";
9
+ throw e;
10
+ }
11
+ return(value) {
12
+ delete this.exec;
13
+ this.state = "closed";
14
+ return { value: undefined, done: true };
15
+ }
16
+ next() {
17
+ if (this.exec) {
18
+ var exec = this.exec;
19
+ delete this.exec;
20
+ delete this.value;
21
+ exec(this.return, this.throw, (value, exec) => {
22
+ this.value = value;
23
+ this.exec = exec;
24
+ });
25
+ }
26
+ return { value: this.value, done: !this.exec };
27
+ }
28
+ }
29
+ Generator.prototype[Symbol.iterator] = function () {
30
+ return this;
31
+ };
32
+
33
+ function aster_() {
34
+ return new Generator(exec_.bind(this, arguments));
35
+ }
@@ -0,0 +1,50 @@
1
+ class AsyncGenerator {
2
+ constructor(f) {
3
+ this.state = "suspended";
4
+ this.exec = f;
5
+ };
6
+ throw(e) {
7
+ delete this.exec;
8
+ this.state = "closed";
9
+ return Promise.reject(e);
10
+ }
11
+ return(value) {
12
+ delete this.exec;
13
+ this.state = "closed";
14
+ return Promise.resolve({ value: undefined, done: true });
15
+ }
16
+ next() {
17
+ if (this.exec) {
18
+ var exec = this.exec;
19
+ delete this.exec;
20
+ delete this.value;
21
+ return this.promise = new Promise(function (ok, oh) {
22
+ exec(function (result) {
23
+ delete this.promise;
24
+ ok(result);
25
+ this.return(result);
26
+ }, function (error) {
27
+ delete this.promise;
28
+ oh(error);
29
+ this.throw(error);
30
+ }, (value, exec) => {
31
+ delete this.promise;
32
+ ok({ value: value, done: !this.exec })
33
+ this.value = value;
34
+ this.exec = exec;
35
+ });
36
+ })
37
+ }
38
+ else if (this.promise) {
39
+ return this.promise.then(this.next, this.next);
40
+ }
41
+ return Promise.resolve({ value: undefined, done: true });
42
+ }
43
+
44
+ }
45
+ Generator.prototype[Symbol.asyncIterator] = function () {
46
+ return this;
47
+ }
48
+ function asyncAster_() {
49
+ return new AsyncGenerator(exec_.bind(this, arguments));
50
+ }
@@ -1,62 +1,4 @@
1
- var exec = function (args, ok, oh) {
2
- var p = null, index = 0, r, finished = false;
3
- var next = function (arg) {
4
- p = arg;
5
- run();
6
- };
7
- var catches = [];
8
- var thro = function (err) {
9
- if (catches.length) {
10
- [index, p] = catches[catches.length - 1]
11
- index += p >>> 16;
12
- p = err;
13
- next();
14
- }
15
- else {
16
- oh(err);
17
- }
18
- };
19
- var retn = function (p) {
20
- r = p;
21
- finished = true;
22
- if (catches.length) fina();
23
- else ok(r);
24
- };
25
- var fina = function () {
26
- // 仅在try或catch未结束时使用
27
- [index, p] = catches[catches.length - 1];
28
- index += (p >>> 16) + (p & 0xffff);
29
- next();
30
- };
31
- var fine = function () {
32
- catches.pop();
33
- next();
34
- }
35
- var run = function () {
36
- var args_length = args.length, i;
37
- if (finished && !catches.length || index > args_length) return ok(r);
38
- loop: while (index < args_length) {
39
- try {
40
- [p, i] = args[index](p) || [1, 0];
41
- } catch (e) {
42
- p = null;
43
- thro(e);
44
- break;
45
- }
46
- switch (i) {
47
- case 0: index += p; break; // reflow
48
- case 1: index += 1; break loop; // await p;
49
- case 2: return finished = true, retn(p); // return p;
50
- case 7: index++; catches.push([index, p]); break; // try start
51
- case 9: return p ? fine() : fina(); // finally
52
- default: throw "代码异常!";
53
- }
54
- }
55
- if (p && isFunction(p.then)) p.then(next, thro);
56
- else next(p);
57
- };
58
- next();
59
- };
1
+
60
2
  function async_() {
61
- return new Promise(exec.bind(null, arguments));
3
+ return new Promise(exec_.bind(this, arguments));
62
4
  }
@@ -0,0 +1,62 @@
1
+ var exec = function (args, ok, oh, int) {
2
+ var p = null, index = 0, r, finished = false, t = this;
3
+ var next = function (arg) {
4
+ p = arg;
5
+ run();
6
+ };
7
+ var catches = [];
8
+ var thro = function (err) {
9
+ if (catches.length) {
10
+ [index, p] = catches[catches.length - 1]
11
+ index += p >>> 16;
12
+ p = err;
13
+ next();
14
+ }
15
+ else {
16
+ oh(err);
17
+ }
18
+ };
19
+ var retn = function (p) {
20
+ r = p;
21
+ finished = true;
22
+ if (catches.length) fina();
23
+ else ok(r);
24
+ };
25
+ var fina = function () {
26
+ // 仅在try或catch未结束时使用
27
+ [index, p] = catches[catches.length - 1];
28
+ index += (p >>> 16) + (p & 0xffff);
29
+ next();
30
+ };
31
+ var fine = function () {
32
+ catches.pop();
33
+ next();
34
+ }
35
+ var run = function () {
36
+ var args_length = args.length, i;
37
+ if (finished && !catches.length || index > args_length) return ok(r);
38
+ while (index < args_length) {
39
+ try {
40
+ [p, i] = args[index].call(t, p) || [1, 0];
41
+ } catch (e) {
42
+ p = null;
43
+ thro(e);
44
+ break;
45
+ }
46
+ switch (i) {
47
+ case 0: index += p; break; // reflow
48
+ case 1:
49
+ index++; // await p;
50
+ if (p && isFunction(p.then)) return p.then(next, thro);
51
+ else return next(p);
52
+ case 2: return finished = true, retn(p); // return p;
53
+ case 3: return index++, int(p, next); // yield p;
54
+ case 7: index++; catches.push([index, p]); break; // try start
55
+ case 9: return p ? fine() : fina(); // finally
56
+ default: throw "代码异常!";
57
+ }
58
+ }
59
+ retn();
60
+ };
61
+ next();
62
+ };
@@ -33,7 +33,7 @@ function,continue,debugger
33
33
  instanceof`.trim().split(/[,\s]+/);
34
34
  class Javascript extends Program {
35
35
  straps = straps;
36
- value_reg = /^(false|true|null|Infinity|NaN|undefined|arguments|this|eval|super)$/
36
+ value_reg = /^(false|true|null|Infinity|NaN|undefined)$/
37
37
  transive_reg = /^(new|var|let|const|yield|void|in|of|typeof|delete|case|return|await|export|default|instanceof|throw|extends|import|from)$/
38
38
  strapexp_reg = /^(new|void|typeof|delete|class|function|await)/;
39
39
  forceend_reg = /^(return|yield|break|continue|debugger)$/;
@@ -101,8 +101,11 @@ var skipAssignment = function (o, cx) {
101
101
  next();
102
102
  break;
103
103
  }
104
- case VALUE:
105
104
  case QUOTED:
105
+ if (needpunc && /^`/.test(o.text || o.entry)) {
106
+ needpunc = false;
107
+ }
108
+ case VALUE:
106
109
  if (needpunc) break loop;
107
110
  needpunc = true;
108
111
  next();
@@ -16,4 +16,5 @@ test('try{}catch{}finally{} if(m)c=d+a;else aa debugger\r\n a')
16
16
  test('try{}catch{}\r\nfinally{}\r\n if(m)c=d+a;else aa debugger\r\n a')
17
17
  test('var a')
18
18
  test('var a,b,c=1;')
19
- test('a:')
19
+ test('a:')
20
+ test('a`b`,a`aa{s}`,c;')
@@ -664,12 +664,8 @@ var killobj = function (body, getobjname, getname_, setsolid, deep = 0) {
664
664
  o = o.next;
665
665
  }
666
666
  };
667
- var import_ = function () { };
668
- var export_ = function () { };
669
667
 
670
668
  // 字面量 false|true|null|Infinity|NaN|undefined|arguments|this|eval|super
671
- var unfalse = function () { };
672
- var unyield = function () { };
673
669
  var power_map = {};
674
670
  [
675
671
  '=,+=,-=,*=,/=,%=,|=,&=,^=,**=,~=',
@@ -691,11 +687,11 @@ var getsync = function (m) {
691
687
  if (m.type === SCOPED && m.await) return null;
692
688
  var n = skipAssignment(m);
693
689
  while (m !== n) {
694
- if (m.await || m.type === STRAP && m.text === 'await') return null;
690
+ if (m.await || m.type === STRAP && /^(yield|await)$/.test(m.text)) return null;
695
691
  m = m.next;
696
692
  }
697
693
  };
698
- var isawait = function (o) {
694
+ var ises3 = function (o) {
699
695
  if (o && o.type === SCOPED && o.entry === "{") {
700
696
  if (!o.await) return false;
701
697
  }
@@ -710,9 +706,9 @@ var isawait = function (o) {
710
706
  return false;
711
707
  }
712
708
  var unforin = function (o, body, getnewname_) {
713
- // 仅处理有 await 的代码
709
+ // 仅处理有 await 或 yield 的代码
714
710
  if (!o.await) {
715
- if (!isawait(o.next)) return;
711
+ if (!ises3(o.next)) return;
716
712
  }
717
713
  var m = o.first;
718
714
  var hasdeclare = false;
@@ -743,6 +739,11 @@ var unforin = function (o, body, getnewname_) {
743
739
  };
744
740
 
745
741
  var unforof = function (o, getnewname, used) {
742
+ var hasawait = false;
743
+ if (o.type === STRAP && o.text === 'await') {
744
+ hasawait = true;
745
+ o = o.next;
746
+ }
746
747
  var m = o.first;
747
748
  var hasdeclare = false;
748
749
  if (m.type === STRAP) {
@@ -761,7 +762,7 @@ var unforof = function (o, getnewname, used) {
761
762
  insert1(o, m, ...scanner2(d.map(a => a.text).join(",")));
762
763
  }
763
764
  var iname = getnewname();
764
- insert1(o, m, ...scanner2(`${iname}=0`));
765
+ var gname = getnewname();
765
766
  var oname;
766
767
  if (!f.next && f.type === EXPRESS && !/\./.test(f.text) && used[f.text].length === 1) {
767
768
  splice1(o, m);
@@ -774,12 +775,7 @@ var unforof = function (o, getnewname, used) {
774
775
  insert1(o, null, ...scanner2(`,${oname}=`));
775
776
  insert1(o, null, ...mo);
776
777
  }
777
- insert1(o, null, ...scanner2(`;${iname}<${oname}.length&&`));
778
- var q = scanner2(`(=${oname}[${iname}],true)`)[0];
779
- insert1(q, q[0], p);
780
- insert1(o, null, q);
781
- insert1(o, null, ...scanner2(`;${iname}++`));
782
-
778
+ insert1(o, null, ...scanner2(`${gname}=${hasawait ? `${oname}[Symbol.asyncGenerator]||${oname}[Symbol.generator]` : `${oname}[Symbol.generator]||${oname}[Symbol.asyncGenerator]`}||Array.prototype[Symbol.asyncGenerator].bind(${oname}),${gname}=${gname}(),${iname}=${hasawait ? "await " : ''}${gname}.next();${p.text}=${iname}.value,!${iname}.done;${iname}=${gname}.next();`));
783
779
  };
784
780
  var unarrow = function (body, o, killobj, getname_) {
785
781
  var p = o.prev;
@@ -961,10 +957,10 @@ var down = function (scoped) {
961
957
  if (argcodes.length) precode(argcodes.join(";") + ";");
962
958
  if (scoped.body) scoped.body.keeplet = false, killobj(scoped.body, gettmpname, _getname, setsolid);
963
959
  scoped.forEach(kill);
964
- if (scoped.async) {
960
+ if (scoped.async || scoped.yield) {
965
961
  var argname = _getname("_");
966
962
  var code = unawait(scoped.body, _getname, argname);
967
- var body = scanner2(`return async_()`);
963
+ var body = scanner2(`return ${[, "aster_", "async_", "asyncAster_"][scoped.async << 1 | scoped.yield]}()`);
968
964
  code.forEach(function (c) {
969
965
  var f = scanner2(`function(${body[2].length ? argname : ''}){}`);
970
966
  if (!c.length) insert1(f[2], null, ...scanner2('return []'));
@@ -1,9 +1,10 @@
1
- var { SPACE, COMMENT, EXPRESS, STRAP, STAMP, SCOPED, VALUE, LABEL, createString, skipAssignment, relink } = 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
5
  var RD = { type: STRAP, text: "@rd" };// if (_) return
6
6
  var RETURN = { type: STRAP, text: "@ret" };// return;
7
+ var YIELD = { type: STRAP, text: "@yield" };// return;
7
8
  var NEXT = { type: STRAP, text: "@next" };// return;
8
9
  var _break = function (body, cx, result) {
9
10
  var label;
@@ -159,6 +160,15 @@ var _for = function (body, cx, unblock, result, tmpname) {
159
160
  if (m.type === STRAP && /^(let|const|var)$/.test(m.text)) {
160
161
  m = m.next;
161
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
+ }
162
172
  var cy = 0;
163
173
  while (o[cy] !== m) cy++;
164
174
  var block = getblock(o, cy);// init
@@ -183,13 +193,36 @@ var _for = function (body, cx, unblock, result, tmpname) {
183
193
  relink(result[result.length - 1]);
184
194
  return cx;
185
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
+ }
186
220
  var _while = function (body, cx, unblock, result, tmpname) {
187
221
  var o = body[cx];
188
222
  o = o.next;
189
223
  while (body[cx] !== o) cx++;
190
- var b = scanner2(`;if(!${tmpname})return []`)
191
- unblock(o);
192
- result[result.length - 1].push(...b);
224
+ var b = scanner2(`if(${getCondition(o, unblock, true)})return []`)
225
+ result.push(b);
193
226
  relink(result[result.length - 1]);
194
227
  var block = getblock(body, ++cx);
195
228
  var i = result.length;
@@ -281,15 +314,14 @@ var _do = function (body, cx, unblock, result, tmpname) {
281
314
  var i = result.length;
282
315
  unblock(o);
283
316
  o = o.next.next;
284
- unblock(o);
285
- var b = scanner2(`return [${tmpname}?${i - result.length}:${1},0]`);
317
+ var b = scanner2(`if(${getCondition(o, unblock)})return [${i - result.length},0];return [1,0]`);
286
318
  addresult(result, b);
287
319
  while (body[cx] !== o) cx++;
288
320
  return cx;
289
321
  };
290
322
 
291
323
  var needbreak = function (o) {
292
- return o === RE || o === RZ || o === RETURN || o === NEXT || o === RD;
324
+ return o === RE || o === RZ || o === RD || o === RETURN || o === NEXT || o === YIELD;
293
325
  };
294
326
  var _return = function (r, nextindex) {
295
327
  var name = r.name;
@@ -301,9 +333,11 @@ var _return = function (r, nextindex) {
301
333
  semicolon = semicolon && semicolon.type === STAMP && /^[,;]$/.test(semicolon.text);
302
334
  var x;
303
335
  if (e === RETURN) {
304
- if (nextindex === 1) r._return = true;
305
336
  x = scanner2(`return [${name},2]`);
306
337
  }
338
+ else if (e === YIELD) {
339
+ x = scanner2(`return [${name},3]`);
340
+ }
307
341
  else if (e === NEXT) {
308
342
  x = scanner2(`return [${name},1]`);
309
343
  r.await = true;
@@ -354,7 +388,7 @@ var _invoke = function (t, getname) {
354
388
  cy = skipAssignment(o, cy);
355
389
  if (by === cy) continue;
356
390
  var m = o.slice(by, cy);
357
- 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)) {
358
392
  continue;
359
393
  }
360
394
  var q = toqueue(m, getdeepname, true);
@@ -410,12 +444,14 @@ var ternary = function (body, getname, ret) {
410
444
  var bx = question.pop();
411
445
  if (!question.length) {
412
446
  var b = body.slice(0, bx);
413
- b = _express(b, getname, true);
447
+ relink(b);
414
448
  var c = ternary(body.slice(bx + 1, cx), getname, true);
415
449
  var d = ternary(body.slice(cx + 1), getname, true);
416
- b[b.length - 1].push(...scanner2(`;return [${getname(0)}?1:${c.length + 1},0]`));
417
- c[c.length - 1].push(...scanner2(`;return [${d.length + 1},0]`));
418
- 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]`));
419
455
  res.push(...c);
420
456
  res.push(...d);
421
457
  }
@@ -441,6 +477,10 @@ var _express = function (body, getname, ret) {
441
477
  for (var cx = 0, dx = body.length; cx < dx; cx++) {
442
478
  var o = body[cx];
443
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
+ }
444
484
  if (o.type & (STRAP | STAMP)) {
445
485
  var p = 0;
446
486
  if (o.text === '=') {
@@ -470,7 +510,7 @@ var _express = function (body, getname, ret) {
470
510
  var p0 = cache.pop();
471
511
  var t = cache.pop();
472
512
  var isawait = _await(t);
473
- if (p0 > powermap["="]) q.push(...scanner2(`${getname(t.index)}=`));
513
+ if (p0 > powermap["="] || isawait) q.push(...scanner2(`${getname(t.index)}=`));
474
514
  q.push.apply(q, t);
475
515
  q.push.apply(q, b);
476
516
  if (isawait) q.push(NEXT);
@@ -506,7 +546,7 @@ var _express = function (body, getname, ret) {
506
546
  nameindex = cache[cache.length - 1].index;
507
547
  var t = cache.pop();
508
548
  var isawait = _await(t, nameindex);
509
- if (p > powermap["="] && (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)}=`));
510
550
  q.push.apply(q, t);
511
551
  q.push.apply(q, b);
512
552
  if (isawait) q.push(NEXT);
@@ -589,7 +629,7 @@ function toqueue(body, getname, ret = false) {
589
629
  var f = result[findex];
590
630
  var n = iftop[cx++];
591
631
  if (f) {
592
- var c = scanner2(`if(!${n})return [${iftop.length > cx ? iftop[cx] - findex : result.length - findex},0];`);
632
+ var c = scanner2(`if(${n})return [${iftop.length > cx ? iftop[cx] - findex : result.length - findex},0];`);
593
633
  f.unshift.apply(f, c);
594
634
  relink(f);
595
635
  }
@@ -608,6 +648,7 @@ function toqueue(body, getname, ret = false) {
608
648
  relink(q);
609
649
  }
610
650
  }
651
+ return result[result.length - 1];
611
652
  };
612
653
  var poplabel = function () {
613
654
  var e = labels.pop();
@@ -658,7 +699,14 @@ function toqueue(body, getname, ret = false) {
658
699
  continue;
659
700
  }
660
701
  a: if (o.type === STRAP) {
661
- 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++;
662
710
  break a;
663
711
  }
664
712
  if (o.text === 'return') {
@@ -668,6 +716,12 @@ function toqueue(body, getname, ret = false) {
668
716
  cx++;
669
717
  break a;
670
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
+ }
671
725
  if (o.text === 'break') {
672
726
  cx = _break(body, cx, result);
673
727
  bx = cx + 1;
@@ -722,16 +776,7 @@ function toqueue(body, getname, ret = false) {
722
776
  if (o.text === 'if') {
723
777
  while (body[cx] !== o.next) cx++;
724
778
  o = o.next;
725
- var n = '';
726
- if (o.first && o.first === o.last) {
727
- if (o.first.type === EXPRESS) {
728
- n = o.first.text;
729
- }
730
- }
731
- if (!n) {
732
- unblock(o);
733
- n = getname(0);
734
- }
779
+ var n = getCondition(o, unblock, true);
735
780
  if (!elseif) {
736
781
  if (iftop) uniftop();
737
782
  iftop = [result.length, n];
@@ -786,7 +831,7 @@ module.exports = function (body, newname, ret) {
786
831
  if (!tmpnames[i]) tmpnames[i] = newname();
787
832
  return tmpnames[i];
788
833
  };
789
- var res = toqueue(body, getname, ret);
834
+ var res = toqueue(body, getname, false);
790
835
  ret_ = ret0;
791
836
  return res;
792
837
  };
@@ -16,7 +16,7 @@ test('a * a + b * c', "_ = a * a, _0 = b * c, _ + _0");
16
16
  test('a * a + b * c * c ** d', "_ = a * a, _0 = b * c, _1 = c ** d, _0 = _0 * _1, _ + _0");
17
17
  test('a * a || b * c * c ** d', "_ = a * a @re _ = b * c, _0 = c ** d, _ * _0");
18
18
  test('a * a || b * c || c * d', "_ = a * a @re _ = b * c @re c * d");
19
- test('a?b:c', "_ = a; return [_ ? 1 : 2, 0]; _ = b; return [2, 0]; _ = c");
19
+ test('a?b:c', "if (a) return [1, 0]; _ = b; return [2, 0]; _ = c;");
20
20
  test('a * a && b * c * c ** d', "_ = a * a @rz _ = b * c, _0 = c ** d, _ * _0");
21
21
  test('a = 1 + 2', "_ = 1 + 2, a = _", true);
22
22
  test('a = b', "a = b", true);
@@ -24,32 +24,35 @@ test('a = b = c', "_ = c, b = _, a = _", true);
24
24
  test('a = b = c + d', "_ = c + d, b = _, a = _", true);
25
25
  test('a = b = c + d * 1', "_ = d * 1, _ = c + _, b = _, a = _", true);
26
26
  test('return a = b', "a = b; return [a, 2]", true);
27
- test('a*a', "_ = a * a", true);
28
- test('a * a && b * c * c ** d', "_ = a * a; if (!_) return [1, 0]; _ = b * c, _0 = c ** d, _ = _ * _0", true);
29
- test('a * a || b * c * c ** d', "_ = a * a; if (_) return [1, 0]; _ = b * c, _0 = c ** d, _ = _ * _0", true);
30
- test('a * a ?? b * c * c ** d', "_ = a * a; if (_ !== null && _ !== undefined) return [1, 0]; _ = b * c, _0 = c ** d, _ = _ * _0", true);
31
- test('a * a && await b*c', "_ = a * a; if (!_) return [2, 0]; _ = b; return [_, 1]; _ = @; _ = _ * c", true);
27
+ test('a*a', "a * a", true);
28
+ test('a * a && b * c * c ** d', "_ = a * a; if (!_) return [1, 0]; _ = b * c, _0 = c ** d, _ * _0", true);
29
+ test('a * a || b * c * c ** d', "_ = a * a; if (_) return [1, 0]; _ = b * c, _0 = c ** d, _ * _0", true);
30
+ test('a * a ?? b * c * c ** d', "_ = a * a; if (_ !== null && _ !== undefined) return [1, 0]; _ = b * c, _0 = c ** d, _ * _0", true);
31
+ test('a * a && await b*c', "_ = a * a; if (!_) return [2, 0]; _ = b; return [_, 1]; _ = @; _ * c", true);
32
32
 
33
33
  test("await a", "_ = a; return [_, 1]", true);
34
+ test("yield a", "_ = a; return [_, 3]", true);
34
35
  test("await a()", "_ = a(); return [_, 1]", true);
35
- test("(1+ +1)", "_ = +1, _ = 1 + _; _ = (_)", true);
36
+ test("yield a()", "_ = a(); return [_, 3]", true);
37
+ test("(1+ +1)", "_ = +1, _ = 1 + _; (_)", true);
36
38
  test("await a(await b)", "_ = b; return [_, 1]; _ = @; _ = a(_); return [_, 1]", true);
37
39
  test("await a(await b).s(await c)", "_ = b; return [_, 1]; _ = @; _ = a(_); _0 = c; return [_0, 1]; _0 = @; _ = _.s(_0); return [_, 1]", true);
38
- test("a*a + await a(await b).s(await c)", "_ = a * a; _0 = b; return [_0, 1]; _0 = @; _0 = a(_0); _1 = c; return [_1, 1]; _1 = @; _0 = _0.s(_1); return [_0, 1]; _0 = @; _ = _ + _0", true);
39
- test("a*a + await a(await b(await c)).s(await c)", "_ = a * a; _0 = c; return [_0, 1]; _0 = @; _0 = b(_0); return [_0, 1]; _0 = @; _0 = a(_0); _1 = c; return [_1, 1]; _1 = @; _0 = _0.s(_1); return [_0, 1]; _0 = @; _ = _ + _0", true);
40
+ test("a*a + await a(await b).s(await c)", "_ = a * a; _0 = b; return [_0, 1]; _0 = @; _0 = a(_0); _1 = c; return [_1, 1]; _1 = @; _0 = _0.s(_1); return [_0, 1]; _0 = @; _ + _0", true);
41
+ test("a*a + await a(await b(await c)).s(await c)", "_ = a * a; _0 = c; return [_0, 1]; _0 = @; _0 = b(_0); return [_0, 1]; _0 = @; _0 = a(_0); _1 = c; return [_1, 1]; _1 = @; _0 = _0.s(_1); return [_0, 1]; _0 = @; _ + _0", true);
40
42
  test("await a, await b", "_ = a; return [_, 1]; _ = b; return [_, 1]", true);
41
- test("await a * b, await b", "_ = a; return [_, 1]; _ = @; _ = _ * b; _ = b; return [_, 1]", true);
43
+ test("await a * b, await b", "_ = a; return [_, 1]; _ = @; _ * b; _ = b; return [_, 1]", true);
42
44
  test("if(a);", "", true);
43
45
  test("if(a) await b", "if (!a) return [1, 0]; _ = b; return [_, 1]", true);
44
46
  test("if(a) await b; else await c", "if (!a) return [2, 0]; _ = b; return [_, 1]; return [2, 0]; _ = c; return [_, 1]", true);
45
47
  test("if(a) b; else await c", "if (!a) return [1, 0]; _ = b; return [2, 0]; _ = c; return [_, 1]", true);
46
48
  test("if(a) await b; else if(e) await c", "if (!a) return [2, 0]; _ = b; return [_, 1]; return [2, 0]; if (!e) return [1, 0]; _ = c; return [_, 1]", true);
47
49
  test("if(a) await b; else if(e) await c else await d", "if (!a) return [2, 0]; _ = b; return [_, 1]; return [4, 0]; if (!e) return [2, 0]; _ = c; return [_, 1]; return [2, 0]; _ = d; return [_, 1]", true);
48
- test("if(await a) await b", "_ = a; return [_, 1]; if (!_) return [1, 0]; _ = b; return [_, 1]", true);
50
+ test("if(await a) await b", "_ = a; return [_, 1]; if (!@) return [1, 0]; _ = b; return [_, 1]", true);
49
51
  test("for(a=0;a<10;a++) await a", "a = 0; return [1, 0]; _ = a < 10; if (!_) return [3, 0]; _ = a; return [_, 1]; _ = a++; return [-2, 0]", true);
50
52
  test("for(a=0;a<10;a++) await a, await b", "a = 0; return [1, 0]; _ = a < 10; if (!_) return [4, 0]; _ = a; return [_, 1]; _ = b; return [_, 1]; _ = a++; return [-3, 0]", true);
51
- test("while(a) await b", "_ = a; if (!_) return [3, 0]; _ = b; return [_, 1]; return [-2, 0]", true);
52
- test("do{await b}while(a)", "_ = b; return [_, 1]; _ = a; return [_ ? -2 : 1, 0]", true);
53
+ test("for(a=0;b=2,a<10;a++) await a, await b", "a = 0; return [1, 0]; b = 2; _ = a < 10; if (!_) return [4, 0]; _ = a; return [_, 1]; _ = b; return [_, 1]; _ = a++; return [-3, 0]", true);
54
+ test("while(a) await b", "if (!a) return [3, 0]; _ = b; return [_, 1]; return [-2, 0]", true);
55
+ test("do{await b}while(a)", "_ = b; return [_, 1]; _ = @; if (a) return [-1, 0]; return [1, 0]", true);
53
56
  test("switch(a){case 1:}", "_ = a; _0 = 1; if (_ === _0) return [1, 0]", true);
54
57
  test("switch(a){case 1:break;}", "_ = a; _0 = 1; if (_ === _0) return [1, 0]; return [1, 0]", true);
55
58
  test("switch(a){case 1:break;case 2:break;}", "_ = a; _0 = 1; if (_ === _0) return [1, 0]; _0 = 2; if (_ === _0) return [2, 0]; return [2, 0]; return [1, 0]", true);
@@ -280,10 +280,6 @@ function prepare(pgpath, ok) {
280
280
  var state = createState(pgpath);
281
281
  state.state = state;
282
282
  var _with_elements = [];
283
- state.with = function (element) {
284
- if (element) _with_elements.push(element);
285
- return _with_elements;
286
- };
287
283
  state.path = function (url) {
288
284
  if (/^\.+\//.test(url)) {
289
285
  url = pgpath.replace(/[^\/]*$/, url);
@@ -304,10 +300,6 @@ function prepare(pgpath, ok) {
304
300
  }
305
301
  return url;
306
302
  };
307
- state.popup = function (a) {
308
- a = state.path(a);
309
- return popup.apply(this, [a].concat([].slice.call(arguments, 1)));
310
- };
311
303
  state.init = function (a) {
312
304
  a = state.path(a);
313
305
  return init.apply(this, [a].concat([].slice.call(arguments, 1)));
@@ -415,10 +407,6 @@ function create(pagepath, args, from, needroles) {
415
407
  return alert(i18n`没有权限!`, 0);
416
408
  }
417
409
  _with_elements = [].concat(_with_elements);
418
- state.with = function (element) {
419
- if (element) _with_elements.push(element);
420
- return _with_elements;
421
- };
422
410
  state.onback = function (handler) {
423
411
  _pageback_listener = handler;
424
412
  };