@mirascript/mirascript 0.1.0
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-5FQWUJIY.js +766 -0
- package/dist/chunk-5FQWUJIY.js.map +6 -0
- package/dist/chunk-BTDGMWFK.js +202 -0
- package/dist/chunk-BTDGMWFK.js.map +6 -0
- package/dist/chunk-DCXIWIW5.js +3419 -0
- package/dist/chunk-DCXIWIW5.js.map +6 -0
- package/dist/chunk-RAPJ3XLV.js +10 -0
- package/dist/chunk-RAPJ3XLV.js.map +6 -0
- package/dist/cli/execute.d.ts +4 -0
- package/dist/cli/execute.d.ts.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +191 -0
- package/dist/cli/index.js.map +6 -0
- package/dist/cli/print.d.ts +4 -0
- package/dist/cli/print.d.ts.map +1 -0
- package/dist/compiler/compile-bytecode.d.ts +12 -0
- package/dist/compiler/compile-bytecode.d.ts.map +1 -0
- package/dist/compiler/compile-fast.d.ts +7 -0
- package/dist/compiler/compile-fast.d.ts.map +1 -0
- package/dist/compiler/create-script.d.ts +7 -0
- package/dist/compiler/create-script.d.ts.map +1 -0
- package/dist/compiler/diagnostic.d.ts +56 -0
- package/dist/compiler/diagnostic.d.ts.map +1 -0
- package/dist/compiler/emit.d.ts +4 -0
- package/dist/compiler/emit.d.ts.map +1 -0
- package/dist/compiler/index.d.ts +13 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/types.d.ts +16 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/worker-manager.d.ts +6 -0
- package/dist/compiler/worker-manager.d.ts.map +1 -0
- package/dist/compiler/worker.d.ts +6 -0
- package/dist/compiler/worker.d.ts.map +1 -0
- package/dist/compiler/worker.js +34 -0
- package/dist/compiler/worker.js.map +6 -0
- package/dist/helpers/constants.d.ts +3 -0
- package/dist/helpers/constants.d.ts.map +1 -0
- package/dist/helpers/serialize.d.ts +45 -0
- package/dist/helpers/serialize.d.ts.map +1 -0
- package/dist/helpers/utils.d.ts +36 -0
- package/dist/helpers/utils.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +6 -0
- package/dist/subtle.d.ts +7 -0
- package/dist/subtle.d.ts.map +1 -0
- package/dist/subtle.js +30 -0
- package/dist/subtle.js.map +6 -0
- package/dist/vm/env.d.ts +3 -0
- package/dist/vm/env.d.ts.map +1 -0
- package/dist/vm/error.d.ts +11 -0
- package/dist/vm/error.d.ts.map +1 -0
- package/dist/vm/helpers.d.ts +21 -0
- package/dist/vm/helpers.d.ts.map +1 -0
- package/dist/vm/index.d.ts +5 -0
- package/dist/vm/index.d.ts.map +1 -0
- package/dist/vm/lib/_helpers.d.ts +35 -0
- package/dist/vm/lib/_helpers.d.ts.map +1 -0
- package/dist/vm/lib/_loader.d.ts +16 -0
- package/dist/vm/lib/_loader.d.ts.map +1 -0
- package/dist/vm/lib/global/bit.d.ts +9 -0
- package/dist/vm/lib/global/bit.d.ts.map +1 -0
- package/dist/vm/lib/global/debug.d.ts +5 -0
- package/dist/vm/lib/global/debug.d.ts.map +1 -0
- package/dist/vm/lib/global/index.d.ts +10 -0
- package/dist/vm/lib/global/index.d.ts.map +1 -0
- package/dist/vm/lib/global/json.d.ts +4 -0
- package/dist/vm/lib/global/json.d.ts.map +1 -0
- package/dist/vm/lib/global/math-additional.d.ts +3 -0
- package/dist/vm/lib/global/math-additional.d.ts.map +1 -0
- package/dist/vm/lib/global/math-arr.d.ts +8 -0
- package/dist/vm/lib/global/math-arr.d.ts.map +1 -0
- package/dist/vm/lib/global/math-const.d.ts +3 -0
- package/dist/vm/lib/global/math-const.d.ts.map +1 -0
- package/dist/vm/lib/global/math-unary.d.ts +29 -0
- package/dist/vm/lib/global/math-unary.d.ts.map +1 -0
- package/dist/vm/lib/global/math.d.ts +9 -0
- package/dist/vm/lib/global/math.d.ts.map +1 -0
- package/dist/vm/lib/global/mod/index.d.ts +3 -0
- package/dist/vm/lib/global/mod/index.d.ts.map +1 -0
- package/dist/vm/lib/global/mod/matrix.d.ts +16 -0
- package/dist/vm/lib/global/mod/matrix.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/all-any.d.ts +4 -0
- package/dist/vm/lib/global/sequence/all-any.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/entries.d.ts +12 -0
- package/dist/vm/lib/global/sequence/entries.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/find.d.ts +10 -0
- package/dist/vm/lib/global/sequence/find.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/flatten.d.ts +3 -0
- package/dist/vm/lib/global/sequence/flatten.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/index.d.ts +12 -0
- package/dist/vm/lib/global/sequence/index.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/len.d.ts +3 -0
- package/dist/vm/lib/global/sequence/len.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/map-filter.d.ts +9 -0
- package/dist/vm/lib/global/sequence/map-filter.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/repeat.d.ts +4 -0
- package/dist/vm/lib/global/sequence/repeat.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/reverse.d.ts +3 -0
- package/dist/vm/lib/global/sequence/reverse.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/sort.d.ts +5 -0
- package/dist/vm/lib/global/sequence/sort.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/with.d.ts +5 -0
- package/dist/vm/lib/global/sequence/with.d.ts.map +1 -0
- package/dist/vm/lib/global/sequence/zip.d.ts +4 -0
- package/dist/vm/lib/global/sequence/zip.d.ts.map +1 -0
- package/dist/vm/lib/global/string.d.ts +12 -0
- package/dist/vm/lib/global/string.d.ts.map +1 -0
- package/dist/vm/lib/global/time.d.ts +15 -0
- package/dist/vm/lib/global/time.d.ts.map +1 -0
- package/dist/vm/lib/global/to-primitive.d.ts +6 -0
- package/dist/vm/lib/global/to-primitive.d.ts.map +1 -0
- package/dist/vm/operations.d.ts +49 -0
- package/dist/vm/operations.d.ts.map +1 -0
- package/dist/vm/types/checker.d.ts +30 -0
- package/dist/vm/types/checker.d.ts.map +1 -0
- package/dist/vm/types/context.d.ts +43 -0
- package/dist/vm/types/context.d.ts.map +1 -0
- package/dist/vm/types/extern.d.ts +32 -0
- package/dist/vm/types/extern.d.ts.map +1 -0
- package/dist/vm/types/function.d.ts +49 -0
- package/dist/vm/types/function.d.ts.map +1 -0
- package/dist/vm/types/index.d.ts +75 -0
- package/dist/vm/types/index.d.ts.map +1 -0
- package/dist/vm/types/module.d.ts +25 -0
- package/dist/vm/types/module.d.ts.map +1 -0
- package/dist/vm/types/script.d.ts +14 -0
- package/dist/vm/types/script.d.ts.map +1 -0
- package/dist/vm/types/wrapper.d.ts +25 -0
- package/dist/vm/types/wrapper.d.ts.map +1 -0
- package/package.json +55 -0
- package/src/cli/execute.ts +32 -0
- package/src/cli/index.ts +73 -0
- package/src/cli/print.ts +41 -0
- package/src/compiler/compile-bytecode.ts +65 -0
- package/src/compiler/compile-fast.ts +81 -0
- package/src/compiler/create-script.ts +34 -0
- package/src/compiler/diagnostic.ts +175 -0
- package/src/compiler/emit.ts +764 -0
- package/src/compiler/index.ts +67 -0
- package/src/compiler/types.ts +16 -0
- package/src/compiler/worker-manager.ts +60 -0
- package/src/compiler/worker.ts +37 -0
- package/src/helpers/constants.ts +3 -0
- package/src/helpers/serialize.ts +280 -0
- package/src/helpers/utils.ts +16 -0
- package/src/index.ts +3 -0
- package/src/subtle.ts +6 -0
- package/src/vm/env.ts +16 -0
- package/src/vm/error.ts +22 -0
- package/src/vm/helpers.ts +121 -0
- package/src/vm/index.ts +5 -0
- package/src/vm/lib/_helpers.ts +215 -0
- package/src/vm/lib/_loader.ts +51 -0
- package/src/vm/lib/global/bit.ts +93 -0
- package/src/vm/lib/global/debug.ts +36 -0
- package/src/vm/lib/global/index.ts +9 -0
- package/src/vm/lib/global/json.ts +45 -0
- package/src/vm/lib/global/math-additional.ts +71 -0
- package/src/vm/lib/global/math-arr.ts +62 -0
- package/src/vm/lib/global/math-const.ts +2 -0
- package/src/vm/lib/global/math-unary.ts +171 -0
- package/src/vm/lib/global/math.ts +27 -0
- package/src/vm/lib/global/mod/index.ts +4 -0
- package/src/vm/lib/global/mod/matrix.ts +579 -0
- package/src/vm/lib/global/sequence/all-any.ts +73 -0
- package/src/vm/lib/global/sequence/entries.ts +67 -0
- package/src/vm/lib/global/sequence/find.ts +49 -0
- package/src/vm/lib/global/sequence/flatten.ts +16 -0
- package/src/vm/lib/global/sequence/index.ts +11 -0
- package/src/vm/lib/global/sequence/len.ts +15 -0
- package/src/vm/lib/global/sequence/map-filter.ts +82 -0
- package/src/vm/lib/global/sequence/repeat.ts +28 -0
- package/src/vm/lib/global/sequence/reverse.ts +17 -0
- package/src/vm/lib/global/sequence/sort.ts +88 -0
- package/src/vm/lib/global/sequence/with.ts +43 -0
- package/src/vm/lib/global/sequence/zip.ts +40 -0
- package/src/vm/lib/global/string.ts +149 -0
- package/src/vm/lib/global/time.ts +73 -0
- package/src/vm/lib/global/to-primitive.ts +58 -0
- package/src/vm/operations.ts +497 -0
- package/src/vm/types/checker.ts +164 -0
- package/src/vm/types/context.ts +161 -0
- package/src/vm/types/extern.ts +166 -0
- package/src/vm/types/function.ts +136 -0
- package/src/vm/types/index.ts +124 -0
- package/src/vm/types/module.ts +40 -0
- package/src/vm/types/script.ts +18 -0
- package/src/vm/types/wrapper.ts +28 -0
|
@@ -0,0 +1,766 @@
|
|
|
1
|
+
// src/compiler/emit.ts
|
|
2
|
+
import { OpCode } from "@mirascript/wasm/types";
|
|
3
|
+
import { encodeURL } from "js-base64";
|
|
4
|
+
function emit(source, chunk, options) {
|
|
5
|
+
const gen = new Emitter(source, chunk, options);
|
|
6
|
+
gen.read();
|
|
7
|
+
const code = gen.codeLines.join("\n");
|
|
8
|
+
return code;
|
|
9
|
+
}
|
|
10
|
+
function readConst(reader, offset) {
|
|
11
|
+
const type = reader.getUint8(offset);
|
|
12
|
+
switch (type) {
|
|
13
|
+
/* c8 ignore next 2 */
|
|
14
|
+
case 0:
|
|
15
|
+
return [null, 1];
|
|
16
|
+
case 1:
|
|
17
|
+
return [true, 1];
|
|
18
|
+
case 2:
|
|
19
|
+
return [false, 1];
|
|
20
|
+
case 3: {
|
|
21
|
+
const ordinal = reader.getInt32(offset + 1, true);
|
|
22
|
+
return [ordinal, 5];
|
|
23
|
+
}
|
|
24
|
+
case 4: {
|
|
25
|
+
const num = reader.getFloat64(offset + 1, true);
|
|
26
|
+
return [num, 9];
|
|
27
|
+
}
|
|
28
|
+
case 5: {
|
|
29
|
+
const len = reader.getUint32(offset + 1, true);
|
|
30
|
+
const str = new TextDecoder().decode(new Uint8Array(reader.buffer, reader.byteOffset + offset + 5, len));
|
|
31
|
+
return [str, 5 + len];
|
|
32
|
+
}
|
|
33
|
+
/* c8 ignore next 2 */
|
|
34
|
+
default:
|
|
35
|
+
throw new Error(`Unknown constant type: ${type}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function toJavascript(value) {
|
|
39
|
+
if (value === null) return "null";
|
|
40
|
+
if (value === void 0) return "undefined";
|
|
41
|
+
if (typeof value == "object" || typeof value == "string") {
|
|
42
|
+
return JSON.stringify(value);
|
|
43
|
+
}
|
|
44
|
+
return String(value);
|
|
45
|
+
}
|
|
46
|
+
var ORIGIN = `mira://MiraScript`;
|
|
47
|
+
var sourceId = 1;
|
|
48
|
+
function createArray(length, fn) {
|
|
49
|
+
const result = [];
|
|
50
|
+
for (let i = 0; i < length; i++) {
|
|
51
|
+
result.push(fn(i));
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
var Emitter = class {
|
|
56
|
+
constructor(source, chunk, options) {
|
|
57
|
+
this.source = source;
|
|
58
|
+
this.chunk = chunk;
|
|
59
|
+
this.options = options;
|
|
60
|
+
this.constants = [];
|
|
61
|
+
this.codeOffset = 0;
|
|
62
|
+
this.closureCounter = 0;
|
|
63
|
+
this.identCounter = 0;
|
|
64
|
+
this.codeLines = [];
|
|
65
|
+
this.pretty = options.pretty ?? false;
|
|
66
|
+
const reader = new DataView(chunk.buffer, chunk.byteOffset, chunk.byteLength);
|
|
67
|
+
this.chunkSize = reader.getUint32(0, true);
|
|
68
|
+
this.codeSize = reader.getUint32(4, true);
|
|
69
|
+
this.constSize = reader.getUint32(8 + this.codeSize, true);
|
|
70
|
+
this.codeReader = new DataView(chunk.buffer, chunk.byteOffset + 8, this.codeSize);
|
|
71
|
+
this.constReader = new DataView(chunk.buffer, chunk.byteOffset + 12 + this.codeSize, this.constSize);
|
|
72
|
+
}
|
|
73
|
+
/** 读取常量表 */
|
|
74
|
+
readConsts() {
|
|
75
|
+
for (let i = 0, index = 0; i < this.constSize; index++) {
|
|
76
|
+
const [constant, size] = readConst(this.constReader, i);
|
|
77
|
+
this.constants.push(toJavascript(constant));
|
|
78
|
+
i += size;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** 制造缩进 */
|
|
82
|
+
ident(len = 0) {
|
|
83
|
+
if (!this.pretty) return "";
|
|
84
|
+
return " ".repeat(this.identCounter + len);
|
|
85
|
+
}
|
|
86
|
+
/** Read variable */
|
|
87
|
+
rv(i, level = 0) {
|
|
88
|
+
if (!i) return "null";
|
|
89
|
+
const c = this.closureCounter - level;
|
|
90
|
+
return `var_${c}_${i}`;
|
|
91
|
+
}
|
|
92
|
+
/** Write variable */
|
|
93
|
+
wv(i, level = 0) {
|
|
94
|
+
if (!i) return "_";
|
|
95
|
+
return this.rv(i, level);
|
|
96
|
+
}
|
|
97
|
+
/** 读取 code param */
|
|
98
|
+
readParam(wide) {
|
|
99
|
+
const value = wide ? this.codeReader.getUint32(this.codeOffset, true) : this.codeReader.getUint8(this.codeOffset);
|
|
100
|
+
this.codeOffset += wide ? 4 : 1;
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
/** 读取 code param */
|
|
104
|
+
readIndex(wide) {
|
|
105
|
+
const value = wide ? this.codeReader.getInt32(this.codeOffset, true) : this.codeReader.getInt8(this.codeOffset);
|
|
106
|
+
this.codeOffset += wide ? 4 : 1;
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
/** 读取闭包 */
|
|
110
|
+
readClosure() {
|
|
111
|
+
this.closureCounter++;
|
|
112
|
+
this.identCounter++;
|
|
113
|
+
while (this.codeOffset < this.codeSize) {
|
|
114
|
+
const opcode_raw = this.codeReader.getUint8(this.codeOffset);
|
|
115
|
+
const opcode = opcode_raw & 127;
|
|
116
|
+
if (opcode !== OpCode.FuncEnd) {
|
|
117
|
+
this.readCode();
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
this.codeOffset++;
|
|
121
|
+
const body = this.ident(-1) + `} finally { CpExit(); } });`;
|
|
122
|
+
this.codeLines.push(body);
|
|
123
|
+
this.closureCounter--;
|
|
124
|
+
this.identCounter--;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/** 读取块结束 */
|
|
129
|
+
readBlockEnd(end) {
|
|
130
|
+
while (this.codeOffset < this.codeSize) {
|
|
131
|
+
const opcode_raw = this.codeReader.getUint8(this.codeOffset);
|
|
132
|
+
const opcode = opcode_raw & 127;
|
|
133
|
+
if (opcode !== end) {
|
|
134
|
+
this.readCode();
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
this.codeOffset++;
|
|
138
|
+
this.identCounter--;
|
|
139
|
+
if (end === OpCode.LoopEnd) {
|
|
140
|
+
this.closureCounter--;
|
|
141
|
+
}
|
|
142
|
+
const body = this.ident() + `};`;
|
|
143
|
+
this.codeLines.push(body);
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** 读取 if else 或 if 结束 */
|
|
148
|
+
readIfElse() {
|
|
149
|
+
this.identCounter++;
|
|
150
|
+
while (this.codeOffset < this.codeSize) {
|
|
151
|
+
const opcode_raw = this.codeReader.getUint8(this.codeOffset);
|
|
152
|
+
const opcode = opcode_raw & 127;
|
|
153
|
+
if (opcode === OpCode.IfEnd) {
|
|
154
|
+
return this.readBlockEnd(OpCode.IfEnd);
|
|
155
|
+
}
|
|
156
|
+
if (opcode === OpCode.Else) {
|
|
157
|
+
this.codeOffset++;
|
|
158
|
+
const body = this.ident(-1) + `} else {`;
|
|
159
|
+
this.codeLines.push(body);
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
if (opcode === OpCode.ElIf) {
|
|
163
|
+
this.codeOffset++;
|
|
164
|
+
const body = this.ident(-1) + `} else `;
|
|
165
|
+
this.codeLines.push(body);
|
|
166
|
+
return this.readCode();
|
|
167
|
+
}
|
|
168
|
+
this.readCode();
|
|
169
|
+
}
|
|
170
|
+
return this.readBlockEnd(OpCode.IfEnd);
|
|
171
|
+
}
|
|
172
|
+
/** 读取 record */
|
|
173
|
+
readRecord(obj) {
|
|
174
|
+
this.identCounter++;
|
|
175
|
+
while (this.codeOffset < this.codeSize) {
|
|
176
|
+
const opcode_raw = this.codeReader.getUint8(this.codeOffset++);
|
|
177
|
+
const opcode = opcode_raw & 127;
|
|
178
|
+
const wide = opcode_raw >= 128;
|
|
179
|
+
const read = () => this.readParam(wide);
|
|
180
|
+
let code = "";
|
|
181
|
+
switch (opcode) {
|
|
182
|
+
case OpCode.FieldOpt:
|
|
183
|
+
case OpCode.Field: {
|
|
184
|
+
const field = read();
|
|
185
|
+
const field_name = this.constants[field];
|
|
186
|
+
if (!field_name) {
|
|
187
|
+
throw new Error(`Unknown field ${field}`);
|
|
188
|
+
}
|
|
189
|
+
const value = read();
|
|
190
|
+
const opt = opcode === OpCode.FieldOpt;
|
|
191
|
+
code = opt ? `...ElementOpt(${field_name}, ${this.rv(value)}),` : `[${field_name}]: Element(${this.rv(value)}),`;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
case OpCode.FieldOptDyn:
|
|
195
|
+
case OpCode.FieldDyn: {
|
|
196
|
+
const field = read();
|
|
197
|
+
const value = read();
|
|
198
|
+
const opt = opcode === OpCode.FieldOptDyn;
|
|
199
|
+
code = opt ? `...ElementOpt(${this.rv(field)}, ${this.rv(value)}),` : `[${this.rv(field)}]: Element(${this.rv(value)}),`;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
case OpCode.FieldOptIndex:
|
|
203
|
+
case OpCode.FieldIndex: {
|
|
204
|
+
const field = this.readIndex(wide);
|
|
205
|
+
const value = read();
|
|
206
|
+
const opt = opcode === OpCode.FieldOptIndex;
|
|
207
|
+
code = opt ? `...ElementOpt(${field}, ${this.rv(value)}),` : `[${field}]: Element(${this.rv(value)}),`;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
case OpCode.Spread: {
|
|
211
|
+
const value = read();
|
|
212
|
+
code = `...$RecordSpread(${this.rv(value)}),`;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
case OpCode.Freeze: {
|
|
216
|
+
this.identCounter--;
|
|
217
|
+
code = `});`;
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
default: {
|
|
221
|
+
code = `// ?${OpCode[opcode] ?? opcode}`;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const ident = this.ident();
|
|
226
|
+
this.codeLines.push(ident + code);
|
|
227
|
+
if (opcode === OpCode.Freeze) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/** 读取 array */
|
|
233
|
+
readArray(arr) {
|
|
234
|
+
this.identCounter++;
|
|
235
|
+
while (this.codeOffset < this.codeSize) {
|
|
236
|
+
const opcode_raw = this.codeReader.getUint8(this.codeOffset++);
|
|
237
|
+
const opcode = opcode_raw & 127;
|
|
238
|
+
const wide = opcode_raw >= 128;
|
|
239
|
+
const read = () => this.readParam(wide);
|
|
240
|
+
let code = "";
|
|
241
|
+
switch (opcode) {
|
|
242
|
+
case OpCode.Item: {
|
|
243
|
+
const value = read();
|
|
244
|
+
code = `Element(${this.rv(value)}),`;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
case OpCode.ItemRange: {
|
|
248
|
+
const start = this.readIndex(wide);
|
|
249
|
+
const end = this.readIndex(wide);
|
|
250
|
+
code = `...ArrayRange(${start}, ${end}),`;
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
case OpCode.ItemRangeDyn: {
|
|
254
|
+
const start = read();
|
|
255
|
+
const end = read();
|
|
256
|
+
code = `...ArrayRange(${this.rv(start)}, ${this.rv(end)}),`;
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
case OpCode.ItemRangeExclusiveDyn: {
|
|
260
|
+
const start = read();
|
|
261
|
+
const end = read();
|
|
262
|
+
code = `...ArrayRangeExclusive(${this.rv(start)}, ${this.rv(end)}),`;
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
case OpCode.Spread: {
|
|
266
|
+
const value = read();
|
|
267
|
+
code = `...$ArraySpread(${this.rv(value)}),`;
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
case OpCode.Freeze: {
|
|
271
|
+
this.identCounter--;
|
|
272
|
+
code = `]);`;
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
default: {
|
|
276
|
+
code = `// ?${OpCode[opcode] ?? opcode}`;
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
const ident = this.ident();
|
|
281
|
+
this.codeLines.push(ident + code);
|
|
282
|
+
if (opcode === OpCode.Freeze) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/** 读取代码 */
|
|
288
|
+
readCode() {
|
|
289
|
+
const opcode_raw = this.codeReader.getUint8(this.codeOffset++);
|
|
290
|
+
const opcode = opcode_raw & 127;
|
|
291
|
+
const wide = opcode_raw >= 128;
|
|
292
|
+
const read = () => this.readParam(wide);
|
|
293
|
+
const readIndex = () => this.readIndex(wide);
|
|
294
|
+
const ident = this.ident();
|
|
295
|
+
let code = "";
|
|
296
|
+
let reg = 0;
|
|
297
|
+
switch (opcode) {
|
|
298
|
+
case OpCode.FuncVarg:
|
|
299
|
+
case OpCode.Func: {
|
|
300
|
+
const script = this.codeOffset === 1;
|
|
301
|
+
reg = read();
|
|
302
|
+
const varg = opcode === OpCode.FuncVarg;
|
|
303
|
+
const argn = read();
|
|
304
|
+
const regn = read();
|
|
305
|
+
const args = createArray(argn, (i) => {
|
|
306
|
+
const wv = this.wv(i + 1, -1);
|
|
307
|
+
if (varg && i === argn - 1) {
|
|
308
|
+
return `...vargs`;
|
|
309
|
+
}
|
|
310
|
+
return `${wv} = null`;
|
|
311
|
+
});
|
|
312
|
+
const regs = createArray(regn - argn + 1, (i) => i ? this.wv(i + argn, -1) : this.wv(0, -1)).join(
|
|
313
|
+
", "
|
|
314
|
+
);
|
|
315
|
+
if (script) {
|
|
316
|
+
args.unshift(`global = GlobalFallback()`);
|
|
317
|
+
code = `'use strict'; return (function script(${args.join(", ")}) { try { CpEnter(); var ${regs};`;
|
|
318
|
+
} else {
|
|
319
|
+
code = `${this.wv(reg)} = Function(function (${args.join(", ")}) { try { CpEnter(); var ${regs};`;
|
|
320
|
+
}
|
|
321
|
+
if (varg) {
|
|
322
|
+
code += ` var ${this.wv(argn, -1)} = Vargs(vargs);`;
|
|
323
|
+
}
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case OpCode.Constant: {
|
|
327
|
+
reg = read();
|
|
328
|
+
const i = read();
|
|
329
|
+
const c = this.constants[i];
|
|
330
|
+
code = `${this.wv(reg)} = ${c};`;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
case OpCode.Uninit: {
|
|
334
|
+
reg = read();
|
|
335
|
+
code = `${this.wv(reg)} = undefined;`;
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
case OpCode.Return: {
|
|
339
|
+
reg = read();
|
|
340
|
+
code = `return ${this.rv(reg)};`;
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
case OpCode.Add:
|
|
344
|
+
case OpCode.Sub:
|
|
345
|
+
case OpCode.Mul:
|
|
346
|
+
case OpCode.Div:
|
|
347
|
+
case OpCode.Mod:
|
|
348
|
+
case OpCode.Pow:
|
|
349
|
+
case OpCode.Gt:
|
|
350
|
+
case OpCode.Gte:
|
|
351
|
+
case OpCode.Lt:
|
|
352
|
+
case OpCode.Lte:
|
|
353
|
+
case OpCode.Eq:
|
|
354
|
+
case OpCode.Neq:
|
|
355
|
+
case OpCode.Aeq:
|
|
356
|
+
case OpCode.Naeq:
|
|
357
|
+
case OpCode.Same:
|
|
358
|
+
case OpCode.Nsame:
|
|
359
|
+
case OpCode.In:
|
|
360
|
+
case OpCode.And:
|
|
361
|
+
case OpCode.Or:
|
|
362
|
+
case OpCode.Format: {
|
|
363
|
+
reg = read();
|
|
364
|
+
const left = read();
|
|
365
|
+
const right = read();
|
|
366
|
+
code = `${this.wv(reg)} = $${OpCode[opcode]}(${this.rv(left)}, ${this.rv(right)});`;
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
case OpCode.InGlobal: {
|
|
370
|
+
reg = read();
|
|
371
|
+
const left = read();
|
|
372
|
+
code = `${this.wv(reg)} = global.has(${this.rv(left)});`;
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
case OpCode.Concat: {
|
|
376
|
+
reg = read();
|
|
377
|
+
const n = read();
|
|
378
|
+
const args = createArray(n, () => read());
|
|
379
|
+
code = `${this.wv(reg)} = $${OpCode[opcode]}(${args.map((a) => this.rv(a)).join(", ")});`;
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
case OpCode.Omit:
|
|
383
|
+
case OpCode.Pick: {
|
|
384
|
+
reg = read();
|
|
385
|
+
const value = read();
|
|
386
|
+
const n = read();
|
|
387
|
+
const args = createArray(n, () => this.constants[read()]);
|
|
388
|
+
code = `${this.wv(reg)} = $${OpCode[opcode]}(${this.rv(value)}, [${args.join(", ")}]);`;
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
case OpCode.Call:
|
|
392
|
+
case OpCode.CallDyn: {
|
|
393
|
+
reg = read();
|
|
394
|
+
const func = read();
|
|
395
|
+
const n = read();
|
|
396
|
+
const args = createArray(n, () => read());
|
|
397
|
+
const ns = read();
|
|
398
|
+
const spreads = createArray(ns, () => read());
|
|
399
|
+
const callTarget = opcode === OpCode.Call ? `global.get(${this.constants[func]})` : this.rv(func);
|
|
400
|
+
code = `${this.wv(reg)} = $Call(${callTarget}, [${args.map((a, i) => {
|
|
401
|
+
if (spreads.includes(i)) return `...$ArraySpread(${this.rv(a)})`;
|
|
402
|
+
else return this.rv(a);
|
|
403
|
+
}).join(", ")}]);`;
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
case OpCode.Assign: {
|
|
407
|
+
reg = read();
|
|
408
|
+
const value = read();
|
|
409
|
+
code = `${this.wv(reg)} = ${this.rv(value)};`;
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
case OpCode.Pos:
|
|
413
|
+
case OpCode.Neg:
|
|
414
|
+
case OpCode.Not:
|
|
415
|
+
case OpCode.Type:
|
|
416
|
+
case OpCode.ToBoolean:
|
|
417
|
+
case OpCode.ToNumber:
|
|
418
|
+
case OpCode.ToString:
|
|
419
|
+
case OpCode.IsBoolean:
|
|
420
|
+
case OpCode.IsNumber:
|
|
421
|
+
case OpCode.IsString:
|
|
422
|
+
case OpCode.IsRecord:
|
|
423
|
+
case OpCode.IsArray:
|
|
424
|
+
case OpCode.Length: {
|
|
425
|
+
reg = read();
|
|
426
|
+
const value = read();
|
|
427
|
+
code = `${this.wv(reg)} = $${OpCode[opcode]}(${this.rv(value)});`;
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
case OpCode.AssertInit:
|
|
431
|
+
case OpCode.AssertNonNil: {
|
|
432
|
+
reg = read();
|
|
433
|
+
code = `$${OpCode[opcode]}(${this.rv(reg)})`;
|
|
434
|
+
break;
|
|
435
|
+
}
|
|
436
|
+
case OpCode.Get: {
|
|
437
|
+
reg = read();
|
|
438
|
+
const obj = read();
|
|
439
|
+
const prop = this.constants[read()];
|
|
440
|
+
code = `${this.wv(reg)} = $Get(${this.rv(obj)}, ${prop});`;
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
case OpCode.GetIndex: {
|
|
444
|
+
reg = read();
|
|
445
|
+
const obj = read();
|
|
446
|
+
const index = readIndex();
|
|
447
|
+
code = `${this.wv(reg)} = $Get(${this.rv(obj)}, ${index});`;
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
case OpCode.GetDyn: {
|
|
451
|
+
reg = read();
|
|
452
|
+
const obj = read();
|
|
453
|
+
const index = read();
|
|
454
|
+
code = `${this.wv(reg)} = $Get(${this.rv(obj)}, ${this.rv(index)});`;
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
457
|
+
case OpCode.Has: {
|
|
458
|
+
reg = read();
|
|
459
|
+
const obj = read();
|
|
460
|
+
const prop = this.constants[read()];
|
|
461
|
+
code = `${this.wv(reg)} = $Has(${this.rv(obj)}, ${prop});`;
|
|
462
|
+
break;
|
|
463
|
+
}
|
|
464
|
+
case OpCode.HasIndex: {
|
|
465
|
+
reg = read();
|
|
466
|
+
const obj = read();
|
|
467
|
+
const index = readIndex();
|
|
468
|
+
code = `${this.wv(reg)} = $Has(${this.rv(obj)}, ${index});`;
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
471
|
+
case OpCode.HasDyn: {
|
|
472
|
+
reg = read();
|
|
473
|
+
const obj = read();
|
|
474
|
+
const index = read();
|
|
475
|
+
code = `${this.wv(reg)} = $Has(${this.rv(obj)}, ${this.rv(index)});`;
|
|
476
|
+
break;
|
|
477
|
+
}
|
|
478
|
+
case OpCode.Set: {
|
|
479
|
+
reg = read();
|
|
480
|
+
const obj = read();
|
|
481
|
+
const prop = this.constants[read()];
|
|
482
|
+
code = `$Set(${this.rv(obj)}, ${prop}, ${this.rv(reg)});`;
|
|
483
|
+
break;
|
|
484
|
+
}
|
|
485
|
+
case OpCode.SetIndex: {
|
|
486
|
+
reg = read();
|
|
487
|
+
const obj = read();
|
|
488
|
+
const index = readIndex();
|
|
489
|
+
code = `$Set(${this.rv(obj)}, ${index}, ${this.rv(reg)});`;
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
case OpCode.SetDyn: {
|
|
493
|
+
reg = read();
|
|
494
|
+
const obj = read();
|
|
495
|
+
const index = read();
|
|
496
|
+
code = `$Set(${this.rv(obj)}, ${this.rv(index)}, ${this.rv(reg)});`;
|
|
497
|
+
break;
|
|
498
|
+
}
|
|
499
|
+
case OpCode.GetGlobal: {
|
|
500
|
+
reg = read();
|
|
501
|
+
const i = read();
|
|
502
|
+
const c = this.constants[i];
|
|
503
|
+
code = `${this.wv(reg)} = global.get(${c}) ?? null;`;
|
|
504
|
+
break;
|
|
505
|
+
}
|
|
506
|
+
case OpCode.GetGlobalDyn: {
|
|
507
|
+
reg = read();
|
|
508
|
+
const name = read();
|
|
509
|
+
code = `${this.wv(reg)} = global.get(${this.rv(name)}) ?? null;`;
|
|
510
|
+
break;
|
|
511
|
+
}
|
|
512
|
+
case OpCode.GetUpvalue: {
|
|
513
|
+
reg = read();
|
|
514
|
+
const level = read();
|
|
515
|
+
const up = read();
|
|
516
|
+
code = `${this.wv(reg)} = Upvalue(${this.rv(up, level)});`;
|
|
517
|
+
break;
|
|
518
|
+
}
|
|
519
|
+
case OpCode.SetUpvalue: {
|
|
520
|
+
reg = read();
|
|
521
|
+
const level = read();
|
|
522
|
+
const up = read();
|
|
523
|
+
code = `${this.wv(up, level)} = ${this.rv(reg)};`;
|
|
524
|
+
break;
|
|
525
|
+
}
|
|
526
|
+
case OpCode.Slice: {
|
|
527
|
+
reg = read();
|
|
528
|
+
const obj = read();
|
|
529
|
+
const start = readIndex();
|
|
530
|
+
const end = readIndex();
|
|
531
|
+
code = `${this.wv(reg)} = $Slice(${this.rv(obj)}, ${start}, ${end});`;
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
case OpCode.SliceStart: {
|
|
535
|
+
reg = read();
|
|
536
|
+
const obj = read();
|
|
537
|
+
const end = readIndex();
|
|
538
|
+
code = `${this.wv(reg)} = $Slice(${this.rv(obj)}, null, ${end});`;
|
|
539
|
+
break;
|
|
540
|
+
}
|
|
541
|
+
case OpCode.SliceEnd: {
|
|
542
|
+
reg = read();
|
|
543
|
+
const obj = read();
|
|
544
|
+
const start = readIndex();
|
|
545
|
+
code = `${this.wv(reg)} = $Slice(${this.rv(obj)}, ${start}, null);`;
|
|
546
|
+
break;
|
|
547
|
+
}
|
|
548
|
+
case OpCode.SliceDyn: {
|
|
549
|
+
reg = read();
|
|
550
|
+
const obj = read();
|
|
551
|
+
const start = read();
|
|
552
|
+
const end = read();
|
|
553
|
+
code = `${this.wv(reg)} = $Slice(${this.rv(obj)}, ${this.rv(start)}, ${this.rv(end)});`;
|
|
554
|
+
break;
|
|
555
|
+
}
|
|
556
|
+
case OpCode.SliceExclusiveDyn: {
|
|
557
|
+
reg = read();
|
|
558
|
+
const obj = read();
|
|
559
|
+
const start = read();
|
|
560
|
+
const end = read();
|
|
561
|
+
code = `${this.wv(reg)} = $SliceExclusive(${this.rv(obj)}, ${this.rv(start)}, ${this.rv(end)});`;
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
case OpCode.Record: {
|
|
565
|
+
reg = read();
|
|
566
|
+
code = `${this.wv(reg)} = ({`;
|
|
567
|
+
break;
|
|
568
|
+
}
|
|
569
|
+
case OpCode.Array: {
|
|
570
|
+
reg = read();
|
|
571
|
+
code = `${this.wv(reg)} = ([`;
|
|
572
|
+
break;
|
|
573
|
+
}
|
|
574
|
+
case OpCode.If: {
|
|
575
|
+
const cond = read();
|
|
576
|
+
code = `if (${this.rv(cond)} !== false && $ToBoolean(${this.rv(cond)}) !== false) {`;
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
579
|
+
case OpCode.IfNot: {
|
|
580
|
+
const cond = read();
|
|
581
|
+
code = `if (${this.rv(cond)} !== true && $ToBoolean(${this.rv(cond)}) !== true) {`;
|
|
582
|
+
break;
|
|
583
|
+
}
|
|
584
|
+
case OpCode.IfInit: {
|
|
585
|
+
const cond = read();
|
|
586
|
+
code = `if (${this.rv(cond)} !== undefined) {`;
|
|
587
|
+
break;
|
|
588
|
+
}
|
|
589
|
+
case OpCode.IfNotInit: {
|
|
590
|
+
const cond = read();
|
|
591
|
+
code = `if (${this.rv(cond)} === undefined) {`;
|
|
592
|
+
break;
|
|
593
|
+
}
|
|
594
|
+
case OpCode.IfNil: {
|
|
595
|
+
const cond = read();
|
|
596
|
+
code = `if (${this.rv(cond)} === null) {`;
|
|
597
|
+
break;
|
|
598
|
+
}
|
|
599
|
+
case OpCode.IfNotNil: {
|
|
600
|
+
const cond = read();
|
|
601
|
+
code = `if (${this.rv(cond)} !== null) {`;
|
|
602
|
+
break;
|
|
603
|
+
}
|
|
604
|
+
case OpCode.LoopFor: {
|
|
605
|
+
const nreg = read();
|
|
606
|
+
const iterable = read();
|
|
607
|
+
const regs = createArray(nreg - 1, (i) => this.wv(i + 2, -1));
|
|
608
|
+
regs.unshift("_");
|
|
609
|
+
const ir = this.wv(1, -1);
|
|
610
|
+
code = `for (let ${ir} of $Iterable(${this.rv(iterable)})) { ${ir} ??= null; Cp(); let ${regs.join(", ")};`;
|
|
611
|
+
break;
|
|
612
|
+
}
|
|
613
|
+
case OpCode.LoopRange:
|
|
614
|
+
case OpCode.LoopRangeExclusive: {
|
|
615
|
+
const nreg = read();
|
|
616
|
+
const start = read();
|
|
617
|
+
const end = read();
|
|
618
|
+
const exclusive = opcode === OpCode.LoopRangeExclusive;
|
|
619
|
+
const regs = createArray(nreg - 1, (i2) => this.wv(i2 + 2, -1));
|
|
620
|
+
regs.unshift("_");
|
|
621
|
+
const i = this.wv(1, -1);
|
|
622
|
+
code = `for (let start = $ToNumber(${this.rv(start)}), end = $ToNumber(${this.rv(end)}), ${i} = start; ${i} ${exclusive ? "<" : "<="} end; ${i} += 1) { Cp(); let ${regs.join(", ")};`;
|
|
623
|
+
break;
|
|
624
|
+
}
|
|
625
|
+
case OpCode.Loop: {
|
|
626
|
+
const nreg = read();
|
|
627
|
+
const regs = createArray(nreg, (i) => this.wv(i + 1, -1));
|
|
628
|
+
regs.unshift("_");
|
|
629
|
+
code = `while (true) { Cp(); let ${regs.join(", ")};`;
|
|
630
|
+
break;
|
|
631
|
+
}
|
|
632
|
+
case OpCode.Break: {
|
|
633
|
+
code = `break;`;
|
|
634
|
+
break;
|
|
635
|
+
}
|
|
636
|
+
case OpCode.Continue: {
|
|
637
|
+
code = `continue;`;
|
|
638
|
+
break;
|
|
639
|
+
}
|
|
640
|
+
default: {
|
|
641
|
+
code = `; // ${OpCode[opcode] ?? opcode}`;
|
|
642
|
+
break;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
this.codeLines.push(ident + code);
|
|
646
|
+
switch (opcode) {
|
|
647
|
+
case OpCode.FuncVarg:
|
|
648
|
+
case OpCode.Func: {
|
|
649
|
+
this.readClosure();
|
|
650
|
+
break;
|
|
651
|
+
}
|
|
652
|
+
case OpCode.If:
|
|
653
|
+
case OpCode.IfNot:
|
|
654
|
+
case OpCode.IfNil:
|
|
655
|
+
case OpCode.IfNotNil:
|
|
656
|
+
case OpCode.IfInit:
|
|
657
|
+
case OpCode.IfNotInit: {
|
|
658
|
+
this.readIfElse();
|
|
659
|
+
break;
|
|
660
|
+
}
|
|
661
|
+
case OpCode.Loop:
|
|
662
|
+
case OpCode.LoopFor:
|
|
663
|
+
case OpCode.LoopRange:
|
|
664
|
+
case OpCode.LoopRangeExclusive: {
|
|
665
|
+
this.identCounter++;
|
|
666
|
+
this.closureCounter++;
|
|
667
|
+
this.readBlockEnd(OpCode.LoopEnd);
|
|
668
|
+
break;
|
|
669
|
+
}
|
|
670
|
+
case OpCode.Record: {
|
|
671
|
+
this.readRecord(reg);
|
|
672
|
+
break;
|
|
673
|
+
}
|
|
674
|
+
case OpCode.Array: {
|
|
675
|
+
this.readArray(reg);
|
|
676
|
+
break;
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
/** 读取 chunk */
|
|
681
|
+
read() {
|
|
682
|
+
this.readConsts();
|
|
683
|
+
this.readCode();
|
|
684
|
+
this.addSourceMap();
|
|
685
|
+
}
|
|
686
|
+
/** 添加源映射 */
|
|
687
|
+
addSourceMap() {
|
|
688
|
+
if (!this.options.sourceMap) return;
|
|
689
|
+
let fileName = (this.options.fileName ?? "").trim();
|
|
690
|
+
const hasSchema = /^\w+:/.test(fileName);
|
|
691
|
+
if (!hasSchema) {
|
|
692
|
+
if (fileName.startsWith("/")) {
|
|
693
|
+
fileName = fileName.replace(/^\\+\s*/, "");
|
|
694
|
+
}
|
|
695
|
+
if (!fileName) {
|
|
696
|
+
fileName = `${sourceId++}.${this.options.input_mode === "Template" ? "miratpl" : "mira"}`;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
const data = {
|
|
700
|
+
version: 3,
|
|
701
|
+
file: fileName,
|
|
702
|
+
sourceRoot: hasSchema ? "" : ORIGIN,
|
|
703
|
+
sources: [fileName],
|
|
704
|
+
sourcesContent: [ArrayBuffer.isView(this.source) ? null : this.source],
|
|
705
|
+
names: [],
|
|
706
|
+
mappings: ""
|
|
707
|
+
};
|
|
708
|
+
const prefix = "//# ";
|
|
709
|
+
const sourceURL = hasSchema ? fileName : `${ORIGIN}/${fileName}.js`;
|
|
710
|
+
this.codeLines.push(
|
|
711
|
+
// Prevent source map from being recognized as of this file
|
|
712
|
+
`${prefix}sourceURL=${sourceURL}`,
|
|
713
|
+
`${prefix}sourceMappingURL=data:application/json;base64,${encodeURL(JSON.stringify(data))}`
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
|
|
718
|
+
// src/compiler/compile-bytecode.ts
|
|
719
|
+
import * as wasm from "@mirascript/wasm";
|
|
720
|
+
var module;
|
|
721
|
+
var loading;
|
|
722
|
+
async function loadModule() {
|
|
723
|
+
if (module != null) return;
|
|
724
|
+
if (loading) return loading;
|
|
725
|
+
const p = (async () => {
|
|
726
|
+
let mod;
|
|
727
|
+
try {
|
|
728
|
+
mod = await import("#compiler-bundle");
|
|
729
|
+
} catch (ex) {
|
|
730
|
+
console.warn("Failed to load compiler bundle, falling back to @mirascript/wasm");
|
|
731
|
+
mod = wasm;
|
|
732
|
+
}
|
|
733
|
+
await wasm.ready;
|
|
734
|
+
module = mod;
|
|
735
|
+
})();
|
|
736
|
+
void p.finally(() => {
|
|
737
|
+
if (loading === p) {
|
|
738
|
+
loading = void 0;
|
|
739
|
+
}
|
|
740
|
+
});
|
|
741
|
+
loading = p;
|
|
742
|
+
return p;
|
|
743
|
+
}
|
|
744
|
+
function checkModule() {
|
|
745
|
+
if (module == null) {
|
|
746
|
+
throw new Error("MiraScript compiler module is not loaded.");
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
function compileBytecodeSync(script, options) {
|
|
750
|
+
checkModule();
|
|
751
|
+
const result = module.compileSync(script, options);
|
|
752
|
+
return [result.chunk, result.diagnostics];
|
|
753
|
+
}
|
|
754
|
+
async function compileBytecode(script, options) {
|
|
755
|
+
await loadModule();
|
|
756
|
+
const result = "compile" in module ? await module.compile(script, options) : module.compileSync(script, options);
|
|
757
|
+
return [result.chunk, result.diagnostics];
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
export {
|
|
761
|
+
emit,
|
|
762
|
+
loadModule,
|
|
763
|
+
compileBytecodeSync,
|
|
764
|
+
compileBytecode
|
|
765
|
+
};
|
|
766
|
+
//# sourceMappingURL=chunk-5FQWUJIY.js.map
|