efront 4.0.20 → 4.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,30 @@
1
1
  var downLevel = require("./downLevel");
2
- var _asert = assert, i = 10;
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(`var [] = piece, key,[]= repeat;`), 'var key;');
14
+ assert(downLevel(`var [] = piece, key,[]`), 'var key');
15
+ assert(downLevel(`const`), 'const');
16
+ assert(downLevel(`let`), 'let');
13
17
  assert(downLevel(`var`), '');
14
18
  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
19
  var tmp, a, tmp0`);
16
20
  assert(downLevel(`const a,b,c`), 'var a, b, c');
17
21
  assert(downLevel(`let a,b,c`), 'var a, b, c');
18
- assert(downLevel(`var a;{let a,b,c}`), 'var a; { var a0, b, c }');
22
+ assert(downLevel(`for(let a in b)`), 'for (var a in b)');
23
+ assert(downLevel(`a;for(let a in b)`), 'a; for (var a0 in b)');
24
+ assert(downLevel(`for(let a in b)setTimeout(function(){console.log(a)})`), 'for (var a in b)(function (a) { setTimeout(function () { console.log(a) }) }(a))\r\nvar tmp, a');
25
+ assert(downLevel(`var a;{let a,b,c}`), 'var a; { var a0 = undefined, b = undefined, c = undefined }');
26
+ assert(downLevel(`var a;{let {a,b},c=1}`), 'var a; { var a0 = undefined, b = undefined, c = 1 }');
27
+ assert(downLevel(`var a;{let {a,b},c}`), 'var a; { var a0 = undefined, b = undefined, c = undefined }');
19
28
  assert(downLevel(`var {a,b,c}`), 'var a, b, c');
20
29
  assert(downLevel(`let {a,b,c}`), 'var a, b, c');
21
30
  assert(downLevel(`const {a,b,c}`), 'var a, b, c');
@@ -28,6 +37,11 @@ assert(downLevel(`var {a}=b`), 'var a = b.a');
28
37
  assert(downLevel(`var {a}=1`), 'var a = 1 .a');
29
38
  assert(downLevel(`var {a}=1.1`), 'var a = 1.1 .a');
30
39
  assert(downLevel(`var {c:a}=b`), 'var a = b.c');
40
+ assert(downLevel(`[...[a]]=[1]`), 'a = [1][0]');
41
+ assert(downLevel(`[...[a]]=[...[1]]`), 'a = [1][0]');
42
+ assert(downLevel(`[a[a]]=[1]`), 'a[a] = [1][0]');
43
+ assert(downLevel(`[a,b]=[b,a]`), '_ = [b, a], a = _[0], b = _[1]\r\nvar _');
44
+ assert(downLevel(`var {c:a=2}=b`), 'var _ = b.c, a = _ !== undefined ? _ : 2\r\nvar _');
31
45
  assert(downLevel(`var {"c":a}=b`), 'var a = b["c"]');
32
46
  assert(downLevel(`var {1:a}=b`), 'var a = b[1]');
33
47
  assert(downLevel(`var [,a]=b`), 'var a = b[1]');
@@ -36,9 +50,9 @@ assert(downLevel(`var {1:a}=b`), 'var a = b[1]');
36
50
  assert(downLevel(`var {.1:a}=b`), 'var a = b[.1]');
37
51
  assert(downLevel(`var {a,[a]:c}=b`), 'var a = b.a, c = b[a]');
38
52
  assert(downLevel(`var {a}=a`), 'var a = a.a');
39
- assert(downLevel(`var {a,b}=a`), 'var _ = a, a = a.a, b = _.b');
53
+ assert(downLevel(`var {a,b}=a`), 'var _ = a, a = a.a, b = _.b\r\nvar _');
40
54
  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]');
55
+ assert(downLevel(`var {a,[a]:c}={}`), 'var _ = {}, a = _.a, c = _[a]\r\nvar _');
42
56
  assert(downLevel(`={a,[a]:c}={}`), '= _ = {}, a = _.a, c = _[a]\r\nvar _');
43
57
  var tmp = scanner2(`var {window}=this`); tmp.helpcode = false; tmp.detour(); assert(downLevel.code(tmp).toString(), `var window = this["window"]`);
44
58
  assert(downLevel(`function (){var [a]=a;}`), "function () { var a = a[0]; }")
@@ -187,7 +201,7 @@ assert(downLevel(`(a)=>k`), "function (a) { return k }")
187
201
  assert(downLevel(`(a=1)=>k`), "function (a) { if (a === undefined) a = 1; return k }")
188
202
  assert(downLevel(`([a])=>b`), "function (arg) { var a = arg[0]; return b }")
189
203
  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];")
204
+ 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
205
  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
206
  i++// 对象收集
193
207
  assert(downLevel(`function (a,...b){}`), `var slice_ = Array["prototype"]["slice"];\r\nfunction (a) { var b = slice_["call"](arguments, 1); }`)
@@ -196,7 +210,7 @@ assert(downLevel(`function (a,...,c){}`), `function (a, c) { c = arguments["leng
196
210
  assert(downLevel(`(...a) => k`), `var slice_ = Array["prototype"]["slice"];\r\nfunction () { var a = slice_["call"](arguments, 0); return k }`)
197
211
  assert(downLevel(`for await(o of os) noSymbol`), `return async_(
198
212
  function () {
199
- return [7, 8]
213
+ return [8, 8]
200
214
  },
201
215
  function () {
202
216
  _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 +222,22 @@ function (_1) {
208
222
  _2 = _1; _ = _2; return [1, 0]
209
223
  },
210
224
  function () {
211
- _2 = !_["done"]; if (!_2) return [1, 0]; o = _["value"]; _2 = (true)
225
+ _2 = !_["done"]; if (!_2) return [2, 0]; _2 = _["value"]; return [_2, 1]
226
+ },
227
+ function (_1) {
228
+ _2 = _1; o = _2; _2 = (true)
212
229
  },
213
230
  function () {
214
231
  if (!_2) return [2, 0]; noSymbol; _2 = _0["next"](); return [_2, 1]
215
232
  },
216
233
  function (_1) {
217
- _2 = _1; _ = _2; return [-2, 0]
234
+ _2 = _1; _ = _2; return [-3, 0]
218
235
  },
219
236
  function () {
220
237
  return [0, 9]
221
238
  },
222
239
  function () {
223
- _2 = _ &&! _["done"]; if (!_2) return [1, 0]; _2 = _0["return"]; _2 = isFunction(_2)
240
+ _2 = _; if (!_2) return [1, 0]; _2 = !_["done"]; if (!_2) return [1, 0]; _2 = _0["return"]; _2 = isFunction(_2)
224
241
  },
225
242
  function () {
226
243
  if (!_2) return [1, 0]; _2 = _0["return"](); return [1, 0]
@@ -231,45 +248,59 @@ return [1, 9]
231
248
  var _, _0, _2`)
232
249
  assert(downLevel(`for await(var [o,s] of os) noSymbol`), `return async_(
233
250
  function () {
234
- return [7, 8]
251
+ return [11, 8]
235
252
  },
236
253
  function () {
237
- o; s; _3 = Symbol["asyncIterator"]; _3 = os[_3]; if (_3) return [1, 0]; _3 = Symbol["iterator"]; _3 = os[_3]; if (_3) return [1, 0]; _3 = Symbol["iterator"]; _3 = Array["prototype"][_3]
254
+ 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]
255
+ },
256
+ function () {
257
+ _0 = _5; _0 = _0["call"](os); _5 = _0["next"](); return [_5, 1]
258
+ },
259
+ function (_4) {
260
+ _5 = _4; _ = _5; return [1, 0]
238
261
  },
239
262
  function () {
240
- _0 = _3; _0 = _0["call"](os); _3 = _0["next"](); return [_3, 1]
263
+ _5 = !_["done"]; if (!_5) return [5, 0]; _5 = _["value"]; return [_5, 1]
241
264
  },
242
- function (_2) {
243
- _3 = _2; _ = _3; return [1, 0]
265
+ function (_4) {
266
+ _5 = _4; _1 = _5; _6 = Symbol["iterator"]; _6 = _1[_6]; if (_6) return [1, 0]; _6 = Symbol["iterator"]; _6 = Array["prototype"][_6]
267
+ },
268
+ function () {
269
+ _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"]
270
+ },
271
+ function () {
272
+ _9 = (_9); if (!_9) return [1, 0]; _9 = _2["return"]; _9 = isFunction(_9); if (!_9) return [1, 0]; _9 = _2["return"]()
244
273
  },
245
274
  function () {
246
- _3 = !_["done"]; if (!_3) return [1, 0]; _1 = _["value"]; o = _1[0]; s = _1[1]; _3 = (true)
275
+ _3 = _9; _5 = (true)
247
276
  },
248
277
  function () {
249
- if (!_3) return [2, 0]; noSymbol; _3 = _0["next"](); return [_3, 1]
278
+ if (!_5) return [2, 0]; noSymbol; _5 = _0["next"](); return [_5, 1]
250
279
  },
251
- function (_2) {
252
- _3 = _2; _ = _3; return [-2, 0]
280
+ function (_4) {
281
+ _5 = _4; _ = _5; return [-6, 0]
253
282
  },
254
283
  function () {
255
284
  return [0, 9]
256
285
  },
257
286
  function () {
258
- _3 = _ &&! _["done"]; if (!_3) return [1, 0]; _3 = _0["return"]; _3 = isFunction(_3)
287
+ _5 = _; if (!_5) return [1, 0]; _5 = !_["done"]; if (!_5) return [1, 0]; _5 = _0["return"]; _5 = isFunction(_5)
259
288
  },
260
289
  function () {
261
- if (!_3) return [1, 0]; _3 = _0["return"](); return [1, 0]
290
+ if (!_5) return [1, 0]; _5 = _0["return"](); return [1, 0]
262
291
  },
263
292
  function () {
264
293
  return [1, 9]
265
294
  })
266
- var o, s, _, _0, _1, _3`)
267
- assert(downLevel(`for(o of os) noSymbol`), `for (_ = 0, _0 = os["length"]; _ < _0 && (o = os[_], true); _++) noSymbol\r\nvar _, _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 (_ &&! _["done"] && isFunction(_0["return"])) _0["return"]() }\r\nvar _, _0`)
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 (_ &&! _["done"] && isFunction(_0["return"])) _0["return"]() }\r\nvar _, _0`)
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 (_ &&! _["done"] && isFunction(_0["return"])) _0["return"]() }\r\nvar _, _0, _1`)
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"] && (a = _["value"][0], true); _ = _0["next"]()) Symbol } finally { if (_ &&! _["done"] && isFunction(_0["return"])) _0["return"]() }\r\nvar _, _0`)
272
- 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"], a = _1[0], b = _1[1], true); _ = _0["next"]()) Symbol } finally { if (_ &&! _["done"] && isFunction(_0["return"])) _0["return"]() }\r\nvar _, _0, _1`)
295
+ var o, s, _, _0, _1, _2, _3, _5, _6, _7, _8, _9`);
296
+ assert(downLevel(`for(o of os) noSymbol`), `for (_ = 0; _ < os["length"] && (o = os[_], true); _++) noSymbol\r\nvar _, _0`)
297
+ 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`)
298
+ 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`)
299
+ 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`)
300
+ 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"]() }
301
+ var _, _0, _1, _2, _3`)
302
+ 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"]() }
303
+ var _, _0, _1, _2, _3`)
273
304
  assert(downLevel(`[...a]=a`), `var slice_ = Array["prototype"]["slice"];\r\na = slice_["call"](a, 0)`)
274
305
  assert(downLevel(`[c,...a]=a`), `var slice_ = Array["prototype"]["slice"];\r\nc = a[0], a = slice_["call"](a, 1)`)
275
306
  assert(downLevel(`[...a]=a`), `var slice_ = Array["prototype"]["slice"];\r\na = slice_["call"](a, 0)`)
@@ -286,10 +317,10 @@ var _0, _1 };`);
286
317
  i++//异步或步进函数
287
318
  assert(downLevel(`function *(){yield *a}`), `function () { return aster_(
288
319
  function () {
289
- _; _0 = 0; _1 = a["length"]; return [1, 0]
320
+ _; _0 = 0; return [1, 0]
290
321
  },
291
322
  function () {
292
- _3 = _0 < _1; if (!_3) return [1, 0]; _ = a[_0]; _3 = (true)
323
+ _3 = _0 < a["length"]; if (!_3) return [1, 0]; _ = a[_0]; _3 = (true)
293
324
  },
294
325
  function () {
295
326
  if (!_3) return [2, 0]; return [_, 3]
@@ -319,7 +350,7 @@ function () {
319
350
  return [0, 9]
320
351
  },
321
352
  function () {
322
- _2 = _ &&! _["done"]; if (!_2) return [1, 0]; _2 = _0["return"]; _2 = isFunction(_2)
353
+ _2 = _; if (!_2) return [1, 0]; _2 = !_["done"]; if (!_2) return [1, 0]; _2 = _0["return"]; _2 = isFunction(_2)
323
354
  },
324
355
  function () {
325
356
  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
+ }();
@@ -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) var case_ = scanner2(`if(${qn}===${qe.name})return[]`);
154
- else case_ = scanner2(`return[]`), case_.ret_ = -1;
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 (!result[result.length - 1].ret_) {
162
- case_ = scanner2(`return[]`), case_.ret_ = -1;
163
- pushstep(result, case_);
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 = isEvalScope(o);
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
- patchname(c, getnextname);
692
- patchname(d, getnextname);
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
- break;
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
- if (scopes.lastIndexOf(e.scope) >= 0) break;
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 = 10;
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]; _ = b; return [2, 0];\r\n _ = c; 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)", "_ = +1, _ = 1 + _; (_)", true);
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);
@@ -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;
@@ -7,7 +7,3 @@
7
7
  <song ng-click="play(i)" ng-class="{activate:musicList.isActived(p)}" ng-src=p></song>
8
8
  </padding>
9
9
  </list>
10
- <div foot -if="wakeEnabled">
11
- <span>播放时屏幕常亮</span>&nbsp;&nbsp;
12
- <swap -model="playMode.wake" @change="keepWake"></swap>
13
- </div>
@@ -10,7 +10,6 @@ var $scope = {
10
10
  song: kugou$song,
11
11
  padding,
12
12
  swap,
13
- wakeEnabled: !!document.addEventListener,
14
13
  mode: playModes[playModeIndex],
15
14
  switchMode() {
16
15
  playModeIndex++;