@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,7 +1,25 @@
1
1
  import {
2
+ $Add,
3
+ $Call,
4
+ $Div,
5
+ $Format,
6
+ $Mul,
7
+ $Same,
8
+ $Sub,
9
+ $ToBoolean,
10
+ $ToNumber,
11
+ $ToString,
12
+ $Type,
13
+ Cp,
2
14
  DiagnosticCode,
15
+ Element,
16
+ GlobalFallback,
17
+ VM_ARRAY_MAX_LENGTH,
18
+ VmError,
19
+ VmFunction,
20
+ VmModule,
21
+ VmSharedContext,
3
22
  __export,
4
- apply,
5
23
  create,
6
24
  defineProperty,
7
25
  emit,
@@ -10,18 +28,27 @@ import {
10
28
  fromEntries,
11
29
  generateBytecode,
12
30
  generateBytecodeSync,
13
- getPrototypeOf,
14
31
  hasOwn,
15
- hasOwnEnumerable,
32
+ helpers_exports,
16
33
  isArray,
17
34
  isFinite,
18
35
  isInteger,
19
36
  isNaN,
20
37
  isSafeInteger,
38
+ isVmArray,
39
+ isVmArrayLikeRecordByEntires,
40
+ isVmCallable,
41
+ isVmConst,
42
+ isVmExtern,
43
+ isVmFunction,
44
+ isVmModule,
45
+ isVmPrimitive,
46
+ isVmRecord,
21
47
  keys,
48
+ operations_exports,
22
49
  parseDiagnostics,
23
50
  values
24
- } from "./chunk-AGIXQM52.js";
51
+ } from "./chunk-JVFUK7AN.js";
25
52
 
26
53
  // src/subtle.ts
27
54
  import { getModule } from "@mirascript/bindings";
@@ -29,1208 +56,28 @@ import { getModule } from "@mirascript/bindings";
29
56
  // src/helpers/constants.ts
30
57
  var constants_exports = {};
31
58
  __export(constants_exports, {
59
+ REG_BIN: () => REG_BIN,
60
+ REG_HEX: () => REG_HEX,
32
61
  REG_IDENTIFIER: () => REG_IDENTIFIER,
33
- REG_ORDINAL: () => REG_ORDINAL
62
+ REG_NUMBER: () => REG_NUMBER,
63
+ REG_OCT: () => REG_OCT,
64
+ REG_ORDINAL: () => REG_ORDINAL,
65
+ REG_WHITESPACE: () => REG_WHITESPACE
34
66
  });
35
67
  var REG_IDENTIFIER = /(?:_+|@+|\$+|\p{XID_Start})\p{XID_Continue}*/u;
36
- var REG_ORDINAL = /(?:0|[1-9]\d{0,8}|1\d{9}|20\d{8}|21[0-3]\d{7}|214[0-6]\d{6}|2147[0-3]\d{5}|21474[0-7]\d{4}|214748[0-2]\d{3}|2147483[0-5]\d{2}|21474836[0-3]\d|214748364[0-7])/;
37
-
38
- // src/vm/error.ts
39
- var VmError = class _VmError extends Error {
40
- constructor(message, recovered) {
41
- super(message);
42
- this.recovered = recovered;
43
- this.name = "VmError";
44
- }
45
- /** 从其他错误构造 */
46
- static from(prefix, error, recovered) {
47
- if (prefix) {
48
- if (prefix.endsWith(":")) {
49
- prefix += " ";
50
- } else if (!prefix.endsWith(": ")) {
51
- prefix += ": ";
52
- }
53
- }
54
- let vmError;
55
- if (error instanceof Error) {
56
- vmError = new _VmError(`${prefix}${error.message}`, recovered);
57
- vmError.stack = error.stack;
58
- } else {
59
- vmError = new _VmError(`${prefix}${String(error)}`, recovered);
60
- }
61
- vmError.cause = error;
62
- return vmError;
63
- }
64
- };
65
-
66
- // src/vm/types/wrapper.ts
67
- var VmWrapper = class {
68
- constructor(value) {
69
- this.value = value;
70
- }
71
- /** Convert the object to JSON */
72
- toJSON() {
73
- return void 0;
74
- }
75
- /** 转为字符串 */
76
- toString() {
77
- const { type, describe } = this;
78
- if (!describe) return `<${type}>`;
79
- return `<${type} ${describe}>`;
80
- }
81
- };
82
- var kVmWrapper = Symbol.for("mirascript.vm.wrapper");
83
- Object.defineProperty(VmWrapper.prototype, kVmWrapper, { value: true });
84
- function isVmWrapper(value) {
85
- return value != null && typeof value == "object" && kVmWrapper in value;
86
- }
87
-
88
- // src/vm/helpers.ts
89
- var helpers_exports = {};
90
- __export(helpers_exports, {
91
- ArrayRange: () => ArrayRange,
92
- ArrayRangeExclusive: () => ArrayRangeExclusive,
93
- Cp: () => Cp,
94
- CpEnter: () => CpEnter,
95
- CpExit: () => CpExit,
96
- Element: () => Element,
97
- ElementOpt: () => ElementOpt,
98
- Function: () => Function2,
99
- GlobalFallback: () => GlobalFallback,
100
- Upvalue: () => Upvalue,
101
- Vargs: () => Vargs,
102
- configCheckpoint: () => configCheckpoint
103
- });
104
-
105
- // src/vm/operations.ts
106
- var operations_exports = {};
107
- __export(operations_exports, {
108
- $Add: () => $Add,
109
- $Aeq: () => $Aeq,
110
- $And: () => $And,
111
- $ArraySpread: () => $ArraySpread,
112
- $AssertInit: () => $AssertInit,
113
- $AssertNonNil: () => $AssertNonNil,
114
- $Call: () => $Call,
115
- $Concat: () => $Concat,
116
- $Div: () => $Div,
117
- $Eq: () => $Eq,
118
- $Format: () => $Format,
119
- $Get: () => $Get,
120
- $Gt: () => $Gt,
121
- $Gte: () => $Gte,
122
- $Has: () => $Has,
123
- $In: () => $In,
124
- $IsArray: () => $IsArray,
125
- $IsBoolean: () => $IsBoolean,
126
- $IsNumber: () => $IsNumber,
127
- $IsRecord: () => $IsRecord,
128
- $IsString: () => $IsString,
129
- $Iterable: () => $Iterable,
130
- $Length: () => $Length,
131
- $Lt: () => $Lt,
132
- $Lte: () => $Lte,
133
- $Mod: () => $Mod,
134
- $Mul: () => $Mul,
135
- $Naeq: () => $Naeq,
136
- $Neg: () => $Neg,
137
- $Neq: () => $Neq,
138
- $Not: () => $Not,
139
- $Nsame: () => $Nsame,
140
- $Omit: () => $Omit,
141
- $Or: () => $Or,
142
- $Pick: () => $Pick,
143
- $Pos: () => $Pos,
144
- $Pow: () => $Pow,
145
- $RecordSpread: () => $RecordSpread,
146
- $Same: () => $Same,
147
- $Set: () => $Set,
148
- $Slice: () => $Slice,
149
- $SliceExclusive: () => $SliceExclusive,
150
- $Sub: () => $Sub,
151
- $ToBoolean: () => $ToBoolean,
152
- $ToNumber: () => $ToNumber,
153
- $ToString: () => $ToString,
154
- $Type: () => $Type
155
- });
156
- var { abs, min, trunc, ceil } = Math;
157
- var { slice, at } = Array.prototype;
158
- var { POSITIVE_INFINITY, NEGATIVE_INFINITY } = Number;
159
- var isSame = (a, b) => {
160
- if (typeof a == "number" && typeof b == "number") return a === b || isNaN(a) && isNaN(b);
161
- if (a === b) return true;
162
- if (a == null || typeof a != "object" || b == null || typeof b != "object") return false;
163
- if (isVmWrapper(a)) return a.same(b);
164
- if (isVmWrapper(b)) return b.same(a);
165
- if (isVmArray(a) && isVmArray(b)) {
166
- const len2 = a.length;
167
- if (len2 !== b.length) {
168
- return false;
169
- }
170
- for (let i = 0; i < len2; i++) {
171
- if (!isSame(a[i] ?? null, b[i] ?? null)) {
172
- return false;
173
- }
174
- }
175
- return true;
176
- }
177
- if (!isVmArray(a) && !isVmArray(b)) {
178
- const aKeys = keys(a);
179
- const bKeys = keys(b);
180
- if (aKeys.length !== bKeys.length) {
181
- return false;
182
- }
183
- for (const key of aKeys) {
184
- if (!hasOwnEnumerable(b, key)) {
185
- return false;
186
- }
187
- if (!isSame(a[key] ?? null, b[key] ?? null)) {
188
- return false;
189
- }
190
- }
191
- return true;
192
- }
193
- return false;
194
- };
195
- var overloadNumberString = (a, b) => {
196
- if (typeof a == "number" || typeof b == "number") return true;
197
- if (typeof a == "string" || typeof b == "string") return false;
198
- return true;
199
- };
200
- var $Add = (a, b) => {
201
- return $ToNumber(a) + $ToNumber(b);
202
- };
203
- var $Sub = (a, b) => {
204
- return $ToNumber(a) - $ToNumber(b);
205
- };
206
- var $Mul = (a, b) => {
207
- return $ToNumber(a) * $ToNumber(b);
208
- };
209
- var $Div = (a, b) => {
210
- return $ToNumber(a) / $ToNumber(b);
211
- };
212
- var $Mod = (a, b) => {
213
- return $ToNumber(a) % $ToNumber(b);
214
- };
215
- var $Pow = (a, b) => {
216
- return $ToNumber(a) ** $ToNumber(b);
217
- };
218
- var $And = (a, b) => {
219
- return $ToBoolean(a) && $ToBoolean(b);
220
- };
221
- var $Or = (a, b) => {
222
- return $ToBoolean(a) || $ToBoolean(b);
223
- };
224
- var $Gt = (a, b) => {
225
- if (overloadNumberString(a, b)) {
226
- return $ToNumber(a) > $ToNumber(b);
227
- } else {
228
- return $ToString(a) > $ToString(b);
229
- }
230
- };
231
- var $Gte = (a, b) => {
232
- if (overloadNumberString(a, b)) {
233
- return $ToNumber(a) >= $ToNumber(b);
234
- } else {
235
- return $ToString(a) >= $ToString(b);
236
- }
237
- };
238
- var $Lt = (a, b) => {
239
- if (overloadNumberString(a, b)) {
240
- return $ToNumber(a) < $ToNumber(b);
241
- } else {
242
- return $ToString(a) < $ToString(b);
243
- }
244
- };
245
- var $Lte = (a, b) => {
246
- if (overloadNumberString(a, b)) {
247
- return $ToNumber(a) <= $ToNumber(b);
248
- } else {
249
- return $ToString(a) <= $ToString(b);
250
- }
251
- };
252
- var $Eq = (a, b) => {
253
- $AssertInit(a);
254
- $AssertInit(b);
255
- if (typeof a == "number" && typeof b == "number") return a === b;
256
- return isSame(a, b);
257
- };
258
- var $Neq = (a, b) => {
259
- return !$Eq(a, b);
260
- };
261
- var $Aeq = (a, b) => {
262
- if (overloadNumberString(a, b)) {
263
- const an = $ToNumber(a);
264
- const bn = $ToNumber(b);
265
- const EPS = 1e-15;
266
- if (isNaN(an) || isNaN(bn)) return false;
267
- if (an === bn) return true;
268
- const absoluteDifference = abs(an - bn);
269
- if (absoluteDifference < EPS) return true;
270
- const base = min(abs(an), abs(bn));
271
- return absoluteDifference < base * EPS;
272
- } else {
273
- const as = $ToString(a);
274
- const bs = $ToString(b);
275
- if (as === bs) return true;
276
- const ai = as.toLowerCase();
277
- const bi = bs.toLowerCase();
278
- if (ai === bi) return true;
279
- const an = ai.normalize("NFC");
280
- const bn = bi.normalize("NFC");
281
- return an === bn;
282
- }
283
- };
284
- var $Naeq = (a, b) => {
285
- return !$Aeq(a, b);
286
- };
287
- var $Same = (a, b) => {
288
- $AssertInit(a);
289
- $AssertInit(b);
290
- return isSame(a, b);
291
- };
292
- var $Nsame = (a, b) => {
293
- return !$Same(a, b);
294
- };
295
- var $In = (value, iterable) => {
296
- $AssertInit(value);
297
- $AssertInit(iterable);
298
- if (iterable == null) return false;
299
- if (isVmArray(iterable)) {
300
- if (value == null) {
301
- for (const item of iterable) {
302
- if (item == null) return true;
303
- }
304
- return false;
305
- }
306
- if (isVmPrimitive(value)) return iterable.includes(value);
307
- value;
308
- return iterable.some((item = null) => isSame(item, value));
309
- }
310
- if (isVmWrapper(iterable)) return iterable.has($ToString(value));
311
- if (typeof iterable == "object") return hasOwnEnumerable(iterable, $ToString(value));
312
- iterable;
313
- return false;
314
- };
315
- var $Concat = (...args) => {
316
- return args.map($Format).join("");
317
- };
318
- var $Pos = (a) => {
319
- return $ToNumber(a);
320
- };
321
- var $Neg = (a) => {
322
- return -$ToNumber(a);
323
- };
324
- var $Not = (a) => {
325
- return !$ToBoolean(a);
326
- };
327
- var $Length = (value) => {
328
- $AssertInit(value);
329
- if (isVmArray(value)) return value.length;
330
- if (isVmRecord(value)) return keys(value).length;
331
- if (isVmWrapper(value)) {
332
- return value.keys().length;
333
- }
334
- return Number.NaN;
335
- };
336
- var $Omit = (value, omitted) => {
337
- $AssertInit(value);
338
- if (value == null || !isVmRecord(value)) return {};
339
- const result = {};
340
- const valueKeys = keys(value);
341
- const omittedSet = new Set(omitted.map($ToString));
342
- for (const key of valueKeys) {
343
- if (!omittedSet.has(key)) {
344
- result[key] = value[key] ?? null;
345
- }
346
- }
347
- return result;
348
- };
349
- var $Pick = (value, picked) => {
350
- $AssertInit(value);
351
- if (value == null || !isVmRecord(value)) return {};
352
- const result = {};
353
- for (const key of picked) {
354
- const k = $ToString(key);
355
- if (hasOwnEnumerable(value, k)) {
356
- result[k] = value[k] ?? null;
357
- }
358
- }
359
- return result;
360
- };
361
- var sliceCore = (value, start, end, exclusive) => {
362
- const { length } = value;
363
- if (isNaN(start)) start = 0;
364
- else if (start < 0) start = length + start;
365
- if (isNaN(end)) end = exclusive ? length : length - 1;
366
- else if (end < 0) end = length + end;
367
- start = ceil(start);
368
- if (exclusive || !isSafeInteger(end)) {
369
- end = ceil(end);
370
- } else {
371
- end = end + 1;
372
- }
373
- return slice.call(value, start, end);
374
- };
375
- var $Slice = (value, start, end) => {
376
- $AssertInit(value);
377
- if (!isVmArray(value)) throw new VmError(`Expected array, got ${$Type(value)}`, []);
378
- const s = start != null ? $ToNumber(start) : 0;
379
- const e = end != null ? $ToNumber(end) : value.length - 1;
380
- return sliceCore(value, s, e, false);
381
- };
382
- var $SliceExclusive = (value, start, end) => {
383
- $AssertInit(value);
384
- if (!isVmArray(value)) throw new VmError(`Expected array, got ${$Type(value)}`, []);
385
- const s = start != null ? $ToNumber(start) : 0;
386
- const e = end != null ? $ToNumber(end) : value.length;
387
- return sliceCore(value, s, e, true);
388
- };
389
- var $AssertInit = (value) => {
390
- if (value === void 0) throw new VmError(`Uninitialized value`, null);
391
- };
392
- var $Call = (func, args) => {
393
- for (const a of args) {
394
- $AssertInit(a);
395
- }
396
- if (isVmExtern(func)) {
397
- return func.call(args) ?? null;
398
- }
399
- if (isVmFunction(func)) {
400
- return func(...args) ?? null;
401
- }
402
- throw new VmError(`Expected callable, got ${$Type(func)}`, null);
403
- };
404
- var $Type = (value) => {
405
- if (value === void 0 || value === null) return "nil";
406
- if (isVmExtern(value)) return "extern";
407
- if (isVmModule(value)) return "module";
408
- if (isVmArray(value)) return "array";
409
- if (typeof value == "object") return "record";
410
- return typeof value;
411
- };
412
- var $ToBoolean = (value) => {
413
- $AssertInit(value);
414
- return value != null && value !== false;
415
- };
416
- function numberToString(value) {
417
- if (isNaN(value)) return "nan";
418
- if (value === Infinity) return "inf";
419
- if (value === -Infinity) return "-inf";
420
- return String(value);
421
- }
422
- function innerToString(value, useBraces) {
423
- if (value == null) return "nil";
424
- if (isVmWrapper(value)) return value.toString();
425
- if (typeof value == "function") {
426
- const name = getVmFunctionInfo(value)?.fullName;
427
- return name ? `<function ${name}>` : `<function>`;
428
- }
429
- if (isVmArray(value)) {
430
- const strings = [];
431
- for (const item of value) {
432
- strings.push(innerToString(item, true));
433
- }
434
- const results = strings.join(", ");
435
- if (!useBraces) return results;
436
- return `[${results}]`;
437
- }
438
- if (typeof value == "object") {
439
- const entries3 = keys(value).map((key) => `${key}: ${innerToString(value[key], true)}`).join(", ");
440
- if (!useBraces) return entries3;
441
- return `(${entries3})`;
442
- }
443
- if (typeof value == "number") {
444
- return numberToString(value);
445
- }
446
- return String(value);
447
- }
448
- var $ToString = (value) => {
449
- $AssertInit(value);
450
- if (typeof value == "string") return value;
451
- if (value === null) return "";
452
- return innerToString(value, false);
453
- };
454
- var $ToNumber = (value) => {
455
- $AssertInit(value);
456
- if (typeof value == "number") return value;
457
- if (value == null) return 0;
458
- if (typeof value == "string") {
459
- value = value.trim();
460
- if (value === "") return 0;
461
- if (value === "inf" || value === "+inf" || value === "Infinity" || value === "+Infinity") {
462
- return POSITIVE_INFINITY;
463
- }
464
- if (value === "-inf" || value === "-Infinity") {
465
- return NEGATIVE_INFINITY;
466
- }
467
- return Number(value);
468
- }
469
- if (typeof value == "boolean") return value ? 1 : 0;
470
- return Number.NaN;
471
- };
472
- var $IsBoolean = (value) => {
473
- $AssertInit(value);
474
- return typeof value == "boolean";
475
- };
476
- var $IsNumber = (value) => {
477
- $AssertInit(value);
478
- return typeof value == "number";
479
- };
480
- var $IsString = (value) => {
481
- $AssertInit(value);
482
- return typeof value == "string";
483
- };
484
- var $IsRecord = (value) => {
485
- $AssertInit(value);
486
- return isVmRecord(value);
487
- };
488
- var $IsArray = (value) => {
489
- $AssertInit(value);
490
- return isVmArray(value);
491
- };
492
- var $AssertNonNil = (value) => {
493
- $AssertInit(value);
494
- if (value !== null) return;
495
- throw new VmError("Expected non-nil value", null);
496
- };
497
- var $Has = (obj, key) => {
498
- $AssertInit(obj);
499
- const pk = $ToString(key);
500
- if (obj == null || typeof obj != "object") return false;
501
- if (isVmWrapper(obj)) return obj.has(pk);
502
- return hasOwnEnumerable(obj, pk);
503
- };
504
- var $Get = (obj, key) => {
505
- $AssertInit(obj);
506
- if (isVmArray(obj)) {
507
- const index = $ToNumber(key);
508
- if (isNaN(index)) return null;
509
- return at.call(obj, trunc(index)) ?? null;
510
- }
511
- const pk = $ToString(key);
512
- if (obj == null || typeof obj != "object") return null;
513
- if (isVmWrapper(obj)) return obj.get(pk) ?? null;
514
- if (!hasOwnEnumerable(obj, pk)) return null;
515
- return obj[pk] ?? null;
516
- };
517
- var $Set = (obj, key, value) => {
518
- $AssertInit(obj);
519
- $AssertInit(value);
520
- const pk = $ToString(key);
521
- if (obj == null) return;
522
- if (!isVmExtern(obj)) throw new VmError(`Expected extern, got ${$Type(obj)}`, void 0);
523
- obj.set(pk, value);
524
- };
525
- var $Iterable = (value) => {
526
- $AssertInit(value);
527
- if (isVmWrapper(value)) return value.keys();
528
- if (isVmArray(value)) return value;
529
- if (value != null && typeof value == "object") return keys(value);
530
- throw new VmError(`Value is not iterable`, isVmFunction(value) ? [] : [value]);
531
- };
532
- var $RecordSpread = (record) => {
533
- $AssertInit(record);
534
- if (record == null || isVmRecord(record)) return record;
535
- if (isVmArray(record)) {
536
- const result = {};
537
- const len2 = record.length;
538
- for (let i = 0; i < len2; i++) {
539
- const item = record[i];
540
- result[i] = item ?? null;
541
- }
542
- return result;
543
- }
544
- if (isVmExtern(record)) {
545
- const result = create(null);
546
- for (const key of record.keys()) {
547
- const value = record.get(key) ?? null;
548
- if (isVmPrimitive(value)) {
549
- result[key] = value;
550
- }
551
- }
552
- return result;
553
- }
554
- throw new VmError(`Expected record, array, extern or nil, got ${$Type(record)}`, null);
555
- };
556
- var $ArraySpread = (array) => {
557
- $AssertInit(array);
558
- if (array == null) return [];
559
- if (isVmArray(array)) return array;
560
- if (isVmExtern(array) && typeof array.value[Symbol.iterator] == "function") {
561
- const result = [];
562
- for (const item of array.value) {
563
- if (isVmPrimitive(item)) {
564
- result.push(item);
565
- } else {
566
- result.push(null);
567
- }
568
- }
569
- return result;
570
- }
571
- throw new VmError(`Expected array, iterable extern or nil, got ${$Type(array)}`, []);
572
- };
573
- function formatNumber(value) {
574
- if (!Number.isFinite(value)) return numberToString(value);
575
- if (value === 0) return "0";
576
- const s = value.toString();
577
- let ps;
578
- const abs3 = Math.abs(value);
579
- if (abs3 >= 1e3 || abs3 < 1e-3) {
580
- const ps1 = value.toExponential();
581
- const ps2 = value.toExponential(5);
582
- ps = ps1.length < ps2.length ? ps1 : ps2;
583
- } else {
584
- ps = value.toPrecision(6);
585
- }
586
- return ps.length < s.length ? ps : s;
587
- }
588
- var $Format = (value, format2) => {
589
- $AssertInit(value);
590
- const f = format2 == null ? "" : typeof format2 == "string" ? format2.trim() : $ToString(format2);
591
- if (typeof value == "number") {
592
- if (/^\.\d+$/.test(f)) {
593
- let digits = Math.trunc(Number(f.slice(1)));
594
- if (!(digits <= 100)) digits = 100;
595
- return value.toFixed(digits);
596
- } else {
597
- return formatNumber(value);
598
- }
599
- }
600
- return $ToString(value);
601
- };
602
-
603
- // src/vm/helpers.ts
604
- var Vargs = (varags) => {
605
- for (let i = 0, l = varags.length; i < l; i++) {
606
- const el = varags[i];
607
- if (!isVmConst(el)) {
608
- varags[i] = null;
609
- }
610
- }
611
- return varags;
612
- };
613
- var Element = (value) => {
614
- $AssertInit(value);
615
- if (!isVmConst(value)) return null;
616
- return value;
617
- };
618
- var ElementOpt = (key, value) => {
619
- $AssertInit(value);
620
- if (value == null || !isVmConst(value)) return {};
621
- return { [key]: value };
622
- };
623
- var Function2 = (fn) => {
624
- return VmFunction(fn, { isLib: false, injectCp: false });
625
- };
626
- var Upvalue = (value) => {
627
- $AssertInit(value);
628
- return value;
629
- };
630
- var assertArrayLength = (start, end) => {
631
- if (end - start > VM_ARRAY_MAX_LENGTH) {
632
- throw new RangeError(`Array length exceeds maximum limit of ${VM_ARRAY_MAX_LENGTH}`);
633
- }
634
- };
635
- var isEmptyRange = (start, end) => {
636
- return !isFinite(start) || !isFinite(end) || start > end;
637
- };
638
- var ArrayRange = (start, end) => {
639
- const s = $ToNumber(start);
640
- const e = $ToNumber(end);
641
- if (isEmptyRange(s, e)) return [];
642
- assertArrayLength(s, e);
643
- const arr = [];
644
- for (let i = s; i <= e; i++) {
645
- arr.push(i);
646
- }
647
- return arr;
648
- };
649
- var ArrayRangeExclusive = (start, end) => {
650
- const s = $ToNumber(start);
651
- const e = $ToNumber(end);
652
- if (isEmptyRange(s, e)) return [];
653
- assertArrayLength(s, e);
654
- const arr = [];
655
- for (let i = s; i < e; i++) {
656
- arr.push(i);
657
- }
658
- return arr;
659
- };
660
- var MAX_DEPTH = 128;
661
- var cpDepth = 0;
662
- var cp = Number.NaN;
663
- var cpTimeout = 100;
664
- function Cp() {
665
- if (!cp) {
666
- cp = Date.now();
667
- } else if (Date.now() - cp > cpTimeout) {
668
- throw new RangeError("Execution timeout");
669
- }
670
- }
671
- function CpEnter() {
672
- cpDepth++;
673
- if (cpDepth <= 1) {
674
- cp = Date.now();
675
- cpDepth = 1;
676
- } else if (cpDepth > MAX_DEPTH) {
677
- throw new RangeError("Maximum call depth exceeded");
678
- } else {
679
- Cp();
680
- }
681
- }
682
- function CpExit() {
683
- cpDepth--;
684
- if (cpDepth < 1) {
685
- cp = Number.NaN;
686
- cpDepth = 0;
687
- } else {
688
- Cp();
689
- }
690
- }
691
- function configCheckpoint(timeout = 100) {
692
- if (typeof timeout !== "number" || timeout <= 0 || Number.isNaN(timeout)) {
693
- throw new RangeError("Invalid timeout value");
694
- }
695
- cpTimeout = timeout;
696
- }
697
- function GlobalFallback() {
698
- return DefaultVmContext;
699
- }
700
-
701
- // src/vm/types/function.ts
702
- var kVmFunction = Symbol.for("mirascript.vm.function");
703
- function isVmFunction(value) {
704
- return getVmFunctionInfo(value) != null;
705
- }
706
- function getVmFunctionInfo(value) {
707
- if (typeof value != "function") return void 0;
708
- return value[kVmFunction];
709
- }
710
- function VmFunction(fn, option = {}) {
711
- if (typeof fn != "function") {
712
- throw new TypeError("Invalid function");
713
- }
714
- const exists = fromVmFunctionProxy(fn);
715
- if (exists) return exists;
716
- const info = {
717
- fullName: option.fullName ?? fn.name,
718
- isLib: option.isLib ?? false,
719
- summary: option.summary || void 0,
720
- params: option.params,
721
- paramsType: option.paramsType,
722
- returns: option.returns || void 0,
723
- returnsType: option.returnsType || void 0,
724
- examples: option.examples?.length ? option.examples : void 0
725
- };
726
- if (option.injectCp) {
727
- const original = fn;
728
- info.original = original;
729
- fn = ((...args) => {
730
- try {
731
- CpEnter();
732
- const ret = original(...args);
733
- return ret;
734
- } finally {
735
- CpExit();
736
- }
737
- });
738
- defineProperty(fn, "name", {
739
- value: original.name,
740
- configurable: true
741
- });
742
- }
743
- defineProperty(fn, kVmFunction, {
744
- value: Object.freeze(info)
745
- });
746
- return fn;
747
- }
748
-
749
- // src/vm/types/boundary.ts
750
- var kProxy = Symbol.for("mirascript.vm.function.proxy");
751
- function toVmFunctionProxy(fn) {
752
- if (!isVmFunction(fn)) return fn;
753
- const cached = fn[kProxy];
754
- if (cached != null) return cached;
755
- const proxy = (...args) => {
756
- const ret = $Call(
757
- fn,
758
- // 作为函数参数传入的值一定丢失了它的 this
759
- args.map((v) => wrapToVmValue(v, null))
760
- );
761
- return unwrapFromVmValue(ret);
762
- };
763
- defineProperty(fn, kProxy, { value: proxy });
764
- defineProperty(proxy, kProxy, { value: fn });
765
- defineProperty(proxy, "name", {
766
- value: fn.name,
767
- configurable: true
768
- });
769
- return proxy;
770
- }
771
- function fromVmFunctionProxy(fn) {
772
- if (isVmFunction(fn)) return fn;
773
- const original = fn[kProxy];
774
- if (original && isVmFunction(original)) return original;
775
- return void 0;
776
- }
777
- function wrapToVmValue(value, thisArg = null, assumeVmValue) {
778
- if (value == null) return null;
779
- switch (typeof value) {
780
- case "function": {
781
- const unwrapped = fromVmFunctionProxy(value);
782
- if (unwrapped) return unwrapped;
783
- return new VmExtern(value, thisArg);
784
- }
785
- case "object": {
786
- if (isVmWrapper(value)) return value;
787
- if (value instanceof Date) return value.valueOf();
788
- if (assumeVmValue?.(value)) return value;
789
- return new VmExtern(value);
790
- }
791
- case "string":
792
- case "number":
793
- case "boolean":
794
- return value;
795
- case "bigint":
796
- return Number(value);
797
- case "symbol":
798
- case "undefined":
799
- default:
800
- return null;
801
- }
802
- }
803
- function unwrapFromVmValue(value) {
804
- if (typeof value == "function") {
805
- return toVmFunctionProxy(value);
806
- }
807
- if (value == null || typeof value != "object") return value;
808
- if (!isVmExtern(value)) return value;
809
- if (value.thisArg == null || typeof value.value != "function") {
810
- return value.value;
811
- }
812
- const f = value;
813
- const caller = f.thisArg.value;
814
- return new Proxy(f.value, {
815
- apply(target, thisArg, args) {
816
- return apply(target, caller, args);
817
- }
818
- });
819
- }
820
-
821
- // src/vm/types/extern.ts
822
- var ObjectPrototype = Object.prototype;
823
- var ObjectToString = ObjectPrototype.toString;
824
- var FunctionToString = Function.prototype.toString;
825
- var VmExtern = class extends VmWrapper {
826
- constructor(value, thisArg = null) {
827
- super(value);
828
- this.thisArg = thisArg;
829
- }
830
- /** Check if the object has a property */
831
- access(key, read) {
832
- if (key.startsWith("_")) return false;
833
- if (typeof this.value == "function" && (key === "prototype" || key === "arguments" || key === "caller"))
834
- return false;
835
- if (hasOwn(this.value, key)) return true;
836
- if (!read) return true;
837
- if (!(key in this.value)) return false;
838
- if (key === "constructor") return false;
839
- const prop = this.value[key];
840
- if (key in Function.prototype && prop === Function.prototype[key]) return false;
841
- if (key in Array.prototype && prop === Array.prototype[key]) return false;
842
- if (key in Object.prototype && prop === Object.prototype[key]) return false;
843
- return true;
844
- }
845
- /** 决定是否对属性进行包装 */
846
- assumeVmValue(value, key) {
847
- return false;
848
- }
849
- /** @inheritdoc */
850
- has(key) {
851
- return this.access(key, true);
852
- }
853
- /** @inheritdoc */
854
- get(key) {
855
- if (!this.has(key)) return void 0;
856
- const prop = this.value[key];
857
- return wrapToVmValue(prop, this, (v) => this.assumeVmValue(v, key));
858
- }
859
- /** Set a property on the object */
860
- set(key, value) {
861
- if (!this.access(key, false)) return false;
862
- const prop = unwrapFromVmValue(value);
863
- this.value[key] = prop;
864
- return true;
865
- }
866
- /** Call extern value */
867
- call(args) {
868
- const { value } = this;
869
- if (typeof value != "function") {
870
- throw VmError.from(`Not a callable extern`, null, null);
871
- }
872
- const caller = this.thisArg?.value ?? null;
873
- const unwrappedArgs = args.map(unwrapFromVmValue);
874
- let ret;
875
- try {
876
- ret = apply(value, caller, unwrappedArgs);
877
- } catch (ex) {
878
- throw VmError.from(`Callable extern`, ex, null);
879
- }
880
- return wrapToVmValue(ret, null, (obj) => this.assumeVmValue(obj, void 0));
881
- }
882
- /** @inheritdoc */
883
- keys() {
884
- const keys4 = [];
885
- for (const key in this.value) {
886
- if (this.has(key)) keys4.push(key);
887
- }
888
- return keys4;
889
- }
890
- /** @inheritdoc */
891
- same(other) {
892
- if (!isVmExtern(other)) return false;
893
- return this.value === other.value && this.thisArg === other.thisArg;
894
- }
895
- /** @inheritdoc */
896
- toString() {
897
- const { toString } = this.value;
898
- if (typeof toString != "function" || toString === ObjectToString || toString === FunctionToString) {
899
- return super.toString();
900
- }
901
- try {
902
- return String(this.value);
903
- } catch {
904
- return super.toString();
905
- }
906
- }
907
- /** @inheritdoc */
908
- get type() {
909
- return "extern";
910
- }
911
- /** @inheritdoc */
912
- get describe() {
913
- const tag = ObjectToString.call(this.value).slice(8, -1);
914
- if (tag === "Object") {
915
- const proto = getPrototypeOf(this.value);
916
- if (proto === ObjectPrototype) {
917
- return "Object";
918
- }
919
- if (proto == null) {
920
- return "Object: null prototype";
921
- }
922
- if (typeof proto.constructor === "function" && proto.constructor.name) {
923
- return proto.constructor.name;
924
- }
925
- } else if (tag === "Function" && "prototype" in this.value && typeof this.value.prototype == "object") {
926
- const { name } = this.value;
927
- return `class ${name || "<anonymous>"}`;
928
- } else if (tag === "Function") {
929
- const { name } = this.value;
930
- return `function ${name || "<anonymous>"}()`;
931
- } else if (tag === "AsyncFunction") {
932
- const { name } = this.value;
933
- return `async function ${name || "<anonymous>"}()`;
934
- } else if (tag === "GeneratorFunction") {
935
- const { name } = this.value;
936
- return `function* ${name || "<anonymous>"}()`;
937
- } else if (tag === "AsyncGeneratorFunction") {
938
- const { name } = this.value;
939
- return `async function* ${name || "<anonymous>"}()`;
940
- }
941
- return tag;
942
- }
943
- };
944
- var kVmExtern = Symbol.for("mirascript.vm.extern");
945
- Object.defineProperty(VmExtern.prototype, kVmExtern, { value: true });
946
- function isVmExtern(value) {
947
- return value != null && typeof value == "object" && kVmExtern in value;
948
- }
949
-
950
- // src/vm/types/module.ts
951
- var VmModule = class extends VmWrapper {
952
- constructor(name, value) {
953
- super(value);
954
- this.name = name;
955
- }
956
- /** @inheritdoc */
957
- has(key) {
958
- return hasOwnEnumerable(this.value, key);
959
- }
960
- /** @inheritdoc */
961
- get(key) {
962
- if (!this.has(key)) return void 0;
963
- return this.value[key] ?? null;
964
- }
965
- /** @inheritdoc */
966
- keys() {
967
- return keys(this.value);
968
- }
969
- /** @inheritdoc */
970
- same(other) {
971
- return this === other;
972
- }
973
- /** @inheritdoc */
974
- get type() {
975
- return "module";
976
- }
977
- /** @inheritdoc */
978
- get describe() {
979
- return this.name;
980
- }
981
- };
982
- var kVmModule = Symbol.for("mirascript.vm.module");
983
- Object.defineProperty(VmModule.prototype, kVmModule, { value: true });
984
- function isVmModule(value) {
985
- return value != null && typeof value == "object" && kVmModule in value;
986
- }
987
-
988
- // src/vm/types/script.ts
989
- var kVmScript = Symbol.for("mirascript.vm.script");
990
- function isVmScript(value) {
991
- return typeof value === "function" && value[kVmScript] === true;
992
- }
993
-
994
- // src/vm/types/checker.ts
995
- var MAX_DEPTH2 = 32;
996
- function isVmArrayDeep(value, depth) {
997
- const proto1 = getPrototypeOf(value);
998
- if (!isArray(proto1)) return false;
999
- if (!depth) return true;
1000
- return value.every((item) => isVmConstInner(item, depth));
1001
- }
1002
- function isVmRecordDeep(value, depth) {
1003
- let isRecord;
1004
- const proto1 = getPrototypeOf(value);
1005
- if (proto1 == null) {
1006
- isRecord = true;
1007
- } else {
1008
- const proto2 = getPrototypeOf(proto1);
1009
- if (proto2 != null) {
1010
- isRecord = false;
1011
- } else {
1012
- isRecord = "hasOwnProperty" in value;
1013
- }
1014
- }
1015
- if (!isRecord) return false;
1016
- if (!depth) return true;
1017
- return values(value).every((value2) => isVmConstInner(value2, depth));
1018
- }
1019
- function isVmConstInner(value, depth) {
1020
- if (depth++ >= MAX_DEPTH2) return false;
1021
- switch (typeof value) {
1022
- case "string":
1023
- case "number":
1024
- case "boolean":
1025
- case "undefined":
1026
- return true;
1027
- case "object":
1028
- if (value == null) return true;
1029
- if (isVmWrapper(value)) return false;
1030
- if (isArray(value)) {
1031
- return isVmArrayDeep(value, depth);
1032
- } else {
1033
- return isVmRecordDeep(value, depth);
1034
- }
1035
- case "function":
1036
- case "bigint":
1037
- case "symbol":
1038
- default:
1039
- return false;
1040
- }
1041
- }
1042
- function isVmConst(value, checkDeep = false) {
1043
- switch (typeof value) {
1044
- case "string":
1045
- case "number":
1046
- case "boolean":
1047
- return true;
1048
- case "object":
1049
- if (value == null) return true;
1050
- if (isVmWrapper(value)) return false;
1051
- if (!checkDeep) {
1052
- if (isArray(value)) {
1053
- return isVmArrayDeep(value, 0);
1054
- } else {
1055
- return isVmRecordDeep(value, 0);
1056
- }
1057
- } else {
1058
- return isVmConstInner(value, 1);
1059
- }
1060
- case "undefined":
1061
- case "function":
1062
- case "bigint":
1063
- case "symbol":
1064
- default:
1065
- return false;
1066
- }
1067
- }
1068
- function isVmImmutable(value, checkDeep = false) {
1069
- return isVmModule(value) || isVmFunction(value) || isVmConst(value, checkDeep);
1070
- }
1071
- function isVmValue(value, checkDeep = false) {
1072
- if (value === void 0) return false;
1073
- return isVmAny(value, checkDeep);
1074
- }
1075
- function isVmAny(value, checkDeep) {
1076
- switch (typeof value) {
1077
- case "string":
1078
- case "number":
1079
- case "boolean":
1080
- case "undefined":
1081
- return true;
1082
- case "object":
1083
- if (value == null) return true;
1084
- if (isVmWrapper(value)) return true;
1085
- return isVmConst(value, checkDeep);
1086
- case "function":
1087
- return isVmFunction(value);
1088
- case "bigint":
1089
- case "symbol":
1090
- default:
1091
- return false;
1092
- }
1093
- }
1094
-
1095
- // src/vm/types/index.ts
1096
- function isVmArray(value) {
1097
- if (!isArray(value)) return false;
1098
- value;
1099
- return true;
1100
- }
1101
- function isVmRecord(value) {
1102
- if (value == null || typeof value !== "object") return false;
1103
- if (isVmWrapper(value)) return false;
1104
- if (isVmArray(value)) return false;
1105
- value;
1106
- return true;
1107
- }
1108
- function isVmPrimitive(value) {
1109
- if (value === null || typeof value == "number" || typeof value == "string" || typeof value == "boolean") {
1110
- value;
1111
- value;
1112
- return true;
1113
- }
1114
- return false;
1115
- }
1116
- function isVmCallable(value) {
1117
- return isVmFunction(value) || isVmExtern(value) && typeof value.value == "function";
1118
- }
1119
- var VM_ARRAY_MAX_LENGTH = 2 ** 31 - 1;
1120
-
1121
- // src/vm/types/context.ts
1122
- var kVmContext = Symbol.for("mirascript.vm.context");
1123
- var VmSharedContext = create(null);
1124
- function defineVmContextValue(name, value, override = false) {
1125
- if (!override && name in VmSharedContext) throw new Error(`Global variable '${name}' is already defined.`);
1126
- let v;
1127
- if (typeof value == "function") {
1128
- v = VmFunction(value, {
1129
- isLib: true,
1130
- fullName: `global.${name}`
1131
- });
1132
- } else {
1133
- v = value;
1134
- }
1135
- VmSharedContext[name] = v ?? null;
1136
- }
1137
- var DefaultVmContext = Object.freeze({
1138
- [kVmContext]: true,
1139
- /** @inheritdoc */
1140
- keys() {
1141
- return keys(VmSharedContext);
1142
- },
1143
- /** @inheritdoc */
1144
- get(key) {
1145
- return VmSharedContext[key] ?? null;
1146
- },
1147
- /** @inheritdoc */
1148
- has(key) {
1149
- return key in VmSharedContext;
1150
- }
1151
- });
1152
- var _a;
1153
- _a = kVmContext;
1154
- var ValueVmContext = class {
1155
- constructor(env, describe) {
1156
- this.env = env;
1157
- this.describe = describe;
1158
- this[_a] = true;
1159
- this.cachedKeys = null;
1160
- }
1161
- /** @inheritdoc */
1162
- keys() {
1163
- this.cachedKeys ??= keys(this.env);
1164
- return [...this.cachedKeys, ...DefaultVmContext.keys()];
1165
- }
1166
- /** @inheritdoc */
1167
- get(key) {
1168
- return this.env[key] ?? null;
1169
- }
1170
- /** @inheritdoc */
1171
- has(key) {
1172
- return key in this.env;
1173
- }
1174
- };
1175
- var _a2;
1176
- _a2 = kVmContext;
1177
- var FactoryVmContext = class {
1178
- constructor(getter, enumerator, describe) {
1179
- this.getter = getter;
1180
- this.enumerator = enumerator;
1181
- this.describe = describe;
1182
- this[_a2] = true;
1183
- }
1184
- /** @inheritdoc */
1185
- keys() {
1186
- if (!this.enumerator) return DefaultVmContext.keys();
1187
- return [...this.enumerator(), ...DefaultVmContext.keys()];
1188
- }
1189
- /** @inheritdoc */
1190
- get(key) {
1191
- const value = this.getter(key);
1192
- if (value !== void 0) return value;
1193
- return DefaultVmContext.get(key);
1194
- }
1195
- /** @inheritdoc */
1196
- has(key) {
1197
- return this.getter(key) !== void 0 || DefaultVmContext.has(key);
1198
- }
1199
- };
1200
- function createVmContext(...args) {
1201
- if (args[0] == null && args[1] == null) {
1202
- return { ...DefaultVmContext };
1203
- }
1204
- if (typeof args[0] == "function") {
1205
- const [getter, enumerator, describer2] = args;
1206
- return new FactoryVmContext(getter, enumerator ?? void 0, describer2 ?? void 0);
1207
- }
1208
- const [vmValues, externValues, describer] = args;
1209
- const env = create(VmSharedContext);
1210
- if (vmValues) {
1211
- for (const [key, value] of entries(vmValues)) {
1212
- if (!isVmAny(value, false)) continue;
1213
- env[key] = value ?? null;
1214
- }
1215
- }
1216
- if (externValues) {
1217
- for (const [key, value] of entries(externValues)) {
1218
- env[key] = value == null ? null : wrapToVmValue(value, null);
1219
- }
1220
- }
1221
- return new ValueVmContext(env, describer ?? void 0);
1222
- }
1223
- function isVmContext(context) {
1224
- if (context == null || typeof context != "object") return false;
1225
- return context[kVmContext] === true;
1226
- }
68
+ var REG_ORDINAL = /(?:214748364[0-7]|21474836[0-3]\d|2147483[0-5]\d{2}|214748[0-2]\d{3}|21474[0-7]\d{4}|2147[0-3]\d{5}|214[0-6]\d{6}|21[0-3]\d{7}|20\d{8}|1\d{9}|[1-9]\d{0,8}|0)/;
69
+ var REG_WHITESPACE = /[ \t\v\f\r\n]/u;
70
+ var REG_HEX = /0[xX][a-fA-F0-9_]*[a-fA-F0-9]/;
71
+ var REG_OCT = /0[oO][0-7_]*[0-7]/;
72
+ var REG_BIN = /0[bB][01_]*[01]/;
73
+ var REG_NUMBER = /\d[\d_]*(?:\.[\d_]+)?(?:[eE][+-]?[\d_]*\d)?/u;
1227
74
 
1228
75
  // src/vm/lib/global/index.ts
1229
76
  var global_exports = {};
1230
77
  __export(global_exports, {
1231
78
  "@e": () => E,
1232
79
  "@pi": () => PI,
1233
- abs: () => abs2,
80
+ abs: () => abs,
1234
81
  acos: () => acos,
1235
82
  acosh: () => acosh,
1236
83
  all: () => all,
@@ -1245,7 +92,7 @@ __export(global_exports, {
1245
92
  b_or: () => b_or,
1246
93
  b_xor: () => b_xor,
1247
94
  cbrt: () => cbrt,
1248
- ceil: () => ceil2,
95
+ ceil: () => ceil,
1249
96
  chars: () => chars,
1250
97
  contains: () => contains,
1251
98
  cos: () => cos,
@@ -1274,7 +121,7 @@ __export(global_exports, {
1274
121
  map: () => map2,
1275
122
  matrix: () => matrix,
1276
123
  max: () => max,
1277
- min: () => min2,
124
+ min: () => min,
1278
125
  panic: () => panic,
1279
126
  pow: () => pow2,
1280
127
  product: () => product,
@@ -1307,7 +154,7 @@ __export(global_exports, {
1307
154
  trim: () => trim,
1308
155
  trim_end: () => trim_end,
1309
156
  trim_start: () => trim_start,
1310
- trunc: () => trunc2,
157
+ trunc: () => trunc,
1311
158
  values: () => values2,
1312
159
  with: () => _with,
1313
160
  zip: () => zip
@@ -1434,7 +281,7 @@ var max = VmLib(build(Math.max), {
1434
281
  returnsType: "number",
1435
282
  examples: ["max(3, 7, 2) // 7"]
1436
283
  });
1437
- var min2 = VmLib(build(Math.min), {
284
+ var min = VmLib(build(Math.min), {
1438
285
  summary: "返回一组数中的最小值",
1439
286
  params: { "..values": "要比较的数值" },
1440
287
  paramsType: { "..values": "number[]" },
@@ -1485,7 +332,7 @@ function build2(f) {
1485
332
  return f($ToNumber(x));
1486
333
  };
1487
334
  }
1488
- var trunc2 = VmLib(build2(Math.trunc), {
335
+ var trunc = VmLib(build2(Math.trunc), {
1489
336
  summary: "返回数值的整数部分(去除小数)",
1490
337
  params: { x: "要取整数部分的数" },
1491
338
  paramsType: { x: "number" },
@@ -1497,7 +344,7 @@ var floor = VmLib(build2(Math.floor), {
1497
344
  paramsType: { x: "number" },
1498
345
  returnsType: "number"
1499
346
  });
1500
- var ceil2 = VmLib(build2(Math.ceil), {
347
+ var ceil = VmLib(build2(Math.ceil), {
1501
348
  summary: "返回大于等于给定数的最小整数",
1502
349
  params: { x: "要向上取整的数" },
1503
350
  paramsType: { x: "number" },
@@ -1526,7 +373,7 @@ var sign = VmLib(build2(Math.sign), {
1526
373
  paramsType: { x: "number" },
1527
374
  returnsType: "number"
1528
375
  });
1529
- var abs2 = VmLib(build2(Math.abs), {
376
+ var abs = VmLib(build2(Math.abs), {
1530
377
  summary: "返回数值的绝对值",
1531
378
  params: { x: "要取绝对值的数" },
1532
379
  paramsType: { x: "number" },
@@ -1930,7 +777,7 @@ var _with = VmLib(
1930
777
  },
1931
778
  paramsType: {
1932
779
  data: "array | record",
1933
- "..entries": `[..[string | number | (string | number)[], any][]]`
780
+ "..entries": `[..[number | string | (number | string)[], any][]]`
1934
781
  },
1935
782
  returnsType: "type(data)",
1936
783
  examples: [
@@ -1961,7 +808,7 @@ var keys2 = VmLib(
1961
808
  summary: "返回数组、记录、外部对象或模块的键列表",
1962
809
  params: { data: "要获取键的数组、记录、外部对象或模块" },
1963
810
  paramsType: { data: "array | record | extern | module" },
1964
- returnsType: "(string | number)[]",
811
+ returnsType: "number[] | string[]",
1965
812
  examples: ["keys([10, 20]) // [0, 1]", 'keys((10, 20)) // ["0", "1"]']
1966
813
  }
1967
814
  );
@@ -1998,7 +845,7 @@ var entries2 = VmLib(
1998
845
  summary: "返回数组或记录的键值对列表",
1999
846
  params: { data: "要获取键值对的数组或记录" },
2000
847
  paramsType: { data: "array | record" },
2001
- returnsType: "(string | number, any)[]",
848
+ returnsType: "(number, any)[] | (string, any)[]",
2002
849
  examples: ["entries([1]) // [(0, 1)]", 'entries((a: 1)) // [("a", 1)]']
2003
850
  }
2004
851
  );
@@ -2038,7 +885,7 @@ var map2 = VmLib(
2038
885
  },
2039
886
  paramsType: {
2040
887
  data: "array | record",
2041
- f: "fn(value: any, key: number | string | nil, input: type(data)) -> any"
888
+ f: "fn(value: any, key: number | string, input: type(data)) -> any"
2042
889
  },
2043
890
  returnsType: "type(data)",
2044
891
  examples: ["map([1, 2, 3], fn (v) { v * v }) // [1, 4, 9]"]
@@ -2057,7 +904,7 @@ var filter = VmLib(
2057
904
  },
2058
905
  paramsType: {
2059
906
  data: "array | record",
2060
- predicate: "fn(value: any, key: number | string | nil, input: type(data)) -> boolean"
907
+ predicate: "fn(value: any, key: number | string, input: type(data)) -> boolean"
2061
908
  },
2062
909
  returnsType: "type(data)",
2063
910
  examples: ["filter([1, 2, 3, 4], fn (v) { v % 2 == 0 }) // [2, 4]"]
@@ -2076,7 +923,7 @@ var filter_map = VmLib(
2076
923
  },
2077
924
  paramsType: {
2078
925
  data: "array | record",
2079
- f: "fn(value: any, key: number | string | nil, input: type(data)) -> any | nil"
926
+ f: "fn(value: any, key: number | string, input: type(data)) -> any | nil"
2080
927
  },
2081
928
  returnsType: "type(data)",
2082
929
  examples: ["filter_map([1, 2, 3], fn (v) { if v % 2 == 0 { v * v } else { nil } }) // [4]"]
@@ -2116,14 +963,14 @@ var find = VmLib(
2116
963
  {
2117
964
  summary: "查找数组或记录中的键值对,返回第一个满足条件的键值对",
2118
965
  params: {
2119
- data: "查的数组或记录",
966
+ data: "要查找的数组或记录",
2120
967
  predicate: "用于测试每个键值对的函数,或要查找的值"
2121
968
  },
2122
969
  paramsType: {
2123
970
  data: "array | record",
2124
- predicate: "(fn(value: any, key: number | string | nil, input: type(data)) -> boolean) | any"
971
+ predicate: "(fn(value: any, key: number | string, input: type(data)) -> boolean) | any"
2125
972
  },
2126
- returnsType: "(string | number, any) | nil",
973
+ returnsType: "(number | string, any) | nil",
2127
974
  examples: ["find([3, 5, 8], fn (v) { v % 2 == 0 }) // (2, 8)", `find((x: 1, y: 2, z: 3), 2) // ('y', 2)`]
2128
975
  }
2129
976
  );
@@ -2677,7 +1524,7 @@ var to_timestamp = VmLib(
2677
1524
  {
2678
1525
  summary: "将数据转换为 Unix 毫秒时间戳",
2679
1526
  params: { datetime: "要转换的数据,默认为当前时间" },
2680
- paramsType: { datetime: "string | number" },
1527
+ paramsType: { datetime: "number | string" },
2681
1528
  returnsType: "number",
2682
1529
  examples: ['to_timestamp("1970-01-01T00:00:00Z") // 0']
2683
1530
  }
@@ -2706,7 +1553,7 @@ var to_datetime = VmLib(
2706
1553
  datetime: "要转换的数据,默认为当前时间",
2707
1554
  offset: "时区偏移量(单位:小时),默认为 0"
2708
1555
  },
2709
- paramsType: { datetime: "string | number", offset: "number" },
1556
+ paramsType: { datetime: "number | string", offset: "number" },
2710
1557
  returnsType: "Date",
2711
1558
  examples: [
2712
1559
  `
@@ -2729,7 +1576,7 @@ var to_iso8601 = VmLib(
2729
1576
  {
2730
1577
  summary: "将数据转换为 ISO 8601 格式的字符串",
2731
1578
  params: { datetime: "要转换的数据,默认为当前时间" },
2732
- paramsType: { datetime: "string | number" },
1579
+ paramsType: { datetime: "number | string" },
2733
1580
  returnsType: "string",
2734
1581
  examples: ['to_iso8601(0) // "1970-01-01T00:00:00.000Z"']
2735
1582
  }
@@ -3286,16 +2133,20 @@ var DEFAULT_OPTIONS = Object.freeze({
3286
2133
  serializeModule: serializeNil,
3287
2134
  serializeExtern: serializeNil
3288
2135
  });
2136
+ function isDefaultOptions(options) {
2137
+ return options == null || options === DEFAULT_OPTIONS;
2138
+ }
3289
2139
  function getSerializeOptions(options) {
3290
- if (options == null) return DEFAULT_OPTIONS;
3291
- const opt = { ...DEFAULT_OPTIONS };
2140
+ if (isDefaultOptions(options)) return DEFAULT_OPTIONS;
2141
+ let opt = null;
3292
2142
  for (const key in options) {
2143
+ if (!hasOwn(options, key) || !hasOwn(DEFAULT_OPTIONS, key)) continue;
3293
2144
  const el = options[key];
3294
- if (el != null) {
3295
- opt[key] = el;
3296
- }
2145
+ if (el == null) continue;
2146
+ opt ??= { ...DEFAULT_OPTIONS };
2147
+ opt[key] = el;
3297
2148
  }
3298
- return Object.freeze(opt);
2149
+ return opt ? Object.freeze(opt) : DEFAULT_OPTIONS;
3299
2150
  }
3300
2151
  function serializeStringImpl(value, options) {
3301
2152
  if (!/[\p{C}'"`$\\]/u.test(value)) {
@@ -3345,7 +2196,16 @@ function serializeStringImpl(value, options) {
3345
2196
  function serializeString(value, options) {
3346
2197
  return serializeStringImpl(value, getSerializeOptions(options));
3347
2198
  }
3348
- function serializePropNameImpl(value, options) {
2199
+ function serializeRecordKeyDefault(key) {
2200
+ if (REG_ORDINAL_FULL.test(key) || REG_IDENTIFIER_FULL.test(key)) {
2201
+ return key;
2202
+ }
2203
+ return serializeStringImpl(key, DEFAULT_OPTIONS);
2204
+ }
2205
+ function serializeRecordKeyOpt(value, options) {
2206
+ if (isDefaultOptions(options)) {
2207
+ return serializeRecordKeyDefault(value);
2208
+ }
3349
2209
  if (REG_ORDINAL_FULL.test(value)) {
3350
2210
  return options.serializePropName(Number(value), options);
3351
2211
  }
@@ -3354,8 +2214,11 @@ function serializePropNameImpl(value, options) {
3354
2214
  }
3355
2215
  return options.serializeString(value, options);
3356
2216
  }
3357
- function serializePropName(value, options) {
3358
- return serializePropNameImpl(value, getSerializeOptions(options));
2217
+ function serializeRecordKey(key, options) {
2218
+ if (isDefaultOptions(options)) {
2219
+ return serializeRecordKeyDefault(key);
2220
+ }
2221
+ return serializeRecordKeyOpt(key, getSerializeOptions(options));
3359
2222
  }
3360
2223
  function serializeNil() {
3361
2224
  return "nil";
@@ -3406,16 +2269,16 @@ function serializeRecord(value, depth, options) {
3406
2269
  if (k === "0") {
3407
2270
  return `(${serializeImpl(v, depth, options)},)`;
3408
2271
  }
3409
- return `(${serializePropNameImpl(k, options)}: ${serializeImpl(v, depth, options)})`;
2272
+ return `(${serializeRecordKeyOpt(k, options)}: ${serializeImpl(v, depth, options)})`;
3410
2273
  }
3411
- const omitKey = e.length < 10 && e.every(([key], index) => key === String(index));
2274
+ const omitKey = isVmArrayLikeRecordByEntires(e);
3412
2275
  let str = "(";
3413
2276
  for (const [key, val] of e) {
3414
2277
  if (str.length > 1) str += ", ";
3415
2278
  if (omitKey) {
3416
2279
  str += serializeImpl(val, depth, options);
3417
2280
  } else {
3418
- str += `${serializePropNameImpl(key, options)}: ${serializeImpl(val, depth, options)}`;
2281
+ str += `${serializeRecordKeyOpt(key, options)}: ${serializeImpl(val, depth, options)}`;
3419
2282
  }
3420
2283
  }
3421
2284
  str += ")";
@@ -3472,12 +2335,12 @@ for (const [key, value] of entries(helpers_exports)) {
3472
2335
  }
3473
2336
 
3474
2337
  // src/compiler/create-script.ts
3475
- var kVmScript2 = Symbol.for("mirascript.vm.script");
2338
+ var kVmScript = Symbol.for("mirascript.vm.script");
3476
2339
  function wrapScript(source, script) {
3477
- if (kVmScript2 in script) {
2340
+ if (kVmScript in script) {
3478
2341
  return script;
3479
2342
  }
3480
- defineProperty(script, kVmScript2, { value: true });
2343
+ defineProperty(script, kVmScript, { value: true });
3481
2344
  if (typeof source === "string") {
3482
2345
  defineProperty(script, "source", { value: source, configurable: true });
3483
2346
  } else if (source instanceof Uint8Array) {
@@ -3522,7 +2385,7 @@ function compileScriptFast(code, options) {
3522
2385
  }
3523
2386
  if (REG_IDENTIFIER_FAST.test(trimmedCode)) {
3524
2387
  const id = trimmedCode;
3525
- return wrapScript(code, (global = GlobalFallback()) => global.get(id) ?? null);
2388
+ return wrapScript(code, (global = GlobalFallback()) => global.get(id));
3526
2389
  }
3527
2390
  if (REG_NUMBER_FULL.test(trimmedCode)) {
3528
2391
  const num2 = Number(trimmedCode);
@@ -3652,36 +2515,6 @@ var keywords = () => {
3652
2515
  };
3653
2516
 
3654
2517
  export {
3655
- VmError,
3656
- isVmWrapper,
3657
- operations_exports,
3658
- VmSharedContext,
3659
- defineVmContextValue,
3660
- DefaultVmContext,
3661
- createVmContext,
3662
- isVmContext,
3663
- configCheckpoint,
3664
- isVmFunction,
3665
- getVmFunctionInfo,
3666
- VmFunction,
3667
- toVmFunctionProxy,
3668
- fromVmFunctionProxy,
3669
- wrapToVmValue,
3670
- unwrapFromVmValue,
3671
- VmExtern,
3672
- isVmExtern,
3673
- VmModule,
3674
- isVmModule,
3675
- isVmScript,
3676
- isVmConst,
3677
- isVmImmutable,
3678
- isVmValue,
3679
- isVmAny,
3680
- isVmArray,
3681
- isVmRecord,
3682
- isVmPrimitive,
3683
- isVmCallable,
3684
- VM_ARRAY_MAX_LENGTH,
3685
2518
  constants_exports,
3686
2519
  emitScript,
3687
2520
  compile,
@@ -3690,7 +2523,7 @@ export {
3690
2523
  debug_print,
3691
2524
  lib,
3692
2525
  serializeString,
3693
- serializePropName,
2526
+ serializeRecordKey,
3694
2527
  serializeNil,
3695
2528
  serializeBoolean,
3696
2529
  serializeNumber,
@@ -3698,4 +2531,4 @@ export {
3698
2531
  serializeRecord,
3699
2532
  serialize
3700
2533
  };
3701
- //# sourceMappingURL=chunk-IKSSUVRE.js.map
2534
+ //# sourceMappingURL=chunk-NT235HY3.js.map