gofront 1.7.0 → 1.9.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.
Files changed (194) hide show
  1. package/README.md +14 -14
  2. package/package.json +10 -38
  3. package/src/backend/js/expressions.js +2060 -389
  4. package/src/backend/js/index.js +586 -174
  5. package/src/backend/js/natives.js +383 -0
  6. package/src/backend/js/runtime.js +936 -1644
  7. package/src/backend/js/statements.js +1349 -132
  8. package/src/backend/js/stdlib/index.js +51 -94
  9. package/src/backend/js/templ.js +67 -118
  10. package/src/backend/js/type-info.js +436 -0
  11. package/src/backend/shared/fixed-float.js +20 -0
  12. package/src/backend/shared/fmt-types.js +80 -0
  13. package/src/backend/shared/host-unicode.js +36 -0
  14. package/src/backend/wasm/boundary.js +753 -872
  15. package/src/backend/wasm/emit-builtins.js +914 -237
  16. package/src/backend/wasm/emit-exprs.js +1456 -195
  17. package/src/backend/wasm/emit-maps.js +78 -380
  18. package/src/backend/wasm/emit-stmts.js +1659 -214
  19. package/src/backend/wasm/emit.js +614 -88
  20. package/src/backend/wasm/encode.js +43 -13
  21. package/src/backend/wasm/globals.js +491 -0
  22. package/src/backend/wasm/glue.js +2 -4
  23. package/src/backend/wasm/index.js +406 -3195
  24. package/src/backend/wasm/method-expr.js +392 -0
  25. package/src/backend/wasm/module-emitter.js +1615 -0
  26. package/src/backend/wasm/monomorph.js +164 -9
  27. package/src/backend/wasm/natives.js +596 -0
  28. package/src/backend/wasm/prescan.js +249 -0
  29. package/src/backend/wasm/prune-funcs.js +89 -0
  30. package/src/backend/wasm/stdlib/index.js +2 -37
  31. package/src/backend/wasm/stdlib/simd.js +293 -28
  32. package/src/backend/wasm/types.js +260 -27
  33. package/src/backend/wasm/variadic.js +93 -0
  34. package/src/backend/wasm/wat.js +47 -20
  35. package/src/{cli-core.js → cli/cli-core.js} +241 -11
  36. package/src/{test-runner.js → cli/test-runner.js} +188 -122
  37. package/src/{vendor.js → cli/vendor.js} +3 -4
  38. package/src/compiler.js +202 -386
  39. package/src/index.js +15 -169
  40. package/src/{lexer.js → lexer/lexer.js} +203 -62
  41. package/src/{templ-lexer.js → lexer/templ-lexer.js} +61 -18
  42. package/src/{tokens.js → lexer/tokens.js} +2 -0
  43. package/src/link/sourcemap.js +97 -0
  44. package/src/link/stdlib.js +737 -0
  45. package/src/link/type-names.js +148 -0
  46. package/src/link/wasm.js +318 -0
  47. package/src/lower/bounds.js +547 -0
  48. package/src/lower/boxing.js +1 -1
  49. package/src/lower/captures.js +267 -64
  50. package/src/lower/embedding.js +32 -3
  51. package/src/lower/errors-as.js +196 -0
  52. package/src/lower/fmt-formatters.js +905 -0
  53. package/src/lower/functions.js +2 -0
  54. package/src/lower/gen-types.js +274 -0
  55. package/src/lower/index.js +33 -19
  56. package/src/lower/json-codecs.js +1379 -0
  57. package/src/lower/ownership.js +47 -8
  58. package/src/lower/range.js +86 -1
  59. package/src/lower/reachability.js +150 -0
  60. package/src/lower/walk.js +12 -0
  61. package/src/parser/declarations.js +83 -15
  62. package/src/parser/expressions.js +110 -18
  63. package/src/parser/index.js +2 -1
  64. package/src/parser/statements.js +38 -22
  65. package/src/{templ-parser.js → parser/templ.js} +179 -17
  66. package/src/parser/types.js +70 -9
  67. package/src/resolver.js +21 -1
  68. package/src/typechecker/assignability.js +291 -19
  69. package/src/typechecker/const-fold.js +399 -0
  70. package/src/typechecker/constants.js +282 -0
  71. package/src/typechecker/expressions.js +1220 -183
  72. package/src/typechecker/index.js +659 -92
  73. package/src/typechecker/init-order.js +426 -0
  74. package/src/typechecker/operand-text.js +40 -0
  75. package/src/typechecker/resolve.js +613 -62
  76. package/src/typechecker/statements.js +212 -20
  77. package/src/typechecker/stdlib/excluded.js +902 -0
  78. package/src/typechecker/stdlib/index.js +38 -0
  79. package/src/typechecker/stdlib/simd.js +65 -15
  80. package/src/typechecker/termination.js +11 -2
  81. package/src/typechecker/types.js +268 -514
  82. package/stdlib/bytes/buffer.go +479 -0
  83. package/stdlib/bytes/bytes.go +1010 -0
  84. package/stdlib/bytes/reader.go +161 -0
  85. package/stdlib/cmp/cmp.go +65 -0
  86. package/stdlib/context/context.go +115 -0
  87. package/stdlib/crypto/rand/rand.go +34 -0
  88. package/stdlib/crypto/sha256/sha256.go +249 -0
  89. package/stdlib/encoding/base64/base64.go +331 -0
  90. package/stdlib/encoding/binary/binary.go +332 -0
  91. package/stdlib/encoding/hex/hex.go +140 -0
  92. package/stdlib/encoding/json/errors.go +31 -0
  93. package/stdlib/encoding/json/indent.go +71 -0
  94. package/stdlib/encoding/json/json.go +62 -0
  95. package/stdlib/encoding/json/number.go +12 -0
  96. package/stdlib/encoding/json/stream.go +173 -0
  97. package/stdlib/errors/errors.go +174 -0
  98. package/stdlib/fmt/errors.go +110 -0
  99. package/stdlib/fmt/format.go +732 -0
  100. package/stdlib/fmt/print.go +1232 -0
  101. package/stdlib/gom/gom.go +293 -0
  102. package/stdlib/hash/hash.go +53 -0
  103. package/stdlib/html/html.go +251 -0
  104. package/stdlib/internal/fmtrt/fmtrt.go +163 -0
  105. package/stdlib/internal/jsonrt/dec.go +871 -0
  106. package/stdlib/internal/jsonrt/enc.go +516 -0
  107. package/stdlib/internal/jsonrt/indent.go +135 -0
  108. package/stdlib/internal/jsonrt/number.go +27 -0
  109. package/stdlib/internal/jsonrt/reader.go +73 -0
  110. package/stdlib/internal/jsonrt/scanner.go +658 -0
  111. package/stdlib/io/io.go +502 -0
  112. package/stdlib/iter/iter.go +18 -0
  113. package/stdlib/maps/maps.go +131 -0
  114. package/stdlib/math/bits/bits.go +507 -0
  115. package/stdlib/math/extra.go +272 -0
  116. package/stdlib/math/math.go +439 -0
  117. package/stdlib/math/rand/rand.go +297 -0
  118. package/stdlib/os/os.go +93 -0
  119. package/stdlib/path/filepath/filepath.go +47 -0
  120. package/stdlib/path/path.go +394 -0
  121. package/stdlib/regexp/regexp.go +231 -0
  122. package/stdlib/slices/slices.go +526 -0
  123. package/stdlib/slices/sort.go +209 -0
  124. package/stdlib/slices/zsort_cmp.go +480 -0
  125. package/stdlib/slices/zsort_ordered.go +482 -0
  126. package/stdlib/sort/sort.go +500 -0
  127. package/stdlib/sort/zsort_func.go +480 -0
  128. package/stdlib/sort/zsort_iface.go +480 -0
  129. package/stdlib/strconv/float.go +1699 -0
  130. package/stdlib/strconv/isprint.go +752 -0
  131. package/stdlib/strconv/quote.go +526 -0
  132. package/stdlib/strconv/strconv.go +616 -0
  133. package/stdlib/strings/builder.go +95 -0
  134. package/stdlib/strings/reader.go +163 -0
  135. package/stdlib/strings/replacer.go +102 -0
  136. package/stdlib/strings/strings.go +807 -0
  137. package/stdlib/sync/sync.go +268 -0
  138. package/stdlib/testing/async_js.go +61 -0
  139. package/stdlib/testing/benchmark.go +297 -0
  140. package/stdlib/testing/testing.go +523 -0
  141. package/stdlib/time/duration.go +233 -0
  142. package/stdlib/time/format.go +745 -0
  143. package/stdlib/time/parse.go +790 -0
  144. package/stdlib/time/sleep_js.go +63 -0
  145. package/stdlib/time/time.go +834 -0
  146. package/stdlib/unicode/unicode.go +250 -0
  147. package/stdlib/unicode/utf8/utf8.go +464 -0
  148. package/src/backend/js/stdlib/base64.js +0 -12
  149. package/src/backend/js/stdlib/binary.js +0 -102
  150. package/src/backend/js/stdlib/bits.js +0 -46
  151. package/src/backend/js/stdlib/builder.js +0 -63
  152. package/src/backend/js/stdlib/bytes.js +0 -122
  153. package/src/backend/js/stdlib/errors.js +0 -44
  154. package/src/backend/js/stdlib/fmt.js +0 -178
  155. package/src/backend/js/stdlib/gom.js +0 -155
  156. package/src/backend/js/stdlib/hex.js +0 -17
  157. package/src/backend/js/stdlib/html.js +0 -20
  158. package/src/backend/js/stdlib/io.js +0 -137
  159. package/src/backend/js/stdlib/json.js +0 -972
  160. package/src/backend/js/stdlib/maps.js +0 -45
  161. package/src/backend/js/stdlib/math.js +0 -69
  162. package/src/backend/js/stdlib/os.js +0 -13
  163. package/src/backend/js/stdlib/path.js +0 -48
  164. package/src/backend/js/stdlib/rand.js +0 -32
  165. package/src/backend/js/stdlib/regexp.js +0 -54
  166. package/src/backend/js/stdlib/sha256.js +0 -12
  167. package/src/backend/js/stdlib/shared.js +0 -17
  168. package/src/backend/js/stdlib/simd.js +0 -24
  169. package/src/backend/js/stdlib/slices.js +0 -77
  170. package/src/backend/js/stdlib/sort.js +0 -30
  171. package/src/backend/js/stdlib/strconv.js +0 -74
  172. package/src/backend/js/stdlib/strings.js +0 -222
  173. package/src/backend/js/stdlib/sync.js +0 -13
  174. package/src/backend/js/stdlib/testing.js +0 -34
  175. package/src/backend/js/stdlib/time.js +0 -128
  176. package/src/backend/js/stdlib/unicode.js +0 -25
  177. package/src/backend/js/stdlib/utf8.js +0 -26
  178. package/src/backend/wasm/const-fold.js +0 -205
  179. package/src/backend/wasm/emit-stdlib.js +0 -13
  180. package/src/backend/wasm/stdlib/bytes.js +0 -5039
  181. package/src/backend/wasm/stdlib/core.js +0 -8903
  182. package/src/backend/wasm/stdlib/io.js +0 -2161
  183. package/src/backend/wasm/stdlib/packages.js +0 -2400
  184. package/src/backend/wasm/stdlib/pure.js +0 -720
  185. package/src/backend/wasm/stdlib/time.js +0 -1200
  186. package/src/typechecker/stdlib/core.js +0 -801
  187. package/src/typechecker/stdlib/extended.js +0 -914
  188. package/src/typechecker/stdlib.js +0 -22
  189. /package/src/{asset-manager.js → cli/asset-manager.js} +0 -0
  190. /package/src/{colors.js → cli/colors.js} +0 -0
  191. /package/src/{dev-server.js → cli/dev-server.js} +0 -0
  192. /package/src/{minifier.js → cli/minifier.js} +0 -0
  193. /package/src/{project-config.js → cli/project-config.js} +0 -0
  194. /package/src/{pwa.js → cli/pwa.js} +0 -0
@@ -0,0 +1,38 @@
1
+ // stdlib.js — built-in namespace and browser-global registration for the GoFront type
2
+ // checker. Called once from TypeChecker._setupGlobals() during construction.
3
+ //
4
+ // Registers browser globals and built-in functions, then delegates to the
5
+ // shared, simd and web sub-modules.
6
+
7
+ import { ANY, BROWSER_GLOBALS } from "../types.js";
8
+ import { setupSharedGlobals } from "./shared.js";
9
+ import { setupSimdGlobals } from "./simd.js";
10
+ import { setupWebGlobals } from "./web.js";
11
+
12
+ export function setupGlobals(globals, types) {
13
+ for (const g of BROWSER_GLOBALS) globals.define(g, ANY);
14
+ for (const name of [
15
+ "append",
16
+ "len",
17
+ "cap",
18
+ "make",
19
+ "delete",
20
+ "print",
21
+ "println",
22
+ "panic",
23
+ "recover",
24
+ "new",
25
+ "copy",
26
+ "error",
27
+ "min",
28
+ "max",
29
+ "clear",
30
+ "complex",
31
+ "real",
32
+ "imag",
33
+ ])
34
+ globals.define(name, { kind: "builtin", name });
35
+ setupSharedGlobals(globals, types);
36
+ setupSimdGlobals(globals, types);
37
+ setupWebGlobals(globals, types);
38
+ }
@@ -5,7 +5,7 @@
5
5
  // - Lowered to WASM v128 in wasm packages.
6
6
  // - Lowered to a frozen 4-number array with Math.fround in js packages.
7
7
 
8
- import { FLOAT32, INT } from "../types.js";
8
+ import { BOOL, FLOAT32, INT } from "../types.js";
9
9
 
10
10
  export function setupSimdGlobals(globals, types) {
11
11
  const f32x4Type = {
@@ -19,25 +19,69 @@ export function setupSimdGlobals(globals, types) {
19
19
  },
20
20
  };
21
21
 
22
+ const mask32x4Type = {
23
+ kind: "named",
24
+ name: "simd.Mask32x4",
25
+ underlying: {
26
+ kind: "simd",
27
+ simd: "Mask32x4",
28
+ elem: BOOL,
29
+ lanes: 4,
30
+ },
31
+ };
32
+
33
+ const fn = (params, returns) => ({ kind: "func", params, returns });
34
+ const unary = fn([], [f32x4Type]);
35
+ const binary = fn([f32x4Type], [f32x4Type]);
36
+ const compare = fn([f32x4Type], [mask32x4Type]);
37
+
22
38
  f32x4Type.underlying.methods = new Map([
23
- ["Add", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
24
- ["Sub", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
25
- ["Mul", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
26
- ["Div", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
27
- ["Min", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
28
- ["Max", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
29
- ["Dot3", { kind: "func", params: [f32x4Type], returns: [FLOAT32] }],
30
- ["Dot4", { kind: "func", params: [f32x4Type], returns: [FLOAT32] }],
31
- ["Lane", { kind: "func", params: [INT], returns: [FLOAT32] }],
32
- [
33
- "WithLane",
34
- { kind: "func", params: [INT, FLOAT32], returns: [f32x4Type] },
35
- ],
36
- ["Splat", { kind: "func", params: [FLOAT32], returns: [f32x4Type] }],
39
+ ["Add", binary],
40
+ ["Sub", binary],
41
+ ["Mul", binary],
42
+ ["Div", binary],
43
+ ["Min", binary],
44
+ ["Max", binary],
45
+ ["MulAdd", fn([f32x4Type, f32x4Type], [f32x4Type])],
46
+ ["Neg", unary],
47
+ ["Abs", unary],
48
+ ["Sqrt", unary],
49
+ ["Floor", unary],
50
+ ["Ceil", unary],
51
+ ["Trunc", unary],
52
+ ["RoundToEven", unary],
53
+ ["Dot3", fn([f32x4Type], [FLOAT32])],
54
+ ["Dot4", fn([f32x4Type], [FLOAT32])],
55
+ ["Sum", fn([], [FLOAT32])],
56
+ ["Lane", fn([INT], [FLOAT32])],
57
+ ["WithLane", fn([INT, FLOAT32], [f32x4Type])],
58
+ ["Splat", fn([FLOAT32], [f32x4Type])],
59
+ ["Swizzle", fn([INT, INT, INT, INT], [f32x4Type])],
60
+ ["Equal", compare],
61
+ ["NotEqual", compare],
62
+ ["Less", compare],
63
+ ["LessEqual", compare],
64
+ ["Greater", compare],
65
+ ["GreaterEqual", compare],
66
+ ]);
67
+
68
+ const maskBinary = fn([mask32x4Type], [mask32x4Type]);
69
+ mask32x4Type.underlying.methods = new Map([
70
+ ["And", maskBinary],
71
+ ["Or", maskBinary],
72
+ ["Xor", maskBinary],
73
+ ["AndNot", maskBinary],
74
+ ["Not", fn([], [mask32x4Type])],
75
+ ["Any", fn([], [BOOL])],
76
+ ["All", fn([], [BOOL])],
77
+ ["Bits", fn([], [INT])],
78
+ ["Lane", fn([INT], [BOOL])],
37
79
  ]);
38
80
 
39
81
  types.set("simd.F32x4", f32x4Type);
40
82
  types.set("F32x4", f32x4Type);
83
+ types.set("simd.Mask32x4", mask32x4Type);
84
+ types.set("Mask32x4", mask32x4Type);
41
85
 
42
86
  const sharedFloat32 = types.get("shared.Float32") ?? {
43
87
  kind: "named",
@@ -47,6 +91,9 @@ export function setupSimdGlobals(globals, types) {
47
91
 
48
92
  const members = {
49
93
  F32x4: f32x4Type,
94
+ Mask32x4: mask32x4Type,
95
+ Select: fn([mask32x4Type, f32x4Type, f32x4Type], [f32x4Type]),
96
+ Shuffle: fn([f32x4Type, f32x4Type, INT, INT, INT, INT], [f32x4Type]),
50
97
  NewF32x4: {
51
98
  kind: "func",
52
99
  params: [FLOAT32, FLOAT32, FLOAT32, FLOAT32],
@@ -62,6 +109,9 @@ export function setupSimdGlobals(globals, types) {
62
109
  params: [sharedFloat32, INT],
63
110
  returns: [f32x4Type],
64
111
  },
112
+ LoadF32x4Slice: fn([{ kind: "slice", elem: FLOAT32 }, INT], [f32x4Type]),
113
+ StoreF32x4Slice: fn([{ kind: "slice", elem: FLOAT32 }, INT, f32x4Type], []),
114
+ Pad4: fn([INT], [INT]),
65
115
  StoreF32x4: {
66
116
  kind: "func",
67
117
  params: [sharedFloat32, INT, f32x4Type],
@@ -19,7 +19,7 @@ export const terminationMethods = {
19
19
  case "ReturnStmt":
20
20
  return true;
21
21
  case "BranchStmt":
22
- return false;
22
+ return stmt.keyword === "goto";
23
23
  case "ExprStmt":
24
24
  return this._isPanicCall(stmt.expr);
25
25
  case "LabeledStmt":
@@ -64,15 +64,24 @@ export const terminationMethods = {
64
64
 
65
65
  _isTerminatingSwitch(stmt) {
66
66
  let hasDefault = false;
67
- for (const c of stmt.cases ?? []) {
67
+ const cases = stmt.cases ?? [];
68
+ for (let i = 0; i < cases.length; i++) {
69
+ const c = cases[i];
68
70
  if (!c.list) hasDefault = true;
69
71
  if (!c.stmts?.length) return false;
70
72
  const last = c.stmts[c.stmts.length - 1];
73
+ // `fallthrough` hands control to the next clause, which is checked
74
+ // on its own; the final clause has none to fall into.
75
+ if (this._isFallthrough(last) && i < cases.length - 1) continue;
71
76
  if (!this._isTerminating(last)) return false;
72
77
  }
73
78
  return hasDefault;
74
79
  },
75
80
 
81
+ _isFallthrough(stmt) {
82
+ return stmt?.kind === "BranchStmt" && stmt.keyword === "fallthrough";
83
+ },
84
+
76
85
  _isTerminatingTypeSwitch(stmt) {
77
86
  let hasDefault = false;
78
87
  for (const c of stmt.cases ?? []) {