efront 4.7.0 → 4.7.2
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/#/345/233/275/351/231/205/345/214/226.yml +4 -1
- package/apps/moue/home/index2.vue +1 -1
- package/coms/basic_/exec_.js +3 -6
- package/coms/basic_/exec_test.js +31 -5
- package/coms/compile/audit.js +106 -8
- package/coms/compile/audit_test.js +18 -3
- package/coms/compile/autoenum_test.js +1 -1
- package/coms/compile/common.js +105 -31
- package/coms/compile/downLevel.js +11 -11
- package/coms/docs/codecolor.js +3 -3
- package/coms/reptile/colors.js +2 -2
- package/coms/third-party/crypto.js +2 -1
- package/coms/zimoli/menu.js +2 -1
- package/coms/zimoli/moue.js +1 -0
- package/coms/zimoli/select.js +2 -1
- package/coms/zimoli/slider.js +2 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
- zh-CN: 以后不会再测试是否兼容vue了,也不准备增加对vue3及后续版本的支持,望知悉。
|
|
2
|
+
en: "We will no longer test whether it is compatible with Vue in the future, and we are not planning to add support for Vue3 and subsequent versions. Please be informed."
|
|
3
|
+
|
|
1
4
|
- zh-CN: 检查完毕!
|
|
2
5
|
en: Check completed!
|
|
3
6
|
|
|
@@ -227,7 +230,7 @@
|
|
|
227
230
|
en: !
|
|
228
231
|
|
|
229
232
|
- zh-CN: https://letsencrypt.org/zh-cn/
|
|
230
|
-
en:
|
|
233
|
+
en: https://letsencrypt.org/
|
|
231
234
|
|
|
232
235
|
- zh-CN: 没有发现上传函数
|
|
233
236
|
en: No upload function found
|
package/coms/basic_/exec_.js
CHANGED
|
@@ -21,7 +21,6 @@ var exec_ = function (args, ok, oh, int) {
|
|
|
21
21
|
next(err);
|
|
22
22
|
}
|
|
23
23
|
else {
|
|
24
|
-
catches.pop();
|
|
25
24
|
fina();
|
|
26
25
|
}
|
|
27
26
|
}
|
|
@@ -32,7 +31,7 @@ var exec_ = function (args, ok, oh, int) {
|
|
|
32
31
|
var retn = function (p) {
|
|
33
32
|
r = p;
|
|
34
33
|
finished = true;
|
|
35
|
-
if (catches.length) fina();
|
|
34
|
+
if (catch_ || catches.length) fina();
|
|
36
35
|
else ok(r);
|
|
37
36
|
};
|
|
38
37
|
var fina = function () {
|
|
@@ -44,7 +43,6 @@ var exec_ = function (args, ok, oh, int) {
|
|
|
44
43
|
next();
|
|
45
44
|
};
|
|
46
45
|
var fine = function () {
|
|
47
|
-
catches.pop();
|
|
48
46
|
if (throwed) thro(e);
|
|
49
47
|
else if (finished) retn(r);
|
|
50
48
|
else {
|
|
@@ -57,11 +55,9 @@ var exec_ = function (args, ok, oh, int) {
|
|
|
57
55
|
while (index < args_length) {
|
|
58
56
|
try {
|
|
59
57
|
var a = args[index](p) || [1, 0];
|
|
60
|
-
catch_ = null;
|
|
61
58
|
p = a[0];
|
|
62
59
|
i = a[1];
|
|
63
60
|
} catch (e) {
|
|
64
|
-
p = null;
|
|
65
61
|
thro(e);
|
|
66
62
|
return;
|
|
67
63
|
}
|
|
@@ -73,12 +69,13 @@ var exec_ = function (args, ok, oh, int) {
|
|
|
73
69
|
try {
|
|
74
70
|
return p.then(next, thro);
|
|
75
71
|
} catch (e) {
|
|
76
|
-
return Promise.reject(e).then(
|
|
72
|
+
return Promise.reject(e).then(null, thro);
|
|
77
73
|
}
|
|
78
74
|
}
|
|
79
75
|
else return next(p);
|
|
80
76
|
case 2: return finished = true, retn(p); // return p;
|
|
81
77
|
case 3: return index++, int(p, next); // yield p;
|
|
78
|
+
case 4: return thro(p); // throw p; 目前无此返回值
|
|
82
79
|
case 7: index++; catches.push([index, p]); break; // try catch finally?
|
|
83
80
|
case 8: index++; catches.push([index, p, 1]); break; // try finally
|
|
84
81
|
case 9: return p ? fine() : fina(); // finally
|
package/coms/basic_/exec_test.js
CHANGED
|
@@ -11,7 +11,14 @@ var b = async function () {
|
|
|
11
11
|
console.log(3, process.uptime())
|
|
12
12
|
try {
|
|
13
13
|
console.log(4, 'try');
|
|
14
|
-
|
|
14
|
+
try {
|
|
15
|
+
throw "这个错误不该出现";
|
|
16
|
+
} catch {
|
|
17
|
+
await Promise.reject('这个错误不该出现');
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
throw await Promise.resolve(5)
|
|
21
|
+
}
|
|
15
22
|
} catch (e) {
|
|
16
23
|
console.log(e, 'catched')
|
|
17
24
|
throw 7;
|
|
@@ -27,22 +34,41 @@ var c = async function () {
|
|
|
27
34
|
|
|
28
35
|
await b();
|
|
29
36
|
} catch (e) {
|
|
30
|
-
console.log(e)
|
|
37
|
+
console.log(e, 'catched')
|
|
31
38
|
return 9;
|
|
32
39
|
}
|
|
33
40
|
finally {
|
|
34
|
-
console.log(8)
|
|
41
|
+
console.log(8, 'finally')
|
|
35
42
|
}
|
|
36
43
|
};
|
|
37
44
|
var d = async function () {
|
|
38
45
|
try {
|
|
39
|
-
throw new Error(
|
|
46
|
+
throw new Error("不该出现此错误");
|
|
40
47
|
}
|
|
41
48
|
catch (e) {
|
|
49
|
+
console.log(10, 'catched');
|
|
42
50
|
throw e;
|
|
43
51
|
}
|
|
52
|
+
finally {
|
|
53
|
+
console.log(11);
|
|
54
|
+
return 12;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
var e = async function () {
|
|
58
|
+
try {
|
|
59
|
+
throw new Error("不该出现此错误");
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
console.log(13, 'catched');
|
|
63
|
+
throw e;
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
console.log(14);
|
|
67
|
+
throw new Error("这是最后的报错");
|
|
68
|
+
}
|
|
44
69
|
}
|
|
45
70
|
console.log(0, process.uptime())
|
|
46
71
|
await a();
|
|
47
72
|
console.log(await c());
|
|
48
|
-
await d();
|
|
73
|
+
console.log(await d());
|
|
74
|
+
await e();
|
package/coms/compile/audit.js
CHANGED
|
@@ -1,7 +1,35 @@
|
|
|
1
|
-
var { STAMP,
|
|
1
|
+
var { STAMP, getDeclared, VALUE, STRAP, SCOPED, QUOTED, snapSentenceHead, pickSentence, createString, getBodyWith } = require("./common");
|
|
2
|
+
var addAccessedStart = function (matched, namedMap) {
|
|
3
|
+
var start = +namedMap["#1"];
|
|
4
|
+
var body = getBodyWith(matched[0], 'arguments');
|
|
5
|
+
if (body.reststart < start) return;
|
|
6
|
+
body.reststart = start;
|
|
7
|
+
};
|
|
8
|
+
var getLoop = function (c, root) {
|
|
9
|
+
var loop = null;
|
|
10
|
+
do {
|
|
11
|
+
var h = snapSentenceHead(c);
|
|
12
|
+
if (h.type === STRAP && /^(do|while|for)$/.test(h.text)) {
|
|
13
|
+
loop = h;
|
|
14
|
+
}
|
|
15
|
+
var p = h.prev;
|
|
16
|
+
while (p?.type === SCOPED && p.entry === "(") {
|
|
17
|
+
h = snapSentenceHead(p);
|
|
18
|
+
if (/^(while|for)$/.test(h.text)) {
|
|
19
|
+
loop = h;
|
|
20
|
+
}
|
|
21
|
+
if (!/^(if|with)$/.test(h.text)) break;
|
|
22
|
+
p = h.prev;
|
|
23
|
+
}
|
|
24
|
+
c = h.queue;
|
|
25
|
+
} while (c?.type === SCOPED && c !== root)
|
|
26
|
+
return loop;
|
|
27
|
+
}
|
|
2
28
|
var suggest = {
|
|
3
29
|
"while($2[$1++]!==$3)": "while($1<$2.length&&$2[$1++]!==$3)",
|
|
4
30
|
"while($2[$1]!==$3)$1++": "while($1<$2.length&&$2[$1]!==$3)$1++",
|
|
31
|
+
"for(var $1=#1,$2=arguments.length;$1<$2;$1++)": addAccessedStart,
|
|
32
|
+
"for(var $1=#1;$1<arguments.length;$1++)": addAccessedStart,
|
|
5
33
|
"arguments"(matched) {
|
|
6
34
|
var m = matched[0];
|
|
7
35
|
var body = getBodyWith(m, 'arguments');
|
|
@@ -10,19 +38,53 @@ var suggest = {
|
|
|
10
38
|
body.checked = true;
|
|
11
39
|
var { used, args } = body.scoped;
|
|
12
40
|
if (!args?.length) return;
|
|
41
|
+
var access_start = body.reststart ?? args?.length;
|
|
42
|
+
a: if (access_start > 0) {
|
|
43
|
+
for (var a of used.arguments) {
|
|
44
|
+
if (a.text !== 'arguments') continue;
|
|
45
|
+
var n = a.next;
|
|
46
|
+
if (!n || n.type !== SCOPED || n.entry !== '[') {
|
|
47
|
+
access_start = 0;
|
|
48
|
+
break a;
|
|
49
|
+
}
|
|
50
|
+
if (n.last && n.last === n.first) {
|
|
51
|
+
if (n.last.isdigit) {
|
|
52
|
+
var i = +n.last.text;
|
|
53
|
+
if (i < access_start) access_start = i;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (access_start >= args.length) return;
|
|
13
59
|
var broken = false;
|
|
60
|
+
var arguments = used.arguments;
|
|
61
|
+
var arg_start = Infinity;
|
|
14
62
|
a: for (var a of args) {
|
|
15
|
-
if (
|
|
63
|
+
if (access_start > 0) {
|
|
64
|
+
access_start--;
|
|
16
65
|
continue;
|
|
17
66
|
}
|
|
67
|
+
if (typeof a !== 'string') continue;
|
|
18
68
|
for (var u of used[a]) {
|
|
19
69
|
if (u.equal) {
|
|
70
|
+
var loop = getLoop(u, body);
|
|
71
|
+
var astart;
|
|
72
|
+
if (loop) {
|
|
73
|
+
astart = loop.start;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
var s = pickSentence(u);
|
|
77
|
+
astart = s[s.length - 1].end;
|
|
78
|
+
}
|
|
79
|
+
if (astart < arg_start) arg_start = astart;
|
|
20
80
|
broken = true;
|
|
21
81
|
break a;
|
|
22
82
|
}
|
|
23
83
|
}
|
|
24
84
|
}
|
|
25
85
|
if (!broken) return;
|
|
86
|
+
arguments = arguments.filter(a => a.start >= arg_start);
|
|
87
|
+
if (!arguments.length) return;
|
|
26
88
|
var h = snapSentenceHead(body);
|
|
27
89
|
var matched = [];
|
|
28
90
|
while (h && h !== body) {
|
|
@@ -33,23 +95,58 @@ var suggest = {
|
|
|
33
95
|
return matched;
|
|
34
96
|
}
|
|
35
97
|
};
|
|
98
|
+
|
|
99
|
+
var regSuggest = function (c) {
|
|
100
|
+
if (c.type !== QUOTED) return;
|
|
101
|
+
var flag = /\/(\w+)$/.exec(c.text)?.[1];
|
|
102
|
+
if (!flag || !/g\w*$/.test(flag)) return;
|
|
103
|
+
var h = snapSentenceHead(c);
|
|
104
|
+
if (h.type === STRAP || /^(var|let|const)$/.test(h)) {
|
|
105
|
+
h = h.next;
|
|
106
|
+
}
|
|
107
|
+
if (!h.equal) return;
|
|
108
|
+
var [args] = getDeclared(h);
|
|
109
|
+
var scoped = getBodyWith(c, args[0]).scoped;
|
|
110
|
+
if (!scoped?.await && !scoped.yield) return;
|
|
111
|
+
var matched = [c];
|
|
112
|
+
matched.suggest = `new RegExp(${c.text.slice(0, c.text.length - flag.length)}.source,"${flag}")`;
|
|
113
|
+
return matched;
|
|
114
|
+
};
|
|
115
|
+
|
|
36
116
|
var roles = Object.keys(suggest).map(s => {
|
|
37
117
|
var r = scanner2(s);
|
|
38
|
-
var { used
|
|
39
|
-
for (var k in
|
|
118
|
+
var { used } = r;
|
|
119
|
+
for (var k in used) {
|
|
40
120
|
used[k].forEach(f => {
|
|
41
|
-
|
|
121
|
+
if (/^\#\d+$/.test(f.text)) {
|
|
122
|
+
f.isdigit = true;
|
|
123
|
+
f.type = VALUE;
|
|
124
|
+
f.sname = f.text;
|
|
125
|
+
}
|
|
126
|
+
else if (/^\$\d+$/.test(f.text)) {
|
|
127
|
+
f.sname = f.text;
|
|
128
|
+
}
|
|
42
129
|
});
|
|
43
130
|
}
|
|
131
|
+
r.matcher = s;
|
|
44
132
|
s = suggest[s];
|
|
45
133
|
if (typeof s === 'string') r.suggest = scanner2(s);
|
|
46
134
|
else r.suggest = s;
|
|
47
135
|
return r;
|
|
48
|
-
});
|
|
136
|
+
}).concat(regSuggest);
|
|
49
137
|
var match = function (role, c, nameMap = {}) {
|
|
50
138
|
var temp = role.first;
|
|
51
139
|
var matched = [];
|
|
140
|
+
if (typeof role === 'function') {
|
|
141
|
+
return role(c);
|
|
142
|
+
}
|
|
52
143
|
while (temp) {
|
|
144
|
+
if (temp.type === STRAP && /^(var|let|const)$/.test(temp.text)) {
|
|
145
|
+
if (!c) return;
|
|
146
|
+
temp = temp.next;
|
|
147
|
+
if (!temp) return;
|
|
148
|
+
if (c.type === STRAP && /^(var|let|const)$/.test(c.text)) c = c.next;
|
|
149
|
+
}
|
|
53
150
|
if (!c || c.type !== temp.type) return;
|
|
54
151
|
if (temp.sname) {
|
|
55
152
|
var name = temp.sname;
|
|
@@ -71,7 +168,7 @@ var match = function (role, c, nameMap = {}) {
|
|
|
71
168
|
}
|
|
72
169
|
if (role.suggest) {
|
|
73
170
|
if (isFunction(role.suggest))
|
|
74
|
-
return role.suggest(matched);
|
|
171
|
+
return role.suggest(matched, nameMap);
|
|
75
172
|
var { used } = role.suggest;
|
|
76
173
|
for (var k in nameMap) {
|
|
77
174
|
if (used[k]) patchlist('', used[k], nameMap[k]);
|
|
@@ -88,7 +185,8 @@ var audit = function (code) {
|
|
|
88
185
|
while (rest.length) {
|
|
89
186
|
var c = rest.pop();
|
|
90
187
|
if (c.length) {
|
|
91
|
-
|
|
188
|
+
var a = c.slice().reverse();
|
|
189
|
+
rest.push.apply(rest, a);
|
|
92
190
|
}
|
|
93
191
|
var m = match(r, c);
|
|
94
192
|
if (!m) continue;
|
|
@@ -7,10 +7,25 @@ function a(a) {
|
|
|
7
7
|
console.log(arguments);
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
class a{
|
|
10
|
+
class a {
|
|
11
11
|
a
|
|
12
|
-
b(c){
|
|
13
|
-
c=2;
|
|
12
|
+
b(c) {
|
|
13
|
+
c = 2;
|
|
14
14
|
arguments;
|
|
15
15
|
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
// 正则表达式在异步函数中无法并发执行,是efront提取正则所致,目前要由用户手动处理
|
|
20
|
+
async function c() {
|
|
21
|
+
var reg = /a/g;
|
|
22
|
+
while (true) {
|
|
23
|
+
await wait(20);
|
|
24
|
+
reg.exec("aaa");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 正则表达式在步进函数中无法并发执行,是efront提取正则所致,目前要由用户手动处理
|
|
29
|
+
async function *c() {
|
|
30
|
+
var reg = /a/g;
|
|
16
31
|
}
|
|
@@ -11,7 +11,7 @@ t("var a=1;console.log(a)", "var a = 1; console.log(1)");
|
|
|
11
11
|
t("a.b = 2;console.log(a.b)", "a.b = 2; console.log(2)");
|
|
12
12
|
t("a/*a*/.b = 2;console.log(a.b)", "a/*a*/.b = 2; console.log(2)");
|
|
13
13
|
t("a.b = 2;console.log(a/*aaaa*/.b)", "a.b = 2; console.log(2)");
|
|
14
|
-
t("a.b = 2;console.log(/*bbbb*/a.b)", "a.b = 2; console.log(/*bbbb*/
|
|
14
|
+
t("a.b = 2;console.log(/*bbbb*/a.b)", "a.b = 2; console.log(/*bbbb*/2)");
|
|
15
15
|
t("var {a=1};console.log(a)", "var { a = 1 }; console.log(a)");
|
|
16
16
|
t("if(c) a=1;console.log(a)", "if (c) a = 1; console.log(a)");
|
|
17
17
|
t("console.log(a);a=1;", "console.log(a); a = 1;");
|
package/coms/compile/common.js
CHANGED
|
@@ -16,7 +16,7 @@ const [
|
|
|
16
16
|
// --------------//1//2/////////////////////////22/////////////2//2//3//4/////4////////3/////3//////3//3//////3///////211/////////////2//////2//////1///
|
|
17
17
|
var number_reg = /^(?:(?:0x[0-9a-f]+|0b\d+|0o\d+|0[0-7]+)(?:_[0-9a-f]+)*|(?:(?:(?:\d+_)*\d+|\d*)\.\d+(?:_\d+)*|(?:\d+_)*\d+\.?))(?:e[\+\-]?\d+(?:_\d+)*|[ijklmnu]+)?/i;
|
|
18
18
|
var equal_reg = /^(?:[\+\-\*\/~\^&\|%]|\*\*|>>>?|<<)?\=$|^(?:\+\+|\-\-)$/;
|
|
19
|
-
var needhead_reg = /^\?\.|^\.[^\.]|^\[/;
|
|
19
|
+
var needhead_reg = /^\?\.|^\.(?:[^\.]|$)|^\[/;
|
|
20
20
|
var skipAssignment = function (o, cx) {
|
|
21
21
|
if (!o) return;
|
|
22
22
|
var next = arguments.length === 1 ? function () {
|
|
@@ -219,14 +219,82 @@ function skipFunction(o) {
|
|
|
219
219
|
}
|
|
220
220
|
return o;
|
|
221
221
|
}
|
|
222
|
+
var getDoBeforeWhile = function (while_) {
|
|
223
|
+
var p = while_.prev;
|
|
224
|
+
if (!p || p.type !== SCOPED || p.entry !== '{') return;
|
|
225
|
+
p = p.prev;
|
|
226
|
+
if (p.type === STRAP && p.text === "do") return p;
|
|
227
|
+
};
|
|
228
|
+
var getIfElseHead = function (if_) {
|
|
229
|
+
var p = if_;
|
|
230
|
+
do {
|
|
231
|
+
if_ = p;
|
|
232
|
+
p = if_.prev;
|
|
233
|
+
if (!p || p.type !== STRAP || p.text !== 'else') {
|
|
234
|
+
return if_;
|
|
235
|
+
}
|
|
236
|
+
while (p && (p.type !== STRAP || p.text !== 'if')) p = p.prev;
|
|
237
|
+
} while (p);
|
|
238
|
+
};
|
|
239
|
+
var getContitionHeadBeforeScoped = function (p, nodo) {
|
|
240
|
+
var pp = p.prev;
|
|
241
|
+
if (pp.type !== STRAP) return;
|
|
242
|
+
if (pp.text === 'await') {
|
|
243
|
+
pp = pp.prev;
|
|
244
|
+
if (pp?.type === STRAP && pp.text === "for") {
|
|
245
|
+
return pp;
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
else switch (pp.text) {
|
|
249
|
+
case "with":
|
|
250
|
+
case "for":
|
|
251
|
+
return pp;
|
|
252
|
+
case "while":
|
|
253
|
+
p = getDoBeforeWhile(pp);
|
|
254
|
+
if (p) {
|
|
255
|
+
if (nodo) return;
|
|
256
|
+
return p;
|
|
257
|
+
}
|
|
258
|
+
return pp;
|
|
259
|
+
case "if":
|
|
260
|
+
return getIfElseHead(pp);
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
var getFunctionHeadBeforeScoped = function (p) {
|
|
264
|
+
var pp = p.prev;
|
|
265
|
+
if (pp && pp.type === EXPRESS) pp = pp.prev;
|
|
266
|
+
if (pp && pp.text === '*') pp = pp.prev;
|
|
267
|
+
if (pp && pp.type === STRAP && pp.text === 'function') {
|
|
268
|
+
p = pp;
|
|
269
|
+
pp = pp.prev;
|
|
270
|
+
if (pp && pp.type === STRAP && pp.text === 'async') {
|
|
271
|
+
p = pp;
|
|
272
|
+
}
|
|
273
|
+
return p;
|
|
274
|
+
}
|
|
275
|
+
while (pp?.isprop) {
|
|
276
|
+
p = pp;
|
|
277
|
+
pp = pp.prev;
|
|
278
|
+
if (pp?.isend) break;
|
|
279
|
+
}
|
|
280
|
+
if (p.isprop) return p;
|
|
281
|
+
}
|
|
222
282
|
function snapSentenceHead(o) {
|
|
223
283
|
// 只检查一级
|
|
224
284
|
while (o && o.prev) {
|
|
225
285
|
var p = o.prev;
|
|
226
|
-
if (o.entry === '('
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
286
|
+
if (o.entry === '(') {
|
|
287
|
+
if (!(p.type & (STAMP | STRAP))) {
|
|
288
|
+
o = p;
|
|
289
|
+
p = o.prev;
|
|
290
|
+
if (!p) break;
|
|
291
|
+
}
|
|
292
|
+
else if (p.type === STRAP) {
|
|
293
|
+
var pp = getContitionHeadBeforeScoped(o, false);
|
|
294
|
+
if (pp) { o = pp; break; }
|
|
295
|
+
pp = getFunctionHeadBeforeScoped(o);
|
|
296
|
+
if (pp) { o = pp; continue };
|
|
297
|
+
}
|
|
230
298
|
}
|
|
231
299
|
var maybeprop = o.type === SCOPED && o.entry !== "{" || o.type === EXPRESS && /^[\.\[]/.test(o.text);
|
|
232
300
|
if (p.type === EXPRESS) {
|
|
@@ -254,18 +322,10 @@ function snapSentenceHead(o) {
|
|
|
254
322
|
continue;
|
|
255
323
|
}
|
|
256
324
|
if (p.entry === "(" && o.type === SCOPED) {
|
|
257
|
-
var pp = p
|
|
258
|
-
if (pp
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
pp = pp.prev;
|
|
262
|
-
continue;
|
|
263
|
-
}
|
|
264
|
-
while (pp?.isprop) {
|
|
265
|
-
o = pp;
|
|
266
|
-
pp = pp.prev;
|
|
267
|
-
if (pp?.isend) break;
|
|
268
|
-
}
|
|
325
|
+
var pp = getContitionHeadBeforeScoped(p, true);
|
|
326
|
+
if (pp) { o = pp; break; }
|
|
327
|
+
var pp = getFunctionHeadBeforeScoped(p);
|
|
328
|
+
if (pp) { o = pp; continue; }
|
|
269
329
|
}
|
|
270
330
|
break;
|
|
271
331
|
}
|
|
@@ -434,7 +494,7 @@ var snapExpressFoot = function (o) {
|
|
|
434
494
|
};
|
|
435
495
|
var createScoped = function (parsed, wash) {
|
|
436
496
|
var used = Object.create(null); var vars = Object.create(null), lets = vars;
|
|
437
|
-
var scoped = [], funcbody = scoped, argscope = scoped, thisscope = scoped;
|
|
497
|
+
var scoped = [], funcbody = scoped, argscope = scoped, thisscope = scoped, labelused = used;
|
|
438
498
|
funcbody.isroot = true;
|
|
439
499
|
scoped.body = parsed;
|
|
440
500
|
scoped.isfunc = true;
|
|
@@ -492,7 +552,7 @@ var createScoped = function (parsed, wash) {
|
|
|
492
552
|
else {
|
|
493
553
|
var u = o.text;
|
|
494
554
|
if (/^\.\.\./.test(u)) u = u.slice(3);
|
|
495
|
-
var u = u.replace(/^([^\.\[
|
|
555
|
+
var u = u.replace(/^([^\.\[\?\s]*)[\s\S]*$/, '$1');
|
|
496
556
|
if (!u) break;
|
|
497
557
|
var prev = o.prev;
|
|
498
558
|
if (prev && prev.type === STAMP && /^(?:\+\+|\-\-)$/.test(prev.text)) {
|
|
@@ -506,7 +566,7 @@ var createScoped = function (parsed, wash) {
|
|
|
506
566
|
break;
|
|
507
567
|
case LABEL:
|
|
508
568
|
var name = o.text;
|
|
509
|
-
name = name.
|
|
569
|
+
name = name.replace(/\s*\:$/, '');
|
|
510
570
|
vars[name] = true;
|
|
511
571
|
o.kind = "label";
|
|
512
572
|
saveTo(used, name, o);
|
|
@@ -516,11 +576,20 @@ var createScoped = function (parsed, wash) {
|
|
|
516
576
|
var s = o.text;
|
|
517
577
|
var m = null;
|
|
518
578
|
switch (s) {
|
|
579
|
+
case "break":
|
|
580
|
+
case "continue":
|
|
581
|
+
if (o.isend) break;
|
|
582
|
+
o = o.next;
|
|
583
|
+
if (o?.type === EXPRESS) {
|
|
584
|
+
saveTo(labelused, o.text, o);
|
|
585
|
+
}
|
|
586
|
+
break;
|
|
519
587
|
case "return":
|
|
520
588
|
if (!funcbody.return) funcbody.return = [];
|
|
521
589
|
funcbody.return.push(o);
|
|
522
590
|
break;
|
|
523
591
|
case "await":
|
|
592
|
+
funcbody.async = funcbody.await = true;
|
|
524
593
|
break;
|
|
525
594
|
case "as":
|
|
526
595
|
case "from":
|
|
@@ -629,6 +698,7 @@ var createScoped = function (parsed, wash) {
|
|
|
629
698
|
var _funcbody = funcbody;
|
|
630
699
|
var _argscope = argscope;
|
|
631
700
|
var _thisscope = thisscope;
|
|
701
|
+
var _labelused = labelused;
|
|
632
702
|
used = Object.create(null);
|
|
633
703
|
lets = Object.create(null);
|
|
634
704
|
vars = Object.create(null);
|
|
@@ -645,7 +715,8 @@ var createScoped = function (parsed, wash) {
|
|
|
645
715
|
thisscope = scoped;
|
|
646
716
|
argscope = scoped;
|
|
647
717
|
}
|
|
648
|
-
|
|
718
|
+
labelused = used;
|
|
719
|
+
scoped.async = isAsync;
|
|
649
720
|
scoped.isfunc = true;
|
|
650
721
|
isFunction = true;
|
|
651
722
|
if (function_obj) function_obj.scoped = scoped;
|
|
@@ -764,6 +835,7 @@ var createScoped = function (parsed, wash) {
|
|
|
764
835
|
}
|
|
765
836
|
if (keepscope) {
|
|
766
837
|
var envs = Object.create(null);
|
|
838
|
+
var caps = Object.create(null);
|
|
767
839
|
for (var k in used) {
|
|
768
840
|
if (!(k in map)) {
|
|
769
841
|
envs[k] = true;
|
|
@@ -771,7 +843,11 @@ var createScoped = function (parsed, wash) {
|
|
|
771
843
|
saveTo(_used, k, u);
|
|
772
844
|
}
|
|
773
845
|
}
|
|
846
|
+
else {
|
|
847
|
+
caps[k] = used[k];
|
|
848
|
+
}
|
|
774
849
|
}
|
|
850
|
+
scoped.caps = caps;
|
|
775
851
|
scoped.envs = envs;
|
|
776
852
|
_scoped.push(scoped);
|
|
777
853
|
}
|
|
@@ -787,6 +863,7 @@ var createScoped = function (parsed, wash) {
|
|
|
787
863
|
if (isClass) delete lets.super, delete lets.this, thisscope = _thisscope;
|
|
788
864
|
if (isFunction) {
|
|
789
865
|
funcbody = _funcbody;
|
|
866
|
+
labelused = _labelused;
|
|
790
867
|
if (!isArrow) {
|
|
791
868
|
delete vars.this;
|
|
792
869
|
delete vars.arguments;
|
|
@@ -807,6 +884,7 @@ var createScoped = function (parsed, wash) {
|
|
|
807
884
|
run(parsed.first);
|
|
808
885
|
scoped.used = used;
|
|
809
886
|
scoped.vars = vars;
|
|
887
|
+
scoped.caps = used;
|
|
810
888
|
var envs = Object.create(null);
|
|
811
889
|
for (var u in used) {
|
|
812
890
|
if (!(u in vars)) {
|
|
@@ -1257,12 +1335,8 @@ var rename = function (used, from, to) {
|
|
|
1257
1335
|
if (doted) text = "..." + text;
|
|
1258
1336
|
if (u.type === PROPERTY) {
|
|
1259
1337
|
if (u.short) {
|
|
1260
|
-
|
|
1261
|
-
q.splice(q.indexOf(u), 0, { type: PROPERTY, text: u.text }, { type: STAMP, text: ":" });
|
|
1262
|
-
u.short = false;
|
|
1263
|
-
u.type = EXPRESS;
|
|
1338
|
+
unshort(u);
|
|
1264
1339
|
u.text = text;
|
|
1265
|
-
relink(q);
|
|
1266
1340
|
}
|
|
1267
1341
|
continue;
|
|
1268
1342
|
}
|
|
@@ -1493,21 +1567,21 @@ var unshort = function (o, text) {
|
|
|
1493
1567
|
};
|
|
1494
1568
|
var getBodyWith = function (o, k) {
|
|
1495
1569
|
var q = o.queue;
|
|
1496
|
-
while (q && (!q.scoped || !q.scoped.
|
|
1570
|
+
while (q && (!q.scoped || !q.scoped.caps[k])) q = q.queue;
|
|
1497
1571
|
return q;
|
|
1498
1572
|
};
|
|
1499
1573
|
|
|
1500
1574
|
var patchArrawScope = function (arraw, origin) {
|
|
1501
1575
|
var s1 = createScoped(arraw);
|
|
1502
|
-
if (s1.
|
|
1576
|
+
if (s1.caps.this) {
|
|
1503
1577
|
var s = getBodyWith(origin, 'this').scoped;
|
|
1504
|
-
s.
|
|
1578
|
+
s.caps.this.push(...s1.caps.this);
|
|
1505
1579
|
s.insett = true;
|
|
1506
1580
|
}
|
|
1507
|
-
if (s1.
|
|
1581
|
+
if (s1.caps.arguments) {
|
|
1508
1582
|
s.inseta = true;
|
|
1509
1583
|
var s = getBodyWith(origin, 'arguments').scoped;
|
|
1510
|
-
s.
|
|
1584
|
+
s.caps.arguments.push(...s1.caps.arguments);
|
|
1511
1585
|
};
|
|
1512
1586
|
};
|
|
1513
1587
|
|
|
@@ -666,13 +666,13 @@ var killcls = function (body, i, letname_, getname_) {
|
|
|
666
666
|
relink(constructor[1]);
|
|
667
667
|
var cs = createScoped(constructor[1]);
|
|
668
668
|
var newt = getname(cs.vars, cs.envs, 'this_');
|
|
669
|
-
if (cs.
|
|
669
|
+
if (cs.caps.this) rename(cs.caps, 'this', newt);
|
|
670
670
|
var inited = false;
|
|
671
671
|
assign.forEach(o => {
|
|
672
672
|
if (o.type === EXPRESS) o.text = o.text.replace(/^this([\[\.]|$)/g, newt + "$1");
|
|
673
673
|
});
|
|
674
|
-
if (cs.
|
|
675
|
-
cs.
|
|
674
|
+
if (cs.caps.super) {
|
|
675
|
+
cs.caps.super.forEach(o => {
|
|
676
676
|
if (o.text !== 'super') return;
|
|
677
677
|
var n = o.next;
|
|
678
678
|
if (!n || n.type !== SCOPED || n.entry !== "(") return;
|
|
@@ -687,8 +687,8 @@ var killcls = function (body, i, letname_, getname_) {
|
|
|
687
687
|
insert1(o.queue, n.next, ...scanner2(`||this;`));
|
|
688
688
|
})
|
|
689
689
|
}
|
|
690
|
-
if (scoped.
|
|
691
|
-
scoped.
|
|
690
|
+
if (scoped.caps.super) {
|
|
691
|
+
scoped.caps.super.forEach(o => {
|
|
692
692
|
if (!/^super(\.|\[|$)/.test(o.text)) return;
|
|
693
693
|
o.text = `${base}["prototype"]` + o.text.replace(/^super/, '');
|
|
694
694
|
insert1(o.queue, o.next, ...scanner2('["bind"](this)'));
|
|
@@ -1674,16 +1674,16 @@ var down = function (scoped) {
|
|
|
1674
1674
|
};
|
|
1675
1675
|
|
|
1676
1676
|
var markcodes = [];
|
|
1677
|
-
if (scoped.isfunc && scoped.
|
|
1677
|
+
if (scoped.isfunc && scoped.caps.this && (funcMark && !scoped.isArrow || scoped.insett)) {
|
|
1678
1678
|
let tn = _getname("this_");
|
|
1679
|
-
rename(scoped.
|
|
1680
|
-
scoped.
|
|
1679
|
+
rename(scoped.caps, "this", tn);
|
|
1680
|
+
scoped.caps.this.forEach(o => o.origin = 'this');
|
|
1681
1681
|
markcodes.push(`${tn}=this`);
|
|
1682
1682
|
}
|
|
1683
|
-
if (scoped.isfunc && scoped.
|
|
1683
|
+
if (scoped.isfunc && scoped.caps.arguments && (funcMark && !scoped.isArrow || scoped.inseta)) {
|
|
1684
1684
|
let an = _getname("arguments_");
|
|
1685
|
-
scoped.
|
|
1686
|
-
rename(scoped.
|
|
1685
|
+
scoped.caps.arguments.forEach(o => o.origin = 'arguments');
|
|
1686
|
+
rename(scoped.caps, "arguments", an);
|
|
1687
1687
|
markcodes.push(`${an}=arguments`);
|
|
1688
1688
|
}
|
|
1689
1689
|
var fordeep = 0;
|