efront 4.0.20 → 4.0.22
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/queue.js +3 -2
- package/coms/basic_/Symbol.js +2 -2
- package/coms/basic_/aster_.js +6 -6
- package/coms/basic_/asyncAster_.js +19 -13
- package/coms/basic_/exec_.js +21 -5
- package/coms/compile/Javascript.js +70 -30
- package/coms/compile/Program.js +13 -6
- package/coms/compile/common.js +76 -79
- package/coms/compile/downLevel.js +251 -100
- package/coms/compile/downLevel_test.js +55 -31
- package/coms/compile/run-test262.js +141 -0
- package/coms/compile/unstruct.js +42 -40
- package/coms/compile/unstruct_test.js +10 -5
- package/coms/kugou/dance.js +1 -0
- package/coms/kugou/player.js +4 -27
- package/coms/reptile/colored_console.js +9 -9
- package/package.json +1 -1
- package/public/efront.js +1 -1
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
var downLevel = require("./downLevel");
|
|
2
|
-
var _asert = assert, i =
|
|
2
|
+
var _asert = assert, i = 12;
|
|
3
3
|
assert = function (a, b) {
|
|
4
4
|
var d = 1;
|
|
5
5
|
b = b.split(/(?<!\r)\n/), d = b["length"], b = b["join"]("\r\n");
|
|
6
6
|
_asert(a, b, i);
|
|
7
7
|
i += d;
|
|
8
8
|
}
|
|
9
|
+
var innerJs = new Javascript;
|
|
10
|
+
innerJs.defaultType = common.STRAP;
|
|
9
11
|
// 声明及解构
|
|
10
12
|
assert(downLevel(`var [name, type, options] = piece, key, repeat;`), 'var name = piece[0], type = piece[1], options = piece[2], key, repeat;');
|
|
11
|
-
assert(downLevel(`const`), '');
|
|
12
|
-
assert(downLevel(`let`), '');
|
|
13
|
+
assert(downLevel(`const`), 'const');
|
|
14
|
+
assert(downLevel(`let`), 'let');
|
|
13
15
|
assert(downLevel(`var`), '');
|
|
14
16
|
assert(downLevel(`{let a; function b(){a};return;}`), `if (tmp = 0, tmp0 =function (a) { a; function b() { a }; return tmp = 1, void 0; }(a)) { if (tmp === 1) return tmp0; }
|
|
15
17
|
var tmp, a, tmp0`);
|
|
@@ -28,6 +30,11 @@ assert(downLevel(`var {a}=b`), 'var a = b.a');
|
|
|
28
30
|
assert(downLevel(`var {a}=1`), 'var a = 1 .a');
|
|
29
31
|
assert(downLevel(`var {a}=1.1`), 'var a = 1.1 .a');
|
|
30
32
|
assert(downLevel(`var {c:a}=b`), 'var a = b.c');
|
|
33
|
+
assert(downLevel(`[...[a]]=[1]`), 'a = [1][0]');
|
|
34
|
+
assert(downLevel(`[...[a]]=[...[1]]`), 'a = [1][0]');
|
|
35
|
+
assert(downLevel(`[a[a]]=[1]`), 'a[a] = [1][0]');
|
|
36
|
+
assert(downLevel(`[a,b]=[b,a]`), '_ = [b, a], a = _[0], b = _[1]\r\nvar _');
|
|
37
|
+
assert(downLevel(`var {c:a=2}=b`), 'var _ = b.c, a = _ !== undefined ? _ : 2\r\nvar _');
|
|
31
38
|
assert(downLevel(`var {"c":a}=b`), 'var a = b["c"]');
|
|
32
39
|
assert(downLevel(`var {1:a}=b`), 'var a = b[1]');
|
|
33
40
|
assert(downLevel(`var [,a]=b`), 'var a = b[1]');
|
|
@@ -36,9 +43,9 @@ assert(downLevel(`var {1:a}=b`), 'var a = b[1]');
|
|
|
36
43
|
assert(downLevel(`var {.1:a}=b`), 'var a = b[.1]');
|
|
37
44
|
assert(downLevel(`var {a,[a]:c}=b`), 'var a = b.a, c = b[a]');
|
|
38
45
|
assert(downLevel(`var {a}=a`), 'var a = a.a');
|
|
39
|
-
assert(downLevel(`var {a,b}=a`), 'var _ = a, a = a.a, b = _.b');
|
|
46
|
+
assert(downLevel(`var {a,b}=a`), 'var _ = a, a = a.a, b = _.b\r\nvar _');
|
|
40
47
|
assert(downLevel(`var {a:{a:{a}}}=b`), 'var a = b.a.a.a');
|
|
41
|
-
assert(downLevel(`var {a,[a]:c}={}`), 'var _ = {}, a = _.a, c = _[a]');
|
|
48
|
+
assert(downLevel(`var {a,[a]:c}={}`), 'var _ = {}, a = _.a, c = _[a]\r\nvar _');
|
|
42
49
|
assert(downLevel(`={a,[a]:c}={}`), '= _ = {}, a = _.a, c = _[a]\r\nvar _');
|
|
43
50
|
var tmp = scanner2(`var {window}=this`); tmp.helpcode = false; tmp.detour(); assert(downLevel.code(tmp).toString(), `var window = this["window"]`);
|
|
44
51
|
assert(downLevel(`function (){var [a]=a;}`), "function () { var a = a[0]; }")
|
|
@@ -187,7 +194,7 @@ assert(downLevel(`(a)=>k`), "function (a) { return k }")
|
|
|
187
194
|
assert(downLevel(`(a=1)=>k`), "function (a) { if (a === undefined) a = 1; return k }")
|
|
188
195
|
assert(downLevel(`([a])=>b`), "function (arg) { var a = arg[0]; return b }")
|
|
189
196
|
assert(downLevel(`map(([a])=>a)`), "map(function (arg) { var a = arg[0]; return a })")
|
|
190
|
-
assert(downLevel(`var [_, R, G, B, A] = rgbHex.exec(color).map(a => parseInt(a + a, 16));`), "var _0 = rgbHex.exec(color).map(function (a) { return parseInt(a + a, 16) }), _ = _0[0], R = _0[1], G = _0[2], B = _0[3], A = _0[4]
|
|
197
|
+
assert(downLevel(`var [_, R, G, B, A] = rgbHex.exec(color).map(a => parseInt(a + a, 16));`), "var _0 = rgbHex.exec(color).map(function (a) { return parseInt(a + a, 16) }), _ = _0[0], R = _0[1], G = _0[2], B = _0[3], A = _0[4];\r\nvar _0")
|
|
191
198
|
assert(downLevel(`if (/^(?:select|input|textarea)$/i.test(initialEvent.target.tagName) || getTargetIn(a => a.nodrag || a.hasAttribute('nodrag'), initialEvent.target)) return;`), "if (/^(?:select|input|textarea)$/i.test(initialEvent.target.tagName) || getTargetIn(function (a) { return a.nodrag || a.hasAttribute('nodrag') }, initialEvent.target)) return;")
|
|
192
199
|
i++// 对象收集
|
|
193
200
|
assert(downLevel(`function (a,...b){}`), `var slice_ = Array["prototype"]["slice"];\r\nfunction (a) { var b = slice_["call"](arguments, 1); }`)
|
|
@@ -196,7 +203,7 @@ assert(downLevel(`function (a,...,c){}`), `function (a, c) { c = arguments["leng
|
|
|
196
203
|
assert(downLevel(`(...a) => k`), `var slice_ = Array["prototype"]["slice"];\r\nfunction () { var a = slice_["call"](arguments, 0); return k }`)
|
|
197
204
|
assert(downLevel(`for await(o of os) noSymbol`), `return async_(
|
|
198
205
|
function () {
|
|
199
|
-
return [
|
|
206
|
+
return [8, 8]
|
|
200
207
|
},
|
|
201
208
|
function () {
|
|
202
209
|
_2 = Symbol["asyncIterator"]; _2 = os[_2]; if (_2) return [1, 0]; _2 = Symbol["iterator"]; _2 = os[_2]; if (_2) return [1, 0]; _2 = Symbol["iterator"]; _2 = Array["prototype"][_2]
|
|
@@ -208,19 +215,22 @@ function (_1) {
|
|
|
208
215
|
_2 = _1; _ = _2; return [1, 0]
|
|
209
216
|
},
|
|
210
217
|
function () {
|
|
211
|
-
_2 = !_["done"]; if (!_2) return [
|
|
218
|
+
_2 = !_["done"]; if (!_2) return [2, 0]; _2 = _["value"]; return [_2, 1]
|
|
219
|
+
},
|
|
220
|
+
function (_1) {
|
|
221
|
+
_2 = _1; o = _2; _2 = (true)
|
|
212
222
|
},
|
|
213
223
|
function () {
|
|
214
224
|
if (!_2) return [2, 0]; noSymbol; _2 = _0["next"](); return [_2, 1]
|
|
215
225
|
},
|
|
216
226
|
function (_1) {
|
|
217
|
-
_2 = _1; _ = _2; return [-
|
|
227
|
+
_2 = _1; _ = _2; return [-3, 0]
|
|
218
228
|
},
|
|
219
229
|
function () {
|
|
220
230
|
return [0, 9]
|
|
221
231
|
},
|
|
222
232
|
function () {
|
|
223
|
-
_2 = _
|
|
233
|
+
_2 = _; if (!_2) return [1, 0]; _2 = !_["done"]; if (!_2) return [1, 0]; _2 = _0["return"]; _2 = isFunction(_2)
|
|
224
234
|
},
|
|
225
235
|
function () {
|
|
226
236
|
if (!_2) return [1, 0]; _2 = _0["return"](); return [1, 0]
|
|
@@ -231,45 +241,59 @@ return [1, 9]
|
|
|
231
241
|
var _, _0, _2`)
|
|
232
242
|
assert(downLevel(`for await(var [o,s] of os) noSymbol`), `return async_(
|
|
233
243
|
function () {
|
|
234
|
-
return [
|
|
244
|
+
return [11, 8]
|
|
235
245
|
},
|
|
236
246
|
function () {
|
|
237
|
-
o; s;
|
|
247
|
+
o; s; _5 = Symbol["asyncIterator"]; _5 = os[_5]; if (_5) return [1, 0]; _5 = Symbol["iterator"]; _5 = os[_5]; if (_5) return [1, 0]; _5 = Symbol["iterator"]; _5 = Array["prototype"][_5]
|
|
248
|
+
},
|
|
249
|
+
function () {
|
|
250
|
+
_0 = _5; _0 = _0["call"](os); _5 = _0["next"](); return [_5, 1]
|
|
251
|
+
},
|
|
252
|
+
function (_4) {
|
|
253
|
+
_5 = _4; _ = _5; return [1, 0]
|
|
238
254
|
},
|
|
239
255
|
function () {
|
|
240
|
-
|
|
256
|
+
_5 = !_["done"]; if (!_5) return [5, 0]; _5 = _["value"]; return [_5, 1]
|
|
241
257
|
},
|
|
242
|
-
function (
|
|
243
|
-
|
|
258
|
+
function (_4) {
|
|
259
|
+
_5 = _4; _1 = _5; _6 = Symbol["iterator"]; _6 = _1[_6]; if (_6) return [1, 0]; _6 = Symbol["iterator"]; _6 = Array["prototype"][_6]
|
|
260
|
+
},
|
|
261
|
+
function () {
|
|
262
|
+
_6 = (_6); _2 = _6["call"](_1); _3 = undefined; _3 = _2["next"](); o = _3["value"]; _3 = _2["next"](); s = _3["value"]; _9 = !_3; if (_9) return [1, 0]; _9 = !_3["done"]
|
|
263
|
+
},
|
|
264
|
+
function () {
|
|
265
|
+
_9 = (_9); if (!_9) return [1, 0]; _9 = _2["return"]; _9 = isFunction(_9); if (!_9) return [1, 0]; _9 = _2["return"]()
|
|
244
266
|
},
|
|
245
267
|
function () {
|
|
246
|
-
_3 =
|
|
268
|
+
_3 = _9; _5 = (true)
|
|
247
269
|
},
|
|
248
270
|
function () {
|
|
249
|
-
if (!
|
|
271
|
+
if (!_5) return [2, 0]; noSymbol; _5 = _0["next"](); return [_5, 1]
|
|
250
272
|
},
|
|
251
|
-
function (
|
|
252
|
-
|
|
273
|
+
function (_4) {
|
|
274
|
+
_5 = _4; _ = _5; return [-6, 0]
|
|
253
275
|
},
|
|
254
276
|
function () {
|
|
255
277
|
return [0, 9]
|
|
256
278
|
},
|
|
257
279
|
function () {
|
|
258
|
-
|
|
280
|
+
_5 = _; if (!_5) return [1, 0]; _5 = !_["done"]; if (!_5) return [1, 0]; _5 = _0["return"]; _5 = isFunction(_5)
|
|
259
281
|
},
|
|
260
282
|
function () {
|
|
261
|
-
if (!
|
|
283
|
+
if (!_5) return [1, 0]; _5 = _0["return"](); return [1, 0]
|
|
262
284
|
},
|
|
263
285
|
function () {
|
|
264
286
|
return [1, 9]
|
|
265
287
|
})
|
|
266
|
-
var o, s, _, _0, _1, _3`)
|
|
267
|
-
assert(downLevel(`for(o of os) noSymbol`), `for (_ = 0
|
|
268
|
-
assert(downLevel(`for(var o of os) Symbol`), `try { for (var o, _0 = os[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (o = _["value"], true); _ = _0["next"]()) Symbol } finally { if (_
|
|
269
|
-
assert(downLevel(`for(var o of os) Symbol`), `try { for (var o, _0 = os[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (o = _["value"], true); _ = _0["next"]()) Symbol } finally { if (_
|
|
270
|
-
assert(downLevel(`for(var o of o)Symbol`), `try { for (var o, _1 = o, _0 = _1[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](_1), _ = _0["next"](); !_["done"] && (o = _["value"], true); _ = _0["next"]()) Symbol } finally { if (_
|
|
271
|
-
assert(downLevel(`for(var [a] of os)Symbol`), `try { for (var a, _0 = os[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (
|
|
272
|
-
|
|
288
|
+
var o, s, _, _0, _1, _2, _3, _5, _6, _7, _8, _9`);
|
|
289
|
+
assert(downLevel(`for(o of os) noSymbol`), `for (_ = 0; _ < os["length"] && (o = os[_], true); _++) noSymbol\r\nvar _, _0`)
|
|
290
|
+
assert(downLevel(`for(var o of os) Symbol`), `try { for (var o, _0 = os[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (o = _["value"], true); _ = _0["next"]()) Symbol } finally { if (_ && !_["done"] && isFunction(_0["return"])) _0["return"]() }\r\nvar _, _0`)
|
|
291
|
+
assert(downLevel(`for(var o of os) Symbol`), `try { for (var o, _0 = os[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (o = _["value"], true); _ = _0["next"]()) Symbol } finally { if (_ && !_["done"] && isFunction(_0["return"])) _0["return"]() }\r\nvar _, _0`)
|
|
292
|
+
assert(downLevel(`for(var o of o)Symbol`), `try { for (var o, _1 = o, _0 = _1[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](_1), _ = _0["next"](); !_["done"] && (o = _["value"], true); _ = _0["next"]()) Symbol } finally { if (_ && !_["done"] && isFunction(_0["return"])) _0["return"]() }\r\nvar _, _0, _1`)
|
|
293
|
+
assert(downLevel(`for(var [a] of os)Symbol`), `try { for (var a, _0 = os[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (_1 = _["value"], _2 = (_1[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]])["call"](_1), _3 = undefined, _3 = _2["next"](), a = _3["value"], _3 = (!_3 || !_3["done"]) && isFunction(_2["return"]) && _2["return"](), true); _ = _0["next"]()) Symbol } finally { if (_ && !_["done"] && isFunction(_0["return"])) _0["return"]() }
|
|
294
|
+
var _, _0, _1, _2, _3`)
|
|
295
|
+
assert(downLevel(`for(var [a,b] of os)Symbol`), `try { for (var a, b, _0 = os[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (_1 = _["value"], _2 = (_1[Symbol["iterator"]] || Array["prototype"][Symbol["iterator"]])["call"](_1), _3 = undefined, _3 = _2["next"](), a = _3["value"], _3 = _2["next"](), b = _3["value"], _3 = (!_3 || !_3["done"]) && isFunction(_2["return"]) && _2["return"](), true); _ = _0["next"]()) Symbol } finally { if (_ && !_["done"] && isFunction(_0["return"])) _0["return"]() }
|
|
296
|
+
var _, _0, _1, _2, _3`)
|
|
273
297
|
assert(downLevel(`[...a]=a`), `var slice_ = Array["prototype"]["slice"];\r\na = slice_["call"](a, 0)`)
|
|
274
298
|
assert(downLevel(`[c,...a]=a`), `var slice_ = Array["prototype"]["slice"];\r\nc = a[0], a = slice_["call"](a, 1)`)
|
|
275
299
|
assert(downLevel(`[...a]=a`), `var slice_ = Array["prototype"]["slice"];\r\na = slice_["call"](a, 0)`)
|
|
@@ -286,10 +310,10 @@ var _0, _1 };`);
|
|
|
286
310
|
i++//异步或步进函数
|
|
287
311
|
assert(downLevel(`function *(){yield *a}`), `function () { return aster_(
|
|
288
312
|
function () {
|
|
289
|
-
_; _0 = 0;
|
|
313
|
+
_; _0 = 0; return [1, 0]
|
|
290
314
|
},
|
|
291
315
|
function () {
|
|
292
|
-
_3 = _0 <
|
|
316
|
+
_3 = _0 < a["length"]; if (!_3) return [1, 0]; _ = a[_0]; _3 = (true)
|
|
293
317
|
},
|
|
294
318
|
function () {
|
|
295
319
|
if (!_3) return [2, 0]; return [_, 3]
|
|
@@ -319,7 +343,7 @@ function () {
|
|
|
319
343
|
return [0, 9]
|
|
320
344
|
},
|
|
321
345
|
function () {
|
|
322
|
-
_2 = _
|
|
346
|
+
_2 = _; if (!_2) return [1, 0]; _2 = !_["done"]; if (!_2) return [1, 0]; _2 = _0["return"]; _2 = isFunction(_2)
|
|
323
347
|
},
|
|
324
348
|
function () {
|
|
325
349
|
if (!_2) return [1, 0]; _2 = _0["return"](); return [1, 0]
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
var fs = require("fs/promises");
|
|
2
|
+
var path = require("path");
|
|
3
|
+
var vm = require("vm");
|
|
4
|
+
var testpath = path.join(__dirname, '../../../test262');
|
|
5
|
+
var $262 = await async function () {
|
|
6
|
+
var $262 = {
|
|
7
|
+
evalScript(script) {
|
|
8
|
+
script = downLevel(script);
|
|
9
|
+
vm.runInNewContext(script);
|
|
10
|
+
},
|
|
11
|
+
createRealm() {
|
|
12
|
+
return;
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
$262.global = vm.createContext({ $262 });
|
|
16
|
+
var v8agent = await fs.readFile(path.join(testpath, "implementation-contributed/v8/test262/harness-agent.js"));
|
|
17
|
+
new Function("$262", [v8agent].join("\r\n"))($262);
|
|
18
|
+
return $262;
|
|
19
|
+
}();
|
|
20
|
+
var harness = await async function () {
|
|
21
|
+
var hpath = path.join(testpath, "harness");
|
|
22
|
+
var nameMap = { "-gc": "GC" };
|
|
23
|
+
var files = await fs.readdir(hpath, { withFileTypes: true });
|
|
24
|
+
var codes = await queue.call(files.filter(f => /\.js$/i.test(f.name)), async (f) => {
|
|
25
|
+
var n = f.name;
|
|
26
|
+
var p = path.join(hpath, n);
|
|
27
|
+
var code = scanner2(String(await fs.readFile(p)));
|
|
28
|
+
n = n.replace(/\.js$/i, '').replace(/\-\w+/g, function (a) {
|
|
29
|
+
return a in nameMap ? nameMap[a] : a[1].toUpperCase() + a.slice(2);
|
|
30
|
+
});
|
|
31
|
+
code.name = n;
|
|
32
|
+
return code;
|
|
33
|
+
});
|
|
34
|
+
var vars = {};
|
|
35
|
+
codes.sort((a, b) => {
|
|
36
|
+
var aenvs = a.envs;
|
|
37
|
+
var avars = a.vars;
|
|
38
|
+
var bvars = b.vars;
|
|
39
|
+
var benvs = b.envs;
|
|
40
|
+
for (var k in aenvs) if (k in bvars) return -1;
|
|
41
|
+
for (var k in benvs) if (k in avars) return 1;
|
|
42
|
+
return 0;
|
|
43
|
+
});
|
|
44
|
+
codes.forEach(c => extend(vars, c.vars));
|
|
45
|
+
return new Function("$262", 'print', codes.join("\r\n") + `\r\nreturn {${Object.keys(vars).map(a => `${a}:${a}`).join(',')}}`)($262, console.info);
|
|
46
|
+
}();
|
|
47
|
+
await async function () {
|
|
48
|
+
extend(harness, {
|
|
49
|
+
aster_,
|
|
50
|
+
async_,
|
|
51
|
+
asyncAster_,
|
|
52
|
+
isFunction,
|
|
53
|
+
restIter_,
|
|
54
|
+
rest_,
|
|
55
|
+
exec_,
|
|
56
|
+
})
|
|
57
|
+
extend(global, harness);
|
|
58
|
+
var rest = [path.join(testpath, 'test')];
|
|
59
|
+
var ignore = [
|
|
60
|
+
"dynamic-import",
|
|
61
|
+
"intl402",
|
|
62
|
+
"built-ins",
|
|
63
|
+
];
|
|
64
|
+
ignore.forEach(k => ignore[k] = true);
|
|
65
|
+
var testFiles = [];
|
|
66
|
+
while (rest.length) {
|
|
67
|
+
var p = rest.pop();
|
|
68
|
+
var names = await fs.readdir(p, { withFileTypes: true });
|
|
69
|
+
for (var n of names) {
|
|
70
|
+
if (n.name in ignore) continue;
|
|
71
|
+
var p1 = path.join(p, n.name);
|
|
72
|
+
if (n.isDirectory()) rest.push(p1);
|
|
73
|
+
else if (!/\.js$/i.test(p1)) continue;
|
|
74
|
+
else testFiles.push(p1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// testFiles = testFiles.slice(4053,9153);
|
|
78
|
+
testFiles.skip = 0;
|
|
79
|
+
var currentTest, currentText;
|
|
80
|
+
var currentIndex = 0;
|
|
81
|
+
var running = false;
|
|
82
|
+
var interupt = function (e) {
|
|
83
|
+
if (this == 'r' && !running) return;
|
|
84
|
+
console.fail(this, currentIndex, currentTest + "\r\n");
|
|
85
|
+
console.log(currentText);
|
|
86
|
+
if (e) console.trace(e);
|
|
87
|
+
process.exit();
|
|
88
|
+
};
|
|
89
|
+
process.on("uncaughtException", interupt.bind('e'));
|
|
90
|
+
process.on("unhandledRejection", interupt.bind('r'));
|
|
91
|
+
await queue.call(testFiles, async function (f, i) {
|
|
92
|
+
var runText = async function (text) {
|
|
93
|
+
/**
|
|
94
|
+
* @type {vm.RunningCodeInNewContextOptions}
|
|
95
|
+
*/
|
|
96
|
+
var ctxOptions = {
|
|
97
|
+
filename: f,
|
|
98
|
+
displayErrors: false,
|
|
99
|
+
};
|
|
100
|
+
running = true;
|
|
101
|
+
if (code.envs.$DONE) harness.$DONE = function (e) {
|
|
102
|
+
if (e) console.fail(ti, f + "\r\n"), console.log(currentText), console.trace(e), process.exit();
|
|
103
|
+
};
|
|
104
|
+
vm.runInThisContext(text, ctxOptions);
|
|
105
|
+
running = false;
|
|
106
|
+
};
|
|
107
|
+
var ti = `${i}/${testFiles.length}`;
|
|
108
|
+
var data = await fs.readFile(f);
|
|
109
|
+
var de;
|
|
110
|
+
try {
|
|
111
|
+
console.test("解析", ti, f);
|
|
112
|
+
var code = scanner2(String(data));
|
|
113
|
+
console.test("降级", ti, f);
|
|
114
|
+
var text = downLevel.code(code).toString();
|
|
115
|
+
} catch (e) {
|
|
116
|
+
de = e;
|
|
117
|
+
}
|
|
118
|
+
currentTest = f;
|
|
119
|
+
currentText = text;
|
|
120
|
+
currentIndex = ti;
|
|
121
|
+
if (text) {
|
|
122
|
+
try {
|
|
123
|
+
console.test("执行", ti, f);
|
|
124
|
+
await runText(text);
|
|
125
|
+
} catch (e) { de = e };
|
|
126
|
+
}
|
|
127
|
+
if (de) try {
|
|
128
|
+
try {
|
|
129
|
+
console.test("检查", ti, f);
|
|
130
|
+
await runText(data);
|
|
131
|
+
} catch (e) { de = null };
|
|
132
|
+
} catch { de = null; }
|
|
133
|
+
if (!text && de) {
|
|
134
|
+
console.log(de)
|
|
135
|
+
console.fail(ti, f);
|
|
136
|
+
throw de;
|
|
137
|
+
}
|
|
138
|
+
console.pass(path.relative(testpath, f));
|
|
139
|
+
}, 1, null);
|
|
140
|
+
console.log(`\r\n完成 ${testFiles.length} 个测试项!`);
|
|
141
|
+
}();
|
package/coms/compile/unstruct.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var { SPACE, COMMENT, EXPRESS, STRAP, QUOTED, STAMP, SCOPED, VALUE, LABEL, createString, skipAssignment, skipSentenceQueue, isHalfSentence, splice, relink, createExpressList, snapExpressHead, snapExpressFoot } = require("./common");
|
|
1
|
+
var { SPACE, COMMENT, EXPRESS, STRAP, QUOTED, STAMP, SCOPED, VALUE, LABEL, isEval, createString, skipAssignment, skipSentenceQueue, isHalfSentence, splice, relink, createExpressList, snapExpressHead, snapExpressFoot } = 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
|
|
@@ -139,6 +139,7 @@ var _switch = function (body, cx, unblock, result, getname) {
|
|
|
139
139
|
var m = o.first;
|
|
140
140
|
var tmp = [];
|
|
141
141
|
while (o[cy] !== m) cy++;
|
|
142
|
+
var default_ = null, case_ = null;
|
|
142
143
|
while (cy < o.length) {
|
|
143
144
|
var block = getblock(o, ++cy);
|
|
144
145
|
cy += block.length;
|
|
@@ -150,23 +151,25 @@ var _switch = function (body, cx, unblock, result, getname) {
|
|
|
150
151
|
var q = ternary(block, getnextname, true);
|
|
151
152
|
for (var q of q) if (q.length) pushstep(result, q);
|
|
152
153
|
var qe = q;
|
|
153
|
-
if (qe.name)
|
|
154
|
-
else case_ = scanner2(`return[]`),
|
|
155
|
-
pushstep(result, case_);
|
|
154
|
+
if (qe.name) case_ = scanner2(`if(${qn}===${qe.name})return[]`), pushstep(result, case_);
|
|
155
|
+
else default_ = case_ = scanner2(`return[]`), default_.ret_ = -1;
|
|
156
156
|
var by = cy;
|
|
157
157
|
m = o[cy];
|
|
158
158
|
while (m && (m.type !== STRAP || !/^(default|case)$/i.test(m.text))) m = o[++cy];
|
|
159
159
|
tmp.push(result.length - 1, case_[case_.length - 1], o.slice(by, cy));
|
|
160
160
|
}
|
|
161
|
-
if (!
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
tmp.push(result.length - 1, case_[case_.length - 1], []);
|
|
161
|
+
if (!default_) {
|
|
162
|
+
default_ = scanner2(`return[]`), default_.ret_ = -1;
|
|
163
|
+
tmp.push(result.length - 1, default_[default_.length - 1], []);
|
|
165
164
|
}
|
|
165
|
+
var default_r = default_[default_.length - 1];
|
|
166
|
+
pushstep(result, default_);
|
|
167
|
+
default_r.index = result.length - 1;
|
|
166
168
|
while (tmp.length) {
|
|
167
169
|
cy = tmp.shift();
|
|
168
170
|
q = tmp.shift();
|
|
169
171
|
block = tmp.shift();
|
|
172
|
+
if (default_r === q) cy = default_r.index;
|
|
170
173
|
q.push({ type: VALUE, text: String(result.length - cy) }, { type: STAMP, text: "," }, { type: VALUE, text: '0' });
|
|
171
174
|
relink(q);
|
|
172
175
|
unblock(block);
|
|
@@ -322,6 +325,9 @@ var pushstep = function (result, step) {
|
|
|
322
325
|
}
|
|
323
326
|
_return(step);
|
|
324
327
|
};
|
|
328
|
+
var patchresult = function (result) {
|
|
329
|
+
for (var cx = 0, dx = result.length; cx < dx; cx++)patchstep(result[cx], result.length - cx, 0);
|
|
330
|
+
};
|
|
325
331
|
var patchstep = function (r, nextindex, h) {
|
|
326
332
|
var name = r.name;
|
|
327
333
|
var o, i, x, p, n;
|
|
@@ -335,6 +341,7 @@ var patchstep = function (r, nextindex, h) {
|
|
|
335
341
|
r.splice(i, 1, ...scanner2(_withget(b.text)));
|
|
336
342
|
}
|
|
337
343
|
}
|
|
344
|
+
var changed = false;
|
|
338
345
|
for (i = r.length - 1; i >= h; i--) {
|
|
339
346
|
o = r[i];
|
|
340
347
|
if (o === RZ) {
|
|
@@ -347,6 +354,7 @@ var patchstep = function (r, nextindex, h) {
|
|
|
347
354
|
x = scanner2(`if(${name}!==null&&${name}!== undefined)return [${nextindex},0]`);
|
|
348
355
|
}
|
|
349
356
|
else continue;
|
|
357
|
+
changed = true;
|
|
350
358
|
var p = o.prev;
|
|
351
359
|
if (!p || p.type === STAMP && p.text === ";");
|
|
352
360
|
else x.unshift({ type: STAMP, text: ";" });
|
|
@@ -354,22 +362,15 @@ var patchstep = function (r, nextindex, h) {
|
|
|
354
362
|
if (!n || n.type === STAMP && n.text === ';');
|
|
355
363
|
else x.push({ type: STAMP, text: ';' });
|
|
356
364
|
r.splice(i, 1, ...x);
|
|
357
|
-
relink(r);
|
|
358
365
|
}
|
|
366
|
+
if (changed) relink(r);
|
|
367
|
+
return changed;
|
|
359
368
|
};
|
|
360
369
|
var flushqueue = function (result, queue) {
|
|
361
|
-
var savedLength = result.length;
|
|
362
|
-
var savedIndex = savedLength - 1;
|
|
363
|
-
var prev = result[savedIndex];
|
|
364
|
-
if (prev) var patch = prev.length;
|
|
365
370
|
for (var q of queue) pushstep(result, q);
|
|
366
|
-
queue = [];
|
|
367
|
-
if (ret_) {
|
|
368
|
-
if (prev) patchstep(prev, result.length - savedIndex, patch || 0);
|
|
369
|
-
result.slice(savedLength).forEach((a, i) => patchstep(a, result.length - savedLength - i, 0));
|
|
370
|
-
}
|
|
371
371
|
};
|
|
372
372
|
|
|
373
|
+
|
|
373
374
|
var _do = function (body, cx, unblock, result) {
|
|
374
375
|
var o = body[cx];
|
|
375
376
|
var label = o;
|
|
@@ -438,17 +439,6 @@ var remove_end_comma = function (o) {
|
|
|
438
439
|
splice(o, cx, o.length - cx);
|
|
439
440
|
}
|
|
440
441
|
};
|
|
441
|
-
var isEvalScope = function (o) {
|
|
442
|
-
if (o.entry === "[") {
|
|
443
|
-
var h = snapExpressHead(o);
|
|
444
|
-
return o !== h;
|
|
445
|
-
}
|
|
446
|
-
else if (o.entry === '(') {
|
|
447
|
-
var h = snapExpressHead(o);
|
|
448
|
-
return o === h;
|
|
449
|
-
}
|
|
450
|
-
return false;
|
|
451
|
-
};
|
|
452
442
|
var ispropcall = function (o) {
|
|
453
443
|
var n = o.next;
|
|
454
444
|
if (!n || n.type !== SCOPED && n.entry !== '(') return false;
|
|
@@ -493,7 +483,7 @@ var _invoke = function (t, getname) {
|
|
|
493
483
|
if (o.type === SCOPED && (o.entry === '[' || o.entry === "(")) {
|
|
494
484
|
var _nameindex = nameindex;
|
|
495
485
|
remove_end_comma(o);
|
|
496
|
-
var iseval =
|
|
486
|
+
var iseval = o.iseval = isEval(o);
|
|
497
487
|
var constStart = 0;
|
|
498
488
|
if (!iseval) {
|
|
499
489
|
for (var cy = 0; cy < o.length; cy++) {
|
|
@@ -522,7 +512,7 @@ var _invoke = function (t, getname) {
|
|
|
522
512
|
if (!iseval || m[m.length - 1] === o.last) {
|
|
523
513
|
var q = toqueue(m, getdeepname, 1);
|
|
524
514
|
var qe = q[q.length - 1];
|
|
525
|
-
splice(o, by, ey - by, { text: qe.name, type: EXPRESS });
|
|
515
|
+
splice(o, by, ey - by, ...qe ? [{ text: qe.name, type: EXPRESS }] : []);
|
|
526
516
|
cy = by + 1;
|
|
527
517
|
}
|
|
528
518
|
else {
|
|
@@ -567,9 +557,9 @@ var _invoke = function (t, getname) {
|
|
|
567
557
|
}
|
|
568
558
|
pushstep(result, t);
|
|
569
559
|
}
|
|
560
|
+
if (ret_) patchresult(result, 0);
|
|
570
561
|
return result;
|
|
571
562
|
};
|
|
572
|
-
|
|
573
563
|
var _await = function (t) {
|
|
574
564
|
var t0 = t[0];
|
|
575
565
|
if (t0.type === STRAP) {
|
|
@@ -615,7 +605,7 @@ var clone = function (o) {
|
|
|
615
605
|
var popass = function (explist) {
|
|
616
606
|
var asn = explist.pop();
|
|
617
607
|
var n;
|
|
618
|
-
if (!asn.ret_ && asn.length) {
|
|
608
|
+
if (asn && !asn.ret_ && asn.length) {
|
|
619
609
|
asn = createExpressList(asn);
|
|
620
610
|
if (asn.length > 1) {
|
|
621
611
|
explist.push(...asn.slice(0, asn.length - 1));
|
|
@@ -627,7 +617,7 @@ var popass = function (explist) {
|
|
|
627
617
|
}
|
|
628
618
|
}
|
|
629
619
|
else {
|
|
630
|
-
n = asn.name;
|
|
620
|
+
n = asn && asn.name;
|
|
631
621
|
asn = [{ type: EXPRESS, text: n }];
|
|
632
622
|
}
|
|
633
623
|
return [asn, n];
|
|
@@ -686,10 +676,12 @@ var ternary = function (body, getname, ret) {
|
|
|
686
676
|
if (!question.length) {
|
|
687
677
|
var b = body.slice(equalsend, bx);
|
|
688
678
|
relink(b);
|
|
689
|
-
var c = toqueue(body.slice(bx + 1, cx), getnextname, true);
|
|
690
|
-
var d = toqueue(body.slice(cx + 1), getnextname, true);
|
|
691
|
-
|
|
692
|
-
|
|
679
|
+
var c = toqueue(equals.concat(body.slice(bx + 1, cx)), getnextname, true);
|
|
680
|
+
var d = toqueue(equals.concat(body.slice(cx + 1)), getnextname, true);
|
|
681
|
+
if (!equals.length && ret) {
|
|
682
|
+
patchname(d, getnextname);
|
|
683
|
+
patchname(c, getnextname);
|
|
684
|
+
}
|
|
693
685
|
pushstep(d, stepReturn(1, 0, d));
|
|
694
686
|
pushstep(c, stepReturn(d.length + 1, 0, c));
|
|
695
687
|
pushstep(explist, scanner2(`if(${getCondition(b, function (b) {
|
|
@@ -707,9 +699,12 @@ var ternary = function (body, getname, ret) {
|
|
|
707
699
|
qe.text = String(explist.length - qi);
|
|
708
700
|
explist.push(...d);
|
|
709
701
|
hasquestion = true;
|
|
710
|
-
|
|
702
|
+
return explist;
|
|
711
703
|
}
|
|
712
704
|
}
|
|
705
|
+
else if (o.text === "=>") {
|
|
706
|
+
cx = skipAssignment(body, cx + 1);
|
|
707
|
+
}
|
|
713
708
|
else if (powermap[o.text] === powermap["="]) {
|
|
714
709
|
var ass = toqueue(body.slice(equalsend, cx), getnextname, false);
|
|
715
710
|
var [ass1, n = ++eqused] = popass(ass);
|
|
@@ -731,6 +726,7 @@ var ternary = function (body, getname, ret) {
|
|
|
731
726
|
explist = [r];
|
|
732
727
|
}
|
|
733
728
|
else {
|
|
729
|
+
if (equals.length && bd.length === 1 && bd[0].type === SCOPED && bd[0].entry === '(' && skipAssignment(bd[0], 0) === bd[0].length) bd = bd[0];
|
|
734
730
|
explist = _express(bd, getnextname, equalsend > skip || ret);
|
|
735
731
|
}
|
|
736
732
|
}
|
|
@@ -1142,12 +1138,18 @@ function toqueue(body, getname, ret = false, result = []) {
|
|
|
1142
1138
|
while (labels.length) {
|
|
1143
1139
|
var e = labels[labels.length - 1];
|
|
1144
1140
|
if (e.type !== LABEL) break;
|
|
1145
|
-
|
|
1141
|
+
var ei = scopes.lastIndexOf(e.scope);
|
|
1142
|
+
if (ei === scopes.length - 1) {
|
|
1143
|
+
if (cx < e.final) break;
|
|
1144
|
+
}
|
|
1145
|
+
else if (ei >= 0) break;
|
|
1146
1146
|
_poplabel();
|
|
1147
1147
|
}
|
|
1148
1148
|
|
|
1149
1149
|
if (o.type === LABEL) {
|
|
1150
1150
|
o.scope = scopes[scopes.length - 1];
|
|
1151
|
+
o.final = body.indexOf(skipSentenceQueue(o.next), cx);
|
|
1152
|
+
if (o.final < 0) o.final = body.length;
|
|
1151
1153
|
labels.push(o);
|
|
1152
1154
|
var next = o.next;
|
|
1153
1155
|
if (next && next.type === SCOPED && next.entry === '{') {
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
var unstruct = require('./unstruct');
|
|
2
2
|
var scanner2 = require("./scanner2");
|
|
3
|
-
var { createString } = require("./common");
|
|
4
|
-
var r =
|
|
3
|
+
var { createString, STRAP } = require("./common");
|
|
4
|
+
var r = 12;
|
|
5
|
+
var innerjs = new Javascript;
|
|
6
|
+
innerjs.defaultType = STRAP;
|
|
5
7
|
function test(codetext, expect, ret = false) {
|
|
6
|
-
var code = scanner2(codetext), i = -2;
|
|
8
|
+
var code = scanner2(codetext, innerjs), i = -2;
|
|
7
9
|
try { code = unstruct(code, () => ++i >= 0 ? "_" + i : '_', ret && "@"); } catch (e) { console.log(r); throw e }
|
|
8
10
|
assert(code.map(createString).join(";\r\n "), expect, r++);
|
|
9
11
|
}
|
|
@@ -18,7 +20,7 @@ test('a * a + b * c * c ** d', "_ = a * a, _0 = b * c, _1 = c ** d, _0 = _0 * _1
|
|
|
18
20
|
test('a * a || b * c * c ** d', "_ = a * a @re _ = b * c, _0 = c ** d, _ * _0");
|
|
19
21
|
test('a * a || b * c || c * d', "_ = a * a @re _ = b * c @re c * d");
|
|
20
22
|
test('a || b || c', "_ = a; if (_) return [1, 0]; _ = b; if (_) return [1, 0]; c", true);
|
|
21
|
-
test('a?b:c', "if (!a) return [1, 0];
|
|
23
|
+
test('a?b:c', "if (!a) return [1, 0]; b; return [2, 0];\r\n c; return [1, 0]");
|
|
22
24
|
test('a * a && b * c * c ** d', "_ = a * a @rz _ = b * c, _0 = c ** d, _ * _0");
|
|
23
25
|
test('a = 1 + 2', "a = 1 + 2", true);
|
|
24
26
|
test('a = b', "a = b", true);
|
|
@@ -36,11 +38,13 @@ test('a * a ?? b * c * c ** d', "_ = a * a; if (_ !== null && _ !== undefined) r
|
|
|
36
38
|
test('a * a && await b*c', "_ = a * a; if (!_) return [2, 0]; _ = b; return [_, 1];\r\n _ = @; _ * c", true);
|
|
37
39
|
test("await a", "_ = a; return [_, 1]", true);
|
|
38
40
|
test("yield a", "return [a, 3]", true);
|
|
41
|
+
test("!a.done&&(b=await a.value)", "_ = !a.done; if (!_) return [2, 0]; _ = a.value; return [_, 1];\r\n _ = @; b = _; (_)", true);
|
|
42
|
+
test("a=1?2:3",`if (false) return [1, 0]; a = 2; return [2, 0];\r\n a = 3; return [1, 0]`)
|
|
39
43
|
test("await a()", "_ = a(); return [_, 1]", true);
|
|
40
44
|
test("yield a()", "_ = a(); return [_, 3]", true);
|
|
41
45
|
test("a = await a()", "_ = a(); return [_, 1];\r\n _ = @; a = _", true);
|
|
42
46
|
test("a = yield a()", "_ = a(); return [_, 3];\r\n _ = @; a = _", true);
|
|
43
|
-
test("(1+ +1)", "_ =
|
|
47
|
+
test("(1+ +1)", "_ = 1 + +1; (_)", true);
|
|
44
48
|
test("await a(await b)", "_ = b; return [_, 1];\r\n _ = @; _ = a(_); return [_, 1]", true);
|
|
45
49
|
test("await a(await b).s(await c)", "_ = b; return [_, 1];\r\n _ = @; _ = a(_); _0 = c; return [_0, 1];\r\n _0 = @; _ = _.s(_0); return [_, 1]", true);
|
|
46
50
|
test("a*a + await a(await b).s(await c)", "_ = a * a, _0 = b; return [_0, 1];\r\n _0 = @; _0 = a(_0); _1 = c; return [_1, 1];\r\n _1 = @; _0 = _0.s(_1); return [_0, 1];\r\n _0 = @; _ + _0", true);
|
|
@@ -114,4 +118,5 @@ test("//aaa", '//aaa', true);
|
|
|
114
118
|
test("menus[0].name+='aaa'", "_ = menus[0]; _0 = _.name + 'aaa'; _.name = _0", true);
|
|
115
119
|
test("menus[a+b].name+='aaa'", "_ = a + b; _ = menus[_]; _0 = _.name + 'aaa'; _.name = _0", true);
|
|
116
120
|
test("menus[a+b]()", "_ = a + b; menus[_]()", true);
|
|
121
|
+
test(`switch(a){default: a;case 1:b;}`, 'if (a === 1) return [2, 0]; return [1, 0];\r\n a; return [1, 0];\r\n b; return [1, 0]', true);
|
|
117
122
|
test("loop:{a=b;if(a) continue loop}", "a = b; if (a) return [0, 0]", true);
|
package/coms/kugou/dance.js
CHANGED
|
@@ -62,6 +62,7 @@ var danceIcon = lazy(async function (theta) {
|
|
|
62
62
|
*/
|
|
63
63
|
function draw(buffer) {
|
|
64
64
|
danceIcon(buffer.theta);
|
|
65
|
+
if (!buffer.length) return;
|
|
65
66
|
var canvas = this;
|
|
66
67
|
var context = canvas.getContext("2d");
|
|
67
68
|
if (canvas.width !== canvas.offsetWidth * devicePixelRatio) canvas.width = canvas.offsetWidth * devicePixelRatio;
|