gofront 1.6.0 → 1.7.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/README.md +35 -39
- package/package.json +37 -4
- package/src/backend/js/expressions.js +559 -144
- package/src/backend/js/index.js +174 -49
- package/src/backend/js/runtime.js +1518 -54
- package/src/backend/js/statements.js +91 -73
- package/src/backend/js/stdlib/base64.js +12 -0
- package/src/backend/js/stdlib/binary.js +102 -0
- package/src/backend/js/stdlib/bits.js +15 -1
- package/src/backend/js/stdlib/builder.js +28 -9
- package/src/backend/js/stdlib/bytes.js +75 -18
- package/src/backend/js/stdlib/errors.js +25 -1
- package/src/backend/js/stdlib/fmt.js +70 -13
- package/src/backend/js/stdlib/hex.js +17 -0
- package/src/backend/js/stdlib/html.js +1 -1
- package/src/backend/js/stdlib/index.js +28 -0
- package/src/backend/js/stdlib/io.js +105 -3
- package/src/backend/js/stdlib/json.js +972 -0
- package/src/backend/js/stdlib/math.js +13 -1
- package/src/backend/js/stdlib/path.js +18 -4
- package/src/backend/js/stdlib/rand.js +10 -5
- package/src/backend/js/stdlib/sha256.js +12 -0
- package/src/backend/js/stdlib/simd.js +24 -0
- package/src/backend/js/stdlib/slices.js +52 -26
- package/src/backend/js/stdlib/strconv.js +21 -5
- package/src/backend/js/stdlib/strings.js +148 -15
- package/src/backend/js/stdlib/sync.js +13 -0
- package/src/backend/js/stdlib/time.js +90 -19
- package/src/backend/js/stdlib/unicode.js +2 -2
- package/src/backend/wasm/boundary.js +1225 -41
- package/src/backend/wasm/const-fold.js +205 -0
- package/src/backend/wasm/emit-builtins.js +220 -76
- package/src/backend/wasm/emit-exprs.js +475 -276
- package/src/backend/wasm/emit-maps.js +144 -8
- package/src/backend/wasm/emit-stdlib.js +12 -3005
- package/src/backend/wasm/emit-stmts.js +264 -270
- package/src/backend/wasm/emit.js +124 -87
- package/src/backend/wasm/encode.js +140 -29
- package/src/backend/wasm/index.js +1001 -32
- package/src/backend/wasm/optimize.js +17 -6
- package/src/backend/wasm/stdlib/bytes.js +5039 -0
- package/src/backend/wasm/stdlib/core.js +8903 -0
- package/src/backend/wasm/stdlib/index.js +43 -0
- package/src/backend/wasm/stdlib/io.js +2161 -0
- package/src/backend/wasm/stdlib/packages.js +2400 -0
- package/src/backend/wasm/stdlib/pure.js +720 -0
- package/src/backend/wasm/stdlib/simd.js +234 -0
- package/src/backend/wasm/stdlib/time.js +1200 -0
- package/src/backend/wasm/types.js +174 -1
- package/src/backend/wasm/wat.js +37 -0
- package/src/cli-core.js +1 -1
- package/src/compiler.js +18 -4
- package/src/dts-parser.js +150 -140
- package/src/index.js +2 -6
- package/src/lexer.js +80 -29
- package/src/lower/boxing.js +1 -7
- package/src/lower/captures.js +2 -6
- package/src/lower/embedding.js +2 -1
- package/src/lower/ownership.js +30 -9
- package/src/minifier.js +20 -68
- package/src/parser/declarations.js +3 -6
- package/src/parser/expressions.js +3 -8
- package/src/parser/index.js +18 -3
- package/src/parser/statements.js +25 -38
- package/src/parser/struct-tag.js +144 -0
- package/src/parser/types.js +64 -8
- package/src/resolver.js +2 -27
- package/src/templ-lexer.js +29 -63
- package/src/templ-parser.js +22 -45
- package/src/typechecker/assignability.js +126 -13
- package/src/typechecker/expressions.js +168 -16
- package/src/typechecker/index.js +35 -8
- package/src/typechecker/resolve.js +187 -8
- package/src/typechecker/statements.js +68 -9
- package/src/typechecker/stdlib/core.js +280 -89
- package/src/typechecker/stdlib/extended.js +490 -1
- package/src/typechecker/stdlib/simd.js +73 -0
- package/src/typechecker/stdlib.js +2 -0
- package/src/typechecker/types.js +362 -9
- package/src/vendor.js +86 -11
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
isArrayType,
|
|
7
7
|
isInterfaceType,
|
|
8
8
|
isPointerToStruct,
|
|
9
|
+
isSigned,
|
|
9
10
|
isStringType,
|
|
10
11
|
toWasmType,
|
|
11
12
|
} from "./types.js";
|
|
@@ -64,11 +65,7 @@ export class MapsEmitter {
|
|
|
64
65
|
return null;
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
_unsupportedMapKey(
|
|
68
|
-
if (isArrayType(keyGoType, this.mod.checker))
|
|
69
|
-
return "array-typed map keys are not yet supported in wasm packages (planned)";
|
|
70
|
-
if (isInterfaceType(keyGoType, this.mod.checker))
|
|
71
|
-
return "interface-typed map keys are not yet supported in wasm packages (planned)";
|
|
68
|
+
_unsupportedMapKey(_keyGoType) {
|
|
72
69
|
return null;
|
|
73
70
|
}
|
|
74
71
|
|
|
@@ -81,6 +78,63 @@ export class MapsEmitter {
|
|
|
81
78
|
});
|
|
82
79
|
return;
|
|
83
80
|
}
|
|
81
|
+
if (isInterfaceType(keyGoType, this.mod.checker)) {
|
|
82
|
+
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
83
|
+
const hashIdx = this.mod.resolveFuncIndex("__any_hash");
|
|
84
|
+
this.pushInstruction({ op: "call", funcIndex: hashIdx });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (isArrayType(keyGoType, this.mod.checker)) {
|
|
88
|
+
const size = this._getArraySize(keyGoType);
|
|
89
|
+
if (size === 0) {
|
|
90
|
+
this.pushInstruction({ op: "i32.const", value: 17 });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const elemGoType = this._getArrayElemType(keyGoType);
|
|
94
|
+
const arrInfo = this.mod.getArrayType(elemGoType);
|
|
95
|
+
const h = this.allocLocal(null, "i32");
|
|
96
|
+
this.pushInstruction({ op: "i32.const", value: 17 });
|
|
97
|
+
this.pushInstruction({ op: "local.set", index: h });
|
|
98
|
+
|
|
99
|
+
const idx = this.allocLocal(null, "i32");
|
|
100
|
+
this.pushInstruction({ op: "i32.const", value: 0 });
|
|
101
|
+
this.pushInstruction({ op: "local.set", index: idx });
|
|
102
|
+
|
|
103
|
+
const elemLoc = this.allocLocal(null, arrInfo.elemWType);
|
|
104
|
+
|
|
105
|
+
this.pushInstruction({ op: "block", blockType: "void" });
|
|
106
|
+
this.pushInstruction({ op: "loop", blockType: "void" });
|
|
107
|
+
this.pushInstruction({ op: "local.get", index: idx });
|
|
108
|
+
this.pushInstruction({ op: "i32.const", value: size });
|
|
109
|
+
this.pushInstruction("i32.ge_s");
|
|
110
|
+
this.pushInstruction({ op: "br_if", depth: 1 });
|
|
111
|
+
|
|
112
|
+
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
113
|
+
this.pushInstruction({ op: "local.get", index: idx });
|
|
114
|
+
this.pushInstruction({
|
|
115
|
+
op: "array.get",
|
|
116
|
+
typeIndex: arrInfo.typeIndex,
|
|
117
|
+
});
|
|
118
|
+
this.pushInstruction({ op: "local.set", index: elemLoc });
|
|
119
|
+
|
|
120
|
+
this.pushInstruction({ op: "local.get", index: h });
|
|
121
|
+
this.pushInstruction({ op: "i32.const", value: 31 });
|
|
122
|
+
this.pushInstruction("i32.mul");
|
|
123
|
+
this.emitKeyHash(elemLoc, elemGoType);
|
|
124
|
+
this.pushInstruction("i32.add");
|
|
125
|
+
this.pushInstruction({ op: "local.set", index: h });
|
|
126
|
+
|
|
127
|
+
this.pushInstruction({ op: "local.get", index: idx });
|
|
128
|
+
this.pushInstruction({ op: "i32.const", value: 1 });
|
|
129
|
+
this.pushInstruction("i32.add");
|
|
130
|
+
this.pushInstruction({ op: "local.set", index: idx });
|
|
131
|
+
this.pushInstruction({ op: "br", depth: 0 });
|
|
132
|
+
this.pushInstruction("end");
|
|
133
|
+
this.pushInstruction("end");
|
|
134
|
+
|
|
135
|
+
this.pushInstruction({ op: "local.get", index: h });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
84
138
|
const wType = toWasmType(keyGoType, this.mod.checker, this.mod);
|
|
85
139
|
if (wType === "i64") {
|
|
86
140
|
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
@@ -113,20 +167,34 @@ export class MapsEmitter {
|
|
|
113
167
|
return;
|
|
114
168
|
}
|
|
115
169
|
// Floats: `x + 0.0` folds -0 onto +0 (they are equal keys in Go) and
|
|
116
|
-
//
|
|
170
|
+
// NaN elements never match (f32.eq/f64.eq returns false in key comparison).
|
|
117
171
|
if (wType === "f32") {
|
|
172
|
+
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
173
|
+
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
174
|
+
this.pushInstruction("f32.ne");
|
|
175
|
+
this.pushInstruction({ op: "if", blockType: "i32" });
|
|
176
|
+
this.pushInstruction({ op: "i32.const", value: 0 });
|
|
177
|
+
this.pushInstruction("else");
|
|
118
178
|
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
119
179
|
this.pushInstruction({ op: "f32.const", value: 0 });
|
|
120
180
|
this.pushInstruction("f32.add");
|
|
121
181
|
this.pushInstruction("i32.reinterpret_f32");
|
|
182
|
+
this.pushInstruction("end");
|
|
122
183
|
return;
|
|
123
184
|
}
|
|
124
185
|
if (wType === "f64") {
|
|
186
|
+
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
187
|
+
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
188
|
+
this.pushInstruction("f64.ne");
|
|
189
|
+
this.pushInstruction({ op: "if", blockType: "i32" });
|
|
190
|
+
this.pushInstruction({ op: "i32.const", value: 0 });
|
|
191
|
+
this.pushInstruction("else");
|
|
125
192
|
this.pushInstruction({ op: "local.get", index: keyLocal });
|
|
126
193
|
this.pushInstruction({ op: "f64.const", value: 0 });
|
|
127
194
|
this.pushInstruction("f64.add");
|
|
128
195
|
this.pushInstruction("i64.reinterpret_f64");
|
|
129
196
|
this.pushInstruction("i32.wrap_i64");
|
|
197
|
+
this.pushInstruction("end");
|
|
130
198
|
return;
|
|
131
199
|
}
|
|
132
200
|
const structInfo = this._structInfoForGoType(keyGoType);
|
|
@@ -175,6 +243,74 @@ export class MapsEmitter {
|
|
|
175
243
|
});
|
|
176
244
|
return;
|
|
177
245
|
}
|
|
246
|
+
if (isInterfaceType(keyGoType, this.mod.checker)) {
|
|
247
|
+
this.pushInstruction({ op: "local.get", index: k1Local });
|
|
248
|
+
this.pushInstruction({ op: "local.get", index: k2Local });
|
|
249
|
+
this._emitAnyEq();
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (isArrayType(keyGoType, this.mod.checker)) {
|
|
253
|
+
const size = this._getArraySize(keyGoType);
|
|
254
|
+
if (size === 0) {
|
|
255
|
+
this.pushInstruction({ op: "i32.const", value: 1 });
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const elemGoType = this._getArrayElemType(keyGoType);
|
|
259
|
+
const arrInfo = this.mod.getArrayType(elemGoType);
|
|
260
|
+
|
|
261
|
+
const idx = this.allocLocal(null, "i32");
|
|
262
|
+
this.pushInstruction({ op: "i32.const", value: 0 });
|
|
263
|
+
this.pushInstruction({ op: "local.set", index: idx });
|
|
264
|
+
|
|
265
|
+
const eqRes = this.allocLocal(null, "i32");
|
|
266
|
+
this.pushInstruction({ op: "i32.const", value: 1 });
|
|
267
|
+
this.pushInstruction({ op: "local.set", index: eqRes });
|
|
268
|
+
|
|
269
|
+
const f1 = this.allocLocal(null, arrInfo.elemWType);
|
|
270
|
+
const f2 = this.allocLocal(null, arrInfo.elemWType);
|
|
271
|
+
|
|
272
|
+
this.pushInstruction({ op: "block", blockType: "void" });
|
|
273
|
+
this.pushInstruction({ op: "loop", blockType: "void" });
|
|
274
|
+
this.pushInstruction({ op: "local.get", index: idx });
|
|
275
|
+
this.pushInstruction({ op: "i32.const", value: size });
|
|
276
|
+
this.pushInstruction("i32.ge_s");
|
|
277
|
+
this.pushInstruction({ op: "br_if", depth: 1 });
|
|
278
|
+
|
|
279
|
+
this.pushInstruction({ op: "local.get", index: k1Local });
|
|
280
|
+
this.pushInstruction({ op: "local.get", index: idx });
|
|
281
|
+
this.pushInstruction({
|
|
282
|
+
op: "array.get",
|
|
283
|
+
typeIndex: arrInfo.typeIndex,
|
|
284
|
+
});
|
|
285
|
+
this.pushInstruction({ op: "local.set", index: f1 });
|
|
286
|
+
|
|
287
|
+
this.pushInstruction({ op: "local.get", index: k2Local });
|
|
288
|
+
this.pushInstruction({ op: "local.get", index: idx });
|
|
289
|
+
this.pushInstruction({
|
|
290
|
+
op: "array.get",
|
|
291
|
+
typeIndex: arrInfo.typeIndex,
|
|
292
|
+
});
|
|
293
|
+
this.pushInstruction({ op: "local.set", index: f2 });
|
|
294
|
+
|
|
295
|
+
this.emitKeyEq(f1, f2, elemGoType);
|
|
296
|
+
this.pushInstruction("i32.eqz");
|
|
297
|
+
this.pushInstruction({ op: "if", blockType: "void" });
|
|
298
|
+
this.pushInstruction({ op: "i32.const", value: 0 });
|
|
299
|
+
this.pushInstruction({ op: "local.set", index: eqRes });
|
|
300
|
+
this.pushInstruction({ op: "br", depth: 2 });
|
|
301
|
+
this.pushInstruction("end");
|
|
302
|
+
|
|
303
|
+
this.pushInstruction({ op: "local.get", index: idx });
|
|
304
|
+
this.pushInstruction({ op: "i32.const", value: 1 });
|
|
305
|
+
this.pushInstruction("i32.add");
|
|
306
|
+
this.pushInstruction({ op: "local.set", index: idx });
|
|
307
|
+
this.pushInstruction({ op: "br", depth: 0 });
|
|
308
|
+
this.pushInstruction("end");
|
|
309
|
+
this.pushInstruction("end");
|
|
310
|
+
|
|
311
|
+
this.pushInstruction({ op: "local.get", index: eqRes });
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
178
314
|
const wType = toWasmType(keyGoType, this.mod.checker, this.mod);
|
|
179
315
|
if (wType === "i64") {
|
|
180
316
|
this.pushInstruction({ op: "local.get", index: k1Local });
|
|
@@ -251,13 +387,13 @@ export class MapsEmitter {
|
|
|
251
387
|
if (wType === "i64") {
|
|
252
388
|
this.pushInstruction({ op: "local.get", index: v1Loc });
|
|
253
389
|
this.pushInstruction({ op: "local.get", index: v2Loc });
|
|
254
|
-
this.pushInstruction("i64.lt_s");
|
|
390
|
+
this.pushInstruction(isSigned(elemGoType) ? "i64.lt_s" : "i64.lt_u");
|
|
255
391
|
return;
|
|
256
392
|
}
|
|
257
393
|
if (wType === "i32") {
|
|
258
394
|
this.pushInstruction({ op: "local.get", index: v1Loc });
|
|
259
395
|
this.pushInstruction({ op: "local.get", index: v2Loc });
|
|
260
|
-
this.pushInstruction("i32.lt_s");
|
|
396
|
+
this.pushInstruction(isSigned(elemGoType) ? "i32.lt_s" : "i32.lt_u");
|
|
261
397
|
return;
|
|
262
398
|
}
|
|
263
399
|
if (wType === "f32") {
|