gofront 1.6.0 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/package.json +1 -1
  2. package/src/backend/js/expressions.js +238 -109
  3. package/src/backend/js/index.js +38 -1
  4. package/src/backend/js/runtime.js +953 -53
  5. package/src/backend/js/statements.js +55 -67
  6. package/src/backend/js/stdlib/base64.js +12 -0
  7. package/src/backend/js/stdlib/binary.js +102 -0
  8. package/src/backend/js/stdlib/bits.js +15 -1
  9. package/src/backend/js/stdlib/builder.js +28 -9
  10. package/src/backend/js/stdlib/bytes.js +75 -18
  11. package/src/backend/js/stdlib/errors.js +20 -1
  12. package/src/backend/js/stdlib/fmt.js +70 -13
  13. package/src/backend/js/stdlib/hex.js +17 -0
  14. package/src/backend/js/stdlib/html.js +1 -1
  15. package/src/backend/js/stdlib/index.js +16 -0
  16. package/src/backend/js/stdlib/io.js +105 -3
  17. package/src/backend/js/stdlib/math.js +13 -1
  18. package/src/backend/js/stdlib/path.js +18 -4
  19. package/src/backend/js/stdlib/rand.js +10 -5
  20. package/src/backend/js/stdlib/sha256.js +12 -0
  21. package/src/backend/js/stdlib/slices.js +52 -26
  22. package/src/backend/js/stdlib/strconv.js +21 -5
  23. package/src/backend/js/stdlib/strings.js +148 -15
  24. package/src/backend/js/stdlib/sync.js +13 -0
  25. package/src/backend/js/stdlib/time.js +90 -19
  26. package/src/backend/js/stdlib/unicode.js +2 -2
  27. package/src/backend/wasm/boundary.js +1207 -41
  28. package/src/backend/wasm/const-fold.js +205 -0
  29. package/src/backend/wasm/emit-builtins.js +203 -76
  30. package/src/backend/wasm/emit-exprs.js +464 -276
  31. package/src/backend/wasm/emit-maps.js +144 -8
  32. package/src/backend/wasm/emit-stdlib.js +12 -3005
  33. package/src/backend/wasm/emit-stmts.js +264 -270
  34. package/src/backend/wasm/emit.js +115 -87
  35. package/src/backend/wasm/encode.js +55 -29
  36. package/src/backend/wasm/index.js +1001 -32
  37. package/src/backend/wasm/optimize.js +13 -4
  38. package/src/backend/wasm/stdlib/bytes.js +5039 -0
  39. package/src/backend/wasm/stdlib/core.js +8903 -0
  40. package/src/backend/wasm/stdlib/index.js +40 -0
  41. package/src/backend/wasm/stdlib/io.js +2161 -0
  42. package/src/backend/wasm/stdlib/packages.js +2400 -0
  43. package/src/backend/wasm/stdlib/pure.js +720 -0
  44. package/src/backend/wasm/stdlib/time.js +1200 -0
  45. package/src/backend/wasm/types.js +153 -1
  46. package/src/cli-core.js +1 -1
  47. package/src/compiler.js +18 -4
  48. package/src/dts-parser.js +79 -126
  49. package/src/index.js +2 -6
  50. package/src/lexer.js +80 -29
  51. package/src/lower/boxing.js +1 -2
  52. package/src/lower/captures.js +2 -6
  53. package/src/lower/ownership.js +30 -9
  54. package/src/minifier.js +20 -68
  55. package/src/parser/declarations.js +3 -6
  56. package/src/parser/expressions.js +3 -8
  57. package/src/parser/index.js +18 -3
  58. package/src/parser/statements.js +25 -38
  59. package/src/parser/types.js +1 -2
  60. package/src/resolver.js +2 -27
  61. package/src/templ-lexer.js +29 -63
  62. package/src/templ-parser.js +22 -45
  63. package/src/typechecker/assignability.js +81 -13
  64. package/src/typechecker/expressions.js +102 -2
  65. package/src/typechecker/resolve.js +36 -6
  66. package/src/typechecker/stdlib/core.js +280 -89
  67. package/src/typechecker/stdlib/extended.js +453 -1
  68. package/src/typechecker/types.js +344 -6
@@ -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(keyGoType) {
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
- // leaves NaN as NaN (never equal, so the hash value is irrelevant).
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") {