efront 3.36.6 → 3.36.9

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,11 +1,12 @@
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
- var _break = function (body, cx, result) {
9
+ var _break = function (body, cx, result, iscontinue) {
9
10
  var label;
10
11
  do {
11
12
  var o = body[++cx];
@@ -14,15 +15,20 @@ var _break = function (body, cx, result) {
14
15
  } while (true);
15
16
  var bx = cx;
16
17
  if (label) {
18
+ var s;
17
19
  for (var cx = labels.length - 1; cx >= 0; cx--) {
18
20
  var b = labels[cx];
19
21
  if (b.type === LABEL && b.text === label) {
20
22
  if (!b.breaks) b.breaks = [];
21
23
  var _b = scanner2(`return[]`);
24
+ if (iscontinue) _b.continue = s, s.continue = true;
22
25
  addresult(result, _b);
23
26
  b.breaks.push(_b);
24
27
  break;
25
28
  }
29
+ else {
30
+ s = b;
31
+ }
26
32
  }
27
33
  }
28
34
  else {
@@ -31,6 +37,7 @@ var _break = function (body, cx, result) {
31
37
  if (b.type !== LABEL) {
32
38
  if (!b.breaks) b.breaks = [];
33
39
  var _b = scanner2(`return[]`);
40
+ if (iscontinue) _b.continue = b, b.continue = true;
34
41
  addresult(result, _b);
35
42
  b.breaks.push(_b);
36
43
  break;
@@ -154,11 +161,21 @@ var _switch = function (body, cx, unblock, result, getname) {
154
161
  };
155
162
  var _for = function (body, cx, unblock, result, tmpname) {
156
163
  var o = body[cx];
164
+ var label = o;
157
165
  o = o.next;
158
166
  var m = o.first;
159
167
  if (m.type === STRAP && /^(let|const|var)$/.test(m.text)) {
160
168
  m = m.next;
161
169
  }
170
+ var mn = m.next;
171
+ if (mn.type === STRAP && mn.text === 'in') {
172
+ // 含有高级语法的 for in 语句在 ./downLevel.js 中预处理
173
+ var dx = cx;
174
+ var n = o.next;
175
+ while (body[dx] !== n) dx++;
176
+ addresult(result, body.slice(cx, dx));
177
+ return dx;
178
+ }
162
179
  var cy = 0;
163
180
  while (o[cy] !== m) cy++;
164
181
  var block = getblock(o, cy);// init
@@ -177,19 +194,44 @@ var _for = function (body, cx, unblock, result, tmpname) {
177
194
  relink(result[result.length - 1]);
178
195
  var i = result.length;
179
196
  unblock(block_);
197
+ if (label.continue) label.continue = result.length, result[result.length - 1].cont = true, label.contat = result.length;
180
198
  unblock(block2);
181
199
  result[result.length - 1].push(...scanner2(`;return [${i - result.length},0]`));
182
200
  b[b.length - 1].push(...scanner2(`${result.length - i + 1},0`));
183
201
  relink(result[result.length - 1]);
184
202
  return cx;
185
203
  };
204
+ var getCondition = function (o, unblock, not_) {
205
+ var n = '';
206
+ var f = o.first;
207
+ var not = f.type === STAMP && f.text === "!";
208
+ if (not) f = f.next;
209
+ if (not_) not = !not;
210
+ if (f && f === o.last) {
211
+ if (f.type & (EXPRESS | VALUE)) {
212
+ n = f.text;
213
+ }
214
+ if (not && n) {
215
+ if (f.type === VALUE) {
216
+ n = String(eval("!" + f.text));
217
+ }
218
+ else n = "!" + n;
219
+ }
220
+ }
221
+ if (!n) {
222
+ n = unblock(o);
223
+ n = n.await ? ret_ : n.name;
224
+ if (not) n = "!" + n;
225
+ }
226
+ return n;
227
+ }
186
228
  var _while = function (body, cx, unblock, result, tmpname) {
187
229
  var o = body[cx];
230
+ o.contat = result.length;
188
231
  o = o.next;
189
232
  while (body[cx] !== o) cx++;
190
- var b = scanner2(`;if(!${tmpname})return []`)
191
- unblock(o);
192
- result[result.length - 1].push(...b);
233
+ var b = scanner2(`if(${getCondition(o, unblock, true)})return []`)
234
+ result.push(b);
193
235
  relink(result[result.length - 1]);
194
236
  var block = getblock(body, ++cx);
195
237
  var i = result.length;
@@ -211,7 +253,7 @@ var pushstep = function (result, step) {
211
253
  relink(step);
212
254
  result.push(step);
213
255
  }
214
- else if (q.ifrt) {
256
+ else if (q.ifrt || q.cont) {
215
257
  result.push(step);
216
258
  }
217
259
  else {
@@ -277,19 +319,20 @@ var addresult = function (result, step) {
277
319
  };
278
320
  var _do = function (body, cx, unblock, result, tmpname) {
279
321
  var o = body[cx];
322
+ var label = o;
280
323
  o = o.next;
281
324
  var i = result.length;
282
325
  unblock(o);
283
326
  o = o.next.next;
284
- unblock(o);
285
- var b = scanner2(`return [${tmpname}?${i - result.length}:${1},0]`);
327
+ if (label.continue) result[result.length - 1].cont = true, label.contat = result.length;
328
+ var b = scanner2(`if(${getCondition(o, unblock)})return [${i - result.length},0];return [1,0]`);
286
329
  addresult(result, b);
287
330
  while (body[cx] !== o) cx++;
288
331
  return cx;
289
332
  };
290
333
 
291
334
  var needbreak = function (o) {
292
- return o === RE || o === RZ || o === RETURN || o === NEXT || o === RD;
335
+ return o === RE || o === RZ || o === RD || o === RETURN || o === NEXT || o === YIELD;
293
336
  };
294
337
  var _return = function (r, nextindex) {
295
338
  var name = r.name;
@@ -301,9 +344,11 @@ var _return = function (r, nextindex) {
301
344
  semicolon = semicolon && semicolon.type === STAMP && /^[,;]$/.test(semicolon.text);
302
345
  var x;
303
346
  if (e === RETURN) {
304
- if (nextindex === 1) r._return = true;
305
347
  x = scanner2(`return [${name},2]`);
306
348
  }
349
+ else if (e === YIELD) {
350
+ x = scanner2(`return [${name},3]`);
351
+ }
307
352
  else if (e === NEXT) {
308
353
  x = scanner2(`return [${name},1]`);
309
354
  r.await = true;
@@ -354,7 +399,7 @@ var _invoke = function (t, getname) {
354
399
  cy = skipAssignment(o, cy);
355
400
  if (by === cy) continue;
356
401
  var m = o.slice(by, cy);
357
- if (m.length === 1 && (m[0].type === EXPRESS && /\./.test(m[0].text) || m[0].type === VALUE)) {
402
+ if (m.length === 1 && (m[0].type === EXPRESS && !/\./.test(m[0].text) || m[0].type === VALUE || m[0].type === QUOTED)) {
358
403
  continue;
359
404
  }
360
405
  var q = toqueue(m, getdeepname, true);
@@ -410,12 +455,14 @@ var ternary = function (body, getname, ret) {
410
455
  var bx = question.pop();
411
456
  if (!question.length) {
412
457
  var b = body.slice(0, bx);
413
- b = _express(b, getname, true);
458
+ relink(b);
414
459
  var c = ternary(body.slice(bx + 1, cx), getname, true);
415
460
  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);
461
+ addresult(c, scanner2(`return [${d.length + 1},0]`));
462
+ addresult(res, scanner2(`if(${getCondition(b, function (b) {
463
+ addresult(res, _express(b));
464
+ return res[res.length - 1];
465
+ })})return [1,0]`));
419
466
  res.push(...c);
420
467
  res.push(...d);
421
468
  }
@@ -441,6 +488,10 @@ var _express = function (body, getname, ret) {
441
488
  for (var cx = 0, dx = body.length; cx < dx; cx++) {
442
489
  var o = body[cx];
443
490
  if (o.type & (COMMENT | SPACE)) continue;
491
+ if (o.type === STRAP && /^(var|let|const)/.test(o.text)) {
492
+ bx = cx + 1;
493
+ continue;
494
+ }
444
495
  if (o.type & (STRAP | STAMP)) {
445
496
  var p = 0;
446
497
  if (o.text === '=') {
@@ -470,7 +521,7 @@ var _express = function (body, getname, ret) {
470
521
  var p0 = cache.pop();
471
522
  var t = cache.pop();
472
523
  var isawait = _await(t);
473
- if (p0 > powermap["="]) q.push(...scanner2(`${getname(t.index)}=`));
524
+ if (p0 > powermap["="] || isawait) q.push(...scanner2(`${getname(t.index)}=`));
474
525
  q.push.apply(q, t);
475
526
  q.push.apply(q, b);
476
527
  if (isawait) q.push(NEXT);
@@ -500,41 +551,44 @@ var _express = function (body, getname, ret) {
500
551
  }
501
552
  }
502
553
  var b = body.slice(bx, cx);
554
+ var needname = false;
503
555
  if (cache.length) while (cache.length) {
504
556
  var p = cache.pop();
505
557
  if (needcomma(q)) q.push({ type: STAMP, text: ',' });
506
558
  nameindex = cache[cache.length - 1].index;
507
559
  var t = cache.pop();
508
560
  var isawait = _await(t, nameindex);
509
- if (p > powermap["="] && (ret || cache.length > 0)) q.push(...scanner2(`${getname(nameindex)}=`));
561
+ if (p > powermap["="] && (ret || ax >= 1 || cache.length > 0 || isawait)) q.push(...scanner2(`${getname(nameindex)}=`));
510
562
  q.push.apply(q, t);
511
563
  q.push.apply(q, b);
512
564
  if (isawait) q.push(NEXT);
565
+ needname = true;
513
566
  b = [{ type: EXPRESS, text: getname(nameindex) }];
514
567
  }
515
568
  else if (ax !== 1) {
516
569
  if (ret && b.length || ax > 1) {
517
570
  q.push(...scanner2(`${getname(nameindex)}=`));
518
571
  q.push(...b);
572
+ needname = true;
519
573
  }
520
574
  else {
521
575
  q.push(...b);
522
576
  }
523
577
  }
524
- q.name = getname(nameindex);
578
+ if (needname) q.name = getname(nameindex);
525
579
  if (ax === 1) {
526
580
  if (q.length) q.push({ type: STAMP, text: ';' });
527
581
  q.push(exps[0], { type: STAMP, text: "=" });
528
582
  q.push(...b);
529
583
  q.name = exps[0].text;
530
- exps[0].set = getname(nameindex);
584
+ if (evals.length) exps[0].set = getname(nameindex);
531
585
  exps.shift();
532
586
  }
533
587
  if (ax > 1) {
534
588
  while (ax > 0) {
535
589
  q.push({ type: STAMP, text: ';' });
536
590
  var [e] = exps.splice(ax - 1, 1);
537
- e.set = getname(nameindex + 1);
591
+ if (evals.length) e.set = getname(nameindex + 1);
538
592
  q.push(e);
539
593
  q.push(...scanner2(`=${getname(nameindex)}`))
540
594
  ax--;
@@ -568,6 +622,10 @@ var getblock = function (body, cx) {
568
622
  return body.slice(ax, cx);
569
623
  };
570
624
  var labels = [];
625
+ var scopes = [];
626
+ var isbreak = function (o) {
627
+ return o.type === STRAP && /^(break|return|continue|yield)$/.test(o.text);
628
+ };
571
629
 
572
630
  function toqueue(body, getname, ret = false) {
573
631
  var retn = false;
@@ -577,19 +635,28 @@ function toqueue(body, getname, ret = false) {
577
635
  addresult(result, re);
578
636
  }
579
637
  var uniftop = function () {
580
- for (var cx = 2, dx = iftop.length; cx < dx; cx += 2) {
638
+ for (var cx = 3, dx = iftop.length; cx < dx; cx += 3) {
581
639
  var findex = iftop[cx];
640
+ var r = iftop[cx + 1];
582
641
  var p = result[findex - 1];
583
- p.pop();
584
- p.push(...scanner2(`[${result.length + 1 - findex},0]`));
585
- relink(p);
642
+ if (!r) {
643
+ p.pop();
644
+ p.push(...scanner2(`[${result.length + 1 - findex},0]`));
645
+ relink(p);
646
+ }
586
647
  }
587
- for (var cx = 0, dx = iftop.length - 1; cx < dx;) {
648
+ for (var cx = 0, dx = iftop.length - 2; cx < dx;) {
588
649
  var findex = iftop[cx++];
589
650
  var f = result[findex];
651
+ var r = iftop[cx++];
590
652
  var n = iftop[cx++];
591
- if (f) {
592
- var c = scanner2(`if(!${n})return [${iftop.length > cx ? iftop[cx] - findex : result.length - findex},0];`);
653
+ if (r) {
654
+ var c = scanner2(`if(${n})`);
655
+ f.unshift.apply(f, c);
656
+ relink(f);
657
+ }
658
+ else if (f) {
659
+ var c = scanner2(`if(${n})return [${iftop.length > cx ? iftop[cx] - findex : result.length - findex},0];`);
593
660
  f.unshift.apply(f, c);
594
661
  relink(f);
595
662
  }
@@ -608,6 +675,7 @@ function toqueue(body, getname, ret = false) {
608
675
  relink(q);
609
676
  }
610
677
  }
678
+ return result[result.length - 1];
611
679
  };
612
680
  var poplabel = function () {
613
681
  var e = labels.pop();
@@ -619,7 +687,7 @@ function toqueue(body, getname, ret = false) {
619
687
  var r = result[cx];
620
688
  if (r[r.length - 1] === end) { break }
621
689
  }
622
- end.push({ type: VALUE, text: result.length - cx }, { type: STAMP, text: "," }, { type: VALUE, text: "0" });
690
+ end.push({ type: VALUE, text: b.contat - cx ? b.continue : result.length - cx }, { type: STAMP, text: "," }, { type: VALUE, text: "0" });
623
691
  relink(end);
624
692
  }
625
693
  }
@@ -634,23 +702,20 @@ function toqueue(body, getname, ret = false) {
634
702
  if (!o) break;
635
703
  while (labels.length) {
636
704
  var e = labels[labels.length - 1];
637
- if (e.type !== LABEL) {
638
- break;
639
- }
640
- if (e.keep) {
641
- e.keep = false;
642
- break;
643
- }
705
+ if (e.type !== LABEL && !iftop) break;
706
+ if (scopes.lastIndexOf(e.scope) >= 0) break;
644
707
  poplabel();
645
708
  }
646
709
 
647
710
  if (o.type === LABEL) {
648
- o.keep = true;
711
+ o.scope = scopes[scopes.length - 1];
649
712
  labels.push(o);
650
713
  continue;
651
714
  }
652
715
  if (o.type === SCOPED && o.entry === '{' && !o.isExpress) {
716
+ scopes.push(o);
653
717
  var b = toqueue(o, getname, false);
718
+ scopes.pop();
654
719
  // addresult(result, b);
655
720
  result.push.apply(result, b);
656
721
  cx++;
@@ -658,7 +723,14 @@ function toqueue(body, getname, ret = false) {
658
723
  continue;
659
724
  }
660
725
  a: if (o.type === STRAP) {
661
- if (/^(new|typeof|yield|await)$/.test(o.text)) {
726
+ if (/^(new|typeof|await)$/.test(o.text)) {
727
+ break a;
728
+ }
729
+ if (o.text === 'yield') {
730
+ retn = [YIELD];
731
+ ret = true;
732
+ bx = cx + 1;
733
+ cx++;
662
734
  break a;
663
735
  }
664
736
  if (o.text === 'return') {
@@ -668,8 +740,14 @@ function toqueue(body, getname, ret = false) {
668
740
  cx++;
669
741
  break a;
670
742
  }
671
- if (o.text === 'break') {
672
- cx = _break(body, cx, result);
743
+ if (/^(async|function)$/.test(o.text)) {
744
+ cx = skipAssignment(body, cx);
745
+ addresult(result, body.slice(bx, cx));
746
+ bx = cx + 1;
747
+ break a;
748
+ }
749
+ if (/^(break|continue)$/.test(o.text)) {
750
+ cx = _break(body, cx, result, o.text === 'continue');
673
751
  bx = cx + 1;
674
752
  continue;
675
753
  };
@@ -714,32 +792,25 @@ function toqueue(body, getname, ret = false) {
714
792
  var elseif = false;
715
793
  if (o.text === 'else') {
716
794
  ifpatch();
717
- iftop.push(result.length);
718
795
  while (body[cx] !== o.next) cx++;
719
796
  o = o.next;
797
+ var isbr = isbreak(o);
798
+ iftop.push(result.length, isbr);
720
799
  elseif = true;
721
800
  }
722
801
  if (o.text === 'if') {
723
802
  while (body[cx] !== o.next) cx++;
724
803
  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
- }
804
+ var isbr = isbreak(o.next);
805
+ var n = getCondition(o, unblock, !isbr);
806
+ o = o.next;
735
807
  if (!elseif) {
736
808
  if (iftop) uniftop();
737
- iftop = [result.length, n];
809
+ iftop = [result.length, isbr, n];
738
810
  }
739
811
  else {
740
812
  iftop.push(n);
741
813
  }
742
- o = o.next;
743
814
  elseif = true;
744
815
  }
745
816
  if (elseif) {
@@ -778,7 +849,13 @@ var ret_ = '';
778
849
  module.exports = function (body, newname, ret) {
779
850
  if (ret) ret = isString(ret) ? ret : newname();
780
851
  var ret0 = ret_;
781
- ret_ = ret;
852
+ var ret1 = null;
853
+ if (ret) ret_ = isString(ret) ? ret : {
854
+ toString() {
855
+ if (ret1) return ret1;
856
+ return newname();
857
+ }
858
+ };
782
859
  var tmpnames = [];
783
860
  var p = 0;
784
861
  var getname = function (i) {
@@ -786,7 +863,7 @@ module.exports = function (body, newname, ret) {
786
863
  if (!tmpnames[i]) tmpnames[i] = newname();
787
864
  return tmpnames[i];
788
865
  };
789
- var res = toqueue(body, getname, ret);
866
+ var res = toqueue(body, getname, false);
790
867
  ret_ = ret0;
791
868
  return res;
792
869
  };
@@ -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);
@@ -1,6 +1,5 @@
1
1
  function Main(dataid, datapath, titleid) {
2
2
  var _titlebar = titlebar(" ");
3
- state.with(_titlebar);
4
3
  var page = createVboxWithState(state);
5
4
  page.initialStyle = 'margin-left:100%';
6
5
  page.innerHTML = buildScroll;
@@ -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)));
@@ -347,7 +339,7 @@ function prepare(pgpath, ok) {
347
339
  };
348
340
  state.titlebar = function () {
349
341
  var realTitleBar = titlebar.apply(null, arguments);
350
- if (!realTitleBar.parentNode) state.with(realTitleBar);
342
+ if (!realTitleBar.parentNode) _with_elements.push(realTitleBar);
351
343
  return realTitleBar;
352
344
  };
353
345
  var roles = res || null;
@@ -405,7 +397,7 @@ function create(pagepath, args, from, needroles) {
405
397
  }
406
398
  else if (isFunction(pagepath)) {
407
399
  var pg = pagepath;
408
- var { with: _with_elements, state = {}, onback: _pageback_listener, roles } = pg;
400
+ var { with: _with_elements = [], state = {}, onback: _pageback_listener, roles } = pg;
409
401
  }
410
402
  if (!checkroles(user.roles, roles) || !checkroles(user.roles, needroles)) {
411
403
  // 检查权限
@@ -414,18 +406,15 @@ function create(pagepath, args, from, needroles) {
414
406
  }
415
407
  return alert(i18n`没有权限!`, 0);
416
408
  }
417
- _with_elements = [].concat(_with_elements);
418
- state.with = function (element) {
419
- if (element) _with_elements.push(element);
420
- return _with_elements;
421
- };
409
+ var _with_length = _with_elements.length;
422
410
  state.onback = function (handler) {
423
411
  _pageback_listener = handler;
424
412
  };
425
413
  var _page = pg.call(state, args, from);
426
414
  if (undefined === args || null === args) args = {};
427
415
  if (_page) {
428
- if (_with_elements.length) _page.with = _with_elements.concat(_page.with || []);
416
+ if (_with_length) _page.with = _with_elements.concat(_page.with || []);
417
+ _with_elements.splice(_with_length, _with_elements.length - _with_length);
429
418
  if (args.initialStyle) _page.initialStyle = args.initialStyle;
430
419
  if (args.holdupStyle) _page.holdupStyle = args.holdupStyle;
431
420
  if (_page.initialStyle && !_page.holdupStyle) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "3.36.6",
3
+ "version": "3.36.9",
4
4
  "description": "简化前端开发,优化web性能",
5
5
  "main": "public/efront.js",
6
6
  "directories": {