efront 3.36.5 → 3.36.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coms/basic_/async_.js +62 -0
- package/coms/basic_/async_test.js +11 -0
- package/coms/compile/Program.js +1 -1
- package/coms/compile/common.js +5 -0
- package/coms/compile/createExpressList_test.js +19 -0
- package/coms/compile/downLevel.js +103 -13
- package/coms/compile/downLevel_test.js +10 -6
- package/coms/compile/powermap.js +12 -0
- package/coms/compile/unstruct.js +241 -161
- package/coms/compile/unstruct_test.js +41 -34
- package/coms/zimoli/alert.js +1 -1
- package/coms/zimoli/cless.js +1 -1
- package/coms/zimoli/menuItem.html +1 -1
- package/coms/zimoli/menuItem.js +1 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
|
@@ -0,0 +1,62 @@
|
|
|
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
|
+
};
|
|
60
|
+
function async_() {
|
|
61
|
+
return new Promise(exec.bind(null, arguments));
|
|
62
|
+
}
|
package/coms/compile/Program.js
CHANGED
|
@@ -222,7 +222,7 @@ class Program {
|
|
|
222
222
|
};
|
|
223
223
|
var row = 1, colstart = -1;
|
|
224
224
|
var save = (type) => {
|
|
225
|
-
if (lasttype === STAMP && type === STAMP && !/[
|
|
225
|
+
if (lasttype === STAMP && type === STAMP && !/[,;\:]/.test(m)) {
|
|
226
226
|
var scope = queue[queue.length - 1];
|
|
227
227
|
if (/=>$/i.test(scope.text) ||
|
|
228
228
|
/[=>]$/.test(scope.text) && /[^>=]/.test(m) ||
|
package/coms/compile/common.js
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
var { createExpressList, createString } = common;
|
|
2
|
+
var test = function (text) {
|
|
3
|
+
var code = scanner2(text);
|
|
4
|
+
var exps = createExpressList(code);
|
|
5
|
+
console.log(code.isExpressQueue(),exps.map(createString))
|
|
6
|
+
};
|
|
7
|
+
test('a')
|
|
8
|
+
test('a+b=c')
|
|
9
|
+
test('if(a)a+b=c')
|
|
10
|
+
test('if(a)b=c; else c=d+a')
|
|
11
|
+
test('if(a)b=c; else if(m)c=d+a;else aa')
|
|
12
|
+
test('with(a)b=c; if(m)c=d+a;else aa')
|
|
13
|
+
test('try{}catch(){}finally{} if(m)c=d+a;else aa')
|
|
14
|
+
test('try{}catch{}finally{} if(m)c=d+a;else aa')
|
|
15
|
+
test('try{}catch{}finally{} if(m)c=d+a;else aa debugger\r\n a')
|
|
16
|
+
test('try{}catch{}\r\nfinally{}\r\n if(m)c=d+a;else aa debugger\r\n a')
|
|
17
|
+
test('var a')
|
|
18
|
+
test('var a,b,c=1;')
|
|
19
|
+
test('a:')
|
|
@@ -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, QUOTED,
|
|
4
|
+
var { STAMP, SCOPED, STRAP, EXPRESS, COMMENT, SPACE, PROPERTY, VALUE, QUOTED, rename, getDeclared, skipAssignment, createString, relink, createExpressList } = require("./common");
|
|
5
5
|
var link = function (a, b) {
|
|
6
6
|
if (a) a.next = b;
|
|
7
7
|
if (b) b.prev = a;
|
|
@@ -394,7 +394,7 @@ var killcls = function (body, o, getname_) {
|
|
|
394
394
|
while (next && !next.isClass) next = next.next;
|
|
395
395
|
base = createString(splice1(body, o, o = next));
|
|
396
396
|
}
|
|
397
|
-
if (base === 'Array') base = 'Array2';
|
|
397
|
+
// if (base === 'Array') base = 'Array2'; 降级时不做填充的工作
|
|
398
398
|
var index = 0;
|
|
399
399
|
while (o && o.isClass) {
|
|
400
400
|
var m = o.first;
|
|
@@ -615,6 +615,9 @@ var killobj = function (body, getobjname, getname_, setsolid, deep = 0) {
|
|
|
615
615
|
if (o && o.type === SCOPED) o = o.next;// ()
|
|
616
616
|
if (o && o.type === SCOPED) o = o.next;// {}
|
|
617
617
|
break;
|
|
618
|
+
case "async":
|
|
619
|
+
splice1(body, o, o = o.next);
|
|
620
|
+
break;
|
|
618
621
|
default:
|
|
619
622
|
o = o.next;
|
|
620
623
|
}
|
|
@@ -667,9 +670,79 @@ var export_ = function () { };
|
|
|
667
670
|
// 字面量 false|true|null|Infinity|NaN|undefined|arguments|this|eval|super
|
|
668
671
|
var unfalse = function () { };
|
|
669
672
|
var unyield = function () { };
|
|
670
|
-
var
|
|
673
|
+
var power_map = {};
|
|
674
|
+
[
|
|
675
|
+
'=,+=,-=,*=,/=,%=,|=,&=,^=,**=,~=',
|
|
676
|
+
'=>', '?,:', '&&,||', '&,|,^',
|
|
677
|
+
'instanceof,in,==,>=,<=,>,<,!=,!==,===,!in,!instanceof',
|
|
678
|
+
'>>,>>>,<<', '+,-', '*,/,%', '**',
|
|
679
|
+
'typeof,await,yield,!,~', '++,--'
|
|
680
|
+
].forEach((pp, i) => {
|
|
681
|
+
pp.split(",").forEach(p => {
|
|
682
|
+
power_map[p] = i + 1;
|
|
683
|
+
})
|
|
684
|
+
});
|
|
685
|
+
var unawait = function (body, getname, argname) {
|
|
686
|
+
return unstruct(body, function () {
|
|
687
|
+
return getname("_");
|
|
688
|
+
}, argname);
|
|
689
|
+
};
|
|
690
|
+
var getsync = function (m) {
|
|
691
|
+
if (m.type === SCOPED && m.await) return null;
|
|
692
|
+
var n = skipAssignment(m);
|
|
693
|
+
while (m !== n) {
|
|
694
|
+
if (m.await || m.type === STRAP && m.text === 'await') return null;
|
|
695
|
+
m = m.next;
|
|
696
|
+
}
|
|
697
|
+
};
|
|
698
|
+
var isawait = function (o) {
|
|
699
|
+
if (o && o.type === SCOPED && o.entry === "{") {
|
|
700
|
+
if (!o.await) return false;
|
|
701
|
+
}
|
|
702
|
+
else while (o) {
|
|
703
|
+
o = getsync(o);
|
|
704
|
+
if (o === null) return true;
|
|
705
|
+
if (!o || o.type !== STAMP || o.text !== ',') {
|
|
706
|
+
break;
|
|
707
|
+
}
|
|
708
|
+
o = o.next;
|
|
709
|
+
}
|
|
710
|
+
return false;
|
|
711
|
+
}
|
|
712
|
+
var unforin = function (o, body, getnewname_) {
|
|
713
|
+
// 仅处理有 await 的代码
|
|
714
|
+
if (!o.await) {
|
|
715
|
+
if (!isawait(o.next)) return;
|
|
716
|
+
}
|
|
717
|
+
var m = o.first;
|
|
718
|
+
var hasdeclare = false;
|
|
719
|
+
if (m.type === STRAP) {
|
|
720
|
+
m = m.next;
|
|
721
|
+
hasdeclare = true;
|
|
722
|
+
}
|
|
723
|
+
var n = m.next;
|
|
724
|
+
if (n.type !== STRAP || n.text !== 'in') {
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
n = n.next;
|
|
728
|
+
var tname = getnewname_();
|
|
729
|
+
var sname = getnewname_();
|
|
730
|
+
var kname = getnewname_();
|
|
731
|
+
var s = scanner2(`${sname}=`);
|
|
732
|
+
insert1(s, null, ...splice1(o, n));
|
|
733
|
+
insert1(s, null,
|
|
734
|
+
...scanner2(`,${tname}=[];for(${kname} in ${sname})${tname}.push(${kname});`)
|
|
735
|
+
);
|
|
736
|
+
insert1(body, o.prev, ...s);
|
|
737
|
+
splice1(o, m.next);
|
|
738
|
+
splice1(o, m);
|
|
739
|
+
insert1(o, o.first, ...scanner2(`${kname}=0;${kname}<${tname}.length`));
|
|
740
|
+
var c = scanner2(`(=${tname}[${kname}]);${kname}++`);
|
|
741
|
+
insert1(c[0], c[0].first, m);
|
|
742
|
+
insert1(o, null, ...c);
|
|
671
743
|
};
|
|
672
|
-
|
|
744
|
+
|
|
745
|
+
var unforof = function (o, getnewname, used) {
|
|
673
746
|
var m = o.first;
|
|
674
747
|
var hasdeclare = false;
|
|
675
748
|
if (m.type === STRAP) {
|
|
@@ -687,17 +760,19 @@ var unforof = function (o, gettempname_, getnextname_) {
|
|
|
687
760
|
var [d] = getDeclared(p);
|
|
688
761
|
insert1(o, m, ...scanner2(d.map(a => a.text).join(",")));
|
|
689
762
|
}
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
insert1(o, null, ...scanner2(`${iname}=0`));
|
|
763
|
+
var iname = getnewname();
|
|
764
|
+
insert1(o, m, ...scanner2(`${iname}=0`));
|
|
693
765
|
var oname;
|
|
694
|
-
if (f.type === EXPRESS && !/\./.test(
|
|
766
|
+
if (!f.next && f.type === EXPRESS && !/\./.test(f.text) && used[f.text].length === 1) {
|
|
767
|
+
splice1(o, m);
|
|
695
768
|
oname = f.text;
|
|
696
769
|
}
|
|
697
770
|
else {
|
|
698
|
-
oname =
|
|
771
|
+
oname = getnewname();
|
|
772
|
+
splice1(o, n, f);
|
|
773
|
+
var mo = splice1(o, f);
|
|
699
774
|
insert1(o, null, ...scanner2(`,${oname}=`));
|
|
700
|
-
insert1(o, null, ...
|
|
775
|
+
insert1(o, null, ...mo);
|
|
701
776
|
}
|
|
702
777
|
insert1(o, null, ...scanner2(`;${iname}<${oname}.length&&`));
|
|
703
778
|
var q = scanner2(`(=${oname}[${iname}],true)`)[0];
|
|
@@ -853,7 +928,7 @@ var down = function (scoped) {
|
|
|
853
928
|
argcodes.push(`var ${an}=arguments;`);
|
|
854
929
|
}
|
|
855
930
|
var fordeep = 0;
|
|
856
|
-
var kill = function (scoped) {
|
|
931
|
+
var kill = function (scoped, _, body) {
|
|
857
932
|
if (scoped.isfunc) return down(scoped);
|
|
858
933
|
killlet(scoped);
|
|
859
934
|
var saveddeep = fordeep;
|
|
@@ -865,7 +940,9 @@ var down = function (scoped) {
|
|
|
865
940
|
var hp = scoped.head.prev;
|
|
866
941
|
if (hp && hp.type === STRAP) {
|
|
867
942
|
if (hp.text === 'for') {
|
|
868
|
-
unforof(scoped.head, getdeepname,
|
|
943
|
+
unforof(scoped.head, getdeepname, scoped.used);
|
|
944
|
+
unforin(scoped.head, body, getdeepname);
|
|
945
|
+
// unforcx(scoped.head, getdeepname);
|
|
869
946
|
}
|
|
870
947
|
else if (hp.text === 'catch') {
|
|
871
948
|
killarg(scoped.head, scoped.body, _getname);
|
|
@@ -884,11 +961,24 @@ var down = function (scoped) {
|
|
|
884
961
|
if (argcodes.length) precode(argcodes.join(";") + ";");
|
|
885
962
|
if (scoped.body) scoped.body.keeplet = false, killobj(scoped.body, gettmpname, _getname, setsolid);
|
|
886
963
|
scoped.forEach(kill);
|
|
964
|
+
if (scoped.async) {
|
|
965
|
+
var argname = _getname("_");
|
|
966
|
+
var code = unawait(scoped.body, _getname, argname);
|
|
967
|
+
var body = scanner2(`return async_()`);
|
|
968
|
+
code.forEach(function (c) {
|
|
969
|
+
var f = scanner2(`function(${body[2].length ? argname : ''}){}`);
|
|
970
|
+
if (!c.length) insert1(f[2], null, ...scanner2('return []'));
|
|
971
|
+
else insert1(f[2], null, ...c);
|
|
972
|
+
if (body[2].length) insert1(body[2], null, { type: STAMP, text: "," });
|
|
973
|
+
insert1(body[2], null, ...f);
|
|
974
|
+
});
|
|
975
|
+
scoped.body.splice(0, scoped.body.length);
|
|
976
|
+
insert1(scoped.body, null, ...body);
|
|
977
|
+
}
|
|
887
978
|
}
|
|
888
979
|
else {
|
|
889
980
|
kill(scoped);
|
|
890
981
|
}
|
|
891
|
-
Program.prototype.relink(scoped.body);
|
|
892
982
|
};
|
|
893
983
|
/**
|
|
894
984
|
* @param {Program} code
|
|
@@ -58,7 +58,7 @@ assert(downLevel(`={a:1,[a]:1}`), `= (_ = { a: 1 }, _[a] = 1, _)`);
|
|
|
58
58
|
assert(downLevel(`={a,[a]:1}`), `= (_ = {}, _.a = a, _[a] = 1, _)`);
|
|
59
59
|
assert(downLevel(`={[a]:{[b]:1}}`), `= (_ = {}, _[a] = (_0 = {}, _0[b] = 1, _0), _)`);
|
|
60
60
|
assert(downLevel(`={[a]:{[b]:{[c]:1}}}`), `= (_ = {}, _[a] = (_0 = {}, _0[b] = (_1 = {}, _1[c] = 1, _1), _0), _)`);
|
|
61
|
-
assert(downLevel(`={[a]:{[b]:{[c]:1}},[b]:{[a]:1}
|
|
61
|
+
assert(downLevel(`={[a]:{[b]:{[c]:1}},[b]:{[a]:1}}`), `= (_ = {}, _[a] = (_0 = {}, _0[b] = (_1 = {}, _1[c] = 1, _1), _0), _[b] = (_0 = {}, _0[a] = 1, _0), _)`);
|
|
62
62
|
// 对象展开
|
|
63
63
|
assert(downLevel(`={...a}`), `= extend({}, a)`);
|
|
64
64
|
assert(downLevel(`={...{a:1}}`), `= extend({}, { a: 1 })`);
|
|
@@ -95,6 +95,7 @@ assert(downLevel(`function (a,...b,b){}`), "function (a, b) { b = arguments.leng
|
|
|
95
95
|
assert(downLevel(`(a)=>k`), "function (a) { return k }")
|
|
96
96
|
assert(downLevel(`(...a) => k`), "function () { var a = Array.prototype.slice.call(arguments, 0); return k }")
|
|
97
97
|
assert(downLevel(`for(var o of os)`), "for (var _ = 0; _ < os.length && (o = os[_], true); _++)")
|
|
98
|
+
assert(downLevel(`for(var o of o)`), "for (var _ = 0, _0 = o; _ < _0.length && (o = _0[_], true); _++)")
|
|
98
99
|
assert(downLevel(`for(var [a] of os)`), "for (var _ = 0; _ < os.length && (a = os[_][0], true); _++)")
|
|
99
100
|
assert(downLevel(`for(var [a,b] of os)`), "for (var _ = 0; _ < os.length && (_0 = os[_], a = _0[0], b = _0[1], true); _++)")
|
|
100
101
|
assert(downLevel(`[...a]=a`), "a = Array.prototype.slice.call(a, 0)")
|
|
@@ -104,8 +105,11 @@ assert(downLevel(`[...a,c]=a`), "_ = a, a = Array.prototype.slice.call(a, 0, -1)
|
|
|
104
105
|
assert(downLevel(`{...a,c}=a`), `c = a.c, a = rest_(a, ["c"])`)
|
|
105
106
|
assert(downLevel(`{c,...a}=a`), `c = a.c, a = rest_(a, ["c"])`)
|
|
106
107
|
assert(downLevel(`{c,[c]:b,...a}=a`), `c = a.c, b = a[c], a = rest_(a, ["c", c])`)
|
|
107
|
-
assert(downLevel(`async function(){}`), `function(){return
|
|
108
|
-
assert(downLevel(`async function(
|
|
109
|
-
assert(downLevel(`async function(a){await a
|
|
110
|
-
assert(downLevel(`async function(){await a
|
|
111
|
-
assert(downLevel(`async function(a){
|
|
108
|
+
assert(downLevel(`async function(){}`), `function () { return async_() }`)
|
|
109
|
+
assert(downLevel(`async function(){return 1}`), `function () { return async_(function () { _0 = 1; return [_0, 2] }) }`)
|
|
110
|
+
assert(downLevel(`async function(a){await a}`), `function (a) { return async_(function () { _0 = a; return [_0, 1] }) }`)
|
|
111
|
+
assert(downLevel(`async function(a){return await a}`), `function (a) { return async_(function () { _0 = a; return [_0, 1] }, function (_) { _0 = _; return [_0, 2] }) }`)
|
|
112
|
+
assert(downLevel(`async function(a){await a,await b}`), `function (a) { return async_(function () { _0 = a; return [_0, 1] }, function (_) { _0 = b; return [_0, 1] }) }`)
|
|
113
|
+
assert(downLevel(`async function(){await a,await b}`), `function () { return async_(function () { _0 = a; return [_0, 1] }, function (_) { _0 = b; return [_0, 1] }) }`)
|
|
114
|
+
assert(downLevel(`async function(a){ if(c)await a,await b;else if(s) await c;}`), `function (a) { return async_(function () { if (!c) return [3, 0]; _0 = a; return [_0, 1] }, function (_) { _0 = b; return [_0, 1] }, function (_) { return [2, 0] }, function (_) { if (!s) return [1, 0]; _0 = c; return [_0, 1] }) }`)
|
|
115
|
+
assert(downLevel(`async function(a){ for(i=1;i<2;i++) await 1 }`), `function (a) { return async_(function () { i = 1; return [1, 0] }, function (_) { _0 = i < 2; if (!_0) return [3, 0] }, function (_) { _0 = 1; return [_0, 1] }, function (_) { _0 = i++; return [-2, 0] }) }`)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var powermap = {};
|
|
2
|
+
[
|
|
3
|
+
'=,+=,-=,*=,/=,%=,|=,&=,^=,**=,~=,?,:,=>'/* 1 */,
|
|
4
|
+
'&&,||,??'/* 4 */, '&,|,^'/* 5 */,
|
|
5
|
+
'instanceof,in,==,>=,<=,>,<,!=,!==,===,!in,!instanceof'/* 6 */,
|
|
6
|
+
'>>,>>>,<<'/* 7 */, '+,-'/* 8 */, '*,/,%'/* 9 */, '**'/* 10 */,
|
|
7
|
+
'typeof,await,yield,new,delete,!,~'/* 11 */, '++,--'/* 12 */
|
|
8
|
+
].forEach((pp, i) => {
|
|
9
|
+
pp.split(",").forEach(p => {
|
|
10
|
+
powermap[p] = i + 1;
|
|
11
|
+
})
|
|
12
|
+
});
|