@mirascript/mirascript 0.1.13 → 0.1.15

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.
Files changed (86) hide show
  1. package/dist/chunk-JVFUK7AN.js +2324 -0
  2. package/dist/chunk-JVFUK7AN.js.map +6 -0
  3. package/dist/{chunk-IKSSUVRE.js → chunk-NT235HY3.js} +97 -1264
  4. package/dist/chunk-NT235HY3.js.map +6 -0
  5. package/dist/cli/index.js +8 -7
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/compiler/emit.d.ts.map +1 -1
  8. package/dist/compiler/worker.js +1 -1
  9. package/dist/helpers/constants.d.ts +5 -0
  10. package/dist/helpers/constants.d.ts.map +1 -1
  11. package/dist/helpers/serialize.d.ts +2 -2
  12. package/dist/helpers/serialize.d.ts.map +1 -1
  13. package/dist/index.js +15 -9
  14. package/dist/subtle.d.ts +1 -1
  15. package/dist/subtle.d.ts.map +1 -1
  16. package/dist/subtle.js +7 -7
  17. package/dist/vm/lib/_helpers.d.ts +8 -8
  18. package/dist/vm/lib/global/debug.d.ts +1 -1
  19. package/dist/vm/lib/global/json.d.ts +2 -2
  20. package/dist/vm/lib/global/json.d.ts.map +1 -1
  21. package/dist/vm/lib/global/mod/matrix.d.ts +1 -1
  22. package/dist/vm/lib/global/mod/matrix.d.ts.map +1 -1
  23. package/dist/vm/lib/global/sequence/all-any.d.ts +2 -2
  24. package/dist/vm/lib/global/sequence/entries.d.ts +4 -4
  25. package/dist/vm/lib/global/sequence/find.d.ts +2 -2
  26. package/dist/vm/lib/global/sequence/repeat.d.ts +1 -1
  27. package/dist/vm/lib/global/sequence/with.d.ts +1 -1
  28. package/dist/vm/lib/global/sequence/with.d.ts.map +1 -1
  29. package/dist/vm/lib/global/sequence/zip.d.ts +1 -1
  30. package/dist/vm/operations.d.ts +4 -2
  31. package/dist/vm/operations.d.ts.map +1 -1
  32. package/dist/vm/types/any.d.ts +10 -0
  33. package/dist/vm/types/any.d.ts.map +1 -0
  34. package/dist/vm/types/array.d.ts +12 -0
  35. package/dist/vm/types/array.d.ts.map +1 -0
  36. package/dist/vm/types/callable.d.ts +5 -0
  37. package/dist/vm/types/callable.d.ts.map +1 -0
  38. package/dist/vm/types/const.d.ts +15 -0
  39. package/dist/vm/types/const.d.ts.map +1 -0
  40. package/dist/vm/types/context.d.ts +8 -3
  41. package/dist/vm/types/context.d.ts.map +1 -1
  42. package/dist/vm/types/extern.d.ts +1 -1
  43. package/dist/vm/types/extern.d.ts.map +1 -1
  44. package/dist/vm/types/immutable.d.ts +15 -0
  45. package/dist/vm/types/immutable.d.ts.map +1 -0
  46. package/dist/vm/types/index.d.ts +17 -47
  47. package/dist/vm/types/index.d.ts.map +1 -1
  48. package/dist/vm/types/primitive.d.ts +7 -0
  49. package/dist/vm/types/primitive.d.ts.map +1 -0
  50. package/dist/vm/types/record.d.ts +20 -0
  51. package/dist/vm/types/record.d.ts.map +1 -0
  52. package/dist/vm/types/value.d.ts +14 -0
  53. package/dist/vm/types/value.d.ts.map +1 -0
  54. package/dist/vm/types/wrapper.d.ts +1 -1
  55. package/dist/vm/types/wrapper.d.ts.map +1 -1
  56. package/package.json +2 -2
  57. package/src/compiler/compile-fast.ts +1 -1
  58. package/src/compiler/emit.ts +131 -17
  59. package/src/helpers/constants.ts +6 -1
  60. package/src/helpers/serialize.ts +35 -15
  61. package/src/subtle.ts +1 -1
  62. package/src/vm/lib/_helpers.ts +8 -8
  63. package/src/vm/lib/global/sequence/entries.ts +2 -2
  64. package/src/vm/lib/global/sequence/find.ts +4 -4
  65. package/src/vm/lib/global/sequence/map-filter.ts +3 -3
  66. package/src/vm/lib/global/sequence/with.ts +1 -1
  67. package/src/vm/lib/global/sequence/zip.ts +1 -1
  68. package/src/vm/lib/global/time.ts +3 -3
  69. package/src/vm/operations.ts +7 -7
  70. package/src/vm/types/any.ts +33 -0
  71. package/src/vm/types/array.ts +19 -0
  72. package/src/vm/types/callable.ts +10 -0
  73. package/src/vm/types/{checker.ts → const.ts} +7 -55
  74. package/src/vm/types/context.ts +25 -6
  75. package/src/vm/types/extern.ts +19 -5
  76. package/src/vm/types/immutable.ts +22 -0
  77. package/src/vm/types/index.ts +31 -83
  78. package/src/vm/types/primitive.ts +14 -0
  79. package/src/vm/types/record.ts +53 -0
  80. package/src/vm/types/value.ts +22 -0
  81. package/src/vm/types/wrapper.ts +1 -1
  82. package/dist/chunk-AGIXQM52.js +0 -916
  83. package/dist/chunk-AGIXQM52.js.map +0 -6
  84. package/dist/chunk-IKSSUVRE.js.map +0 -6
  85. package/dist/vm/types/checker.d.ts +0 -30
  86. package/dist/vm/types/checker.d.ts.map +0 -1
@@ -1,916 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, { get: all[name], enumerable: true });
5
- };
6
-
7
- // src/compiler/diagnostic.ts
8
- import { DiagnosticCode, getModule } from "@mirascript/bindings";
9
-
10
- // src/helpers/utils.ts
11
- var { isArray } = Array;
12
- var { isFinite, isNaN, isInteger, isSafeInteger } = Number;
13
- var { hasOwn, keys, values, entries, create, getPrototypeOf, fromEntries, defineProperty } = Object;
14
- var { apply } = Reflect;
15
- var hasOwnEnumerable = Function.call.bind(
16
- // eslint-disable-next-line @typescript-eslint/unbound-method
17
- Object.prototype.propertyIsEnumerable
18
- );
19
-
20
- // src/compiler/diagnostic.ts
21
- var diagnosticMessages = /* @__PURE__ */ new Map();
22
- function getDiagnosticMessage(code) {
23
- if (!isSafeInteger(code) || code < 0 || code >= 65535) {
24
- throw new RangeError(`Invalid DiagnosticCode: ${code}`);
25
- }
26
- if (diagnosticMessages.has(code)) {
27
- return diagnosticMessages.get(code) || null;
28
- }
29
- const mod = getModule();
30
- const msg = mod.getDiagnosticMessage(code);
31
- diagnosticMessages.set(code, msg);
32
- return msg;
33
- }
34
- function parseDiagnostics(source, diagnostics, filter) {
35
- const parsed = [];
36
- const bufLen = diagnostics.length;
37
- for (let i = 0; i < bufLen; i += 5) {
38
- const code = diagnostics[i + 4];
39
- if (filter && !filter(code)) {
40
- continue;
41
- }
42
- const startLineNumber = diagnostics[i];
43
- const startColumn = diagnostics[i + 1];
44
- const endLineNumber = diagnostics[i + 2];
45
- const endColumn = diagnostics[i + 3];
46
- parsed.push({
47
- code,
48
- range: {
49
- startLineNumber,
50
- startColumn,
51
- endLineNumber,
52
- endColumn
53
- }
54
- });
55
- }
56
- const _errors = [];
57
- const _warnings = [];
58
- const _infos = [];
59
- const _hints = [];
60
- const _tags = [];
61
- const _references = [];
62
- const _tagsReferences = [];
63
- const _sourcemaps = [];
64
- for (let i = 0; i < parsed.length; i++) {
65
- const diagnostic = parsed[i];
66
- const { code } = diagnostic;
67
- if (code > DiagnosticCode.ErrorStart && code < DiagnosticCode.ErrorEnd) {
68
- _errors.push(diagnostic);
69
- } else if (code > DiagnosticCode.WarningStart && code < DiagnosticCode.WarningEnd) {
70
- _warnings.push(diagnostic);
71
- } else if (code > DiagnosticCode.InfoStart && code < DiagnosticCode.InfoEnd) {
72
- _infos.push(diagnostic);
73
- } else if (code > DiagnosticCode.HintStart && code < DiagnosticCode.HintEnd) {
74
- _hints.push(diagnostic);
75
- } else if (code > DiagnosticCode.TagStart && code < DiagnosticCode.TagEnd) {
76
- _tags.push(diagnostic);
77
- } else if (code === DiagnosticCode.SourceMap) {
78
- _sourcemaps.push(diagnostic.range);
79
- continue;
80
- } else {
81
- continue;
82
- }
83
- diagnostic.references = [];
84
- while (i + 1 < parsed.length) {
85
- const ref = parsed[i + 1];
86
- let isRef = false;
87
- if (ref.code > DiagnosticCode.TagRefStart && ref.code < DiagnosticCode.TagRefEnd) {
88
- isRef = true;
89
- _tagsReferences.push(ref);
90
- }
91
- if (ref.code > DiagnosticCode.ReferenceStart && ref.code < DiagnosticCode.ReferenceEnd) {
92
- isRef = true;
93
- _references.push(ref);
94
- }
95
- if (!isRef) {
96
- break;
97
- }
98
- i++;
99
- ref.diagnostic = diagnostic;
100
- diagnostic.references.push(ref);
101
- }
102
- }
103
- return {
104
- errors: _errors,
105
- warnings: _warnings,
106
- infos: _infos,
107
- hints: _hints,
108
- tags: _tags,
109
- references: _references,
110
- tagsReferences: _tagsReferences,
111
- sourcemaps: _sourcemaps
112
- };
113
- }
114
- function formatRange(range) {
115
- if (range.startLineNumber === range.endLineNumber) {
116
- if (range.startColumn === range.endColumn) {
117
- return `${range.startLineNumber}:${range.startColumn}`;
118
- }
119
- return `${range.startLineNumber}:${range.startColumn}-${range.endColumn}`;
120
- }
121
- return `${range.startLineNumber}:${range.startColumn}-${range.endLineNumber}:${range.endColumn}`;
122
- }
123
- function formatDiagnostic(diagnostic) {
124
- const range = formatRange(diagnostic.range);
125
- const codeName = DiagnosticCode[diagnostic.code] || `Unknown(${diagnostic.code})`;
126
- let message = getDiagnosticMessage(diagnostic.code);
127
- for (const ref of diagnostic.references) {
128
- const refRange = formatRange(ref.range);
129
- message += `
130
- (${refRange}): ${getDiagnosticMessage(ref.code)}`;
131
- }
132
- return ` ${codeName}(${range}): ${message}`;
133
- }
134
-
135
- // src/compiler/emit.ts
136
- import { OpCode } from "@mirascript/bindings";
137
- import { SourceMapGenerator } from "source-map-js";
138
- function emit(source, chunk, sourcemaps, options) {
139
- const gen = new Emitter(source, chunk, sourcemaps, options);
140
- gen.read();
141
- const code = gen.codeLines.join("\n");
142
- return code;
143
- }
144
- function readConst(reader, offset) {
145
- const type = reader.getUint8(offset);
146
- switch (type) {
147
- /* c8 ignore next 2 */
148
- case 0:
149
- return [null, 1];
150
- case 1:
151
- return [true, 1];
152
- case 2:
153
- return [false, 1];
154
- case 3: {
155
- const ordinal = reader.getInt32(offset + 1, true);
156
- return [ordinal, 5];
157
- }
158
- case 4: {
159
- const num = reader.getFloat64(offset + 1, true);
160
- return [num, 9];
161
- }
162
- case 5: {
163
- const len = reader.getUint32(offset + 1, true);
164
- const str = new TextDecoder().decode(new Uint8Array(reader.buffer, reader.byteOffset + offset + 5, len));
165
- return [str, 5 + len];
166
- }
167
- /* c8 ignore next 2 */
168
- default:
169
- throw new Error(`Unknown constant type: ${type}`);
170
- }
171
- }
172
- function toJavascript(value) {
173
- if (value === null) return "null";
174
- if (value === void 0) return "undefined";
175
- if (typeof value == "object" || typeof value == "string") {
176
- return JSON.stringify(value);
177
- }
178
- if (value === 0) {
179
- if (1 / value === -Infinity) return "-0";
180
- return "0";
181
- }
182
- return String(value);
183
- }
184
- var ORIGIN = `mira://MiraScript/`;
185
- var sourceId = 1;
186
- function createArray(length, fn) {
187
- const result = [];
188
- for (let i = 0; i < length; i++) {
189
- result.push(fn(i));
190
- }
191
- return result;
192
- }
193
- var Emitter = class {
194
- constructor(source, chunk, sourcemaps, options) {
195
- this.source = source;
196
- this.chunk = chunk;
197
- this.sourcemaps = sourcemaps;
198
- this.options = options;
199
- this.constants = [];
200
- this.codeOffset = 0;
201
- this.closureCounter = 0;
202
- this.identCounter = 0;
203
- this.codeLines = [];
204
- this.pretty = options.pretty ?? false;
205
- const reader = new DataView(chunk.buffer, chunk.byteOffset, chunk.byteLength);
206
- this.chunkSize = reader.getUint32(0, true);
207
- this.codeSize = reader.getUint32(4, true);
208
- this.constSize = reader.getUint32(8 + this.codeSize, true);
209
- this.codeReader = new DataView(chunk.buffer, chunk.byteOffset + 8, this.codeSize);
210
- this.constReader = new DataView(chunk.buffer, chunk.byteOffset + 12 + this.codeSize, this.constSize);
211
- }
212
- /** 读取常量表 */
213
- readConsts() {
214
- for (let i = 0, index = 0; i < this.constSize; index++) {
215
- const [constant, size] = readConst(this.constReader, i);
216
- this.constants.push(toJavascript(constant));
217
- i += size;
218
- }
219
- }
220
- /** 制造缩进 */
221
- ident(len = 0) {
222
- if (!this.pretty) return "";
223
- return " ".repeat(this.identCounter + len);
224
- }
225
- /** Read variable */
226
- rv(i, level = 0) {
227
- if (!i) return "null";
228
- const c = this.closureCounter - level;
229
- return `var_${c}_${i}`;
230
- }
231
- /** Write variable */
232
- wv(i, level = 0) {
233
- if (!i) return "_";
234
- return this.rv(i, level);
235
- }
236
- /** 读取 code param */
237
- readParam(wide) {
238
- const value = wide ? this.codeReader.getUint32(this.codeOffset, true) : this.codeReader.getUint8(this.codeOffset);
239
- this.codeOffset += wide ? 4 : 1;
240
- return value;
241
- }
242
- /** 读取 code param */
243
- readIndex(wide) {
244
- const value = wide ? this.codeReader.getInt32(this.codeOffset, true) : this.codeReader.getInt8(this.codeOffset);
245
- this.codeOffset += wide ? 4 : 1;
246
- return value;
247
- }
248
- /** 读取闭包 */
249
- readClosure() {
250
- this.closureCounter++;
251
- this.identCounter++;
252
- while (this.codeOffset < this.codeSize) {
253
- const opcode_raw = this.codeReader.getUint8(this.codeOffset);
254
- const opcode = opcode_raw & 127;
255
- if (opcode !== OpCode.FuncEnd) {
256
- this.readCode();
257
- continue;
258
- }
259
- this.codeOffset++;
260
- const body = this.ident(-1) + `} finally { CpExit(); } });`;
261
- this.codeLines.push(body);
262
- this.closureCounter--;
263
- this.identCounter--;
264
- break;
265
- }
266
- }
267
- /** 读取块结束 */
268
- readBlockEnd(end) {
269
- while (this.codeOffset < this.codeSize) {
270
- const opcode_raw = this.codeReader.getUint8(this.codeOffset);
271
- const opcode = opcode_raw & 127;
272
- if (opcode !== end) {
273
- this.readCode();
274
- continue;
275
- }
276
- this.codeOffset++;
277
- this.identCounter--;
278
- if (end === OpCode.LoopEnd) {
279
- this.closureCounter--;
280
- }
281
- const body = this.ident() + `};`;
282
- this.codeLines.push(body);
283
- break;
284
- }
285
- }
286
- /** 读取 if else 或 if 结束 */
287
- readIfElse() {
288
- this.identCounter++;
289
- while (this.codeOffset < this.codeSize) {
290
- const opcode_raw = this.codeReader.getUint8(this.codeOffset);
291
- const opcode = opcode_raw & 127;
292
- if (opcode === OpCode.IfEnd) {
293
- return this.readBlockEnd(OpCode.IfEnd);
294
- }
295
- if (opcode === OpCode.Else) {
296
- this.codeOffset++;
297
- const body = this.ident(-1) + `} else {`;
298
- this.codeLines.push(body);
299
- break;
300
- }
301
- if (opcode === OpCode.ElIf) {
302
- this.codeOffset++;
303
- const body = this.ident(-1) + `} else `;
304
- this.codeLines.push(body);
305
- return this.readCode();
306
- }
307
- this.readCode();
308
- }
309
- return this.readBlockEnd(OpCode.IfEnd);
310
- }
311
- /** 读取 record */
312
- readRecord(obj) {
313
- this.identCounter++;
314
- while (this.codeOffset < this.codeSize) {
315
- const opcode_raw = this.codeReader.getUint8(this.codeOffset++);
316
- const opcode = opcode_raw & 127;
317
- const wide = opcode_raw >= 128;
318
- const read = () => this.readParam(wide);
319
- let code = "";
320
- switch (opcode) {
321
- case OpCode.FieldOpt:
322
- case OpCode.Field: {
323
- const field = read();
324
- const field_name = this.constants[field];
325
- if (!field_name) {
326
- throw new Error(`Unknown field ${field}`);
327
- }
328
- const value = read();
329
- const opt = opcode === OpCode.FieldOpt;
330
- code = opt ? `...ElementOpt(${field_name}, ${this.rv(value)}),` : `[${field_name}]: Element(${this.rv(value)}),`;
331
- break;
332
- }
333
- case OpCode.FieldOptDyn:
334
- case OpCode.FieldDyn: {
335
- const field = read();
336
- const value = read();
337
- const opt = opcode === OpCode.FieldOptDyn;
338
- code = opt ? `...ElementOpt(${this.rv(field)}, ${this.rv(value)}),` : `[${this.rv(field)}]: Element(${this.rv(value)}),`;
339
- break;
340
- }
341
- case OpCode.FieldOptIndex:
342
- case OpCode.FieldIndex: {
343
- const field = this.readIndex(wide);
344
- const value = read();
345
- const opt = opcode === OpCode.FieldOptIndex;
346
- code = opt ? `...ElementOpt(${field}, ${this.rv(value)}),` : `[${field}]: Element(${this.rv(value)}),`;
347
- break;
348
- }
349
- case OpCode.Spread: {
350
- const value = read();
351
- code = `...$RecordSpread(${this.rv(value)}),`;
352
- break;
353
- }
354
- case OpCode.Freeze: {
355
- this.identCounter--;
356
- code = `});`;
357
- break;
358
- }
359
- default: {
360
- code = `// ?${OpCode[opcode] ?? opcode}`;
361
- break;
362
- }
363
- }
364
- const ident = this.ident();
365
- this.codeLines.push(ident + code);
366
- if (opcode === OpCode.Freeze) {
367
- return;
368
- }
369
- }
370
- }
371
- /** 读取 array */
372
- readArray(arr) {
373
- this.identCounter++;
374
- while (this.codeOffset < this.codeSize) {
375
- const opcode_raw = this.codeReader.getUint8(this.codeOffset++);
376
- const opcode = opcode_raw & 127;
377
- const wide = opcode_raw >= 128;
378
- const read = () => this.readParam(wide);
379
- let code = "";
380
- switch (opcode) {
381
- case OpCode.Item: {
382
- const value = read();
383
- code = `Element(${this.rv(value)}),`;
384
- break;
385
- }
386
- case OpCode.ItemRange: {
387
- const start = this.readIndex(wide);
388
- const end = this.readIndex(wide);
389
- code = `...ArrayRange(${start}, ${end}),`;
390
- break;
391
- }
392
- case OpCode.ItemRangeDyn: {
393
- const start = read();
394
- const end = read();
395
- code = `...ArrayRange(${this.rv(start)}, ${this.rv(end)}),`;
396
- break;
397
- }
398
- case OpCode.ItemRangeExclusiveDyn: {
399
- const start = read();
400
- const end = read();
401
- code = `...ArrayRangeExclusive(${this.rv(start)}, ${this.rv(end)}),`;
402
- break;
403
- }
404
- case OpCode.Spread: {
405
- const value = read();
406
- code = `...$ArraySpread(${this.rv(value)}),`;
407
- break;
408
- }
409
- case OpCode.Freeze: {
410
- this.identCounter--;
411
- code = `]);`;
412
- break;
413
- }
414
- default: {
415
- code = `// ?${OpCode[opcode] ?? opcode}`;
416
- break;
417
- }
418
- }
419
- const ident = this.ident();
420
- this.codeLines.push(ident + code);
421
- if (opcode === OpCode.Freeze) {
422
- return;
423
- }
424
- }
425
- }
426
- /** 读取代码 */
427
- readCode() {
428
- const opcode_raw = this.codeReader.getUint8(this.codeOffset++);
429
- const opcode = opcode_raw & 127;
430
- const wide = opcode_raw >= 128;
431
- const read = () => this.readParam(wide);
432
- const readIndex = () => this.readIndex(wide);
433
- const ident = this.ident();
434
- let code = "";
435
- let reg = 0;
436
- switch (opcode) {
437
- case OpCode.FuncVarg:
438
- case OpCode.Func: {
439
- const script = this.codeOffset === 1;
440
- reg = read();
441
- const varg = opcode === OpCode.FuncVarg;
442
- const argn = read();
443
- const regn = read();
444
- const args = createArray(argn, (i) => {
445
- const wv = this.wv(i + 1, -1);
446
- if (varg && i === argn - 1) {
447
- return `...vargs`;
448
- }
449
- return `${wv} = null`;
450
- });
451
- const regs = createArray(regn - argn + 1, (i) => i ? this.wv(i + argn, -1) : this.wv(0, -1)).join(
452
- ", "
453
- );
454
- if (script) {
455
- args.unshift(`global = GlobalFallback()`);
456
- code = `'use strict'; return ((${args.join(", ")}) => { try { CpEnter(); var ${regs};`;
457
- } else {
458
- code = `${this.wv(reg)} = Function((${args.join(", ")}) => { try { CpEnter(); var ${regs};`;
459
- }
460
- if (varg) {
461
- code += ` var ${this.wv(argn, -1)} = Vargs(vargs);`;
462
- }
463
- break;
464
- }
465
- case OpCode.Constant: {
466
- reg = read();
467
- const i = read();
468
- const c = this.constants[i];
469
- code = `${this.wv(reg)} = ${c};`;
470
- break;
471
- }
472
- case OpCode.Uninit: {
473
- reg = read();
474
- code = `${this.wv(reg)} = undefined;`;
475
- break;
476
- }
477
- case OpCode.Return: {
478
- reg = read();
479
- code = `return ${this.rv(reg)};`;
480
- break;
481
- }
482
- case OpCode.Add:
483
- case OpCode.Sub:
484
- case OpCode.Mul:
485
- case OpCode.Div:
486
- case OpCode.Mod:
487
- case OpCode.Pow:
488
- case OpCode.Gt:
489
- case OpCode.Gte:
490
- case OpCode.Lt:
491
- case OpCode.Lte:
492
- case OpCode.Eq:
493
- case OpCode.Neq:
494
- case OpCode.Aeq:
495
- case OpCode.Naeq:
496
- case OpCode.Same:
497
- case OpCode.Nsame:
498
- case OpCode.In:
499
- case OpCode.And:
500
- case OpCode.Or:
501
- case OpCode.Format: {
502
- reg = read();
503
- const left = read();
504
- const right = read();
505
- code = `${this.wv(reg)} = $${OpCode[opcode]}(${this.rv(left)}, ${this.rv(right)});`;
506
- break;
507
- }
508
- case OpCode.InGlobal: {
509
- reg = read();
510
- const left = read();
511
- code = `${this.wv(reg)} = global.has(${this.rv(left)});`;
512
- break;
513
- }
514
- case OpCode.Concat: {
515
- reg = read();
516
- const n = read();
517
- const args = createArray(n, () => read());
518
- code = `${this.wv(reg)} = $${OpCode[opcode]}(${args.map((a) => this.rv(a)).join(", ")});`;
519
- break;
520
- }
521
- case OpCode.Omit:
522
- case OpCode.Pick: {
523
- reg = read();
524
- const value = read();
525
- const n = read();
526
- const args = createArray(n, () => this.constants[read()]);
527
- code = `${this.wv(reg)} = $${OpCode[opcode]}(${this.rv(value)}, [${args.join(", ")}]);`;
528
- break;
529
- }
530
- case OpCode.Call:
531
- case OpCode.CallDyn: {
532
- reg = read();
533
- const func = read();
534
- const n = read();
535
- const args = createArray(n, () => read());
536
- const ns = read();
537
- const spreads = createArray(ns, () => read());
538
- const callTarget = opcode === OpCode.Call ? `global.get(${this.constants[func]})` : this.rv(func);
539
- code = `${this.wv(reg)} = $Call(${callTarget}, [${args.map((a, i) => {
540
- if (spreads.includes(i)) return `...$ArraySpread(${this.rv(a)})`;
541
- else return this.rv(a);
542
- }).join(", ")}]);`;
543
- break;
544
- }
545
- case OpCode.Assign: {
546
- reg = read();
547
- const value = read();
548
- code = `${this.wv(reg)} = ${this.rv(value)};`;
549
- break;
550
- }
551
- case OpCode.Pos:
552
- case OpCode.Neg:
553
- case OpCode.Not:
554
- case OpCode.Type:
555
- case OpCode.ToBoolean:
556
- case OpCode.ToNumber:
557
- case OpCode.ToString:
558
- case OpCode.IsBoolean:
559
- case OpCode.IsNumber:
560
- case OpCode.IsString:
561
- case OpCode.IsRecord:
562
- case OpCode.IsArray:
563
- case OpCode.Length: {
564
- reg = read();
565
- const value = read();
566
- code = `${this.wv(reg)} = $${OpCode[opcode]}(${this.rv(value)});`;
567
- break;
568
- }
569
- case OpCode.AssertInit:
570
- case OpCode.AssertNonNil: {
571
- reg = read();
572
- code = `$${OpCode[opcode]}(${this.rv(reg)})`;
573
- break;
574
- }
575
- case OpCode.Get: {
576
- reg = read();
577
- const obj = read();
578
- const prop = this.constants[read()];
579
- code = `${this.wv(reg)} = $Get(${this.rv(obj)}, ${prop});`;
580
- break;
581
- }
582
- case OpCode.GetIndex: {
583
- reg = read();
584
- const obj = read();
585
- const index = readIndex();
586
- code = `${this.wv(reg)} = $Get(${this.rv(obj)}, ${index});`;
587
- break;
588
- }
589
- case OpCode.GetDyn: {
590
- reg = read();
591
- const obj = read();
592
- const index = read();
593
- code = `${this.wv(reg)} = $Get(${this.rv(obj)}, ${this.rv(index)});`;
594
- break;
595
- }
596
- case OpCode.Has: {
597
- reg = read();
598
- const obj = read();
599
- const prop = this.constants[read()];
600
- code = `${this.wv(reg)} = $Has(${this.rv(obj)}, ${prop});`;
601
- break;
602
- }
603
- case OpCode.HasIndex: {
604
- reg = read();
605
- const obj = read();
606
- const index = readIndex();
607
- code = `${this.wv(reg)} = $Has(${this.rv(obj)}, ${index});`;
608
- break;
609
- }
610
- case OpCode.HasDyn: {
611
- reg = read();
612
- const obj = read();
613
- const index = read();
614
- code = `${this.wv(reg)} = $Has(${this.rv(obj)}, ${this.rv(index)});`;
615
- break;
616
- }
617
- case OpCode.Set: {
618
- reg = read();
619
- const obj = read();
620
- const prop = this.constants[read()];
621
- code = `$Set(${this.rv(obj)}, ${prop}, ${this.rv(reg)});`;
622
- break;
623
- }
624
- case OpCode.SetIndex: {
625
- reg = read();
626
- const obj = read();
627
- const index = readIndex();
628
- code = `$Set(${this.rv(obj)}, ${index}, ${this.rv(reg)});`;
629
- break;
630
- }
631
- case OpCode.SetDyn: {
632
- reg = read();
633
- const obj = read();
634
- const index = read();
635
- code = `$Set(${this.rv(obj)}, ${this.rv(index)}, ${this.rv(reg)});`;
636
- break;
637
- }
638
- case OpCode.GetGlobal: {
639
- reg = read();
640
- const i = read();
641
- const c = this.constants[i];
642
- code = `${this.wv(reg)} = global.get(${c}) ?? null;`;
643
- break;
644
- }
645
- case OpCode.GetGlobalDyn: {
646
- reg = read();
647
- const name = read();
648
- code = `${this.wv(reg)} = global.get(${this.rv(name)}) ?? null;`;
649
- break;
650
- }
651
- case OpCode.GetUpvalue: {
652
- reg = read();
653
- const level = read();
654
- const up = read();
655
- code = `${this.wv(reg)} = Upvalue(${this.rv(up, level)});`;
656
- break;
657
- }
658
- case OpCode.SetUpvalue: {
659
- reg = read();
660
- const level = read();
661
- const up = read();
662
- code = `${this.wv(up, level)} = ${this.rv(reg)};`;
663
- break;
664
- }
665
- case OpCode.Slice: {
666
- reg = read();
667
- const obj = read();
668
- const start = readIndex();
669
- const end = readIndex();
670
- code = `${this.wv(reg)} = $Slice(${this.rv(obj)}, ${start}, ${end});`;
671
- break;
672
- }
673
- case OpCode.SliceStart: {
674
- reg = read();
675
- const obj = read();
676
- const end = readIndex();
677
- code = `${this.wv(reg)} = $Slice(${this.rv(obj)}, null, ${end});`;
678
- break;
679
- }
680
- case OpCode.SliceEnd: {
681
- reg = read();
682
- const obj = read();
683
- const start = readIndex();
684
- code = `${this.wv(reg)} = $Slice(${this.rv(obj)}, ${start}, null);`;
685
- break;
686
- }
687
- case OpCode.SliceDyn: {
688
- reg = read();
689
- const obj = read();
690
- const start = read();
691
- const end = read();
692
- code = `${this.wv(reg)} = $Slice(${this.rv(obj)}, ${this.rv(start)}, ${this.rv(end)});`;
693
- break;
694
- }
695
- case OpCode.SliceExclusiveDyn: {
696
- reg = read();
697
- const obj = read();
698
- const start = read();
699
- const end = read();
700
- code = `${this.wv(reg)} = $SliceExclusive(${this.rv(obj)}, ${this.rv(start)}, ${this.rv(end)});`;
701
- break;
702
- }
703
- case OpCode.Record: {
704
- reg = read();
705
- code = `${this.wv(reg)} = ({`;
706
- break;
707
- }
708
- case OpCode.Array: {
709
- reg = read();
710
- code = `${this.wv(reg)} = ([`;
711
- break;
712
- }
713
- case OpCode.If: {
714
- const cond = read();
715
- code = `if (${this.rv(cond)} !== false && $ToBoolean(${this.rv(cond)}) !== false) {`;
716
- break;
717
- }
718
- case OpCode.IfNot: {
719
- const cond = read();
720
- code = `if (${this.rv(cond)} !== true && $ToBoolean(${this.rv(cond)}) !== true) {`;
721
- break;
722
- }
723
- case OpCode.IfInit: {
724
- const cond = read();
725
- code = `if (${this.rv(cond)} !== undefined) {`;
726
- break;
727
- }
728
- case OpCode.IfNotInit: {
729
- const cond = read();
730
- code = `if (${this.rv(cond)} === undefined) {`;
731
- break;
732
- }
733
- case OpCode.IfNil: {
734
- const cond = read();
735
- code = `if (${this.rv(cond)} === null) {`;
736
- break;
737
- }
738
- case OpCode.IfNotNil: {
739
- const cond = read();
740
- code = `if (${this.rv(cond)} !== null) {`;
741
- break;
742
- }
743
- case OpCode.LoopFor: {
744
- const nreg = read();
745
- const iterable = read();
746
- const regs = createArray(nreg - 1, (i) => this.wv(i + 2, -1));
747
- regs.unshift("_");
748
- const ir = this.wv(1, -1);
749
- code = `for (let ${ir} of $Iterable(${this.rv(iterable)})) { ${ir} ??= null; Cp(); let ${regs.join(", ")};`;
750
- break;
751
- }
752
- case OpCode.LoopRange:
753
- case OpCode.LoopRangeExclusive: {
754
- const nreg = read();
755
- const start = read();
756
- const end = read();
757
- const exclusive = opcode === OpCode.LoopRangeExclusive;
758
- const regs = createArray(nreg - 1, (i2) => this.wv(i2 + 2, -1));
759
- regs.unshift("_");
760
- const i = this.wv(1, -1);
761
- code = `for (let start = $ToNumber(${this.rv(start)}), end = $ToNumber(${this.rv(end)}), ${i} = start; ${i} ${exclusive ? "<" : "<="} end; ${i} += 1) { Cp(); let ${regs.join(", ")};`;
762
- break;
763
- }
764
- case OpCode.Loop: {
765
- const nreg = read();
766
- const regs = createArray(nreg, (i) => this.wv(i + 1, -1));
767
- regs.unshift("_");
768
- code = `while (true) { Cp(); let ${regs.join(", ")};`;
769
- break;
770
- }
771
- case OpCode.Break: {
772
- code = `break;`;
773
- break;
774
- }
775
- case OpCode.Continue: {
776
- code = `continue;`;
777
- break;
778
- }
779
- case OpCode.Noop: {
780
- return;
781
- }
782
- default: {
783
- code = `; // ${OpCode[opcode] ?? opcode}`;
784
- break;
785
- }
786
- }
787
- this.codeLines.push(ident + code);
788
- switch (opcode) {
789
- case OpCode.FuncVarg:
790
- case OpCode.Func: {
791
- this.readClosure();
792
- break;
793
- }
794
- case OpCode.If:
795
- case OpCode.IfNot:
796
- case OpCode.IfNil:
797
- case OpCode.IfNotNil:
798
- case OpCode.IfInit:
799
- case OpCode.IfNotInit: {
800
- this.readIfElse();
801
- break;
802
- }
803
- case OpCode.Loop:
804
- case OpCode.LoopFor:
805
- case OpCode.LoopRange:
806
- case OpCode.LoopRangeExclusive: {
807
- this.identCounter++;
808
- this.closureCounter++;
809
- this.readBlockEnd(OpCode.LoopEnd);
810
- break;
811
- }
812
- case OpCode.Record: {
813
- this.readRecord(reg);
814
- break;
815
- }
816
- case OpCode.Array: {
817
- this.readArray(reg);
818
- break;
819
- }
820
- }
821
- }
822
- /** 读取 chunk */
823
- read() {
824
- this.readConsts();
825
- this.readCode();
826
- this.addSourceMap();
827
- }
828
- /** 添加源映射 */
829
- addSourceMap() {
830
- if (!this.options.sourceMap) return;
831
- let fileName = (this.options.fileName ?? "").trim();
832
- const hasSchema = /^\w+:/.test(fileName);
833
- if (!hasSchema) {
834
- if (fileName.startsWith("/")) {
835
- fileName = fileName.replace(/^\/+\s*/, "");
836
- }
837
- if (!fileName) {
838
- fileName = `${sourceId++}.${this.options.input_mode === "Template" ? "miratpl" : "mira"}`;
839
- }
840
- }
841
- const map = new SourceMapGenerator({
842
- file: fileName + ".js"
843
- });
844
- if (typeof this.source === "string") {
845
- map.setSourceContent(fileName, this.source);
846
- }
847
- for (let i = 0; i < this.sourcemaps.length; i++) {
848
- const range = this.sourcemaps[i];
849
- if (!range) break;
850
- map.addMapping({
851
- generated: {
852
- // 前两行固定为:
853
- // (function anonymous($Add,$Aeq, ...
854
- // ) {
855
- line: i + 3,
856
- column: 0
857
- },
858
- original: {
859
- line: range.startLineNumber,
860
- column: range.startColumn - 1
861
- },
862
- source: fileName
863
- });
864
- }
865
- const prefix = "//# ";
866
- const sourceURL = hasSchema ? fileName : `${ORIGIN}${fileName}`;
867
- this.codeLines.push(
868
- // Prevent source map from being recognized as of this file
869
- `${prefix}sourceURL=${sourceURL}.js`,
870
- `${prefix}sourceMappingURL=data:application/json,${encodeURIComponent(map.toString())}`
871
- );
872
- }
873
- };
874
-
875
- // src/compiler/generate-bytecode.ts
876
- import { getModule as getModule2, loadModule } from "@mirascript/bindings";
877
- function generateBytecodeSync(script, options) {
878
- const module = getModule2();
879
- const result = module.compileSync(script, options);
880
- return [result.chunk, result.diagnostics];
881
- }
882
- async function generateBytecode(script, options) {
883
- if (options == null) {
884
- throw new TypeError("options must be provided");
885
- }
886
- const module = await loadModule();
887
- const result = "compile" in module ? await module.compile(script, options) : module.compileSync(script, options);
888
- return [result.chunk, result.diagnostics];
889
- }
890
-
891
- export {
892
- __export,
893
- isArray,
894
- isFinite,
895
- isNaN,
896
- isInteger,
897
- isSafeInteger,
898
- hasOwn,
899
- keys,
900
- values,
901
- entries,
902
- create,
903
- getPrototypeOf,
904
- fromEntries,
905
- defineProperty,
906
- apply,
907
- hasOwnEnumerable,
908
- DiagnosticCode,
909
- getDiagnosticMessage,
910
- parseDiagnostics,
911
- formatDiagnostic,
912
- emit,
913
- generateBytecodeSync,
914
- generateBytecode
915
- };
916
- //# sourceMappingURL=chunk-AGIXQM52.js.map