efront 4.0.3 → 4.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coms/compile/common.js +32 -14
- package/coms/compile/downLevel.js +3 -3
- package/coms/compile/downLevel_test.js +11 -11
- package/coms/compile/unstruct.js +66 -42
- package/coms/compile/unstruct_test.js +7 -3
- package/docs//347/211/210/346/234/254/350/257/264/346/230/216.md +1 -1
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/coms/compile/common.js
CHANGED
|
@@ -121,27 +121,42 @@ var skipAssignment = function (o, cx) {
|
|
|
121
121
|
break;
|
|
122
122
|
case STRAP:
|
|
123
123
|
if (needpunc) {
|
|
124
|
-
if (
|
|
125
|
-
next();
|
|
126
|
-
next();
|
|
127
|
-
needpunc = false;
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
if (!/^(in|instanceof|of|else|as|finally)$/.test(o.text)) break loop;
|
|
124
|
+
if (!/^(in|instanceof|of|else|as)$/.test(o.text)) break loop;
|
|
131
125
|
if (o.text === 'else') {
|
|
132
126
|
if (!ifdeep) break loop;
|
|
133
127
|
ifdeep--;
|
|
128
|
+
needpunc = false;
|
|
134
129
|
}
|
|
135
|
-
|
|
136
130
|
next();
|
|
137
131
|
needpunc = false;
|
|
138
132
|
}
|
|
139
|
-
else if (/^(
|
|
133
|
+
else if (/^(try|catch|finally)$/.test(o.text)) {
|
|
134
|
+
next();
|
|
135
|
+
if (o.entry === "(") next();
|
|
136
|
+
next();
|
|
137
|
+
}
|
|
138
|
+
else if (o.text === 'else') {
|
|
139
|
+
ifdeep--;
|
|
140
|
+
needpunc = false;
|
|
141
|
+
next();
|
|
142
|
+
}
|
|
143
|
+
else if (/^(if|while|with|switch)$/.test(o.text)) {
|
|
140
144
|
if (o.text === 'if') ifdeep++;
|
|
141
145
|
next();
|
|
142
146
|
next();
|
|
143
147
|
break;
|
|
144
148
|
}
|
|
149
|
+
else if (o.text === 'do') {
|
|
150
|
+
next();
|
|
151
|
+
next();
|
|
152
|
+
next();
|
|
153
|
+
}
|
|
154
|
+
else if (o.text === 'for') {
|
|
155
|
+
next();
|
|
156
|
+
if (o.type === STRAP && o.text === 'await') next();
|
|
157
|
+
next();
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
145
160
|
else if (o.text === "class") {
|
|
146
161
|
next();
|
|
147
162
|
while (o && !o.isClass) next();
|
|
@@ -163,9 +178,12 @@ var skipAssignment = function (o, cx) {
|
|
|
163
178
|
needpunc = false;
|
|
164
179
|
break loop;
|
|
165
180
|
}
|
|
181
|
+
else if (o.isend && !ifdeep) {
|
|
182
|
+
next();
|
|
183
|
+
break loop;
|
|
184
|
+
}
|
|
166
185
|
else {
|
|
167
186
|
next();
|
|
168
|
-
needpunc = false;
|
|
169
187
|
}
|
|
170
188
|
break;
|
|
171
189
|
default:
|
|
@@ -191,7 +209,7 @@ function snapSentenceHead(o) {
|
|
|
191
209
|
p = o.prev;
|
|
192
210
|
if (!p) break;
|
|
193
211
|
}
|
|
194
|
-
var maybeprop = o.type === SCOPED && o.entry !== "{" || o.type === EXPRESS &&
|
|
212
|
+
var maybeprop = o.type === SCOPED && o.entry !== "{" || o.type === EXPRESS && /^[\.\[]/.test(o.text);
|
|
195
213
|
if (p.type === EXPRESS) {
|
|
196
214
|
if (maybeprop || /\.$/.test(p.text)) {
|
|
197
215
|
o = p;
|
|
@@ -472,7 +490,7 @@ var createScoped = function (parsed, wash) {
|
|
|
472
490
|
if (mustyield !== false && o.next) {
|
|
473
491
|
if (o.next.type === STRAP && !/^(?:instanceof|in|of|from|as)$/.test(o.next.text)
|
|
474
492
|
|| o.next.type === STAMP && /[!~]/.test(o.next.text)
|
|
475
|
-
|| o.next.type === EXPRESS &&
|
|
493
|
+
|| o.next.type === EXPRESS && !/^[\.\[]/.test(o.next.text)
|
|
476
494
|
|| o.next.type & (VALUE | QUOTED | SCOPED)
|
|
477
495
|
) {
|
|
478
496
|
mustyield = true;
|
|
@@ -704,7 +722,7 @@ var createScoped = function (parsed, wash) {
|
|
|
704
722
|
|| (VALUE | QUOTED | SCOPED) & o.type
|
|
705
723
|
|| EXPRESS === o.type && !/\.$/.test(o.text)) {
|
|
706
724
|
if ((VALUE | QUOTED | PROPERTY | LABEL) & next.type) break;
|
|
707
|
-
if (EXPRESS === next.type &&
|
|
725
|
+
if (EXPRESS === next.type && !/^[\.\[]/.test(next.text)) break;
|
|
708
726
|
if (next.type === SCOPED && next.entry === "{") break;
|
|
709
727
|
if (next.type === STRAP && !next.isExpress) break;
|
|
710
728
|
}
|
|
@@ -1079,7 +1097,7 @@ var createString = function (parsed) {
|
|
|
1079
1097
|
break;
|
|
1080
1098
|
default:
|
|
1081
1099
|
if (o instanceof Object) {
|
|
1082
|
-
if (o.prev && o.prev.type === EXPRESS && o.type === EXPRESS && (
|
|
1100
|
+
if (o.prev && o.prev.type === EXPRESS && o.type === EXPRESS && (/^[\.\[]/.test(o.text) || /\.$/.test(o.prev.text)));
|
|
1083
1101
|
else if ((STRAP | EXPRESS | PROPERTY | COMMENT | VALUE) & lasttype && (STRAP | EXPRESS | PROPERTY | VALUE) & o.type) {
|
|
1084
1102
|
result.push(" ");
|
|
1085
1103
|
}
|
|
@@ -937,7 +937,7 @@ var unforin = function (o, getnewname_, killobj) {
|
|
|
937
937
|
);
|
|
938
938
|
insert1(o.queue, o.prev, ...s);
|
|
939
939
|
splice(o, 0, o.length, ...scanner2(`${kname}=0;${kname}<${tname}.length&&`));
|
|
940
|
-
var c = scanner2(`(${m.text}=${tname}[${kname}]);${kname}++`);
|
|
940
|
+
var c = scanner2(`(${m.text}=${tname}[${kname}],true);${kname}++`);
|
|
941
941
|
insert1(o, null, ...c);
|
|
942
942
|
};
|
|
943
943
|
|
|
@@ -1358,7 +1358,7 @@ var down = function (scoped) {
|
|
|
1358
1358
|
if (!hp) break a;
|
|
1359
1359
|
if (hp.text === 'for') {
|
|
1360
1360
|
unforof(hp.next, getdeepname, scoped.used);
|
|
1361
|
-
killed = unforin(scoped.head, getdeepname, _killobj.bind(null, _getlocal)) !== false;
|
|
1361
|
+
if (funcMark) killed = unforin(scoped.head, getdeepname, _killobj.bind(null, _getlocal)) !== false;
|
|
1362
1362
|
// unforcx(scoped.head, getdeepname);
|
|
1363
1363
|
}
|
|
1364
1364
|
else if (hp.text === 'catch') {
|
|
@@ -1383,8 +1383,8 @@ var down = function (scoped) {
|
|
|
1383
1383
|
if (funcMark) {
|
|
1384
1384
|
var argname = _letname("_");
|
|
1385
1385
|
unstruct.debug = downLevel.debug;
|
|
1386
|
-
var code = unawait(scoped.body, _getname, argname);
|
|
1387
1386
|
var body = scanner2(`return ${funcMark}()`);
|
|
1387
|
+
var code = unawait(scoped.body, _getname, argname);
|
|
1388
1388
|
code.forEach(function (c) {
|
|
1389
1389
|
var f = scanner2(`function(${c.awaited ? argname : ''}){\r\n}`);
|
|
1390
1390
|
if (!c.length) f[2].push(...scanner2('return [1,0]'));
|
|
@@ -188,7 +188,7 @@ assert(downLevel(`function (a,...,c){}`), `function (a, c) { c = arguments["leng
|
|
|
188
188
|
assert(downLevel(`(...a) => k`), `var slice_ = Array["prototype"]["slice"];\r\nfunction () { var a = slice_["call"](arguments, 0); return k }`)
|
|
189
189
|
assert(downLevel(`for await(o of os) noSymbol`), `return async_(
|
|
190
190
|
function () {
|
|
191
|
-
|
|
191
|
+
_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]
|
|
192
192
|
},
|
|
193
193
|
function () {
|
|
194
194
|
_0 = _2; _2 = _0["call"](os); _0 = _2; _2 = _0["next"](); return [_2, 1]
|
|
@@ -197,15 +197,15 @@ function (_1) {
|
|
|
197
197
|
_2 = _1; _ = _2; return [1, 0]
|
|
198
198
|
},
|
|
199
199
|
function () {
|
|
200
|
-
_2 = !_["done"]; if (!_2) return [1, 0];
|
|
200
|
+
_2 = !_["done"]; if (!_2) return [1, 0]; o = _["value"]; _2 = (true)
|
|
201
201
|
},
|
|
202
202
|
function () {
|
|
203
203
|
if (!_2) return [1, 0]; noSymbol; _2 = _0["next"](); _ = _2; return [-1, 0]
|
|
204
204
|
})
|
|
205
|
-
var _, _0, _2
|
|
205
|
+
var _, _0, _2`)
|
|
206
206
|
assert(downLevel(`for await(var [o,s] of os) noSymbol`), `return async_(
|
|
207
207
|
function () {
|
|
208
|
-
o; s;
|
|
208
|
+
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]
|
|
209
209
|
},
|
|
210
210
|
function () {
|
|
211
211
|
_0 = _3; _3 = _0["call"](os); _0 = _3; _3 = _0["next"](); return [_3, 1]
|
|
@@ -214,12 +214,12 @@ function (_2) {
|
|
|
214
214
|
_3 = _2; _ = _3; return [1, 0]
|
|
215
215
|
},
|
|
216
216
|
function () {
|
|
217
|
-
_3 = !_["done"]; if (!_3) return [1, 0];
|
|
217
|
+
_3 = !_["done"]; if (!_3) return [1, 0]; _1 = _["value"]; o = _1[0]; s = _1[1]; _3 = (true)
|
|
218
218
|
},
|
|
219
219
|
function () {
|
|
220
220
|
if (!_3) return [1, 0]; noSymbol; _3 = _0["next"](); _ = _3; return [-1, 0]
|
|
221
221
|
})
|
|
222
|
-
var o, s, _, _0, _1, _3
|
|
222
|
+
var o, s, _, _0, _1, _3`)
|
|
223
223
|
assert(downLevel(`for(o of os) noSymbol`), `for (_ = 0, _0 = os["length"]; _ < _0 && (o = os[_], true); _++) noSymbol\r\nvar _, _0`)
|
|
224
224
|
assert(downLevel(`for(var o of os) Symbol`), `for (var o, _0 = os[Symbol["iterator"]] || os[Symbol["asyncIterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (o = _["value"], true); _ = _0["next"]()) Symbol\r\nvar _, _0`)
|
|
225
225
|
assert(downLevel(`for(var o of os) Symbol`), `for (var o, _0 = os[Symbol["iterator"]] || os[Symbol["asyncIterator"]] || Array["prototype"][Symbol["iterator"]], _0 = _0["call"](os), _ = _0["next"](); !_["done"] && (o = _["value"], true); _ = _0["next"]()) Symbol\r\nvar _, _0`)
|
|
@@ -245,7 +245,7 @@ function () {
|
|
|
245
245
|
_; _0 = 0; _3 = a["length"]; _1 = _3; return [1, 0]
|
|
246
246
|
},
|
|
247
247
|
function () {
|
|
248
|
-
_3 = _0 < _1; if (!_3) return [1, 0];
|
|
248
|
+
_3 = _0 < _1; if (!_3) return [1, 0]; _ = a[_0]; _3 = (true)
|
|
249
249
|
},
|
|
250
250
|
function () {
|
|
251
251
|
if (!_3) return [2, 0]; return [_, 3]
|
|
@@ -253,22 +253,22 @@ if (!_3) return [2, 0]; return [_, 3]
|
|
|
253
253
|
function () {
|
|
254
254
|
_3 = _0++; return [-2, 0]
|
|
255
255
|
})
|
|
256
|
-
var _, _0, _1, _3
|
|
256
|
+
var _, _0, _1, _3 }`)
|
|
257
257
|
assert(downLevel(`async function(){}`), `function () { return async_() }`)
|
|
258
258
|
assert(downLevel(`async function(){for(var a of b){Symbol}}`), `function () { return async_(
|
|
259
259
|
function () {
|
|
260
|
-
a;
|
|
260
|
+
a; _2 = Symbol["iterator"]; _2 = b[_2]; if (_2) return [1, 0]; _2 = Symbol["asyncIterator"]; _2 = b[_2]; if (_2) return [1, 0]; _2 = Symbol["iterator"]; _2 = Array["prototype"][_2]
|
|
261
261
|
},
|
|
262
262
|
function () {
|
|
263
263
|
_0 = _2; _2 = _0["call"](b); _0 = _2; _2 = _0["next"](); _ = _2; return [1, 0]
|
|
264
264
|
},
|
|
265
265
|
function () {
|
|
266
|
-
_2 = !_["done"]; if (!_2) return [1, 0];
|
|
266
|
+
_2 = !_["done"]; if (!_2) return [1, 0]; a = _["value"]; _2 = (true)
|
|
267
267
|
},
|
|
268
268
|
function () {
|
|
269
269
|
if (!_2) return [1, 0]; Symbol; _2 = _0["next"](); _ = _2; return [-1, 0]
|
|
270
270
|
})
|
|
271
|
-
var a, _, _0, _2
|
|
271
|
+
var a, _, _0, _2 }`)
|
|
272
272
|
assert(downLevel(`a={async a(){var b =c;return 1}}`), `a = (_ = {},
|
|
273
273
|
_.a = function () { return async_(\r\nfunction () {\r\nb = c; return [1, 2]\r\n})\r\nvar b }, _)\r\nvar _`)
|
|
274
274
|
assert(downLevel(`async function(){return 1}`), `function () { return async_(\r\nfunction () {\r\nreturn [1, 2]\r\n}) }`)
|
package/coms/compile/unstruct.js
CHANGED
|
@@ -23,7 +23,7 @@ var _break = function (body, cx, result, iscontinue) {
|
|
|
23
23
|
if (b.type === LABEL && b.text === label) {
|
|
24
24
|
if (!b.breaks) b.breaks = [];
|
|
25
25
|
var _b = scanner2('return []');
|
|
26
|
-
_b.ret_ =
|
|
26
|
+
_b.ret_ = -1;
|
|
27
27
|
if (iscontinue) _b[1].continue = s, s.continue = true;
|
|
28
28
|
b.breaks.push(_b[1]);
|
|
29
29
|
pushstep(result, _b);
|
|
@@ -40,7 +40,7 @@ var _break = function (body, cx, result, iscontinue) {
|
|
|
40
40
|
if (b.type !== LABEL) {
|
|
41
41
|
if (!b.breaks) b.breaks = [];
|
|
42
42
|
var _b = scanner2("return []");
|
|
43
|
-
_b.ret_ =
|
|
43
|
+
_b.ret_ = -1;
|
|
44
44
|
if (iscontinue) _b[1].continue = b, b.continue = true;
|
|
45
45
|
b.breaks.push(_b[1]);
|
|
46
46
|
pushstep(result, _b);
|
|
@@ -146,7 +146,7 @@ var _switch = function (body, cx, unblock, result, getname) {
|
|
|
146
146
|
for (var q of q) if (q.length) pushstep(result, q);
|
|
147
147
|
var qe = q;
|
|
148
148
|
if (qe.name) var case_ = scanner2(`if(${qn}===${qe.name})return[]`);
|
|
149
|
-
else case_ = scanner2(`return[]`), case_.ret_ =
|
|
149
|
+
else case_ = scanner2(`return[]`), case_.ret_ = -1;
|
|
150
150
|
pushstep(result, case_);
|
|
151
151
|
var by = cy;
|
|
152
152
|
m = o[cy];
|
|
@@ -154,7 +154,7 @@ var _switch = function (body, cx, unblock, result, getname) {
|
|
|
154
154
|
tmp.push(result.length - 1, case_[case_.length - 1], o.slice(by, cy));
|
|
155
155
|
}
|
|
156
156
|
if (!result[result.length - 1].ret_) {
|
|
157
|
-
case_ = scanner2(`return[]`), case_.ret_ =
|
|
157
|
+
case_ = scanner2(`return[]`), case_.ret_ = -1;
|
|
158
158
|
pushstep(result, case_);
|
|
159
159
|
tmp.push(result.length - 1, case_[case_.length - 1], []);
|
|
160
160
|
}
|
|
@@ -284,7 +284,9 @@ var _while = function (body, cx, unblock, result) {
|
|
|
284
284
|
return cx;
|
|
285
285
|
};
|
|
286
286
|
var pushstep = function (result, step) {
|
|
287
|
-
if (
|
|
287
|
+
if (isempty(step, SPACE)) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
288
290
|
var q = result[result.length - 1];
|
|
289
291
|
if (!q) {
|
|
290
292
|
result.push(step);
|
|
@@ -302,6 +304,7 @@ var pushstep = function (result, step) {
|
|
|
302
304
|
if (needcomma(q)) q.push({ type: STAMP, text: ';' });
|
|
303
305
|
if (!ishalf(q)) {
|
|
304
306
|
q.ret_ = step.ret_;
|
|
307
|
+
q.ifbrk = step.ifbrk;
|
|
305
308
|
}
|
|
306
309
|
q.push(...step);
|
|
307
310
|
q.await_ = step.await_;
|
|
@@ -346,7 +349,7 @@ var patchstep = function (r, nextindex, h) {
|
|
|
346
349
|
relink(r);
|
|
347
350
|
}
|
|
348
351
|
};
|
|
349
|
-
var
|
|
352
|
+
var flushqueue = function (result, queue) {
|
|
350
353
|
var savedLength = result.length;
|
|
351
354
|
var savedIndex = savedLength - 1;
|
|
352
355
|
var prev = result[savedIndex];
|
|
@@ -359,21 +362,6 @@ var flusqueue = function (result, queue) {
|
|
|
359
362
|
}
|
|
360
363
|
};
|
|
361
364
|
|
|
362
|
-
var addresult = function (result, step) {
|
|
363
|
-
if (!step.length) return;
|
|
364
|
-
var cx, mx = 0, n;
|
|
365
|
-
var awaited = step.awaited;
|
|
366
|
-
var queue = [];
|
|
367
|
-
do {
|
|
368
|
-
while (step[mx] && step[mx].type === STAMP && /^[,;]$/.test(step[mx].text)) mx++;
|
|
369
|
-
cx = step.indexOf(NEXT, mx);
|
|
370
|
-
n = step.slice(mx, mx = cx < 0 ? step.length : cx + 1);
|
|
371
|
-
if (awaited) n.awaited = awaited, awaited = false;
|
|
372
|
-
n.name = step.name;
|
|
373
|
-
queue.push(n);
|
|
374
|
-
} while (mx < step.length);
|
|
375
|
-
flusqueue(result, queue);
|
|
376
|
-
};
|
|
377
365
|
var _do = function (body, cx, unblock, result) {
|
|
378
366
|
var o = body[cx];
|
|
379
367
|
var label = o;
|
|
@@ -391,7 +379,7 @@ var _do = function (body, cx, unblock, result) {
|
|
|
391
379
|
};
|
|
392
380
|
var stepReturn = function (value, type, q) {
|
|
393
381
|
var r = scanner2(`return [${value},${type}]`);
|
|
394
|
-
r.ret_ = true;
|
|
382
|
+
r.ret_ = type === 2 ? type : true;
|
|
395
383
|
if (q && q.length) r.name = q[q.length - 1].name;
|
|
396
384
|
return r;
|
|
397
385
|
}
|
|
@@ -422,7 +410,10 @@ var _return = function (r, nextindex) {
|
|
|
422
410
|
r.await_ = true;
|
|
423
411
|
}
|
|
424
412
|
if (needcomma(r)) r.push({ type: STAMP, text: ';' });
|
|
425
|
-
else if (r.length)
|
|
413
|
+
else if (r.length) {
|
|
414
|
+
var re = r[r.length - 1];
|
|
415
|
+
if (re.type === STAMP && re.text === ',') re.text = ';';
|
|
416
|
+
}
|
|
426
417
|
r.push(...x);
|
|
427
418
|
relink(r);
|
|
428
419
|
};
|
|
@@ -463,7 +454,6 @@ var _invoke = function (t, getname) {
|
|
|
463
454
|
for (var cx = 0; cx < t.length; cx++) {
|
|
464
455
|
var o = t[cx];
|
|
465
456
|
if (needbreak(o)) {
|
|
466
|
-
if (needcomma(queue)) queue.push({ type: STAMP, text: ',' });
|
|
467
457
|
var s = splice(t, bx, cx + 1 - bx);
|
|
468
458
|
if (cx > 0) s.name = s[0].text;
|
|
469
459
|
else s.name = qname;
|
|
@@ -476,6 +466,19 @@ var _invoke = function (t, getname) {
|
|
|
476
466
|
var _nameindex = nameindex;
|
|
477
467
|
remove_end_comma(o);
|
|
478
468
|
var iseval = isEvalScope(o);
|
|
469
|
+
var constStart = 0;
|
|
470
|
+
if (!iseval) {
|
|
471
|
+
for (var cy = 0; cy < o.length; cy++) {
|
|
472
|
+
while (cy < o.length && o[cy].type & (SPACE | COMMENT)) cy++;
|
|
473
|
+
var ay = cy;
|
|
474
|
+
cy = skipAssignment(o, cy);
|
|
475
|
+
var m = o[ay];
|
|
476
|
+
if (cy === ay + 1 && (m.type === EXPRESS && !/[\.\[]/.test(m.text) || m.type === VALUE || m.type === QUOTED && !m.length)) {
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
constStart = cy + 1;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
479
482
|
for (var cy = 0; cy < o.length; cy++) {
|
|
480
483
|
var by = cy;
|
|
481
484
|
while (cy < o.length && o[cy].type & (SPACE | COMMENT)) cy++;
|
|
@@ -484,16 +487,17 @@ var _invoke = function (t, getname) {
|
|
|
484
487
|
var ey = cy;
|
|
485
488
|
if (ay === ey || ay >= o.length) continue;
|
|
486
489
|
var m = o.slice(ay, ey);
|
|
487
|
-
if (m.length === 1 && (m[0].type === EXPRESS &&
|
|
490
|
+
if (m.length === 1 && (m[0].type === EXPRESS && !/[\.\[]/.test(m[0].text) && ay >= constStart || m[0].type === VALUE || m[0].type === QUOTED && !m[0].length)) {
|
|
488
491
|
continue;
|
|
489
492
|
}
|
|
490
|
-
var q = toqueue(m, getdeepname, true);
|
|
491
|
-
var qe = q[q.length - 1];
|
|
492
493
|
if (!iseval || m[m.length - 1] === o.last) {
|
|
494
|
+
var q = toqueue(m, getdeepname, 1);
|
|
495
|
+
var qe = q[q.length - 1];
|
|
493
496
|
splice(o, by, ey - by, { text: qe.name, type: EXPRESS });
|
|
494
497
|
cy = by + 1;
|
|
495
498
|
}
|
|
496
499
|
else {
|
|
500
|
+
var q = toqueue(m, getdeepname, false);
|
|
497
501
|
while (cy < o.length && o[cy].type & (SPACE | COMMENT)) cy++;
|
|
498
502
|
var c = o[cy];
|
|
499
503
|
if (c && c.type & STAMP && /^[,;]$/.test(c.text)) cy++;
|
|
@@ -505,7 +509,7 @@ var _invoke = function (t, getname) {
|
|
|
505
509
|
}
|
|
506
510
|
nameindex = _nameindex;
|
|
507
511
|
if (!cache.length) continue;
|
|
508
|
-
if (queue.length)
|
|
512
|
+
if (queue.length) flushqueue(result, queue), queue = [];
|
|
509
513
|
for (var c of cache) pushstep(result, c);
|
|
510
514
|
cache = [];
|
|
511
515
|
var n = o.next;
|
|
@@ -524,15 +528,15 @@ var _invoke = function (t, getname) {
|
|
|
524
528
|
}
|
|
525
529
|
if (queue.length) {
|
|
526
530
|
queue.push(t);
|
|
527
|
-
|
|
531
|
+
flushqueue(result, queue);
|
|
528
532
|
}
|
|
529
533
|
else if (t.length) {
|
|
530
534
|
var t0 = t[0];
|
|
531
|
-
if (t0.type === EXPRESS &&
|
|
535
|
+
if (t0.type === EXPRESS && /^[\.\[]/.test(t0.text) || t0.type & (STAMP | STRAP) && powermap[t0.text] < powermap.new) {
|
|
532
536
|
t.unshift(...scanner2(`${qname}=${qname}`));
|
|
533
537
|
relink(t);
|
|
534
538
|
}
|
|
535
|
-
|
|
539
|
+
pushstep(result, t);
|
|
536
540
|
}
|
|
537
541
|
return result;
|
|
538
542
|
};
|
|
@@ -551,10 +555,18 @@ var ishalf = function (q) {
|
|
|
551
555
|
if (!e) return false;
|
|
552
556
|
return e.type === SCOPED && e.entry === '(' && e.prev && e.prev.type === STRAP && /^if$/.test(e.prev.text) || e.type === STRAP && /^else$/.test(e.text);
|
|
553
557
|
}
|
|
558
|
+
var isempty = function (q, ignore_types) {
|
|
559
|
+
for (var a of q) {
|
|
560
|
+
if (!(a.type & ignore_types || a.type === STAMP && /^[,;]$/.test(a.text))) return false;
|
|
561
|
+
}
|
|
562
|
+
return true;
|
|
563
|
+
}
|
|
554
564
|
var needcomma = function (q) {
|
|
555
|
-
if (
|
|
556
|
-
var e = q[q.length - 1];
|
|
565
|
+
if (isempty(q, COMMENT | SPACE)) return false;
|
|
557
566
|
if (ishalf(q)) return false;
|
|
567
|
+
var i = q.length - 1;
|
|
568
|
+
var e = q[i];
|
|
569
|
+
while (e.type & (SPACE | COMMENT)) e = q[--i];
|
|
558
570
|
return !needbreak(e);
|
|
559
571
|
};
|
|
560
572
|
var patchname = function (d, getname) {
|
|
@@ -595,9 +607,9 @@ var ternary = function (body, getname, ret) {
|
|
|
595
607
|
patchname(d, getname);
|
|
596
608
|
pushstep(d, stepReturn(1, 0, d));
|
|
597
609
|
pushstep(c, stepReturn(d.length + 1, 0, c));
|
|
598
|
-
|
|
610
|
+
pushstep(res, scanner2(`if(${getCondition(b, function (b) {
|
|
599
611
|
b = ternary(b, getname, true);
|
|
600
|
-
for (var b of b)
|
|
612
|
+
for (var b of b) pushstep(res, b);
|
|
601
613
|
return b;
|
|
602
614
|
}, true)})return [1,0]`));
|
|
603
615
|
var q = res[res.length - 1];
|
|
@@ -620,6 +632,12 @@ var ternary = function (body, getname, ret) {
|
|
|
620
632
|
if (!ret && equcount === 1 && canbeOnce(bd)) {
|
|
621
633
|
res = [bd];
|
|
622
634
|
}
|
|
635
|
+
else if (ret === 1 && !equcount && canbeOnce(bd)) {
|
|
636
|
+
var name = getname(0);
|
|
637
|
+
var r = [{ type: EXPRESS, text: name }, { type: STAMP, text: '=' }, ...bd]
|
|
638
|
+
r.name = name;
|
|
639
|
+
res = [r];
|
|
640
|
+
}
|
|
623
641
|
else {
|
|
624
642
|
res = _express(bd, getname, equalsend > skip || ret);
|
|
625
643
|
}
|
|
@@ -888,6 +906,7 @@ var getblock = function (body, cx) {
|
|
|
888
906
|
cx++;
|
|
889
907
|
}
|
|
890
908
|
var b = body.slice(ax, cx);
|
|
909
|
+
while (o && o.type & (SPACE | COMMENT)) o = body[++cx];
|
|
891
910
|
b.next = o;
|
|
892
911
|
return b;
|
|
893
912
|
};
|
|
@@ -903,9 +922,11 @@ var ifpatch = function (result, autoskip) {
|
|
|
903
922
|
if (!result.length) return;
|
|
904
923
|
if (autoskip !== false) {
|
|
905
924
|
var rs = result[result.length - 1];
|
|
906
|
-
if (rs.ret_ &&
|
|
925
|
+
if (rs.ret_ !== true && rs.ret_) return;
|
|
907
926
|
}
|
|
908
927
|
var re = stepReturn(1, 0);
|
|
928
|
+
re.ret_ = -2;
|
|
929
|
+
re.ifbrk = autoskip !== undefined;
|
|
909
930
|
pushstep(result, re);
|
|
910
931
|
};
|
|
911
932
|
function toqueue(body, getname, ret = false, result = []) {
|
|
@@ -916,9 +937,11 @@ function toqueue(body, getname, ret = false, result = []) {
|
|
|
916
937
|
if (isbr) continue;
|
|
917
938
|
var findex = iftop[cx] - 1;
|
|
918
939
|
var p = result[findex];
|
|
919
|
-
p.
|
|
920
|
-
|
|
921
|
-
|
|
940
|
+
if (p.ifbrk) {
|
|
941
|
+
p.pop();
|
|
942
|
+
p.push(scanner2(`[${result.length - findex},0]`)[0]);
|
|
943
|
+
relink(p);
|
|
944
|
+
}
|
|
922
945
|
}
|
|
923
946
|
for (var cx = 1, dx = iftop.length - 2; cx < dx; cx++) {
|
|
924
947
|
var isbr = iftop[cx++];
|
|
@@ -946,6 +969,7 @@ function toqueue(body, getname, ret = false, result = []) {
|
|
|
946
969
|
var r = result[cx];
|
|
947
970
|
if (r.indexOf(b) >= 0) { break }
|
|
948
971
|
}
|
|
972
|
+
if (cx < 0) throw console.log(result.map(r => createString(r)), e.text, createString([b.prev, b])), "break语句异常";
|
|
949
973
|
end.push({ type: VALUE, text: b.continue ? b.continue.contat - cx : result.length - cx }, { type: STAMP, text: "," }, { type: VALUE, text: "0" });
|
|
950
974
|
relink(end);
|
|
951
975
|
}
|
|
@@ -1047,7 +1071,7 @@ function toqueue(body, getname, ret = false, result = []) {
|
|
|
1047
1071
|
while (body[cx] !== o.next) cx++;
|
|
1048
1072
|
o = o.next;
|
|
1049
1073
|
isbr = isbreak(o);
|
|
1050
|
-
if (!isbr) ifpatch(result);
|
|
1074
|
+
if (!isbr) ifpatch(result, true);
|
|
1051
1075
|
iftop.push(result.length);
|
|
1052
1076
|
elseif = true;
|
|
1053
1077
|
}
|
|
@@ -1087,8 +1111,8 @@ function toqueue(body, getname, ret = false, result = []) {
|
|
|
1087
1111
|
var bn = body.next;
|
|
1088
1112
|
if (bn && bn.type === STAMP && bn.text === ';') bn = bn.next;
|
|
1089
1113
|
var inif = bn && bn.type === STRAP && bn.text === 'else';
|
|
1090
|
-
if (inif) ifpatch(result);
|
|
1091
|
-
else if (!isbr) ifpatch(result);
|
|
1114
|
+
if (inif) ifpatch(result, true);
|
|
1115
|
+
else if (!isbr) ifpatch(result, true);
|
|
1092
1116
|
uniftop();
|
|
1093
1117
|
if (inif) ifpatch(result, false);
|
|
1094
1118
|
iftop = null;
|
|
@@ -57,8 +57,10 @@ test("if(await a) await b", "_ = a; return [_, 1];\r\n if (!@) return [2, 0]; _
|
|
|
57
57
|
test("for(a in b)", "for (a in b)", true);
|
|
58
58
|
test("for(var a in b) a.push()", "for (var a in b) a.push()", true);
|
|
59
59
|
test("for(;;)", "return [0, 0]", true);
|
|
60
|
-
test("for(a = os[Symbol.iterator] || os[Symbol.asyncIterator] || Array.prototype[Symbol.iterator], a = a.call(os), b = a.next(); !b.done && (o = b.value, true); b = a.next())", "_ = Symbol.iterator; _ = os[_]; if (_) return [1, 0]; _ = Symbol.asyncIterator; _ = os[_]; if (_) return [1, 0]; _ = Symbol.iterator; _ = Array.prototype[_];\r\n a = _; _ = a.call(os); a = _; _ = a.next(); b = _; return [1, 0];\r\n _ = !b.done; if (!_) return [1, 0];
|
|
61
|
-
test("for(a=0;a<1;a++)if(a==0)continue", `a = 0; return [1, 0];\r\n _ = a < 1; if (!_) return [
|
|
60
|
+
test("for(a = os[Symbol.iterator] || os[Symbol.asyncIterator] || Array.prototype[Symbol.iterator], a = a.call(os), b = a.next(); !b.done && (o = b.value, true); b = a.next())", "_ = Symbol.iterator; _ = os[_]; if (_) return [1, 0]; _ = Symbol.asyncIterator; _ = os[_]; if (_) return [1, 0]; _ = Symbol.iterator; _ = Array.prototype[_];\r\n a = _; _ = a.call(os); a = _; _ = a.next(); b = _; return [1, 0];\r\n _ = !b.done; if (!_) return [1, 0]; o = b.value; _ = (true);\r\n if (!_) return [1, 0]; _ = a.next(); b = _; return [-1, 0]", true);
|
|
61
|
+
test("for(a=0;a<1;a++)if(a==0)continue\r\n else a=1", `a = 0; return [1, 0];\r\n _ = a < 1; if (!_) return [3, 0]; _ = a == 0; if (_) return [2, 0]; return [1, 0];\r\n a = 1; return [1, 0];\r\n _ = a++; return [-2, 0]`, true);
|
|
62
|
+
test("for(a=0;a<1;a++)if(a==0){continue} else {a=1}", `a = 0; return [1, 0];\r\n _ = a < 1; if (!_) return [3, 0]; _ = a == 0; if (!_) return [1, 0]; return [2, 0];\r\n a = 1; return [1, 0];\r\n _ = a++; return [-2, 0]`, true);
|
|
63
|
+
test("for(a=0;a<1;a++){if(a==0){a=2;continue} else if(b) {a=1;continue} c=3}", `a = 0; return [1, 0];\r\n _ = a < 1; if (!_) return [4, 0]; _ = a == 0; if (!_) return [1, 0]; a = 2; return [3, 0];\r\n if (!b) return [1, 0]; a = 1; return [2, 0];\r\n c = 3; return [1, 0];\r\n _ = a++; return [-3, 0]`, true);
|
|
62
64
|
test("for(a=0;a<10;a++) await a", "a = 0; return [1, 0];\r\n _ = a < 10; if (!_) return [2, 0]; _ = a; return [_, 1];\r\n _ = @; _ = a++; return [-1, 0]", true);
|
|
63
65
|
test("for(a=0;a<10;a++) await a, await b", "a = 0; return [1, 0];\r\n _ = a < 10; if (!_) return [3, 0]; _ = a; return [_, 1];\r\n _ = @; _ = b; return [_, 1];\r\n _ = @; _ = a++; return [-2, 0]", true);
|
|
64
66
|
test("for(a=0;b=2,a<10;a++) await a, await b", "a = 0; return [1, 0];\r\n b = 2; _ = a < 10; if (!_) return [3, 0]; _ = a; return [_, 1];\r\n _ = @; _ = b; return [_, 1];\r\n _ = @; _ = a++; return [-2, 0]", true);
|
|
@@ -73,6 +75,7 @@ test("switch(a){case 1:case 2:break;}", "if (a === 1) return [1, 0]; if (a === 2
|
|
|
73
75
|
test("switch(a){case 1:case 2:x=1;}", "if (a === 1) return [1, 0]; if (a === 2) return [1, 0]; return [2, 0];\r\n x = 1; return [1, 0]", true);
|
|
74
76
|
test("switch(a){case 1:case 2:x=1;}", "if (a === 1) return [1, 0]; if (a === 2) return [1, 0]; return [2, 0];\r\n x = 1; return [1, 0]", true);
|
|
75
77
|
test("with(a){ a = 1}", `if (_ = with_("a", [a])) _.a = 1; else a = 1;`, true);
|
|
78
|
+
test("try{a=2+1}catch(e){return;}", 'return [65537, 7];\r\n _ = 2 + 1; a = _; return [0, 9];\r\n e = @; return [undefined, 2];\r\n return [1, 9]', true);
|
|
76
79
|
test("try{a=2+1}catch(e){}", 'return [1, 7];\r\n _ = 2 + 1; a = _; return [0, 9];\r\n return [1, 9]', true);
|
|
77
80
|
test("try{a=2+1}catch(e){a=3}", 'return [65537, 7];\r\n _ = 2 + 1; a = _; return [0, 9];\r\n e = @; a = 3; return [0, 9];\r\n return [1, 9]', true);
|
|
78
81
|
test("(function(){})", '_ = function () {}; (_)', true);
|
|
@@ -90,4 +93,5 @@ test(`a=a+b*c+c*d`, `_ = b * c, _ = a + _, _0 = c * d, _ = _ + _0; a = _`, true)
|
|
|
90
93
|
test(`cc.name += "<f test></f>"`, `_ = cc.name + "<f test></f>"; cc.name = _`, true);
|
|
91
94
|
test("yield a", 'return [a, 3]', true);
|
|
92
95
|
test("throw a", 'throw a', true);
|
|
93
|
-
test("debugger", 'debugger', true);
|
|
96
|
+
test("debugger", 'debugger', true);
|
|
97
|
+
test("a(b,b+=1)", '_ = b; _0 = b + 1; b = _0; a(_, _0)', true);
|