@mirascript/mirascript 0.1.78 → 0.1.80
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/dist/{chunk-VNQQF2W7.js → chunk-BPFOJ4Q6.js} +381 -432
- package/dist/chunk-BPFOJ4Q6.js.map +6 -0
- package/dist/{chunk-BITOQYYQ.js → chunk-LSPCAN32.js} +204 -149
- package/dist/chunk-LSPCAN32.js.map +6 -0
- package/dist/compiler/emit/constants.d.ts +1 -1
- package/dist/compiler/emit/constants.d.ts.map +1 -1
- package/dist/compiler/emit/consts.d.ts.map +1 -1
- package/dist/compiler/worker.js +1 -1
- package/dist/helpers/convert/{to-boolean.d.ts → boolean.d.ts} +1 -1
- package/dist/helpers/convert/boolean.d.ts.map +1 -0
- package/dist/helpers/convert/{to-format.d.ts → format.d.ts} +1 -1
- package/dist/helpers/convert/format.d.ts.map +1 -0
- package/dist/helpers/convert/index.d.ts +4 -4
- package/dist/helpers/convert/index.d.ts.map +1 -1
- package/dist/helpers/convert/{to-number.d.ts → number.d.ts} +1 -1
- package/dist/helpers/convert/number.d.ts.map +1 -0
- package/dist/helpers/convert/{to-string.d.ts → string.d.ts} +1 -1
- package/dist/helpers/convert/string.d.ts.map +1 -0
- package/dist/helpers/serialize.d.ts.map +1 -1
- package/dist/helpers/types/array-like.d.ts +8 -0
- package/dist/helpers/types/array-like.d.ts.map +1 -0
- package/dist/helpers/types/basic.d.ts +26 -0
- package/dist/helpers/types/basic.d.ts.map +1 -0
- package/dist/helpers/types/composed.d.ts +12 -0
- package/dist/helpers/types/composed.d.ts.map +1 -0
- package/dist/helpers/types/const.d.ts +6 -0
- package/dist/helpers/types/const.d.ts.map +1 -0
- package/dist/helpers/types/get-type.d.ts +6 -0
- package/dist/helpers/types/get-type.d.ts.map +1 -0
- package/dist/helpers/types/index.d.ts +6 -0
- package/dist/helpers/types/index.d.ts.map +1 -0
- package/dist/helpers/types/proto.d.ts +5 -0
- package/dist/helpers/types/proto.d.ts.map +1 -0
- package/dist/helpers/utils.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/subtle.js +3 -3
- package/dist/vm/lib/global/json.d.ts +1 -1
- package/dist/vm/lib/global/json.d.ts.map +1 -1
- package/dist/vm/lib/helpers.d.ts.map +1 -1
- package/dist/vm/lib/mod/index.d.ts +1 -1
- package/dist/vm/lib/mod/index.d.ts.map +1 -1
- package/dist/vm/lib/mod/matrix/bin-ops.d.ts +8 -0
- package/dist/vm/lib/mod/matrix/bin-ops.d.ts.map +1 -0
- package/dist/vm/lib/mod/matrix/fill.d.ts +6 -0
- package/dist/vm/lib/mod/matrix/fill.d.ts.map +1 -0
- package/dist/vm/lib/mod/matrix/helpers.d.ts +6 -0
- package/dist/vm/lib/mod/matrix/helpers.d.ts.map +1 -0
- package/dist/vm/lib/mod/matrix/index.d.ts +6 -0
- package/dist/vm/lib/mod/matrix/index.d.ts.map +1 -0
- package/dist/vm/lib/mod/matrix/invert.d.ts +3 -0
- package/dist/vm/lib/mod/matrix/invert.d.ts.map +1 -0
- package/dist/vm/lib/mod/matrix/size.d.ts +2 -0
- package/dist/vm/lib/mod/matrix/size.d.ts.map +1 -0
- package/dist/vm/lib/mod/matrix/transpose.d.ts +2 -0
- package/dist/vm/lib/mod/matrix/transpose.d.ts.map +1 -0
- package/dist/vm/operations/array-range.d.ts +3 -3
- package/dist/vm/operations/array-range.d.ts.map +1 -1
- package/dist/vm/operations/call.d.ts +1 -1
- package/dist/vm/operations/call.d.ts.map +1 -1
- package/dist/vm/operations/compound.d.ts +1 -13
- package/dist/vm/operations/compound.d.ts.map +1 -1
- package/dist/vm/operations/index.d.ts +3 -0
- package/dist/vm/operations/index.d.ts.map +1 -1
- package/dist/vm/operations/iterable.d.ts +6 -0
- package/dist/vm/operations/iterable.d.ts.map +1 -0
- package/dist/vm/operations/record.d.ts +6 -0
- package/dist/vm/operations/record.d.ts.map +1 -0
- package/dist/vm/operations/slice.d.ts.map +1 -1
- package/dist/vm/operations/spread.d.ts +6 -0
- package/dist/vm/operations/spread.d.ts.map +1 -0
- package/dist/vm/operations/utils.d.ts.map +1 -1
- package/dist/vm/types/extern/access.d.ts +5 -0
- package/dist/vm/types/extern/access.d.ts.map +1 -0
- package/dist/vm/types/{extern.d.ts → extern/index.d.ts} +3 -3
- package/dist/vm/types/extern/index.d.ts.map +1 -0
- package/dist/vm/types/extern/tag.d.ts +3 -0
- package/dist/vm/types/extern/tag.d.ts.map +1 -0
- package/dist/vm/types/extern/utils.d.ts +13 -0
- package/dist/vm/types/extern/utils.d.ts.map +1 -0
- package/dist/vm/types/index.d.ts +3 -3
- package/dist/vm/types/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/compiler/diagnostic.ts +2 -2
- package/src/compiler/emit/constants.ts +1 -1
- package/src/compiler/emit/consts.ts +0 -1
- package/src/compiler/emit/index.ts +1 -1
- package/src/compiler/emit/sourcemap.ts +1 -1
- package/src/compiler/load-module.ts +5 -1
- package/src/helpers/convert/{to-boolean.ts → boolean.ts} +1 -1
- package/src/helpers/convert/{to-format.ts → format.ts} +1 -1
- package/src/helpers/convert/index.ts +4 -4
- package/src/helpers/convert/{to-number.ts → number.ts} +15 -26
- package/src/helpers/convert/{to-string.ts → string.ts} +2 -2
- package/src/helpers/serialize.ts +42 -36
- package/src/helpers/types/array-like.ts +32 -0
- package/src/helpers/types/basic.ts +82 -0
- package/src/helpers/types/composed.ts +27 -0
- package/src/helpers/types/const.ts +44 -0
- package/src/helpers/types/get-type.ts +16 -0
- package/src/helpers/types/index.ts +5 -0
- package/src/helpers/types/proto.ts +21 -0
- package/src/helpers/utils.ts +7 -1
- package/src/vm/lib/global/sequence/all-any.ts +1 -1
- package/src/vm/lib/global/sequence/find.ts +1 -1
- package/src/vm/lib/global/sequence/group.ts +1 -1
- package/src/vm/lib/global/sequence/map-filter.ts +1 -1
- package/src/vm/lib/global/sequence/new.ts +1 -1
- package/src/vm/lib/global/sequence/sort.ts +1 -1
- package/src/vm/lib/global/sequence/unique.ts +1 -1
- package/src/vm/lib/global/sequence/with.ts +1 -1
- package/src/vm/lib/global/time.ts +1 -1
- package/src/vm/lib/helpers.ts +8 -1
- package/src/vm/lib/mod/index.ts +1 -1
- package/src/vm/lib/mod/matrix/bin-ops.ts +291 -0
- package/src/vm/lib/mod/matrix/fill.ts +109 -0
- package/src/vm/lib/mod/matrix/helpers.ts +26 -0
- package/src/vm/lib/mod/matrix/index.ts +5 -0
- package/src/vm/lib/mod/matrix/invert.ts +122 -0
- package/src/vm/lib/mod/matrix/size.ts +15 -0
- package/src/vm/lib/mod/matrix/transpose.ts +32 -0
- package/src/vm/operations/array-range.ts +15 -27
- package/src/vm/operations/call.ts +2 -2
- package/src/vm/operations/compound.ts +4 -131
- package/src/vm/operations/helpers.ts +1 -1
- package/src/vm/operations/index.ts +3 -0
- package/src/vm/operations/iterable.ts +40 -0
- package/src/vm/operations/record.ts +33 -0
- package/src/vm/operations/slice.ts +23 -22
- package/src/vm/operations/spread.ts +57 -0
- package/src/vm/operations/type-check.ts +1 -1
- package/src/vm/operations/utils.ts +45 -37
- package/src/vm/types/boundary.ts +2 -2
- package/src/vm/types/extern/access.ts +24 -0
- package/src/vm/types/extern/index.ts +124 -0
- package/src/vm/types/extern/tag.ts +58 -0
- package/src/vm/types/extern/utils.ts +55 -0
- package/src/vm/types/function.ts +1 -1
- package/src/vm/types/index.ts +3 -3
- package/dist/chunk-BITOQYYQ.js.map +0 -6
- package/dist/chunk-VNQQF2W7.js.map +0 -6
- package/dist/helpers/convert/to-boolean.d.ts.map +0 -1
- package/dist/helpers/convert/to-format.d.ts.map +0 -1
- package/dist/helpers/convert/to-number.d.ts.map +0 -1
- package/dist/helpers/convert/to-string.d.ts.map +0 -1
- package/dist/helpers/types.d.ts +0 -58
- package/dist/helpers/types.d.ts.map +0 -1
- package/dist/vm/lib/mod/matrix.d.ts +0 -15
- package/dist/vm/lib/mod/matrix.d.ts.map +0 -1
- package/dist/vm/types/extern.d.ts.map +0 -1
- package/src/helpers/types.ts +0 -283
- package/src/vm/lib/mod/matrix.ts +0 -590
- package/src/vm/types/extern.ts +0 -197
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DiagnosticCode,
|
|
3
|
-
NegativeInfinity,
|
|
4
3
|
NotNumber,
|
|
5
4
|
PositiveInfinity,
|
|
6
5
|
VM_ARRAY_MAX_LENGTH,
|
|
@@ -50,117 +49,18 @@ import {
|
|
|
50
49
|
keysLength,
|
|
51
50
|
parseDiagnostics,
|
|
52
51
|
setRecord,
|
|
52
|
+
toBoolean,
|
|
53
|
+
toFormat,
|
|
54
|
+
toNumber,
|
|
53
55
|
toString,
|
|
54
56
|
values
|
|
55
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-LSPCAN32.js";
|
|
56
58
|
|
|
57
59
|
// src/compiler/load-module.ts
|
|
58
60
|
import { loadModule } from "@mirascript/bindings";
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
var convert_exports = {};
|
|
63
|
-
__export(convert_exports, {
|
|
64
|
-
toBoolean: () => toBoolean,
|
|
65
|
-
toFormat: () => toFormat,
|
|
66
|
-
toNumber: () => toNumber,
|
|
67
|
-
toString: () => toString
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// src/helpers/convert/to-number.ts
|
|
71
|
-
function parseNumericLiteral(value) {
|
|
72
|
-
const ch0 = value.charAt(0);
|
|
73
|
-
if (ch0 < "0" || ch0 > "9") {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
if (/^0[bB][01]+$/.test(value)) {
|
|
77
|
-
return Number.parseInt(value.slice(2), 2);
|
|
78
|
-
}
|
|
79
|
-
if (/^0[oO][0-7]+$/.test(value)) {
|
|
80
|
-
return Number.parseInt(value.slice(2), 8);
|
|
81
|
-
}
|
|
82
|
-
if (/^0[xX][0-9a-fA-F]+$/.test(value)) {
|
|
83
|
-
return Number.parseInt(value.slice(2), 16);
|
|
84
|
-
}
|
|
85
|
-
if (/^[0-9]+(\.[0-9]+)?([eE][+-]?[0-9]+)?$/.test(value)) {
|
|
86
|
-
return Number.parseFloat(value);
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
function stringToNumber(value) {
|
|
91
|
-
value = value.trim();
|
|
92
|
-
if (value === "") return null;
|
|
93
|
-
if (value === "inf" || value === "+inf" || value === "Infinity" || value === "+Infinity") {
|
|
94
|
-
return PositiveInfinity;
|
|
95
|
-
}
|
|
96
|
-
if (value === "-inf" || value === "-Infinity") {
|
|
97
|
-
return NegativeInfinity;
|
|
98
|
-
}
|
|
99
|
-
if (value === "nan" || value === "NaN") {
|
|
100
|
-
return NotNumber;
|
|
101
|
-
}
|
|
102
|
-
if (value.startsWith("-")) {
|
|
103
|
-
const num2 = parseNumericLiteral(value.slice(1));
|
|
104
|
-
if (num2 !== null) return -num2;
|
|
105
|
-
return null;
|
|
106
|
-
} else if (value.startsWith("+")) {
|
|
107
|
-
return parseNumericLiteral(value.slice(1));
|
|
108
|
-
} else {
|
|
109
|
-
return parseNumericLiteral(value);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
function toNumber(value, fallback) {
|
|
113
|
-
if (typeof value === "number") return value;
|
|
114
|
-
if (typeof value == "boolean") return value ? 1 : 0;
|
|
115
|
-
if (typeof value == "string") {
|
|
116
|
-
const num2 = stringToNumber(value);
|
|
117
|
-
if (num2 !== null) return num2;
|
|
118
|
-
}
|
|
119
|
-
if (fallback === void 0) {
|
|
120
|
-
throw new VmError(`Failed to convert value to number: ${display(value)}`, NotNumber);
|
|
121
|
-
}
|
|
122
|
-
return fallback;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// src/helpers/convert/to-format.ts
|
|
126
|
-
function formatNumber(finite) {
|
|
127
|
-
if (finite === 0) return "0";
|
|
128
|
-
const s2 = finite.toString();
|
|
129
|
-
let ps;
|
|
130
|
-
const abs3 = Math.abs(finite);
|
|
131
|
-
if (abs3 >= 1e3 || abs3 < 1e-3) {
|
|
132
|
-
const ps1 = finite.toExponential();
|
|
133
|
-
const ps2 = finite.toExponential(5);
|
|
134
|
-
ps = ps1.length < ps2.length ? ps1 : ps2;
|
|
135
|
-
} else {
|
|
136
|
-
ps = finite.toPrecision(6);
|
|
137
|
-
}
|
|
138
|
-
return ps.length < s2.length ? ps : s2;
|
|
139
|
-
}
|
|
140
|
-
function toFormat(value, format2) {
|
|
141
|
-
const f = format2 == null ? "" : format2.trim();
|
|
142
|
-
if (typeof value == "number") {
|
|
143
|
-
if (!isFinite(value)) {
|
|
144
|
-
return toString(value, void 0);
|
|
145
|
-
}
|
|
146
|
-
if (/^\.\d+$/.test(f)) {
|
|
147
|
-
let digits = Math.trunc(Number(f.slice(1)));
|
|
148
|
-
if (!(digits <= 100)) digits = 100;
|
|
149
|
-
return value.toFixed(digits);
|
|
150
|
-
} else {
|
|
151
|
-
return formatNumber(value);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return toString(value, void 0);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// src/helpers/convert/to-boolean.ts
|
|
158
|
-
function toBoolean(value, fallback) {
|
|
159
|
-
if (typeof value === "boolean") return value;
|
|
160
|
-
if (fallback === void 0) {
|
|
161
|
-
throw new VmError(`Failed to convert value to boolean: ${display(value)}`, false);
|
|
162
|
-
}
|
|
163
|
-
return fallback;
|
|
61
|
+
try {
|
|
62
|
+
await loadModule();
|
|
63
|
+
} catch (error) {
|
|
164
64
|
}
|
|
165
65
|
|
|
166
66
|
// src/vm/types/wrapper.ts
|
|
@@ -295,13 +195,11 @@ function unwrapFromVmValue(value, bindThisArg = true) {
|
|
|
295
195
|
return bindThisArg ? bindThis(f.value, f.thisArg) : f.value;
|
|
296
196
|
}
|
|
297
197
|
|
|
298
|
-
// src/vm/types/extern.ts
|
|
198
|
+
// src/vm/types/extern/tag.ts
|
|
299
199
|
var ObjectPrototype = Object.prototype;
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
var ArrayMap = Array.prototype.map;
|
|
304
|
-
var TypedArrayToString = Uint8Array.prototype.toString;
|
|
200
|
+
function getJsObjectTag(value) {
|
|
201
|
+
return ObjectPrototype.toString.call(value).slice(8, -1);
|
|
202
|
+
}
|
|
305
203
|
function classNameOf(kls) {
|
|
306
204
|
const { displayName } = kls;
|
|
307
205
|
if (typeof displayName === "string" && displayName.trim()) {
|
|
@@ -313,6 +211,94 @@ function classNameOf(kls) {
|
|
|
313
211
|
}
|
|
314
212
|
return null;
|
|
315
213
|
}
|
|
214
|
+
function getTag(value) {
|
|
215
|
+
const tag = getJsObjectTag(value);
|
|
216
|
+
if (tag === "Function") {
|
|
217
|
+
if ("prototype" in value && typeof value.prototype == "object") {
|
|
218
|
+
const className = classNameOf(value);
|
|
219
|
+
if (!className) return `class`;
|
|
220
|
+
return `class ${className}`;
|
|
221
|
+
}
|
|
222
|
+
return `function`;
|
|
223
|
+
}
|
|
224
|
+
if (tag === "AsyncFunction") {
|
|
225
|
+
return `async function`;
|
|
226
|
+
}
|
|
227
|
+
if (tag === "GeneratorFunction") {
|
|
228
|
+
return `function*`;
|
|
229
|
+
}
|
|
230
|
+
if (tag === "AsyncGeneratorFunction") {
|
|
231
|
+
return `async function*`;
|
|
232
|
+
}
|
|
233
|
+
if (tag === "Object") {
|
|
234
|
+
const proto = getPrototypeOf(value);
|
|
235
|
+
if (proto === ObjectPrototype) {
|
|
236
|
+
return "Object";
|
|
237
|
+
}
|
|
238
|
+
if (proto == null) {
|
|
239
|
+
return "Object: null prototype";
|
|
240
|
+
}
|
|
241
|
+
if (typeof proto.constructor === "function") {
|
|
242
|
+
return classNameOf(proto.constructor) ?? "Object";
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return tag;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// src/vm/types/extern/utils.ts
|
|
249
|
+
function isArrayLike(value) {
|
|
250
|
+
return isArray(value) || ArrayBuffer.isView(value) && "length" in value;
|
|
251
|
+
}
|
|
252
|
+
function getKeys(value, includeNonEnumerable) {
|
|
253
|
+
if (!includeNonEnumerable) {
|
|
254
|
+
const keys5 = [];
|
|
255
|
+
for (const key in value) {
|
|
256
|
+
keys5.push(key);
|
|
257
|
+
}
|
|
258
|
+
return keys5;
|
|
259
|
+
}
|
|
260
|
+
const keys4 = /* @__PURE__ */ new Set();
|
|
261
|
+
let e2 = value;
|
|
262
|
+
while (e2 != null && (typeof e2 == "object" || typeof e2 == "function")) {
|
|
263
|
+
for (const key of getOwnPropertyNames(e2)) {
|
|
264
|
+
keys4.add(key);
|
|
265
|
+
}
|
|
266
|
+
e2 = getPrototypeOf(e2);
|
|
267
|
+
}
|
|
268
|
+
return Array.from(keys4);
|
|
269
|
+
}
|
|
270
|
+
var ObjectToString = Object.prototype.toString;
|
|
271
|
+
var FunctionToString = Function.prototype.toString;
|
|
272
|
+
var ArrayToString = Array.prototype.toString;
|
|
273
|
+
var TypedArrayToString = Uint8Array.prototype.toString;
|
|
274
|
+
function hasCustomToString(value) {
|
|
275
|
+
const { toString: toString2 } = value;
|
|
276
|
+
if (typeof toString2 != "function") return false;
|
|
277
|
+
if (toString2 === ObjectToString || toString2 === FunctionToString || toString2 === ArrayToString || toString2 === TypedArrayToString)
|
|
278
|
+
return false;
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// src/vm/types/extern/access.ts
|
|
283
|
+
var pFunction = Function.prototype;
|
|
284
|
+
var pArray = Array.prototype;
|
|
285
|
+
var pObject = Object.prototype;
|
|
286
|
+
function canAccessProperty(value, key, read) {
|
|
287
|
+
if (key.startsWith("_")) return false;
|
|
288
|
+
if (typeof value == "function" && (key === "prototype" || key === "arguments" || key === "caller")) return false;
|
|
289
|
+
if (hasOwn(value, key)) return true;
|
|
290
|
+
if (!read) return true;
|
|
291
|
+
if (!(key in value)) return false;
|
|
292
|
+
if (key === "constructor") return false;
|
|
293
|
+
const prop = value[key];
|
|
294
|
+
if (key in pFunction && prop === pFunction[key]) return false;
|
|
295
|
+
if (key in pArray && prop === pArray[key]) return false;
|
|
296
|
+
if (key in pObject && prop === pObject[key]) return false;
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// src/vm/types/extern/index.ts
|
|
301
|
+
var ArrayMap = Array.prototype.map;
|
|
316
302
|
var VmExtern = class extends VmWrapper {
|
|
317
303
|
constructor(value, thisArg = null) {
|
|
318
304
|
super(value);
|
|
@@ -323,18 +309,7 @@ var VmExtern = class extends VmWrapper {
|
|
|
323
309
|
* This method will be used in {@link get}, {@link set}, {@link has}, and {@link keys} methods
|
|
324
310
|
*/
|
|
325
311
|
access(key, read) {
|
|
326
|
-
|
|
327
|
-
if (typeof this.value == "function" && (key === "prototype" || key === "arguments" || key === "caller"))
|
|
328
|
-
return false;
|
|
329
|
-
if (hasOwn(this.value, key)) return true;
|
|
330
|
-
if (!read) return true;
|
|
331
|
-
if (!(key in this.value)) return false;
|
|
332
|
-
if (key === "constructor") return false;
|
|
333
|
-
const prop = this.value[key];
|
|
334
|
-
if (key in Function.prototype && prop === Function.prototype[key]) return false;
|
|
335
|
-
if (key in Array.prototype && prop === Array.prototype[key]) return false;
|
|
336
|
-
if (key in Object.prototype && prop === Object.prototype[key]) return false;
|
|
337
|
-
return true;
|
|
312
|
+
return canAccessProperty(this.value, key, read);
|
|
338
313
|
}
|
|
339
314
|
/** 决定是否对属性进行包装 */
|
|
340
315
|
assumeVmValue(value, key) {
|
|
@@ -376,23 +351,8 @@ var VmExtern = class extends VmWrapper {
|
|
|
376
351
|
}
|
|
377
352
|
/** @inheritdoc */
|
|
378
353
|
keys(includeNonEnumerable = false) {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
for (const key in this.value) {
|
|
382
|
-
if (this.access(key, true)) keys4.push(key);
|
|
383
|
-
}
|
|
384
|
-
return keys4;
|
|
385
|
-
} else {
|
|
386
|
-
const keys4 = /* @__PURE__ */ new Set();
|
|
387
|
-
let e2 = this.value;
|
|
388
|
-
while (e2 != null && (typeof e2 == "object" || typeof e2 == "function")) {
|
|
389
|
-
for (const key of getOwnPropertyNames(e2)) {
|
|
390
|
-
keys4.add(key);
|
|
391
|
-
}
|
|
392
|
-
e2 = getPrototypeOf(e2);
|
|
393
|
-
}
|
|
394
|
-
return Array.from(keys4).filter((key) => this.access(key, true));
|
|
395
|
-
}
|
|
354
|
+
const keys4 = getKeys(this.value, includeNonEnumerable);
|
|
355
|
+
return keys4.filter((key) => this.access(key, true));
|
|
396
356
|
}
|
|
397
357
|
/** @inheritdoc */
|
|
398
358
|
same(other) {
|
|
@@ -405,15 +365,14 @@ var VmExtern = class extends VmWrapper {
|
|
|
405
365
|
* By default, this method returns true if the wrapped value is an Array or a TypedArray.
|
|
406
366
|
*/
|
|
407
367
|
isArrayLike() {
|
|
408
|
-
return
|
|
368
|
+
return isArrayLike(this.value);
|
|
409
369
|
}
|
|
410
370
|
/** @inheritdoc */
|
|
411
371
|
toString(useBraces) {
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
return super.toString(useBraces);
|
|
372
|
+
if (hasCustomToString(this.value)) {
|
|
373
|
+
return String(this.value);
|
|
415
374
|
}
|
|
416
|
-
if (
|
|
375
|
+
if (this.isArrayLike()) {
|
|
417
376
|
const mapped = ArrayMap.call(this.value, (item) => {
|
|
418
377
|
if (item === void 0) return "";
|
|
419
378
|
return innerToString(wrapToVmValue(item ?? null, null, null), true);
|
|
@@ -422,7 +381,7 @@ var VmExtern = class extends VmWrapper {
|
|
|
422
381
|
if (useBraces) return `[${str}]`;
|
|
423
382
|
return str;
|
|
424
383
|
}
|
|
425
|
-
return
|
|
384
|
+
return super.toString(useBraces);
|
|
426
385
|
}
|
|
427
386
|
/** @inheritdoc */
|
|
428
387
|
get type() {
|
|
@@ -430,32 +389,9 @@ var VmExtern = class extends VmWrapper {
|
|
|
430
389
|
}
|
|
431
390
|
/** @inheritdoc */
|
|
432
391
|
get tag() {
|
|
433
|
-
const tag =
|
|
392
|
+
const tag = getTag(this.value);
|
|
434
393
|
if (this.isArrayLike()) {
|
|
435
394
|
return `${tag}(${this.value.length})`;
|
|
436
|
-
} else if (tag === "Object") {
|
|
437
|
-
const proto = getPrototypeOf(this.value);
|
|
438
|
-
if (proto === ObjectPrototype) {
|
|
439
|
-
return "Object";
|
|
440
|
-
}
|
|
441
|
-
if (proto == null) {
|
|
442
|
-
return "Object: null prototype";
|
|
443
|
-
}
|
|
444
|
-
if (typeof proto.constructor === "function") {
|
|
445
|
-
return classNameOf(proto.constructor) ?? "Object";
|
|
446
|
-
}
|
|
447
|
-
} else if (tag === "Function" && "prototype" in this.value && typeof this.value.prototype == "object") {
|
|
448
|
-
const className = classNameOf(this.value);
|
|
449
|
-
if (!className) return `class`;
|
|
450
|
-
return `class ${className}`;
|
|
451
|
-
} else if (tag === "Function") {
|
|
452
|
-
return `function`;
|
|
453
|
-
} else if (tag === "AsyncFunction") {
|
|
454
|
-
return `async function`;
|
|
455
|
-
} else if (tag === "GeneratorFunction") {
|
|
456
|
-
return `function*`;
|
|
457
|
-
} else if (tag === "AsyncGeneratorFunction") {
|
|
458
|
-
return `async function*`;
|
|
459
395
|
}
|
|
460
396
|
return tag;
|
|
461
397
|
}
|
|
@@ -885,42 +821,48 @@ var overloadNumberString = (a, b) => {
|
|
|
885
821
|
if (typeof a == "string" || typeof b == "string") return false;
|
|
886
822
|
return true;
|
|
887
823
|
};
|
|
824
|
+
var isArraySame = (a, b) => {
|
|
825
|
+
const len2 = a.length;
|
|
826
|
+
if (len2 !== b.length) return false;
|
|
827
|
+
for (let i = 0; i < len2; i++) {
|
|
828
|
+
if (!isSame(a[i] ?? null, b[i] ?? null)) {
|
|
829
|
+
return false;
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
return true;
|
|
833
|
+
};
|
|
834
|
+
var isRecordSame = (a, b) => {
|
|
835
|
+
const aKeys = keys(a);
|
|
836
|
+
const bKeys = keys(b);
|
|
837
|
+
const len2 = aKeys.length;
|
|
838
|
+
if (len2 !== bKeys.length) return false;
|
|
839
|
+
if (len2 === 0) return true;
|
|
840
|
+
for (let i = 0; i < len2; i++) {
|
|
841
|
+
const key = aKeys[i];
|
|
842
|
+
const av = a[key] ?? null;
|
|
843
|
+
const bv = getRecord(b, key);
|
|
844
|
+
if (bv === void 0) return false;
|
|
845
|
+
if (!isSame(av, bv)) return false;
|
|
846
|
+
}
|
|
847
|
+
return true;
|
|
848
|
+
};
|
|
888
849
|
var isSame = (a, b) => {
|
|
889
850
|
if (typeof a == "number" && typeof b == "number") {
|
|
890
851
|
return a === b || isNaN(a) && isNaN(b);
|
|
891
852
|
}
|
|
892
853
|
if (a === b) return true;
|
|
893
854
|
if (a == null || typeof a != "object" || b == null || typeof b != "object") return false;
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
if (
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
return false;
|
|
900
|
-
}
|
|
901
|
-
for (let i = 0; i < len2; i++) {
|
|
902
|
-
if (!isSame(a[i] ?? null, b[i] ?? null)) {
|
|
903
|
-
return false;
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
return true;
|
|
855
|
+
const aType = getVmType(a);
|
|
856
|
+
const bType = getVmType(b);
|
|
857
|
+
if (aType !== bType) return false;
|
|
858
|
+
if (aType === "array") {
|
|
859
|
+
return isArraySame(a, b);
|
|
907
860
|
}
|
|
908
|
-
if (
|
|
909
|
-
|
|
910
|
-
const bKeys = keys(b);
|
|
911
|
-
const len2 = aKeys.length;
|
|
912
|
-
if (len2 !== bKeys.length) return false;
|
|
913
|
-
if (len2 === 0) return true;
|
|
914
|
-
let i = len2;
|
|
915
|
-
while (i--) {
|
|
916
|
-
const key = aKeys[i];
|
|
917
|
-
if (!hasOwnEnumerable(b, key)) return false;
|
|
918
|
-
const av = a[key] ?? null;
|
|
919
|
-
const bv = b[key] ?? null;
|
|
920
|
-
if (!isSame(av, bv)) return false;
|
|
921
|
-
}
|
|
922
|
-
return true;
|
|
861
|
+
if (aType === "record") {
|
|
862
|
+
return isRecordSame(a, b);
|
|
923
863
|
}
|
|
864
|
+
if (isVmWrapper(a)) return a.same(b);
|
|
865
|
+
if (isVmWrapper(b)) return b.same(a);
|
|
924
866
|
return false;
|
|
925
867
|
};
|
|
926
868
|
|
|
@@ -1048,32 +990,32 @@ var $Nsame = (a, b) => {
|
|
|
1048
990
|
var { ceil } = Math;
|
|
1049
991
|
var { slice } = Array.prototype;
|
|
1050
992
|
var sliceCore = (value, start, end, exclusive) => {
|
|
993
|
+
$AssertInit(value);
|
|
994
|
+
$AssertInit(start);
|
|
995
|
+
$AssertInit(end);
|
|
996
|
+
if (!isVmArray(value)) {
|
|
997
|
+
throw new VmError(`Expected array, got ${display(value)}`, []);
|
|
998
|
+
}
|
|
1051
999
|
const { length } = value;
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
if (isNaN(
|
|
1055
|
-
else if (
|
|
1056
|
-
|
|
1057
|
-
if (
|
|
1058
|
-
|
|
1000
|
+
let s2 = start != null ? toNumber(start) : 0;
|
|
1001
|
+
let e2 = end != null ? toNumber(end) : length - (exclusive ? 0 : 1);
|
|
1002
|
+
if (isNaN(s2)) s2 = 0;
|
|
1003
|
+
else if (s2 < 0) s2 = length + s2;
|
|
1004
|
+
if (isNaN(e2)) e2 = exclusive ? length : length - 1;
|
|
1005
|
+
else if (e2 < 0) e2 = length + e2;
|
|
1006
|
+
s2 = ceil(s2);
|
|
1007
|
+
if (exclusive || !isSafeInteger(e2)) {
|
|
1008
|
+
e2 = ceil(e2);
|
|
1059
1009
|
} else {
|
|
1060
|
-
|
|
1010
|
+
e2 = e2 + 1;
|
|
1061
1011
|
}
|
|
1062
|
-
return slice.call(value,
|
|
1012
|
+
return slice.call(value, s2, e2);
|
|
1063
1013
|
};
|
|
1064
1014
|
var $Slice = (value, start, end) => {
|
|
1065
|
-
|
|
1066
|
-
if (!isVmArray(value)) throw new VmError(`Expected array, got ${display(value)}`, []);
|
|
1067
|
-
const s2 = start != null ? $ToNumber(start) : 0;
|
|
1068
|
-
const e2 = end != null ? $ToNumber(end) : value.length - 1;
|
|
1069
|
-
return sliceCore(value, s2, e2, false);
|
|
1015
|
+
return sliceCore(value, start, end, false);
|
|
1070
1016
|
};
|
|
1071
1017
|
var $SliceExclusive = (value, start, end) => {
|
|
1072
|
-
|
|
1073
|
-
if (!isVmArray(value)) throw new VmError(`Expected array, got ${display(value)}`, []);
|
|
1074
|
-
const s2 = start != null ? $ToNumber(start) : 0;
|
|
1075
|
-
const e2 = end != null ? $ToNumber(end) : value.length;
|
|
1076
|
-
return sliceCore(value, s2, e2, true);
|
|
1018
|
+
return sliceCore(value, start, end, true);
|
|
1077
1019
|
};
|
|
1078
1020
|
|
|
1079
1021
|
// src/vm/operations/helpers.ts
|
|
@@ -1109,23 +1051,6 @@ var $GlobalFallback = () => {
|
|
|
1109
1051
|
// src/vm/operations/compound.ts
|
|
1110
1052
|
var { trunc } = Math;
|
|
1111
1053
|
var { at } = Array.prototype;
|
|
1112
|
-
var $In = (value, iterable) => {
|
|
1113
|
-
$AssertInit(value);
|
|
1114
|
-
$AssertInit(iterable);
|
|
1115
|
-
if (iterable == null) return false;
|
|
1116
|
-
if (typeof iterable != "object") return false;
|
|
1117
|
-
if (isVmArray(iterable)) {
|
|
1118
|
-
if (value == null) {
|
|
1119
|
-
for (const item of iterable) if (item == null) return true;
|
|
1120
|
-
return false;
|
|
1121
|
-
}
|
|
1122
|
-
if (isVmPrimitive(value)) return iterable.includes(value);
|
|
1123
|
-
return iterable.some((item = null) => isSame(item, value));
|
|
1124
|
-
}
|
|
1125
|
-
const key = toString(value, void 0);
|
|
1126
|
-
if (isVmWrapper(iterable)) return iterable.has(key);
|
|
1127
|
-
return hasOwnEnumerable(iterable, key);
|
|
1128
|
-
};
|
|
1129
1054
|
var $Length = (value) => {
|
|
1130
1055
|
$AssertInit(value);
|
|
1131
1056
|
if (isVmArray(value)) return value.length;
|
|
@@ -1133,31 +1058,6 @@ var $Length = (value) => {
|
|
|
1133
1058
|
if (isVmWrapper(value)) return value.keys().length;
|
|
1134
1059
|
throw new VmError(`Value has no length: ${display(value)}`, 0);
|
|
1135
1060
|
};
|
|
1136
|
-
var $Omit = (value, omitted) => {
|
|
1137
|
-
$AssertInit(value);
|
|
1138
|
-
if (!isVmRecord(value)) return {};
|
|
1139
|
-
const result = {};
|
|
1140
|
-
const valueKeys = keys(value);
|
|
1141
|
-
const omittedSet = new Set(omitted.map($ToString));
|
|
1142
|
-
for (const key of valueKeys) {
|
|
1143
|
-
if (!omittedSet.has(key)) {
|
|
1144
|
-
setRecord(result, key, value[key]);
|
|
1145
|
-
}
|
|
1146
|
-
}
|
|
1147
|
-
return result;
|
|
1148
|
-
};
|
|
1149
|
-
var $Pick = (value, picked) => {
|
|
1150
|
-
$AssertInit(value);
|
|
1151
|
-
if (!isVmRecord(value)) return {};
|
|
1152
|
-
const result = {};
|
|
1153
|
-
for (const key of picked) {
|
|
1154
|
-
const k = $ToString(key);
|
|
1155
|
-
if (hasOwnEnumerable(value, k)) {
|
|
1156
|
-
setRecord(result, k, value[k]);
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
return result;
|
|
1160
|
-
};
|
|
1161
1061
|
var $Has = (obj, key) => {
|
|
1162
1062
|
$AssertInit(obj);
|
|
1163
1063
|
const pk = $ToString(key);
|
|
@@ -1195,13 +1095,8 @@ var $Set = (obj, key, value) => {
|
|
|
1195
1095
|
if (!isVmExtern(obj)) throw new VmError(`Expected extern, got ${display(obj)}`, void 0);
|
|
1196
1096
|
obj.set(pk, value);
|
|
1197
1097
|
};
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
if (isVmWrapper(value)) return value.keys();
|
|
1201
|
-
if (isVmArray(value)) return value;
|
|
1202
|
-
if (value != null && typeof value == "object") return keys(value);
|
|
1203
|
-
throw new VmError(`Value is not iterable: ${display(value)}`, isVmFunction(value) ? [] : [value]);
|
|
1204
|
-
};
|
|
1098
|
+
|
|
1099
|
+
// src/vm/operations/spread.ts
|
|
1205
1100
|
var $RecordSpread = (record) => {
|
|
1206
1101
|
$AssertInit(record);
|
|
1207
1102
|
if (record == null || isVmRecord(record)) return record;
|
|
@@ -1249,40 +1144,81 @@ var $ArraySpread = (array) => {
|
|
|
1249
1144
|
throw new VmError(`Expected array, iterable extern or nil, got ${display(array)}`, []);
|
|
1250
1145
|
};
|
|
1251
1146
|
|
|
1252
|
-
// src/vm/operations/
|
|
1253
|
-
var
|
|
1254
|
-
|
|
1255
|
-
|
|
1147
|
+
// src/vm/operations/record.ts
|
|
1148
|
+
var $Omit = (value, omitted) => {
|
|
1149
|
+
$AssertInit(value);
|
|
1150
|
+
if (!isVmRecord(value)) return {};
|
|
1151
|
+
const result = {};
|
|
1152
|
+
const valueKeys = keys(value);
|
|
1153
|
+
const omittedSet = new Set(omitted.map(String));
|
|
1154
|
+
for (const key of valueKeys) {
|
|
1155
|
+
if (!omittedSet.has(key)) {
|
|
1156
|
+
setRecord(result, key, value[key]);
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
return result;
|
|
1160
|
+
};
|
|
1161
|
+
var $Pick = (value, picked) => {
|
|
1162
|
+
$AssertInit(value);
|
|
1163
|
+
if (!isVmRecord(value)) return {};
|
|
1164
|
+
const result = {};
|
|
1165
|
+
for (const key of picked) {
|
|
1166
|
+
const k = String(key);
|
|
1167
|
+
if (hasOwnEnumerable(value, k)) {
|
|
1168
|
+
setRecord(result, k, value[k]);
|
|
1169
|
+
}
|
|
1256
1170
|
}
|
|
1171
|
+
return result;
|
|
1257
1172
|
};
|
|
1258
|
-
|
|
1259
|
-
|
|
1173
|
+
|
|
1174
|
+
// src/vm/operations/iterable.ts
|
|
1175
|
+
var $In = (value, iterable) => {
|
|
1176
|
+
$AssertInit(value);
|
|
1177
|
+
$AssertInit(iterable);
|
|
1178
|
+
if (iterable == null) return false;
|
|
1179
|
+
if (typeof iterable != "object") return false;
|
|
1180
|
+
if (isVmArray(iterable)) {
|
|
1181
|
+
if (value == null) {
|
|
1182
|
+
for (const item of iterable) if (item == null) return true;
|
|
1183
|
+
return false;
|
|
1184
|
+
}
|
|
1185
|
+
if (isVmPrimitive(value)) return iterable.includes(value);
|
|
1186
|
+
return iterable.some((item = null) => isSame(item, value));
|
|
1187
|
+
}
|
|
1188
|
+
const key = toString(value, void 0);
|
|
1189
|
+
if (isVmWrapper(iterable)) return iterable.has(key);
|
|
1190
|
+
return hasOwnEnumerable(iterable, key);
|
|
1260
1191
|
};
|
|
1261
|
-
var $
|
|
1192
|
+
var $Iterable = (value) => {
|
|
1193
|
+
$AssertInit(value);
|
|
1194
|
+
if (isVmWrapper(value)) return value.keys();
|
|
1195
|
+
if (isVmArray(value)) return value;
|
|
1196
|
+
if (value != null && typeof value == "object") return keys(value);
|
|
1197
|
+
throw new VmError(`Value is not iterable: ${display(value)}`, isVmFunction(value) ? [] : [value]);
|
|
1198
|
+
};
|
|
1199
|
+
|
|
1200
|
+
// src/vm/operations/array-range.ts
|
|
1201
|
+
var makeArray = (start, end, exclusive) => {
|
|
1262
1202
|
const s2 = $ToNumber(start);
|
|
1263
1203
|
const e2 = $ToNumber(end);
|
|
1264
|
-
if (
|
|
1265
|
-
|
|
1266
|
-
|
|
1204
|
+
if (!isFinite(s2) || !isFinite(e2) || s2 > e2) {
|
|
1205
|
+
return [];
|
|
1206
|
+
}
|
|
1207
|
+
const n = exclusive ? Math.ceil(e2 - s2) : Math.floor(e2 - s2 + 1);
|
|
1208
|
+
if (n > VM_ARRAY_MAX_LENGTH) {
|
|
1209
|
+
throw new RangeError(`Array length exceeds maximum limit of ${VM_ARRAY_MAX_LENGTH}`);
|
|
1210
|
+
}
|
|
1267
1211
|
const arr = [];
|
|
1268
|
-
arr.length = n;
|
|
1269
1212
|
for (let i = 0; i < n; i++) {
|
|
1270
1213
|
arr[i] = s2 + i;
|
|
1271
1214
|
}
|
|
1272
1215
|
return arr;
|
|
1273
1216
|
};
|
|
1217
|
+
var $ArrayRange = (start, end) => {
|
|
1218
|
+
return makeArray(start, end, false);
|
|
1219
|
+
};
|
|
1274
1220
|
var $ArrayRangeExclusive = (start, end) => {
|
|
1275
|
-
|
|
1276
|
-
const e2 = $ToNumber(end);
|
|
1277
|
-
if (isEmptyRange(s2, e2)) return [];
|
|
1278
|
-
const n = Math.ceil(e2 - s2);
|
|
1279
|
-
assertArrayLength(n);
|
|
1280
|
-
const arr = [];
|
|
1281
|
-
arr.length = n;
|
|
1282
|
-
for (let i = 0; i < n; i++) {
|
|
1283
|
-
arr[i] = s2 + i;
|
|
1284
|
-
}
|
|
1285
|
-
return arr;
|
|
1221
|
+
return makeArray(start, end, true);
|
|
1286
1222
|
};
|
|
1287
1223
|
|
|
1288
1224
|
// src/compiler/create-script.ts
|
|
@@ -1480,7 +1416,7 @@ function expectNumber(name, value) {
|
|
|
1480
1416
|
}
|
|
1481
1417
|
return v;
|
|
1482
1418
|
}
|
|
1483
|
-
function expectNumberRange(name, value, min3,
|
|
1419
|
+
function expectNumberRange(name, value, min3, max3) {
|
|
1484
1420
|
const v = expectNumber(name, value);
|
|
1485
1421
|
if (!isFinite(v)) {
|
|
1486
1422
|
throwError(`${describeParam(name)} is not a finite number: ${display(value)}`, NotNumber);
|
|
@@ -1488,18 +1424,18 @@ function expectNumberRange(name, value, min3, max2) {
|
|
|
1488
1424
|
if (v < min3) {
|
|
1489
1425
|
throwError(`${describeParam(name)} is less than minimum value ${min3}: ${display(value)}`, min3);
|
|
1490
1426
|
}
|
|
1491
|
-
if (v >
|
|
1492
|
-
throwError(`${describeParam(name)} is greater than maximum value ${
|
|
1427
|
+
if (v > max3) {
|
|
1428
|
+
throwError(`${describeParam(name)} is greater than maximum value ${max3}: ${display(value)}`, max3);
|
|
1493
1429
|
}
|
|
1494
1430
|
return v;
|
|
1495
1431
|
}
|
|
1496
|
-
function expectIntegerRange(name, value, min3,
|
|
1432
|
+
function expectIntegerRange(name, value, min3, max3) {
|
|
1497
1433
|
const i = expectInteger(name, value);
|
|
1498
1434
|
if (i < min3) {
|
|
1499
1435
|
throwError(`${describeParam(name)} is less than minimum value ${min3}: ${display(value)}`, min3);
|
|
1500
1436
|
}
|
|
1501
|
-
if (i >
|
|
1502
|
-
throwError(`${describeParam(name)} is greater than maximum value ${
|
|
1437
|
+
if (i > max3) {
|
|
1438
|
+
throwError(`${describeParam(name)} is greater than maximum value ${max3}: ${display(value)}`, max3);
|
|
1503
1439
|
}
|
|
1504
1440
|
return i;
|
|
1505
1441
|
}
|
|
@@ -2816,8 +2752,8 @@ var repeat = VmLib(
|
|
|
2816
2752
|
|
|
2817
2753
|
// src/vm/lib/global/sequence/new.ts
|
|
2818
2754
|
var new_record = VmLib(
|
|
2819
|
-
(
|
|
2820
|
-
const n = expectIntegerRange("size",
|
|
2755
|
+
(size3, generator) => {
|
|
2756
|
+
const n = expectIntegerRange("size", size3, 0, PositiveInfinity);
|
|
2821
2757
|
expectCallable("generator", generator, null);
|
|
2822
2758
|
const result = {};
|
|
2823
2759
|
for (let i = 0; i < n; i++) {
|
|
@@ -3469,7 +3405,7 @@ __export(mod_exports, {
|
|
|
3469
3405
|
matrix: () => matrix_exports
|
|
3470
3406
|
});
|
|
3471
3407
|
|
|
3472
|
-
// src/vm/lib/mod/matrix.ts
|
|
3408
|
+
// src/vm/lib/mod/matrix/index.ts
|
|
3473
3409
|
var matrix_exports = {};
|
|
3474
3410
|
__export(matrix_exports, {
|
|
3475
3411
|
add: () => add2,
|
|
@@ -3481,12 +3417,14 @@ __export(matrix_exports, {
|
|
|
3481
3417
|
invert: () => invert,
|
|
3482
3418
|
multiply: () => multiply,
|
|
3483
3419
|
ones: () => ones,
|
|
3484
|
-
size: () =>
|
|
3420
|
+
size: () => size2,
|
|
3485
3421
|
subtract: () => subtract,
|
|
3486
3422
|
transpose: () => transpose,
|
|
3487
3423
|
zeros: () => zeros
|
|
3488
3424
|
});
|
|
3489
|
-
|
|
3425
|
+
|
|
3426
|
+
// src/vm/lib/mod/matrix/helpers.ts
|
|
3427
|
+
function size(matrix) {
|
|
3490
3428
|
if (!isVmArray(matrix)) return [];
|
|
3491
3429
|
if (matrix.length === 0) return [0];
|
|
3492
3430
|
const numRows = matrix.length;
|
|
@@ -3503,46 +3441,12 @@ function sizeImpl(matrix) {
|
|
|
3503
3441
|
function num(v) {
|
|
3504
3442
|
return toNumber(v, void 0);
|
|
3505
3443
|
}
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
return sizeImpl(matrix);
|
|
3510
|
-
},
|
|
3511
|
-
{
|
|
3512
|
-
summary: "获取矩阵尺寸",
|
|
3513
|
-
params: { matrix: { type: "any[][]", description: "要获取尺寸的矩阵" } },
|
|
3514
|
-
returns: { type: "[number, number]" },
|
|
3515
|
-
examples: ["matrix.size([[1, 2], [3, 4]]) // [2, 2]"]
|
|
3516
|
-
}
|
|
3517
|
-
);
|
|
3518
|
-
var transpose = VmLib(
|
|
3519
|
-
(matrix) => {
|
|
3520
|
-
required("matrix", matrix, []);
|
|
3521
|
-
const [numRows, numCols] = sizeImpl(matrix);
|
|
3522
|
-
if (numRows == null || numCols == null) return matrix;
|
|
3523
|
-
const transposed = [];
|
|
3524
|
-
for (let j = 0; j < numCols; j++) {
|
|
3525
|
-
Cp();
|
|
3526
|
-
const tj = [];
|
|
3527
|
-
for (let i = 0; i < numRows; i++) {
|
|
3528
|
-
const row = matrix[i] ?? null;
|
|
3529
|
-
const item = row?.[j] ?? null;
|
|
3530
|
-
tj[i] = item;
|
|
3531
|
-
}
|
|
3532
|
-
transposed[j] = tj;
|
|
3533
|
-
}
|
|
3534
|
-
return transposed;
|
|
3535
|
-
},
|
|
3536
|
-
{
|
|
3537
|
-
summary: "转置矩阵",
|
|
3538
|
-
params: { matrix: { type: "any[][]", description: "要转置的矩阵" } },
|
|
3539
|
-
returns: { type: "any[][]" },
|
|
3540
|
-
examples: ["matrix.transpose([[1, 2], [3, 4]]) // [[1, 3], [2, 4]]"]
|
|
3541
|
-
}
|
|
3542
|
-
);
|
|
3444
|
+
|
|
3445
|
+
// src/vm/lib/mod/matrix/bin-ops.ts
|
|
3446
|
+
var { max: max2 } = Math;
|
|
3543
3447
|
function entrywiseImpl(a, b, f, vvf, mmf, vmf, mvf) {
|
|
3544
|
-
let [ar, ac] =
|
|
3545
|
-
let [br, bc] =
|
|
3448
|
+
let [ar, ac] = size(a);
|
|
3449
|
+
let [br, bc] = size(b);
|
|
3546
3450
|
if (ar == null) {
|
|
3547
3451
|
if (br == null) {
|
|
3548
3452
|
return f(a, b);
|
|
@@ -3593,7 +3497,7 @@ function entrywiseImpl(a, b, f, vvf, mmf, vmf, mvf) {
|
|
|
3593
3497
|
if (vvf != null) {
|
|
3594
3498
|
return vvf(a, b, ar, br);
|
|
3595
3499
|
}
|
|
3596
|
-
const rr2 =
|
|
3500
|
+
const rr2 = max2(ar, br);
|
|
3597
3501
|
const result2 = [];
|
|
3598
3502
|
for (let r = 0; r < rr2; r++) {
|
|
3599
3503
|
const aItem = a[r] ?? null;
|
|
@@ -3621,8 +3525,8 @@ function entrywiseImpl(a, b, f, vvf, mmf, vmf, mvf) {
|
|
|
3621
3525
|
if (mmf != null) {
|
|
3622
3526
|
return mmf(a, b, ar, ac, br, bc);
|
|
3623
3527
|
}
|
|
3624
|
-
const rr =
|
|
3625
|
-
const rc =
|
|
3528
|
+
const rr = max2(ar, br);
|
|
3529
|
+
const rc = max2(ac, bc);
|
|
3626
3530
|
const result = [];
|
|
3627
3531
|
for (let r = 0; r < rr; r++) {
|
|
3628
3532
|
const rRow = [];
|
|
@@ -3731,7 +3635,7 @@ var multiply = VmLib(
|
|
|
3731
3635
|
b,
|
|
3732
3636
|
$Mul,
|
|
3733
3637
|
(a2, b2, al, bl) => {
|
|
3734
|
-
const l =
|
|
3638
|
+
const l = max2(al, bl);
|
|
3735
3639
|
let s2 = 0;
|
|
3736
3640
|
for (let i = 0; i < l; i++) {
|
|
3737
3641
|
s2 += num(a2[i]) * num(b2[i]);
|
|
@@ -3790,10 +3694,109 @@ var multiply = VmLib(
|
|
|
3790
3694
|
examples: ["matrix.multiply([[1, 2], [3, 4]], [5, 6]) // [17, 39]"]
|
|
3791
3695
|
}
|
|
3792
3696
|
);
|
|
3697
|
+
|
|
3698
|
+
// src/vm/lib/mod/matrix/fill.ts
|
|
3699
|
+
function filled(size3, value) {
|
|
3700
|
+
const s2 = getNumbers(size3);
|
|
3701
|
+
if (s2.length === 0) return [];
|
|
3702
|
+
while (s2.length > 0) {
|
|
3703
|
+
const repeat2 = arrayLen(s2.pop());
|
|
3704
|
+
Cp();
|
|
3705
|
+
const data = [];
|
|
3706
|
+
data.length = repeat2;
|
|
3707
|
+
data.fill(value);
|
|
3708
|
+
value = data;
|
|
3709
|
+
}
|
|
3710
|
+
return value;
|
|
3711
|
+
}
|
|
3712
|
+
var zeros = VmLib((...size3) => filled(size3, 0), {
|
|
3713
|
+
summary: "创建一个全零的矩阵",
|
|
3714
|
+
params: { "..size": { type: "number[]", description: "矩阵的维度" } },
|
|
3715
|
+
returns: { type: "number[][]" },
|
|
3716
|
+
examples: ["matrix.zeros(2, 3) // [[0, 0, 0], [0, 0, 0]]"]
|
|
3717
|
+
});
|
|
3718
|
+
var ones = VmLib((...size3) => filled(size3, 1), {
|
|
3719
|
+
summary: "创建一个全一的矩阵",
|
|
3720
|
+
params: { "..size": { type: "number[]", description: "矩阵的维度" } },
|
|
3721
|
+
returns: { type: "number[][]" },
|
|
3722
|
+
examples: ["matrix.ones(2, 2) // [[1, 1], [1, 1]]"]
|
|
3723
|
+
});
|
|
3724
|
+
var identity = VmLib(
|
|
3725
|
+
(...size3) => {
|
|
3726
|
+
let s2 = getNumbers(size3);
|
|
3727
|
+
if (s2.length === 0) return [];
|
|
3728
|
+
if (s2.length > 2) throwError("Invalid matrix size", []);
|
|
3729
|
+
if (s2.length === 1) s2 = [s2[0], s2[0]];
|
|
3730
|
+
const m = arrayLen(s2[0]);
|
|
3731
|
+
const n = arrayLen(s2[1]);
|
|
3732
|
+
const ret = [];
|
|
3733
|
+
for (let i = 0; i < m; i++) {
|
|
3734
|
+
const row = [];
|
|
3735
|
+
ret[i] = row;
|
|
3736
|
+
row.length = n;
|
|
3737
|
+
row.fill(0);
|
|
3738
|
+
if (i < n) row[i] = 1;
|
|
3739
|
+
}
|
|
3740
|
+
return ret;
|
|
3741
|
+
},
|
|
3742
|
+
{
|
|
3743
|
+
summary: "创建一个单位矩阵",
|
|
3744
|
+
params: { "..size": { type: "[number] | [number, number]", description: "矩阵的维度" } },
|
|
3745
|
+
returns: { type: "number[][]" },
|
|
3746
|
+
examples: ["matrix.identity(3) // [[1, 0, 0], [0, 1, 0], [0, 0, 1]]"]
|
|
3747
|
+
}
|
|
3748
|
+
);
|
|
3749
|
+
var diagonal = VmLib(
|
|
3750
|
+
(x, k = 0) => {
|
|
3751
|
+
expectArray("x", x, []);
|
|
3752
|
+
const fk = expectInteger("k", k);
|
|
3753
|
+
if (x.every((e2) => isArray(e2))) {
|
|
3754
|
+
const diag = [];
|
|
3755
|
+
for (let i = 0; i < x.length; i++) {
|
|
3756
|
+
const row = x[i];
|
|
3757
|
+
const r = i + fk;
|
|
3758
|
+
if (r < 0) continue;
|
|
3759
|
+
if (!row || r >= row.length) break;
|
|
3760
|
+
diag.push(row[r] ?? null);
|
|
3761
|
+
}
|
|
3762
|
+
return diag;
|
|
3763
|
+
}
|
|
3764
|
+
const l = x.length;
|
|
3765
|
+
const m = arrayLen(fk < 0 ? l - fk : l);
|
|
3766
|
+
const n = arrayLen(fk > 0 ? l + fk : l);
|
|
3767
|
+
const result = [];
|
|
3768
|
+
for (let i = 0; i < m; i++) {
|
|
3769
|
+
const row = [];
|
|
3770
|
+
result[i] = row;
|
|
3771
|
+
row.length = n;
|
|
3772
|
+
row.fill(0);
|
|
3773
|
+
for (let j = 0; j < n; j++) {
|
|
3774
|
+
if (i + fk === j) {
|
|
3775
|
+
row[j] = x[fk >= 0 ? i : j] ?? null;
|
|
3776
|
+
}
|
|
3777
|
+
}
|
|
3778
|
+
}
|
|
3779
|
+
return result;
|
|
3780
|
+
},
|
|
3781
|
+
{
|
|
3782
|
+
summary: "创建一个对角矩阵或获取矩阵的对角线",
|
|
3783
|
+
params: {
|
|
3784
|
+
x: { type: "number[] | number[][]", description: "对角线元素或要获取对角线的矩阵" },
|
|
3785
|
+
k: { type: "number", description: "对角线偏移量,默认为 0" }
|
|
3786
|
+
},
|
|
3787
|
+
returns: { type: "number[][] | number[]" },
|
|
3788
|
+
examples: [
|
|
3789
|
+
"matrix.diagonal([1, 2, 3]) // [[1, 0, 0], [0, 2, 0], [0, 0, 3]]",
|
|
3790
|
+
"matrix.diagonal([[1, 2], [3, 4]]) // [1, 4]"
|
|
3791
|
+
]
|
|
3792
|
+
}
|
|
3793
|
+
);
|
|
3794
|
+
|
|
3795
|
+
// src/vm/lib/mod/matrix/invert.ts
|
|
3793
3796
|
var invert = VmLib(
|
|
3794
3797
|
(a) => {
|
|
3795
3798
|
expectConst("a", a, null);
|
|
3796
|
-
const [rows, cols] =
|
|
3799
|
+
const [rows, cols] = size(a);
|
|
3797
3800
|
if (rows == null) return 1 / num(a);
|
|
3798
3801
|
if (cols == null) return iterate(a, (v) => 1 / num(v));
|
|
3799
3802
|
if (rows !== cols) throwError(`Matrix must be square`, a);
|
|
@@ -3880,99 +3883,46 @@ var invert = VmLib(
|
|
|
3880
3883
|
examples: ["matrix.invert([[1, 2], [3, 4]]) // [[-2, 1], [1.5, -0.5]]"]
|
|
3881
3884
|
}
|
|
3882
3885
|
);
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
|
|
3889
|
-
const data = [];
|
|
3890
|
-
data.length = repeat2;
|
|
3891
|
-
data.fill(value);
|
|
3892
|
-
value = data;
|
|
3893
|
-
}
|
|
3894
|
-
return value;
|
|
3895
|
-
}
|
|
3896
|
-
var zeros = VmLib((...size2) => filled(size2, 0), {
|
|
3897
|
-
summary: "创建一个全零的矩阵",
|
|
3898
|
-
params: { "..size": { type: "number[]", description: "矩阵的维度" } },
|
|
3899
|
-
returns: { type: "number[][]" },
|
|
3900
|
-
examples: ["matrix.zeros(2, 3) // [[0, 0, 0], [0, 0, 0]]"]
|
|
3901
|
-
});
|
|
3902
|
-
var ones = VmLib((...size2) => filled(size2, 1), {
|
|
3903
|
-
summary: "创建一个全一的矩阵",
|
|
3904
|
-
params: { "..size": { type: "number[]", description: "矩阵的维度" } },
|
|
3905
|
-
returns: { type: "number[][]" },
|
|
3906
|
-
examples: ["matrix.ones(2, 2) // [[1, 1], [1, 1]]"]
|
|
3907
|
-
});
|
|
3908
|
-
var identity = VmLib(
|
|
3909
|
-
(...size2) => {
|
|
3910
|
-
let s2 = getNumbers(size2);
|
|
3911
|
-
if (s2.length === 0) return [];
|
|
3912
|
-
if (s2.length > 2) throwError("Invalid matrix size", []);
|
|
3913
|
-
if (s2.length === 1) s2 = [s2[0], s2[0]];
|
|
3914
|
-
const m = arrayLen(s2[0]);
|
|
3915
|
-
const n = arrayLen(s2[1]);
|
|
3916
|
-
const ret = [];
|
|
3917
|
-
for (let i = 0; i < m; i++) {
|
|
3918
|
-
const row = [];
|
|
3919
|
-
ret[i] = row;
|
|
3920
|
-
row.length = n;
|
|
3921
|
-
row.fill(0);
|
|
3922
|
-
if (i < n) row[i] = 1;
|
|
3923
|
-
}
|
|
3924
|
-
return ret;
|
|
3886
|
+
|
|
3887
|
+
// src/vm/lib/mod/matrix/size.ts
|
|
3888
|
+
var size2 = VmLib(
|
|
3889
|
+
(matrix) => {
|
|
3890
|
+
required("matrix", matrix, []);
|
|
3891
|
+
return size(matrix);
|
|
3925
3892
|
},
|
|
3926
3893
|
{
|
|
3927
|
-
summary: "
|
|
3928
|
-
params: {
|
|
3929
|
-
returns: { type: "number
|
|
3930
|
-
examples: ["matrix.
|
|
3894
|
+
summary: "获取矩阵尺寸",
|
|
3895
|
+
params: { matrix: { type: "any[][]", description: "要获取尺寸的矩阵" } },
|
|
3896
|
+
returns: { type: "[number, number]" },
|
|
3897
|
+
examples: ["matrix.size([[1, 2], [3, 4]]) // [2, 2]"]
|
|
3931
3898
|
}
|
|
3932
3899
|
);
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
3936
|
-
|
|
3937
|
-
|
|
3938
|
-
|
|
3939
|
-
|
|
3940
|
-
|
|
3941
|
-
|
|
3942
|
-
|
|
3943
|
-
|
|
3944
|
-
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
|
|
3948
|
-
|
|
3949
|
-
const m = arrayLen(fk < 0 ? l - fk : l);
|
|
3950
|
-
const n = arrayLen(fk > 0 ? l + fk : l);
|
|
3951
|
-
const result = [];
|
|
3952
|
-
for (let i = 0; i < m; i++) {
|
|
3953
|
-
const row = [];
|
|
3954
|
-
result[i] = row;
|
|
3955
|
-
row.length = n;
|
|
3956
|
-
row.fill(0);
|
|
3957
|
-
for (let j = 0; j < n; j++) {
|
|
3958
|
-
if (i + fk === j) {
|
|
3959
|
-
row[j] = x[fk >= 0 ? i : j] ?? null;
|
|
3960
|
-
}
|
|
3900
|
+
|
|
3901
|
+
// src/vm/lib/mod/matrix/transpose.ts
|
|
3902
|
+
var transpose = VmLib(
|
|
3903
|
+
(matrix) => {
|
|
3904
|
+
required("matrix", matrix, []);
|
|
3905
|
+
const [numRows, numCols] = size(matrix);
|
|
3906
|
+
if (numRows == null || numCols == null) return matrix;
|
|
3907
|
+
const m = matrix;
|
|
3908
|
+
const transposed = [];
|
|
3909
|
+
for (let j = 0; j < numCols; j++) {
|
|
3910
|
+
Cp();
|
|
3911
|
+
const tj = [];
|
|
3912
|
+
for (let i = 0; i < numRows; i++) {
|
|
3913
|
+
const row = m[i] ?? null;
|
|
3914
|
+
const item = row?.[j] ?? null;
|
|
3915
|
+
tj[i] = item;
|
|
3961
3916
|
}
|
|
3917
|
+
transposed[j] = tj;
|
|
3962
3918
|
}
|
|
3963
|
-
return
|
|
3919
|
+
return transposed;
|
|
3964
3920
|
},
|
|
3965
3921
|
{
|
|
3966
|
-
summary: "
|
|
3967
|
-
params: {
|
|
3968
|
-
|
|
3969
|
-
|
|
3970
|
-
},
|
|
3971
|
-
returns: { type: "number[][] | number[]" },
|
|
3972
|
-
examples: [
|
|
3973
|
-
"matrix.diagonal([1, 2, 3]) // [[1, 0, 0], [0, 2, 0], [0, 0, 3]]",
|
|
3974
|
-
"matrix.diagonal([[1, 2], [3, 4]]) // [1, 4]"
|
|
3975
|
-
]
|
|
3922
|
+
summary: "转置矩阵",
|
|
3923
|
+
params: { matrix: { type: "any[][]", description: "要转置的矩阵" } },
|
|
3924
|
+
returns: { type: "any[][]" },
|
|
3925
|
+
examples: ["matrix.transpose([[1, 2], [3, 4]]) // [[1, 3], [2, 4]]"]
|
|
3976
3926
|
}
|
|
3977
3927
|
);
|
|
3978
3928
|
|
|
@@ -4029,7 +3979,6 @@ for (const [name, value] of entries(mod_exports)) {
|
|
|
4029
3979
|
var lib = Object.freeze(Object.assign(create(null), global_exports, mod_exports));
|
|
4030
3980
|
|
|
4031
3981
|
export {
|
|
4032
|
-
convert_exports,
|
|
4033
3982
|
VmExtern,
|
|
4034
3983
|
wrapToVmValue,
|
|
4035
3984
|
unwrapFromVmValue,
|
|
@@ -4047,4 +3996,4 @@ export {
|
|
|
4047
3996
|
emitScript,
|
|
4048
3997
|
lib
|
|
4049
3998
|
};
|
|
4050
|
-
//# sourceMappingURL=chunk-
|
|
3999
|
+
//# sourceMappingURL=chunk-BPFOJ4Q6.js.map
|