efront 3.36.5 → 3.36.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/basic_/Symbol.js +11 -0
- package/coms/basic_/aster_.js +35 -0
- package/coms/basic_/asyncAster_.js +50 -0
- package/coms/basic_/async_.js +4 -0
- package/coms/basic_/async_test.js +11 -0
- package/coms/basic_/exec_.js +62 -0
- package/coms/compile/Javascript.js +1 -1
- package/coms/compile/Program.js +1 -1
- package/coms/compile/common.js +9 -1
- package/coms/compile/createExpressList_test.js +20 -0
- package/coms/compile/downLevel.js +109 -23
- package/coms/compile/downLevel_test.js +10 -6
- package/coms/compile/powermap.js +12 -0
- package/coms/compile/unstruct.js +302 -177
- package/coms/compile/unstruct_test.js +44 -34
- package/coms/zimoli/alert.js +1 -1
- package/coms/zimoli/cless.js +1 -1
- package/coms/zimoli/menuItem.html +1 -1
- package/coms/zimoli/menuItem.js +1 -1
- package/coms/zimoli/zimoli.js +0 -12
- package/package.json +1 -1
- package/public/efront.js +1 -1
package/coms/compile/unstruct.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
var { SPACE, COMMENT, EXPRESS, STRAP, STAMP, SCOPED, VALUE, LABEL, createString, skipAssignment } = require("./common");
|
|
1
|
+
var { SPACE, COMMENT, EXPRESS, STRAP, QUOTED, STAMP, SCOPED, VALUE, LABEL, createString, skipAssignment, relink } = 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
|
|
5
|
+
var RD = { type: STRAP, text: "@rd" };// if (_) return
|
|
5
6
|
var RETURN = { type: STRAP, text: "@ret" };// return;
|
|
7
|
+
var YIELD = { type: STRAP, text: "@yield" };// return;
|
|
6
8
|
var NEXT = { type: STRAP, text: "@next" };// return;
|
|
7
|
-
var relink = scanner2.Program.prototype.relink;
|
|
8
9
|
var _break = function (body, cx, result) {
|
|
9
10
|
var label;
|
|
10
11
|
do {
|
|
@@ -39,6 +40,47 @@ var _break = function (body, cx, result) {
|
|
|
39
40
|
}
|
|
40
41
|
return bx;
|
|
41
42
|
};
|
|
43
|
+
var _try = function (body, cx, unblock, result, getname) {
|
|
44
|
+
var o = body[cx];
|
|
45
|
+
o = o.next;
|
|
46
|
+
while (body[cx++] !== o);
|
|
47
|
+
var trystart = scanner2(`return [,7]`);
|
|
48
|
+
addresult(result, trystart);
|
|
49
|
+
var tryoffset = result.length;
|
|
50
|
+
unblock(o);
|
|
51
|
+
var final = scanner2(`return [0,9]`);
|
|
52
|
+
|
|
53
|
+
addresult(result, final);
|
|
54
|
+
o = o.next;
|
|
55
|
+
if (o.type !== STRAP || o.text !== 'catch') throw `缺少catch语句`;
|
|
56
|
+
o = o.next;
|
|
57
|
+
var arg = [];
|
|
58
|
+
var catchoffset = result.length;
|
|
59
|
+
if (o.type === SCOPED && o.entry === "(") {
|
|
60
|
+
var e = o.first;
|
|
61
|
+
if (e) {
|
|
62
|
+
arg = scanner2(`${e.text}=${ret_ || "@"}`);
|
|
63
|
+
addresult(result, arg);
|
|
64
|
+
}
|
|
65
|
+
o = o.next;
|
|
66
|
+
}
|
|
67
|
+
unblock(o);
|
|
68
|
+
o = o.next;
|
|
69
|
+
if (o && o.type === STRAP && o.text === 'finally') {
|
|
70
|
+
o = o.next;
|
|
71
|
+
var finishoffset = result.length;
|
|
72
|
+
unblock(o);
|
|
73
|
+
}
|
|
74
|
+
var tse = trystart[trystart.length - 1];
|
|
75
|
+
tse.unshift({
|
|
76
|
+
text: String(catchoffset - tryoffset << 16 | finishoffset - catchoffset),
|
|
77
|
+
type: VALUE,
|
|
78
|
+
});
|
|
79
|
+
relink(tse);
|
|
80
|
+
|
|
81
|
+
var finalend = scanner2(`return [1,9]`);
|
|
82
|
+
addresult(result, finalend);
|
|
83
|
+
};
|
|
42
84
|
var evals = [];
|
|
43
85
|
|
|
44
86
|
var _with = function (body, cx, unblock, result, getname) {
|
|
@@ -46,7 +88,6 @@ var _with = function (body, cx, unblock, result, getname) {
|
|
|
46
88
|
var c = o.next;
|
|
47
89
|
while (body[cx] !== c) cx++;
|
|
48
90
|
unblock(c);
|
|
49
|
-
addresult(result, []);
|
|
50
91
|
evals.push(getname(0));
|
|
51
92
|
var block = getblock(body, ++cx);
|
|
52
93
|
cx += block.length;
|
|
@@ -87,18 +128,20 @@ var _switch = function (body, cx, unblock, result, getname) {
|
|
|
87
128
|
};
|
|
88
129
|
var q = _express(block, getnextname, true);
|
|
89
130
|
for (var q of q) addresult(result, q);
|
|
90
|
-
|
|
131
|
+
var case_ = scanner2(`if(${getname(0)}===${getname(1)})return[]`)
|
|
132
|
+
addresult(result, case_);
|
|
91
133
|
var by = cy;
|
|
92
134
|
m = o[cy];
|
|
93
135
|
while (m && (m.type !== STRAP || m.text !== 'case')) m = o[++cy];
|
|
94
|
-
tmp.push(result.length - 1, o.slice(by, cy));
|
|
136
|
+
tmp.push(result.length - 1, case_, o.slice(by, cy));
|
|
95
137
|
}
|
|
96
138
|
while (tmp.length) {
|
|
97
139
|
cy = tmp.shift();
|
|
140
|
+
case_ = tmp.shift();
|
|
98
141
|
block = tmp.shift();
|
|
99
|
-
var q =
|
|
100
|
-
q
|
|
101
|
-
relink(q
|
|
142
|
+
var q = case_[case_.length - 1];
|
|
143
|
+
q.push({ type: VALUE, text: String(result.length - cy) }, { type: STAMP, text: "," }, { type: VALUE, text: '0' });
|
|
144
|
+
relink(q);
|
|
102
145
|
for (var cy = 0, dy = block.length; cy < dy; cy++) {
|
|
103
146
|
var b = getblock(block, cy);
|
|
104
147
|
cy += b.length;
|
|
@@ -107,7 +150,6 @@ var _switch = function (body, cx, unblock, result, getname) {
|
|
|
107
150
|
result.push(r);
|
|
108
151
|
}
|
|
109
152
|
}
|
|
110
|
-
addresult(result, []);
|
|
111
153
|
}
|
|
112
154
|
return cx;
|
|
113
155
|
};
|
|
@@ -118,11 +160,20 @@ var _for = function (body, cx, unblock, result, tmpname) {
|
|
|
118
160
|
if (m.type === STRAP && /^(let|const|var)$/.test(m.text)) {
|
|
119
161
|
m = m.next;
|
|
120
162
|
}
|
|
163
|
+
var mn = m.next;
|
|
164
|
+
if (mn.type === STRAP && mn.text === 'in') {
|
|
165
|
+
// 含有高级语法的 for in 语句在 ./downLevel.js 中预处理
|
|
166
|
+
var dx = cx;
|
|
167
|
+
var n = o.next;
|
|
168
|
+
while (body[dx] !== n) dx++;
|
|
169
|
+
addresult(result, body.slice(cx, dx));
|
|
170
|
+
return dx;
|
|
171
|
+
}
|
|
121
172
|
var cy = 0;
|
|
122
173
|
while (o[cy] !== m) cy++;
|
|
123
174
|
var block = getblock(o, cy);// init
|
|
124
175
|
cy += block.length + 1;
|
|
125
|
-
unblock(block, ...scanner2(
|
|
176
|
+
unblock(block, ...scanner2(`;return [1,0]`));
|
|
126
177
|
var block1 = getblock(o, cy);// condition
|
|
127
178
|
cy += block1.length + 1;
|
|
128
179
|
var block2 = getblock(o, cy);// next
|
|
@@ -130,54 +181,131 @@ var _for = function (body, cx, unblock, result, tmpname) {
|
|
|
130
181
|
var block_ = getblock(body, ++cx);// body
|
|
131
182
|
cx += block_.length;
|
|
132
183
|
unblock(block1);
|
|
133
|
-
result[result.length - 1].pop();
|
|
134
|
-
result[result.length - 1].pop();
|
|
135
184
|
relink(result[result.length - 1]);
|
|
136
|
-
var b = scanner2(
|
|
185
|
+
var b = scanner2(`;if(!${tmpname})return []`)
|
|
137
186
|
result[result.length - 1].push(...b);
|
|
138
187
|
relink(result[result.length - 1]);
|
|
139
188
|
var i = result.length;
|
|
140
189
|
unblock(block_);
|
|
141
190
|
unblock(block2);
|
|
142
|
-
result[result.length - 1].
|
|
143
|
-
|
|
144
|
-
b[b.length - 1].push(result.length - i + 1);
|
|
191
|
+
result[result.length - 1].push(...scanner2(`;return [${i - result.length},0]`));
|
|
192
|
+
b[b.length - 1].push(...scanner2(`${result.length - i + 1},0`));
|
|
145
193
|
relink(result[result.length - 1]);
|
|
146
194
|
return cx;
|
|
147
195
|
};
|
|
196
|
+
var getCondition = function (o, unblock, not_) {
|
|
197
|
+
var n = '';
|
|
198
|
+
var f = o.first;
|
|
199
|
+
var not = f.type === STAMP && f.text === "!";
|
|
200
|
+
if (not) f = f.next;
|
|
201
|
+
if (not_) not = !not;
|
|
202
|
+
if (f && f === o.last) {
|
|
203
|
+
if (f.type & (EXPRESS | VALUE)) {
|
|
204
|
+
n = f.text;
|
|
205
|
+
}
|
|
206
|
+
if (not && n) {
|
|
207
|
+
if (f.type === VALUE) {
|
|
208
|
+
n = String(eval("!" + f.text));
|
|
209
|
+
}
|
|
210
|
+
else n = "!" + n;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!n) {
|
|
214
|
+
n = unblock(o);
|
|
215
|
+
n = n.await ? ret_ : n.name;
|
|
216
|
+
if (not) n = "!" + n;
|
|
217
|
+
}
|
|
218
|
+
return n;
|
|
219
|
+
}
|
|
148
220
|
var _while = function (body, cx, unblock, result, tmpname) {
|
|
149
221
|
var o = body[cx];
|
|
150
222
|
o = o.next;
|
|
151
223
|
while (body[cx] !== o) cx++;
|
|
152
|
-
var b = scanner2(`if(
|
|
153
|
-
|
|
154
|
-
result[result.length - 1].pop();
|
|
155
|
-
result[result.length - 1].pop();
|
|
156
|
-
result[result.length - 1].push(...b);
|
|
224
|
+
var b = scanner2(`if(${getCondition(o, unblock, true)})return []`)
|
|
225
|
+
result.push(b);
|
|
157
226
|
relink(result[result.length - 1]);
|
|
158
227
|
var block = getblock(body, ++cx);
|
|
159
228
|
var i = result.length;
|
|
160
229
|
cx += block.length;
|
|
161
230
|
unblock(block);
|
|
162
|
-
result.push(scanner2(`return [${i - result.length - 1}]`));
|
|
163
|
-
b[b.length - 1].push(result.length - i + 1);
|
|
231
|
+
result.push(scanner2(`return [${i - result.length - 1},0]`));
|
|
232
|
+
b[b.length - 1].push(...scanner2(`${result.length - i + 1},0`));
|
|
164
233
|
return cx;
|
|
165
234
|
};
|
|
166
|
-
var
|
|
235
|
+
var pushstep = function (result, step) {
|
|
236
|
+
if (!step.length) return;
|
|
167
237
|
var q = result[result.length - 1];
|
|
168
|
-
if (q
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
238
|
+
if (!q) {
|
|
239
|
+
result.push(step);
|
|
240
|
+
}
|
|
241
|
+
else if (q.await) {
|
|
242
|
+
if (!step.awaited) step.unshift(...scanner2(`${q.name}=${ret_};`));
|
|
243
|
+
step.awaited = true;
|
|
244
|
+
relink(step);
|
|
245
|
+
result.push(step);
|
|
246
|
+
}
|
|
247
|
+
else if (q.ifrt) {
|
|
248
|
+
result.push(step);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
q.push({ type: STAMP, text: ";" }, ...step);
|
|
252
|
+
step = q;
|
|
253
|
+
relink(q);
|
|
254
|
+
}
|
|
255
|
+
_return(step);
|
|
256
|
+
};
|
|
257
|
+
var patchstep = function (r, nextindex, h) {
|
|
258
|
+
var name = r.name;
|
|
259
|
+
var o, i, x, p, n;
|
|
260
|
+
if (evals.length) for (var i = r.length - 1; i >= h; i--) {
|
|
261
|
+
o = r[i];
|
|
262
|
+
if (o.set) {
|
|
263
|
+
var [m, _, b] = r.splice(i, 3);
|
|
264
|
+
r.splice(i, 0, ...scanner2(_withset(m.text, m.set, b.text)));
|
|
173
265
|
}
|
|
174
|
-
else {
|
|
175
|
-
|
|
266
|
+
else if (o.get) {
|
|
267
|
+
r.splice(i, 1, ...scanner2(_withget(b.text)));
|
|
176
268
|
}
|
|
177
|
-
q._return = next._return;
|
|
178
269
|
}
|
|
179
|
-
|
|
180
|
-
|
|
270
|
+
for (i = r.length - 1; i >= h; i--) {
|
|
271
|
+
o = r[i];
|
|
272
|
+
if (o === RZ) {
|
|
273
|
+
x = scanner2(`if(!${name})return [${nextindex},0]`);
|
|
274
|
+
}
|
|
275
|
+
else if (o === RE) {
|
|
276
|
+
x = scanner2(`if(${name})return [${nextindex},0]`);
|
|
277
|
+
}
|
|
278
|
+
else if (o === RD) {
|
|
279
|
+
x = scanner2(`if(${name}!==null&&${name}!== undefined)return [${nextindex},0]`);
|
|
280
|
+
}
|
|
281
|
+
else continue;
|
|
282
|
+
var p = o.prev;
|
|
283
|
+
if (!p || p.type === STAMP && p.text === ";");
|
|
284
|
+
else x.unshift({ type: STAMP, text: ";" });
|
|
285
|
+
var n = o.next;
|
|
286
|
+
if (!n || n.type === STAMP && n.text === ';');
|
|
287
|
+
else x.push({ type: STAMP, text: ';' });
|
|
288
|
+
r.splice(i, 1, ...x);
|
|
289
|
+
relink(r);
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
var addresult = function (result, step) {
|
|
293
|
+
if (!step.length) return;
|
|
294
|
+
var savedLength = result.length;
|
|
295
|
+
var prev = result[savedLength - 1];
|
|
296
|
+
if (prev) var patch = prev.length;
|
|
297
|
+
var cx, mx = 0, n;
|
|
298
|
+
var awaited = step.awaited;
|
|
299
|
+
do {
|
|
300
|
+
cx = step.indexOf(NEXT, mx);
|
|
301
|
+
n = step.slice(mx, mx = cx < 0 ? step.length : cx + 1);
|
|
302
|
+
if (awaited) n.awaited = awaited, awaited = false;
|
|
303
|
+
n.name = step.name;
|
|
304
|
+
pushstep(result, n);
|
|
305
|
+
} while (mx < step.length);
|
|
306
|
+
if (ret_) {
|
|
307
|
+
if (prev) patchstep(prev, result.length - savedLength - 1, patch || 0);
|
|
308
|
+
result.slice(savedLength).forEach((a, i) => patchstep(a, result.length - i - savedLength, 0));
|
|
181
309
|
}
|
|
182
310
|
};
|
|
183
311
|
var _do = function (body, cx, unblock, result, tmpname) {
|
|
@@ -186,77 +314,39 @@ var _do = function (body, cx, unblock, result, tmpname) {
|
|
|
186
314
|
var i = result.length;
|
|
187
315
|
unblock(o);
|
|
188
316
|
o = o.next.next;
|
|
189
|
-
|
|
190
|
-
var b = scanner2(`return [${tmpname}?${i - result.length}:${1}]`);
|
|
317
|
+
var b = scanner2(`if(${getCondition(o, unblock)})return [${i - result.length},0];return [1,0]`);
|
|
191
318
|
addresult(result, b);
|
|
192
319
|
while (body[cx] !== o) cx++;
|
|
193
320
|
return cx;
|
|
194
321
|
};
|
|
195
322
|
|
|
196
323
|
var needbreak = function (o) {
|
|
197
|
-
return o === RE || o === RZ || o === RETURN || o === NEXT;
|
|
324
|
+
return o === RE || o === RZ || o === RD || o === RETURN || o === NEXT || o === YIELD;
|
|
198
325
|
};
|
|
199
|
-
var _return = function (
|
|
200
|
-
var
|
|
201
|
-
var
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
tmp = [];
|
|
211
|
-
}
|
|
326
|
+
var _return = function (r, nextindex) {
|
|
327
|
+
var name = r.name;
|
|
328
|
+
var e = r[r.length - 1];
|
|
329
|
+
if (!needbreak(e)) return;
|
|
330
|
+
r.ifrt = true;
|
|
331
|
+
r.pop();
|
|
332
|
+
var semicolon = r[r.length - 1];
|
|
333
|
+
semicolon = semicolon && semicolon.type === STAMP && /^[,;]$/.test(semicolon.text);
|
|
334
|
+
var x;
|
|
335
|
+
if (e === RETURN) {
|
|
336
|
+
x = scanner2(`return [${name},2]`);
|
|
212
337
|
}
|
|
213
|
-
if (
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
else if (e === RE) {
|
|
225
|
-
x = scanner2(`if(${r.name})return [${result.length - i},]`);
|
|
226
|
-
}
|
|
227
|
-
else if (e === RETURN) {
|
|
228
|
-
if (result.length === 1) r._return = true;
|
|
229
|
-
x = scanner2(`return [${result.length - i},]`);
|
|
230
|
-
}
|
|
231
|
-
else if (e === NEXT) {
|
|
232
|
-
x = scanner2(`return [1,]`);
|
|
233
|
-
}
|
|
234
|
-
if (r.name) {
|
|
235
|
-
if (!semicolon) r.push({ type: STAMP, text: ';' });
|
|
236
|
-
x[x.length - 1].push({ type: EXPRESS, text: r.name });
|
|
237
|
-
relink(x[x.length - 1]);
|
|
238
|
-
r.push(...x);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
x[x.length - 1].push(...r);
|
|
242
|
-
r.splice(0, r.length, ...x);
|
|
243
|
-
}
|
|
244
|
-
relink(r);
|
|
245
|
-
});
|
|
246
|
-
return result;
|
|
338
|
+
else if (e === YIELD) {
|
|
339
|
+
x = scanner2(`return [${name},3]`);
|
|
340
|
+
}
|
|
341
|
+
else if (e === NEXT) {
|
|
342
|
+
x = scanner2(`return [${name},1]`);
|
|
343
|
+
r.await = true;
|
|
344
|
+
}
|
|
345
|
+
if (semicolon) r.pop();
|
|
346
|
+
r.push({ type: STAMP, text: ';' });
|
|
347
|
+
r.push(...x);
|
|
348
|
+
relink(r);
|
|
247
349
|
};
|
|
248
|
-
var power_map = {};
|
|
249
|
-
[
|
|
250
|
-
'=,+=,-=,*=,/=,%=,|=,&=,^=,**=,~='/* 1 */,
|
|
251
|
-
'=>'/* 2 */, '?,:'/* 3 */, '&&,||'/* 4 */, '&,|,^'/* 5 */,
|
|
252
|
-
'instanceof,in,==,>=,<=,>,<,!=,!==,===,!in,!instanceof'/* 6 */,
|
|
253
|
-
'>>,>>>,<<'/* 7 */, '+,-'/* 8 */, '*,/,%'/* 9 */, '**'/* 10 */,
|
|
254
|
-
'typeof,await,yield,new,!,~'/* 11 */, '++,--'/* 12 */
|
|
255
|
-
].forEach((pp, i) => {
|
|
256
|
-
pp.split(",").forEach(p => {
|
|
257
|
-
power_map[p] = i + 1;
|
|
258
|
-
})
|
|
259
|
-
});
|
|
260
350
|
var remove_end_comma = function (o) {
|
|
261
351
|
if (!o.length || o.type !== SCOPED || o.entry === '[') return;
|
|
262
352
|
for (var cx = o.length - 1; cx >= 0; cx--) {
|
|
@@ -277,18 +367,19 @@ var _invoke = function (t, getname) {
|
|
|
277
367
|
var result = [];
|
|
278
368
|
var cache = [];
|
|
279
369
|
var queue = [];
|
|
370
|
+
queue.name = t.name;
|
|
280
371
|
var bx = 0;
|
|
281
372
|
for (var cx = 0; cx < t.length; cx++) {
|
|
282
373
|
var o = t[cx];
|
|
283
374
|
if (o.type === STAMP && /^[,;]$/.test(o.text)) {
|
|
284
|
-
if (queue.length) queue.push({ type: STAMP, text: '
|
|
375
|
+
if (queue.length) queue.push({ type: STAMP, text: ',' });
|
|
285
376
|
queue.push(...t.splice(bx, cx + 1));
|
|
286
377
|
cx += bx - cx - 1;
|
|
287
378
|
queue.pop();
|
|
288
379
|
bx = cx + 1;
|
|
289
380
|
continue;
|
|
290
381
|
}
|
|
291
|
-
if (o.type === SCOPED && o.entry === '[' || o.entry === "(") {
|
|
382
|
+
if (o.type === SCOPED && (o.entry === '[' || o.entry === "(")) {
|
|
292
383
|
var _nameindex = nameindex;
|
|
293
384
|
remove_end_comma(o);
|
|
294
385
|
var cy = 0;
|
|
@@ -297,40 +388,35 @@ var _invoke = function (t, getname) {
|
|
|
297
388
|
cy = skipAssignment(o, cy);
|
|
298
389
|
if (by === cy) continue;
|
|
299
390
|
var m = o.slice(by, cy);
|
|
300
|
-
if (m.length === 1 && (m[0].type === EXPRESS &&
|
|
391
|
+
if (m.length === 1 && (m[0].type === EXPRESS && !/\./.test(m[0].text) || m[0].type === VALUE || m[0].type === QUOTED)) {
|
|
301
392
|
continue;
|
|
302
393
|
}
|
|
303
394
|
var q = toqueue(m, getdeepname, true);
|
|
304
395
|
o.splice(by, cy, { text: getdeepname(0), type: EXPRESS });
|
|
305
396
|
cy -= cy - by - 1;
|
|
306
397
|
nameindex++;
|
|
307
|
-
|
|
308
|
-
if (q._return) {
|
|
309
|
-
q.splice(q.length - 3);
|
|
310
|
-
}
|
|
311
|
-
cache.push(q);
|
|
312
|
-
});
|
|
398
|
+
cache.push(...q);
|
|
313
399
|
}
|
|
314
400
|
if (!cache.length) continue;
|
|
315
401
|
nameindex = _nameindex;
|
|
316
|
-
if (queue.length) result
|
|
402
|
+
if (queue.length) addresult(result, queue), queue = [], queue.name = getdeepname(nameindex);
|
|
317
403
|
result.push(...cache);
|
|
318
404
|
cache = [];
|
|
319
405
|
var m = t.splice(bx, cx + 1);
|
|
406
|
+
m.name = queue.name;
|
|
320
407
|
cx -= m.length;
|
|
321
|
-
if (bx + 1 < t.length && (t[bx].type
|
|
408
|
+
if (bx + 1 < t.length && (t[bx].type & (SCOPED | EXPRESS))) t.splice(bx, 0, ...scanner2(`${getname(0)}=${getname(nameindex)}`)), t.name = getname(0);
|
|
322
409
|
relink(m);
|
|
323
|
-
result
|
|
410
|
+
addresult(result, m);
|
|
324
411
|
nameindex++;
|
|
325
412
|
bx = cx + 1;
|
|
326
413
|
}
|
|
327
414
|
}
|
|
328
|
-
if (
|
|
329
|
-
if (
|
|
330
|
-
|
|
331
|
-
queue.push(...t);
|
|
415
|
+
if (queue.length) {
|
|
416
|
+
if (t.length) queue.push({ type: STAMP, text: ',' }, ...t), queue.name = t.name;
|
|
417
|
+
addresult(result, queue);
|
|
332
418
|
}
|
|
333
|
-
if (
|
|
419
|
+
else if (t.length) addresult(result, t);
|
|
334
420
|
return result;
|
|
335
421
|
};
|
|
336
422
|
|
|
@@ -358,23 +444,20 @@ var ternary = function (body, getname, ret) {
|
|
|
358
444
|
var bx = question.pop();
|
|
359
445
|
if (!question.length) {
|
|
360
446
|
var b = body.slice(0, bx);
|
|
361
|
-
|
|
362
|
-
b[b.length - 1].pop();
|
|
363
|
-
b[b.length - 1].pop();
|
|
447
|
+
relink(b);
|
|
364
448
|
var c = ternary(body.slice(bx + 1, cx), getname, true);
|
|
365
449
|
var d = ternary(body.slice(cx + 1), getname, true);
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
450
|
+
addresult(c, scanner2(`return [${d.length + 1},0]`));
|
|
451
|
+
addresult(res, scanner2(`if(${getCondition(b, function (b) {
|
|
452
|
+
addresult(res, _express(b));
|
|
453
|
+
return res[res.length - 1];
|
|
454
|
+
})})return [1,0];return [${c.length + 1},0]`));
|
|
371
455
|
res.push(...c);
|
|
372
456
|
res.push(...d);
|
|
373
457
|
}
|
|
374
458
|
}
|
|
375
459
|
}
|
|
376
460
|
if (!res.length) return _express(body, getname, ret);
|
|
377
|
-
if (!ret) res = Array.prototype.concat.apply([], res), relink(res);
|
|
378
461
|
return res;
|
|
379
462
|
};
|
|
380
463
|
var _express = function (body, getname, ret) {
|
|
@@ -393,17 +476,21 @@ var _express = function (body, getname, ret) {
|
|
|
393
476
|
var exps = [];
|
|
394
477
|
for (var cx = 0, dx = body.length; cx < dx; cx++) {
|
|
395
478
|
var o = body[cx];
|
|
396
|
-
if (o.type
|
|
397
|
-
if (o.type === STRAP
|
|
479
|
+
if (o.type & (COMMENT | SPACE)) continue;
|
|
480
|
+
if (o.type === STRAP && /^(var|let|const)/.test(o.text)) {
|
|
481
|
+
bx = cx + 1;
|
|
482
|
+
continue;
|
|
483
|
+
}
|
|
484
|
+
if (o.type & (STRAP | STAMP)) {
|
|
398
485
|
var p = 0;
|
|
399
486
|
if (o.text === '=') {
|
|
400
487
|
ax = exps.length;
|
|
401
488
|
bx = cx + 1;
|
|
402
489
|
continue;
|
|
403
490
|
}
|
|
404
|
-
if (/[!~]|\+\-|\-\+/.test(o.text)) p =
|
|
405
|
-
if (!p && /[\+\-]/.test(o.text)) p = needpunc ?
|
|
406
|
-
if (!p) p =
|
|
491
|
+
if (/[!~]|\+\-|\-\+/.test(o.text)) p = powermap["!"];
|
|
492
|
+
if (!p && /[\+\-]/.test(o.text)) p = needpunc ? powermap["+"] : powermap["!"];
|
|
493
|
+
if (!p) p = powermap[o.text];
|
|
407
494
|
needpunc = false;
|
|
408
495
|
var b = body.slice(bx, cx + 1);
|
|
409
496
|
bx = cx + 1;
|
|
@@ -412,7 +499,9 @@ var _express = function (body, getname, ret) {
|
|
|
412
499
|
cache.push(b, p);
|
|
413
500
|
continue;
|
|
414
501
|
}
|
|
415
|
-
var
|
|
502
|
+
var name = getname(nameindex);
|
|
503
|
+
var n = scanner2(name);
|
|
504
|
+
q.name = name;
|
|
416
505
|
n.index = nameindex;
|
|
417
506
|
nameindex = cache[cache.length - 2].index;
|
|
418
507
|
n.push(b.pop());
|
|
@@ -421,20 +510,23 @@ var _express = function (body, getname, ret) {
|
|
|
421
510
|
var p0 = cache.pop();
|
|
422
511
|
var t = cache.pop();
|
|
423
512
|
var isawait = _await(t);
|
|
424
|
-
if (p0 >
|
|
513
|
+
if (p0 > powermap["="] || isawait) q.push(...scanner2(`${getname(t.index)}=`));
|
|
425
514
|
q.push.apply(q, t);
|
|
426
515
|
q.push.apply(q, b);
|
|
427
516
|
if (isawait) q.push(NEXT);
|
|
428
517
|
}
|
|
429
518
|
nameindex++;
|
|
430
519
|
if (maxindex < nameindex) maxindex = nameindex;
|
|
431
|
-
if (p ==
|
|
520
|
+
if (p == powermap["||"]) {
|
|
432
521
|
if (o.text === '||') {
|
|
433
522
|
q.push(RE);
|
|
434
523
|
}
|
|
435
524
|
else if (o.text === '&&') {
|
|
436
525
|
q.push(RZ);
|
|
437
526
|
}
|
|
527
|
+
else if (o.text === '??') {
|
|
528
|
+
q.push(RD);
|
|
529
|
+
}
|
|
438
530
|
nameindex = 0;
|
|
439
531
|
} else {
|
|
440
532
|
cache.push(n, p);
|
|
@@ -454,24 +546,14 @@ var _express = function (body, getname, ret) {
|
|
|
454
546
|
nameindex = cache[cache.length - 1].index;
|
|
455
547
|
var t = cache.pop();
|
|
456
548
|
var isawait = _await(t, nameindex);
|
|
457
|
-
if (p >
|
|
549
|
+
if (p > powermap["="] && (ret || ax >= 1 || cache.length > 0 || isawait)) q.push(...scanner2(`${getname(nameindex)}=`));
|
|
458
550
|
q.push.apply(q, t);
|
|
459
551
|
q.push.apply(q, b);
|
|
460
552
|
if (isawait) q.push(NEXT);
|
|
461
553
|
b = [{ type: EXPRESS, text: getname(nameindex) }];
|
|
462
554
|
}
|
|
463
|
-
else {
|
|
464
|
-
if (ax
|
|
465
|
-
if (evals.length) {
|
|
466
|
-
q.push.apply(q, scanner2(_withset(exps[0].text, getname(nameindex), createString(b))));
|
|
467
|
-
}
|
|
468
|
-
else {
|
|
469
|
-
q.push(exps[0], { type: STAMP, text: "=" });
|
|
470
|
-
q.push(...b);
|
|
471
|
-
}
|
|
472
|
-
exps.shift();
|
|
473
|
-
}
|
|
474
|
-
else if (ret && b.length || ax > 1) {
|
|
555
|
+
else if (ax !== 1) {
|
|
556
|
+
if (ret && b.length || ax > 1) {
|
|
475
557
|
q.push(...scanner2(`${getname(nameindex)}=`));
|
|
476
558
|
q.push(...b);
|
|
477
559
|
}
|
|
@@ -479,17 +561,22 @@ var _express = function (body, getname, ret) {
|
|
|
479
561
|
q.push(...b);
|
|
480
562
|
}
|
|
481
563
|
}
|
|
564
|
+
q.name = getname(nameindex);
|
|
565
|
+
if (ax === 1) {
|
|
566
|
+
if (q.length) q.push({ type: STAMP, text: ';' });
|
|
567
|
+
q.push(exps[0], { type: STAMP, text: "=" });
|
|
568
|
+
q.push(...b);
|
|
569
|
+
q.name = exps[0].text;
|
|
570
|
+
exps[0].set = getname(nameindex);
|
|
571
|
+
exps.shift();
|
|
572
|
+
}
|
|
482
573
|
if (ax > 1) {
|
|
483
574
|
while (ax > 0) {
|
|
484
575
|
q.push({ type: STAMP, text: ';' });
|
|
485
576
|
var [e] = exps.splice(ax - 1, 1);
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
}
|
|
489
|
-
else {
|
|
490
|
-
q.push(e);
|
|
491
|
-
q.push(...scanner2(`=${getname(nameindex)}`))
|
|
492
|
-
}
|
|
577
|
+
e.set = getname(nameindex + 1);
|
|
578
|
+
q.push(e);
|
|
579
|
+
q.push(...scanner2(`=${getname(nameindex)}`))
|
|
493
580
|
ax--;
|
|
494
581
|
}
|
|
495
582
|
}
|
|
@@ -498,16 +585,14 @@ var _express = function (body, getname, ret) {
|
|
|
498
585
|
if (o.type !== EXPRESS) continue;
|
|
499
586
|
if (o === exps[exps.length - 1]) {
|
|
500
587
|
exps.pop();
|
|
501
|
-
|
|
588
|
+
o.get = true;
|
|
502
589
|
if (!exps.length) {
|
|
503
590
|
break;
|
|
504
591
|
}
|
|
505
592
|
}
|
|
506
593
|
}
|
|
507
594
|
relink(q);
|
|
508
|
-
|
|
509
|
-
if (ret) result = _invoke(q, getdeepname);
|
|
510
|
-
return ret ? result : q;
|
|
595
|
+
return _invoke(q, getdeepname);
|
|
511
596
|
};
|
|
512
597
|
|
|
513
598
|
var getblock = function (body, cx) {
|
|
@@ -525,14 +610,29 @@ var getblock = function (body, cx) {
|
|
|
525
610
|
var labels = [];
|
|
526
611
|
|
|
527
612
|
function toqueue(body, getname, ret = false) {
|
|
613
|
+
var retn = false;
|
|
614
|
+
var ifpatch = function () {
|
|
615
|
+
var re = scanner2(`return [1,0]`);
|
|
616
|
+
re.awaited = true;
|
|
617
|
+
addresult(result, re);
|
|
618
|
+
}
|
|
528
619
|
var uniftop = function () {
|
|
529
|
-
for (var cx =
|
|
620
|
+
for (var cx = 2, dx = iftop.length; cx < dx; cx += 2) {
|
|
621
|
+
var findex = iftop[cx];
|
|
622
|
+
var p = result[findex - 1];
|
|
623
|
+
p.pop();
|
|
624
|
+
p.push(...scanner2(`[${result.length + 1 - findex},0]`));
|
|
625
|
+
relink(p);
|
|
626
|
+
}
|
|
627
|
+
for (var cx = 0, dx = iftop.length - 1; cx < dx;) {
|
|
530
628
|
var findex = iftop[cx++];
|
|
531
629
|
var f = result[findex];
|
|
532
|
-
var n = iftop[cx];
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
630
|
+
var n = iftop[cx++];
|
|
631
|
+
if (f) {
|
|
632
|
+
var c = scanner2(`if(${n})return [${iftop.length > cx ? iftop[cx] - findex : result.length - findex},0];`);
|
|
633
|
+
f.unshift.apply(f, c);
|
|
634
|
+
relink(f);
|
|
635
|
+
}
|
|
536
636
|
};
|
|
537
637
|
};
|
|
538
638
|
var unblock = function (block, ...end) {
|
|
@@ -544,11 +644,11 @@ function toqueue(body, getname, ret = false) {
|
|
|
544
644
|
});
|
|
545
645
|
if (end.length) {
|
|
546
646
|
var q = c[c.length - 1];
|
|
547
|
-
q.pop();
|
|
548
647
|
q.push(...end);
|
|
549
648
|
relink(q);
|
|
550
649
|
}
|
|
551
650
|
}
|
|
651
|
+
return result[result.length - 1];
|
|
552
652
|
};
|
|
553
653
|
var poplabel = function () {
|
|
554
654
|
var e = labels.pop();
|
|
@@ -560,7 +660,8 @@ function toqueue(body, getname, ret = false) {
|
|
|
560
660
|
var r = result[cx];
|
|
561
661
|
if (r[r.length - 1] === end) { break }
|
|
562
662
|
}
|
|
563
|
-
end.push({ type: VALUE, text: result.length - cx });
|
|
663
|
+
end.push({ type: VALUE, text: result.length - cx }, { type: STAMP, text: "," }, { type: VALUE, text: "0" });
|
|
664
|
+
relink(end);
|
|
564
665
|
}
|
|
565
666
|
}
|
|
566
667
|
};
|
|
@@ -591,21 +692,36 @@ function toqueue(body, getname, ret = false) {
|
|
|
591
692
|
}
|
|
592
693
|
if (o.type === SCOPED && o.entry === '{' && !o.isExpress) {
|
|
593
694
|
var b = toqueue(o, getname, false);
|
|
695
|
+
// addresult(result, b);
|
|
594
696
|
result.push.apply(result, b);
|
|
595
697
|
cx++;
|
|
596
698
|
bx = cx;
|
|
597
699
|
continue;
|
|
598
700
|
}
|
|
599
701
|
a: if (o.type === STRAP) {
|
|
600
|
-
if (/^(new|typeof|
|
|
702
|
+
if (/^(new|typeof|await)$/.test(o.text)) {
|
|
703
|
+
break a;
|
|
704
|
+
}
|
|
705
|
+
if (o.text === 'yield') {
|
|
706
|
+
retn = [YIELD];
|
|
707
|
+
ret = true;
|
|
708
|
+
bx = cx + 1;
|
|
709
|
+
cx++;
|
|
601
710
|
break a;
|
|
602
711
|
}
|
|
603
712
|
if (o.text === 'return') {
|
|
713
|
+
retn = [RETURN];
|
|
604
714
|
ret = true;
|
|
605
715
|
bx = cx + 1;
|
|
606
716
|
cx++;
|
|
607
717
|
break a;
|
|
608
718
|
}
|
|
719
|
+
if (/^(async|function)$/.test(o.text)) {
|
|
720
|
+
cx = skipAssignment(body, cx);
|
|
721
|
+
addresult(result, body.slice(bx, cx));
|
|
722
|
+
bx = cx + 1;
|
|
723
|
+
break a;
|
|
724
|
+
}
|
|
609
725
|
if (o.text === 'break') {
|
|
610
726
|
cx = _break(body, cx, result);
|
|
611
727
|
bx = cx + 1;
|
|
@@ -616,6 +732,11 @@ function toqueue(body, getname, ret = false) {
|
|
|
616
732
|
bx = cx + 1;
|
|
617
733
|
continue;
|
|
618
734
|
}
|
|
735
|
+
if (o.text === 'try') {
|
|
736
|
+
cx = _try(body, cx, unblock, result, getname);
|
|
737
|
+
bx = cx + 1;
|
|
738
|
+
continue;
|
|
739
|
+
}
|
|
619
740
|
if (o.text === 'for') {
|
|
620
741
|
labels.push(o);
|
|
621
742
|
cx = _for(body, cx, unblock, result, getname(0));
|
|
@@ -646,6 +767,7 @@ function toqueue(body, getname, ret = false) {
|
|
|
646
767
|
}
|
|
647
768
|
var elseif = false;
|
|
648
769
|
if (o.text === 'else') {
|
|
770
|
+
ifpatch();
|
|
649
771
|
iftop.push(result.length);
|
|
650
772
|
while (body[cx] !== o.next) cx++;
|
|
651
773
|
o = o.next;
|
|
@@ -654,16 +776,7 @@ function toqueue(body, getname, ret = false) {
|
|
|
654
776
|
if (o.text === 'if') {
|
|
655
777
|
while (body[cx] !== o.next) cx++;
|
|
656
778
|
o = o.next;
|
|
657
|
-
var n =
|
|
658
|
-
if (o.first && o.first === o.lastUncomment) {
|
|
659
|
-
if (o.first.type === EXPRESS) {
|
|
660
|
-
n = o.first.text;
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
if (!n) {
|
|
664
|
-
unblock(o);
|
|
665
|
-
n = getname(0);
|
|
666
|
-
}
|
|
779
|
+
var n = getCondition(o, unblock, true);
|
|
667
780
|
if (!elseif) {
|
|
668
781
|
if (iftop) uniftop();
|
|
669
782
|
iftop = [result.length, n];
|
|
@@ -671,10 +784,11 @@ function toqueue(body, getname, ret = false) {
|
|
|
671
784
|
else {
|
|
672
785
|
iftop.push(n);
|
|
673
786
|
}
|
|
787
|
+
o = o.next;
|
|
674
788
|
elseif = true;
|
|
675
789
|
}
|
|
676
790
|
if (elseif) {
|
|
677
|
-
while (body[cx] !== o
|
|
791
|
+
while (body[cx] !== o) cx++;
|
|
678
792
|
var block = getblock(body, cx);
|
|
679
793
|
cx += block.length;
|
|
680
794
|
o = body[cx];
|
|
@@ -696,17 +810,28 @@ function toqueue(body, getname, ret = false) {
|
|
|
696
810
|
cx++;
|
|
697
811
|
bx = cx;
|
|
698
812
|
b = ternary(b, getname, ret);
|
|
699
|
-
|
|
700
|
-
|
|
813
|
+
result.push(...b);
|
|
814
|
+
if (retn) {
|
|
815
|
+
retn.name = b[b.length - 1].name;
|
|
816
|
+
addresult(result, retn);
|
|
817
|
+
}
|
|
818
|
+
retn = false;
|
|
701
819
|
} while (cx < body.length);
|
|
702
820
|
return result;
|
|
703
821
|
}
|
|
822
|
+
var ret_ = '';
|
|
704
823
|
module.exports = function (body, newname, ret) {
|
|
824
|
+
if (ret) ret = isString(ret) ? ret : newname();
|
|
825
|
+
var ret0 = ret_;
|
|
826
|
+
ret_ = ret;
|
|
705
827
|
var tmpnames = [];
|
|
828
|
+
var p = 0;
|
|
706
829
|
var getname = function (i) {
|
|
707
|
-
i += evals.length;
|
|
830
|
+
i += evals.length + p;
|
|
708
831
|
if (!tmpnames[i]) tmpnames[i] = newname();
|
|
709
832
|
return tmpnames[i];
|
|
710
833
|
};
|
|
711
|
-
|
|
834
|
+
var res = toqueue(body, getname, false);
|
|
835
|
+
ret_ = ret0;
|
|
836
|
+
return res;
|
|
712
837
|
};
|