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.
- package/coms/basic_/Symbol.js +11 -0
- package/coms/basic_/aster_.js +35 -0
- package/coms/basic_/asyncAster_.js +50 -0
- package/coms/basic_/async_.js +2 -60
- package/coms/basic_/exec_.js +62 -0
- package/coms/compile/Javascript.js +1 -1
- package/coms/compile/common.js +4 -1
- package/coms/compile/createExpressList_test.js +2 -1
- package/coms/compile/downLevel.js +13 -17
- package/coms/compile/unstruct.js +73 -28
- package/coms/compile/unstruct_test.js +16 -13
- package/coms/zimoli/zimoli.js +0 -12
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/coms/basic_/Symbol.js
CHANGED
|
@@ -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
|
+
}
|
package/coms/basic_/async_.js
CHANGED
|
@@ -1,62 +1,4 @@
|
|
|
1
|
-
|
|
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(
|
|
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
|
|
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)$/;
|
package/coms/compile/common.js
CHANGED
|
@@ -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();
|
|
@@ -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
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
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(
|
|
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 []'));
|
package/coms/compile/unstruct.js
CHANGED
|
@@ -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(
|
|
191
|
-
|
|
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
|
-
|
|
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 ===
|
|
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 &&
|
|
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
|
-
|
|
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
|
-
|
|
417
|
-
|
|
418
|
-
|
|
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(
|
|
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|
|
|
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,
|
|
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', "
|
|
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', "
|
|
28
|
-
test('a * a && b * c * c ** d', "_ = a * a; if (!_) return [1, 0]; _ = b * c, _0 = c ** d, _
|
|
29
|
-
test('a * a || b * c * c ** d', "_ = a * a; if (_) return [1, 0]; _ = b * c, _0 = c ** d, _
|
|
30
|
-
test('a * a ?? b * c * c ** d', "_ = a * a; if (_ !== null && _ !== undefined) return [1, 0]; _ = b * c, _0 = c ** d, _
|
|
31
|
-
test('a * a && await b*c', "_ = a * a; if (!_) return [2, 0]; _ = b; return [_, 1]; _ = @; _
|
|
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("(
|
|
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 = @; _
|
|
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 = @; _
|
|
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]; _ = @; _
|
|
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 (
|
|
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("
|
|
52
|
-
test("
|
|
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);
|
package/coms/zimoli/zimoli.js
CHANGED
|
@@ -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
|
};
|