efront 4.0.19 → 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.
@@ -1,15 +1,17 @@
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(`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 [7, 8]
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 [1, 0]; o = _["value"]; _2 = (true)
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 [-2, 0]
227
+ _2 = _1; _ = _2; return [-3, 0]
218
228
  },
219
229
  function () {
220
230
  return [0, 9]
221
231
  },
222
232
  function () {
223
- _2 = _ &&! _["done"]; if (!_2) return [1, 0]; _2 = _0["return"]; _2 = isFunction(_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 [7, 8]
244
+ return [11, 8]
235
245
  },
236
246
  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]
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
- _0 = _3; _0 = _0["call"](os); _3 = _0["next"](); return [_3, 1]
256
+ _5 = !_["done"]; if (!_5) return [5, 0]; _5 = _["value"]; return [_5, 1]
241
257
  },
242
- function (_2) {
243
- _3 = _2; _ = _3; return [1, 0]
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 = !_["done"]; if (!_3) return [1, 0]; _1 = _["value"]; o = _1[0]; s = _1[1]; _3 = (true)
268
+ _3 = _9; _5 = (true)
247
269
  },
248
270
  function () {
249
- if (!_3) return [2, 0]; noSymbol; _3 = _0["next"](); return [_3, 1]
271
+ if (!_5) return [2, 0]; noSymbol; _5 = _0["next"](); return [_5, 1]
250
272
  },
251
- function (_2) {
252
- _3 = _2; _ = _3; return [-2, 0]
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
- _3 = _ &&! _["done"]; if (!_3) return [1, 0]; _3 = _0["return"]; _3 = isFunction(_3)
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 (!_3) return [1, 0]; _3 = _0["return"](); return [1, 0]
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, _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`)
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; _1 = a["length"]; return [1, 0]
313
+ _; _0 = 0; return [1, 0]
290
314
  },
291
315
  function () {
292
- _3 = _0 < _1; if (!_3) return [1, 0]; _ = a[_0]; _3 = (true)
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 = _ &&! _["done"]; if (!_2) return [1, 0]; _2 = _0["return"]; _2 = isFunction(_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
+ }();
@@ -4,7 +4,7 @@ var esprima// = require("../esprima/index");
4
4
  // var typescript = require("../typescript/index");
5
5
  var console = require("../reptile/colored_console");
6
6
  var scanner = require("./scanner2");
7
- var data = fs.readFileSync(path.join(__dirname, "../typescript/index.js")).toString();
7
+ var data //= fs.readFileSync(path.join(__dirname, "../typescript/index.js")).toString();
8
8
  var data2 = fs.readFileSync(path.join(__dirname, "./scanner2.js")).toString();
9
9
  // data='{ \r\na( ){ return a;} }';
10
10
  function test(parser, name) {
@@ -107,6 +107,10 @@ function testSpaceLess() {
107
107
  var m = scanner(`if(n<0)return'_f("'+t+'")('+e+")"`);
108
108
  console.log(m.toString());
109
109
  }
110
+ function testUnicode() {
111
+ var m = scanner(`\\u{0042}\\u0042=1`);
112
+ console.log(m.toString())
113
+ }
110
114
  Program.debug = true;
111
115
  // testSpeed();
112
116
  // testVariables();
@@ -119,6 +123,7 @@ Program.debug = true;
119
123
  // testJsx3();
120
124
  // testJsxOnlyHtml();
121
125
  // testSpaceLess();
122
- testArrow();
126
+ // testArrow();
127
+ testUnicode();
123
128
  // var typescript = require("../typescript/index");
124
129
  // typescript.transpile(data.toString(), { noEmitHelpers: true });
@@ -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++) {
@@ -502,7 +492,7 @@ var _invoke = function (t, getname) {
502
492
  cy = skipAssignment(o, cy);
503
493
  if (cy === ay || ay >= o.length) continue;
504
494
  var m = o[ay];
505
- if (cy === ay + 1 && (m.type === EXPRESS && !/[\.\[]/.test(m.text) || m.type === VALUE || m.type === QUOTED && !m.length)) {
495
+ if (cy === ay + 1 && (m.type === EXPRESS && (strip || !/[\.\[]/.test(m.text)) || m.type === VALUE || m.type === QUOTED && !m.length)) {
506
496
  continue;
507
497
  }
508
498
  constStart = cy + 1;
@@ -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
  }
@@ -890,7 +886,7 @@ var canbeTemp = function (body) {
890
886
  if (body[cx] !== body[dx]) return false;
891
887
  var o = body[cx];
892
888
  if (!o) return false;
893
- return o.type === EXPRESS && !/[\.\[]/.test(o.text) || o.type === VALUE || o.type === QUOTED && !o.length;
889
+ return o.type === EXPRESS && (strip || !/[\.\[]/.test(o.text)) || o.type === VALUE || o.type === QUOTED && !o.length;
894
890
  };
895
891
  var _express = function (body, getname, ret) {
896
892
  if (canbeTemp(body)) {
@@ -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 === '{') {
@@ -1312,7 +1314,9 @@ function toqueue(body, getname, ret = false, result = []) {
1312
1314
  return result;
1313
1315
  }
1314
1316
  var ret_ = '';
1317
+ var strip = false;
1315
1318
  module.exports = function (body, newname, ret) {
1319
+ strip = body.strip;
1316
1320
  if (ret) ret = isString(ret) ? ret : newname();
1317
1321
  var ret0 = ret_;
1318
1322
  var ret1 = null;
@@ -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;