gofront 1.7.0 → 1.8.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 (128) hide show
  1. package/README.md +13 -13
  2. package/package.json +8 -37
  3. package/src/backend/js/expressions.js +1341 -148
  4. package/src/backend/js/fmt-runtime.js +573 -0
  5. package/src/backend/js/index.js +375 -57
  6. package/src/backend/js/runtime.js +1460 -133
  7. package/src/backend/js/statements.js +900 -86
  8. package/src/backend/js/stdlib/bits.js +87 -14
  9. package/src/backend/js/stdlib/builder.js +41 -6
  10. package/src/backend/js/stdlib/bytes.js +253 -7
  11. package/src/backend/js/stdlib/errors.js +2 -1
  12. package/src/backend/js/stdlib/fmt.js +349 -10
  13. package/src/backend/js/stdlib/index.js +8 -3
  14. package/src/backend/js/stdlib/json.js +247 -52
  15. package/src/backend/js/stdlib/maps.js +0 -8
  16. package/src/backend/js/stdlib/math.js +17 -1
  17. package/src/backend/js/stdlib/simd.js +10 -0
  18. package/src/backend/js/stdlib/slices.js +36 -6
  19. package/src/backend/js/stdlib/strconv.js +10 -5
  20. package/src/backend/js/stdlib/strings.js +83 -4
  21. package/src/backend/js/stdlib/testing.js +7 -0
  22. package/src/backend/js/stdlib/time.js +79 -55
  23. package/src/backend/js/stdlib/unicode.js +1 -1
  24. package/src/backend/js/stdlib/utf8.js +1 -1
  25. package/src/backend/js/templ.js +38 -76
  26. package/src/backend/js/type-info.js +272 -0
  27. package/src/backend/shared/fmt-types.js +188 -0
  28. package/src/backend/wasm/boundary.js +436 -80
  29. package/src/backend/wasm/emit-builtins.js +303 -13
  30. package/src/backend/wasm/emit-exprs.js +1397 -203
  31. package/src/backend/wasm/emit-maps.js +61 -13
  32. package/src/backend/wasm/emit-stmts.js +1359 -164
  33. package/src/backend/wasm/emit.js +512 -77
  34. package/src/backend/wasm/encode.js +43 -13
  35. package/src/backend/wasm/globals.js +452 -0
  36. package/src/backend/wasm/index.js +194 -2489
  37. package/src/backend/wasm/method-expr.js +381 -0
  38. package/src/backend/wasm/module-emitter.js +2240 -0
  39. package/src/backend/wasm/monomorph.js +62 -4
  40. package/src/backend/wasm/prescan.js +397 -0
  41. package/src/backend/wasm/stdlib/bytes.js +1804 -127
  42. package/src/backend/wasm/stdlib/core.js +1574 -199
  43. package/src/backend/wasm/stdlib/index.js +0 -5
  44. package/src/backend/wasm/stdlib/io.js +1567 -150
  45. package/src/backend/wasm/stdlib/packages.js +2 -0
  46. package/src/backend/wasm/stdlib/simd.js +293 -28
  47. package/src/backend/wasm/stdlib/time.js +1041 -12
  48. package/src/backend/wasm/types.js +200 -15
  49. package/src/backend/wasm/variadic.js +93 -0
  50. package/src/backend/wasm/wat.js +47 -20
  51. package/src/{cli-core.js → cli/cli-core.js} +236 -10
  52. package/src/{test-runner.js → cli/test-runner.js} +332 -39
  53. package/src/{vendor.js → cli/vendor.js} +3 -4
  54. package/src/compiler.js +107 -269
  55. package/src/index.js +15 -169
  56. package/src/{lexer.js → lexer/lexer.js} +102 -55
  57. package/src/{tokens.js → lexer/tokens.js} +1 -0
  58. package/src/link/sourcemap.js +97 -0
  59. package/src/link/stdlib.js +515 -0
  60. package/src/link/wasm.js +294 -0
  61. package/src/lower/bounds.js +394 -0
  62. package/src/lower/boxing.js +1 -1
  63. package/src/lower/captures.js +176 -32
  64. package/src/lower/index.js +26 -18
  65. package/src/lower/json-codecs.js +1398 -0
  66. package/src/lower/ownership.js +22 -1
  67. package/src/lower/range.js +86 -1
  68. package/src/lower/reachability.js +132 -0
  69. package/src/parser/declarations.js +58 -13
  70. package/src/parser/expressions.js +29 -7
  71. package/src/parser/index.js +2 -1
  72. package/src/parser/statements.js +37 -22
  73. package/src/{templ-parser.js → parser/templ.js} +138 -15
  74. package/src/parser/types.js +69 -9
  75. package/src/resolver.js +22 -1
  76. package/src/typechecker/assignability.js +176 -17
  77. package/src/typechecker/const-fold.js +356 -0
  78. package/src/typechecker/constants.js +256 -0
  79. package/src/typechecker/expressions.js +931 -122
  80. package/src/typechecker/index.js +459 -67
  81. package/src/typechecker/init-order.js +330 -0
  82. package/src/typechecker/resolve.js +451 -56
  83. package/src/typechecker/statements.js +90 -9
  84. package/src/typechecker/stdlib/core.js +333 -55
  85. package/src/typechecker/stdlib/excluded.js +898 -0
  86. package/src/typechecker/stdlib/extended.js +322 -26
  87. package/src/typechecker/{stdlib.js → stdlib/index.js} +5 -5
  88. package/src/typechecker/stdlib/simd.js +65 -15
  89. package/src/typechecker/termination.js +1 -1
  90. package/src/typechecker/types.js +149 -25
  91. package/stdlib/bytes/iter.go +192 -0
  92. package/stdlib/bytes/search.go +240 -0
  93. package/stdlib/bytes/split.go +218 -0
  94. package/stdlib/cmp/cmp.go +65 -0
  95. package/stdlib/encoding/json/errors.go +31 -0
  96. package/stdlib/encoding/json/indent.go +71 -0
  97. package/stdlib/encoding/json/number.go +12 -0
  98. package/stdlib/encoding/json/stream.go +173 -0
  99. package/stdlib/errors/overlay.go +12 -0
  100. package/stdlib/hash/hash.go +53 -0
  101. package/stdlib/internal/jsonrt/dec.go +738 -0
  102. package/stdlib/internal/jsonrt/enc.go +366 -0
  103. package/stdlib/internal/jsonrt/indent.go +135 -0
  104. package/stdlib/internal/jsonrt/number.go +27 -0
  105. package/stdlib/internal/jsonrt/reader.go +73 -0
  106. package/stdlib/internal/jsonrt/scanner.go +649 -0
  107. package/stdlib/io/io.go +346 -0
  108. package/stdlib/iter/iter.go +18 -0
  109. package/stdlib/maps/iter.go +65 -0
  110. package/stdlib/math/extra.go +270 -0
  111. package/stdlib/slices/extra.go +73 -0
  112. package/stdlib/slices/iter.go +113 -0
  113. package/stdlib/sort/sort.go +561 -0
  114. package/stdlib/strconv/quote.go +341 -0
  115. package/stdlib/strings/extra.go +35 -0
  116. package/stdlib/strings/iter.go +122 -0
  117. package/stdlib/sync/extra.go +105 -0
  118. package/stdlib/unicode/unicode.go +112 -0
  119. package/stdlib/unicode/utf8/bytes.go +239 -0
  120. package/src/backend/wasm/const-fold.js +0 -205
  121. package/src/backend/wasm/emit-stdlib.js +0 -13
  122. /package/src/{asset-manager.js → cli/asset-manager.js} +0 -0
  123. /package/src/{colors.js → cli/colors.js} +0 -0
  124. /package/src/{dev-server.js → cli/dev-server.js} +0 -0
  125. /package/src/{minifier.js → cli/minifier.js} +0 -0
  126. /package/src/{project-config.js → cli/project-config.js} +0 -0
  127. /package/src/{pwa.js → cli/pwa.js} +0 -0
  128. /package/src/{templ-lexer.js → lexer/templ-lexer.js} +0 -0
@@ -9,8 +9,6 @@ import {
9
9
  FLOAT32,
10
10
  FLOAT64,
11
11
  INT,
12
- INT8,
13
- INT16,
14
12
  INT32,
15
13
  INT64,
16
14
  STRING,
@@ -19,9 +17,48 @@ import {
19
17
  UINT16,
20
18
  UINT32,
21
19
  UINT64,
20
+ UNTYPED_INT,
22
21
  VOID,
23
22
  } from "../types.js";
24
23
 
24
+ const MONTH_T = {
25
+ kind: "named",
26
+ name: "time.Month",
27
+ underlying: INT,
28
+ methods: new Map([
29
+ ["String", { kind: "func", params: [], returns: [STRING] }],
30
+ ]),
31
+ };
32
+
33
+ const WEEKDAY_T = {
34
+ kind: "named",
35
+ name: "time.Weekday",
36
+ underlying: INT,
37
+ methods: new Map([
38
+ ["String", { kind: "func", params: [], returns: [STRING] }],
39
+ ]),
40
+ };
41
+
42
+ const LOCATION_T = {
43
+ kind: "named",
44
+ name: "time.Location",
45
+ underlying: {
46
+ kind: "struct",
47
+ fields: new Map([
48
+ ["_name", STRING],
49
+ ["_offset", INT],
50
+ ]),
51
+ methods: new Map([
52
+ ["String", { kind: "func", params: [], returns: [STRING] }],
53
+ ]),
54
+ },
55
+ };
56
+ LOCATION_T.methods = LOCATION_T.underlying.methods;
57
+ const LOCATION_PTR_T = {
58
+ kind: "pointer",
59
+ base: LOCATION_T,
60
+ };
61
+
25
62
  const DURATION_T = {
26
63
  kind: "named",
27
64
  name: "time.Duration",
@@ -36,6 +73,44 @@ const DURATION_T = {
36
73
  ["String", { kind: "func", params: [], returns: [STRING] }],
37
74
  ]),
38
75
  };
76
+ DURATION_T.methods.set("Truncate", {
77
+ kind: "func",
78
+ params: [DURATION_T],
79
+ returns: [DURATION_T],
80
+ });
81
+ DURATION_T.methods.set("Round", {
82
+ kind: "func",
83
+ params: [DURATION_T],
84
+ returns: [DURATION_T],
85
+ });
86
+ DURATION_T.methods.set("Abs", {
87
+ kind: "func",
88
+ params: [],
89
+ returns: [DURATION_T],
90
+ });
91
+
92
+ const TIMER_T = {
93
+ kind: "named",
94
+ name: "time.Timer",
95
+ underlying: {
96
+ kind: "struct",
97
+ fields: new Map(),
98
+ methods: new Map([
99
+ ["Stop", { kind: "func", params: [], returns: [BOOL], _ptrRecv: true }],
100
+ [
101
+ "Reset",
102
+ { kind: "func", params: [DURATION_T], returns: [BOOL], _ptrRecv: true },
103
+ ],
104
+ ]),
105
+ },
106
+ };
107
+ TIMER_T.methods = TIMER_T.underlying.methods;
108
+ const TIMER_PTR_T = {
109
+ kind: "pointer",
110
+ base: TIMER_T,
111
+ };
112
+
113
+ const TIME_BYTES = { kind: "slice", elem: UINT8 };
39
114
  const TIME_T = {
40
115
  kind: "named",
41
116
  name: "time.Time",
@@ -47,16 +122,17 @@ const TIME_T = {
47
122
  };
48
123
  TIME_T.underlying.fields.set("_unixNano", INT64);
49
124
  TIME_T.underlying.fields.set("_offset", INT32);
125
+ TIME_T.underlying.fields.set("_loc", ANY);
50
126
  TIME_T.underlying.methods = new Map([
51
127
  ["Format", { kind: "func", params: [STRING], returns: [STRING] }],
52
128
  ["String", { kind: "func", params: [], returns: [STRING] }],
53
129
  ["Year", { kind: "func", params: [], returns: [INT] }],
54
- ["Month", { kind: "func", params: [], returns: [INT] }],
130
+ ["Month", { kind: "func", params: [], returns: [MONTH_T] }],
55
131
  ["Day", { kind: "func", params: [], returns: [INT] }],
56
132
  ["Hour", { kind: "func", params: [], returns: [INT] }],
57
133
  ["Minute", { kind: "func", params: [], returns: [INT] }],
58
134
  ["Second", { kind: "func", params: [], returns: [INT] }],
59
- ["Weekday", { kind: "func", params: [], returns: [INT] }],
135
+ ["Weekday", { kind: "func", params: [], returns: [WEEKDAY_T] }],
60
136
  ["Unix", { kind: "func", params: [], returns: [INT64] }],
61
137
  ["UnixMilli", { kind: "func", params: [], returns: [INT64] }],
62
138
  ["UnixNano", { kind: "func", params: [], returns: [INT64] }],
@@ -78,14 +154,30 @@ TIME_T.underlying.methods = new Map([
78
154
  ["ISOWeek", { kind: "func", params: [], returns: [INT, INT] }],
79
155
  ["Compare", { kind: "func", params: [TIME_T], returns: [INT] }],
80
156
  ["In", { kind: "func", params: [ANY], returns: [TIME_T] }],
81
- ["Location", { kind: "func", params: [], returns: [ANY] }],
157
+ ["Location", { kind: "func", params: [], returns: [LOCATION_PTR_T] }],
82
158
  ["Zone", { kind: "func", params: [], returns: [STRING, INT] }],
159
+ ["MarshalJSON", { kind: "func", params: [], returns: [TIME_BYTES, ERROR] }],
160
+ [
161
+ "UnmarshalJSON",
162
+ { kind: "func", params: [TIME_BYTES], returns: [ERROR], _ptrRecv: true },
163
+ ],
164
+ ["MarshalText", { kind: "func", params: [], returns: [TIME_BYTES, ERROR] }],
165
+ [
166
+ "UnmarshalText",
167
+ { kind: "func", params: [TIME_BYTES], returns: [ERROR], _ptrRecv: true },
168
+ ],
83
169
  ]);
84
170
  TIME_T.methods = TIME_T.underlying.methods;
85
171
  const REPLACER_T = {
86
172
  kind: "pointer",
87
173
  base: { kind: "named", name: "strings.Replacer" },
88
174
  };
175
+ const BUFFER_T = {
176
+ kind: "named",
177
+ name: "bytes.Buffer",
178
+ underlying: { kind: "struct" },
179
+ };
180
+ const BUFFER_PTR_T = { kind: "pointer", base: BUFFER_T };
89
181
 
90
182
  export function setupCoreGlobals(globals, types) {
91
183
  for (const g of BROWSER_GLOBALS) globals.define(g, ANY);
@@ -96,17 +188,46 @@ export function setupCoreGlobals(globals, types) {
96
188
  returns: [ret],
97
189
  variadic: true,
98
190
  });
191
+ const FMT_BYTES = { kind: "slice", elem: UINT8 };
99
192
  const fmtPrintVariadic = (ret) => ({
100
193
  kind: "func",
101
194
  params: [ANY],
102
195
  returns: [ret],
103
196
  variadic: true,
104
197
  });
198
+ const FMT_STRINGER = {
199
+ kind: "interface",
200
+ name: "fmt.Stringer",
201
+ methods: new Map([
202
+ ["String", { kind: "func", params: [], returns: [STRING] }],
203
+ ]),
204
+ };
105
205
  globals.define("fmt", {
106
206
  kind: "namespace",
107
207
  name: "fmt",
108
208
  members: {
209
+ Stringer: FMT_STRINGER,
109
210
  Sprintf: fmtVariadic(STRING),
211
+ Sprint: fmtPrintVariadic(STRING),
212
+ Sprintln: fmtPrintVariadic(STRING),
213
+ Append: {
214
+ kind: "func",
215
+ params: [FMT_BYTES, ANY],
216
+ returns: [FMT_BYTES],
217
+ variadic: true,
218
+ },
219
+ Appendf: {
220
+ kind: "func",
221
+ params: [FMT_BYTES, STRING, ANY],
222
+ returns: [FMT_BYTES],
223
+ variadic: true,
224
+ },
225
+ Appendln: {
226
+ kind: "func",
227
+ params: [FMT_BYTES, ANY],
228
+ returns: [FMT_BYTES],
229
+ variadic: true,
230
+ },
110
231
  Errorf: fmtVariadic(ERROR),
111
232
  Printf: fmtVariadic(VOID),
112
233
  Println: fmtPrintVariadic(VOID),
@@ -239,6 +360,7 @@ export function setupCoreGlobals(globals, types) {
239
360
  variadic: true,
240
361
  },
241
362
  NewReader: { kind: "func", params: [STRING], returns: [ANY] },
363
+ ToValidUTF8: strFn2(STRING, STRING),
242
364
  Builder: ANY,
243
365
  },
244
366
  });
@@ -315,7 +437,18 @@ export function setupCoreGlobals(globals, types) {
315
437
  returns: [{ kind: "slice", elem: BYTE_SLICE }],
316
438
  },
317
439
  NewReader: { kind: "func", params: [BYTE_SLICE], returns: [ANY] },
318
- Buffer: ANY,
440
+ NewBuffer: {
441
+ kind: "func",
442
+ params: [BYTE_SLICE],
443
+ returns: [BUFFER_PTR_T],
444
+ },
445
+ NewBufferString: {
446
+ kind: "func",
447
+ params: [STRING],
448
+ returns: [BUFFER_PTR_T],
449
+ },
450
+ ToValidUTF8: byFn2(BYTE_SLICE, BYTE_SLICE),
451
+ Buffer: BUFFER_T,
319
452
  },
320
453
  });
321
454
 
@@ -341,7 +474,7 @@ export function setupCoreGlobals(globals, types) {
341
474
  ParseInt: {
342
475
  kind: "func",
343
476
  params: [STRING, INT, INT],
344
- returns: [INT, ERROR],
477
+ returns: [INT64, ERROR],
345
478
  },
346
479
  ParseUint: {
347
480
  kind: "func",
@@ -429,8 +562,10 @@ export function setupCoreGlobals(globals, types) {
429
562
  Cbrt: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
430
563
  Pow: { kind: "func", params: [FLOAT64, FLOAT64], returns: [FLOAT64] },
431
564
  Log: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
565
+ Log1p: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
432
566
  Log2: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
433
567
  Log10: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
568
+ Expm1: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
434
569
  Sin: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
435
570
  Cos: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
436
571
  Tan: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
@@ -485,19 +620,20 @@ export function setupCoreGlobals(globals, types) {
485
620
  SmallestNonzeroFloat64: FLOAT64,
486
621
  MaxInt: INT,
487
622
  MinInt: INT,
488
- MaxInt8: INT8,
489
- MinInt8: INT8,
490
- MaxInt16: INT16,
491
- MinInt16: INT16,
492
- MaxInt32: INT32,
493
- MinInt32: INT32,
494
- MaxInt64: INT64,
495
- MinInt64: INT64,
496
- MaxUint8: UINT8,
497
- MaxUint16: UINT16,
498
- MaxUint32: UINT32,
623
+ // Untyped integer constants, as in Go (`var x int64 = math.MaxUint64 >> 1`).
624
+ MaxInt8: UNTYPED_INT,
625
+ MinInt8: UNTYPED_INT,
626
+ MaxInt16: UNTYPED_INT,
627
+ MinInt16: UNTYPED_INT,
628
+ MaxInt32: UNTYPED_INT,
629
+ MinInt32: UNTYPED_INT,
630
+ MaxInt64: UNTYPED_INT,
631
+ MinInt64: UNTYPED_INT,
632
+ MaxUint8: UNTYPED_INT,
633
+ MaxUint16: UNTYPED_INT,
634
+ MaxUint32: UNTYPED_INT,
499
635
  MaxUint: UINT,
500
- MaxUint64: UINT64,
636
+ MaxUint64: UNTYPED_INT,
501
637
  },
502
638
  });
503
639
 
@@ -505,21 +641,96 @@ export function setupCoreGlobals(globals, types) {
505
641
  kind: "namespace",
506
642
  name: "bits",
507
643
  members: {
644
+ Add: { kind: "func", params: [UINT, UINT, UINT], returns: [UINT, UINT] },
645
+ Add32: {
646
+ kind: "func",
647
+ params: [UINT32, UINT32, UINT32],
648
+ returns: [UINT32, UINT32],
649
+ },
650
+ Add64: {
651
+ kind: "func",
652
+ params: [UINT64, UINT64, UINT64],
653
+ returns: [UINT64, UINT64],
654
+ },
655
+ Sub: { kind: "func", params: [UINT, UINT, UINT], returns: [UINT, UINT] },
656
+ Sub32: {
657
+ kind: "func",
658
+ params: [UINT32, UINT32, UINT32],
659
+ returns: [UINT32, UINT32],
660
+ },
661
+ Sub64: {
662
+ kind: "func",
663
+ params: [UINT64, UINT64, UINT64],
664
+ returns: [UINT64, UINT64],
665
+ },
666
+ Mul: { kind: "func", params: [UINT, UINT], returns: [UINT, UINT] },
667
+ Mul32: {
668
+ kind: "func",
669
+ params: [UINT32, UINT32],
670
+ returns: [UINT32, UINT32],
671
+ },
672
+ Mul64: {
673
+ kind: "func",
674
+ params: [UINT64, UINT64],
675
+ returns: [UINT64, UINT64],
676
+ },
677
+ Div: { kind: "func", params: [UINT, UINT, UINT], returns: [UINT, UINT] },
678
+ Div32: {
679
+ kind: "func",
680
+ params: [UINT32, UINT32, UINT32],
681
+ returns: [UINT32, UINT32],
682
+ },
683
+ Div64: {
684
+ kind: "func",
685
+ params: [UINT64, UINT64, UINT64],
686
+ returns: [UINT64, UINT64],
687
+ },
688
+ Rem: { kind: "func", params: [UINT, UINT, UINT], returns: [UINT] },
689
+ Rem32: {
690
+ kind: "func",
691
+ params: [UINT32, UINT32, UINT32],
692
+ returns: [UINT32],
693
+ },
694
+ Rem64: {
695
+ kind: "func",
696
+ params: [UINT64, UINT64, UINT64],
697
+ returns: [UINT64],
698
+ },
699
+ LeadingZeros: { kind: "func", params: [UINT], returns: [INT] },
700
+ LeadingZeros8: { kind: "func", params: [UINT8], returns: [INT] },
701
+ LeadingZeros16: { kind: "func", params: [UINT16], returns: [INT] },
508
702
  LeadingZeros32: { kind: "func", params: [UINT32], returns: [INT] },
509
- TrailingZeros32: { kind: "func", params: [UINT32], returns: [INT] },
510
- OnesCount32: { kind: "func", params: [UINT32], returns: [INT] },
511
- RotateLeft32: { kind: "func", params: [UINT32, INT], returns: [UINT32] },
512
703
  LeadingZeros64: { kind: "func", params: [UINT64], returns: [INT] },
704
+ TrailingZeros: { kind: "func", params: [UINT], returns: [INT] },
705
+ TrailingZeros8: { kind: "func", params: [UINT8], returns: [INT] },
706
+ TrailingZeros16: { kind: "func", params: [UINT16], returns: [INT] },
707
+ TrailingZeros32: { kind: "func", params: [UINT32], returns: [INT] },
513
708
  TrailingZeros64: { kind: "func", params: [UINT64], returns: [INT] },
709
+ OnesCount: { kind: "func", params: [UINT], returns: [INT] },
710
+ OnesCount8: { kind: "func", params: [UINT8], returns: [INT] },
711
+ OnesCount16: { kind: "func", params: [UINT16], returns: [INT] },
712
+ OnesCount32: { kind: "func", params: [UINT32], returns: [INT] },
514
713
  OnesCount64: { kind: "func", params: [UINT64], returns: [INT] },
714
+ RotateLeft: { kind: "func", params: [UINT, INT], returns: [UINT] },
715
+ RotateLeft8: { kind: "func", params: [UINT8, INT], returns: [UINT8] },
716
+ RotateLeft16: { kind: "func", params: [UINT16, INT], returns: [UINT16] },
717
+ RotateLeft32: { kind: "func", params: [UINT32, INT], returns: [UINT32] },
515
718
  RotateLeft64: { kind: "func", params: [UINT64, INT], returns: [UINT64] },
719
+ Reverse: { kind: "func", params: [UINT], returns: [UINT] },
720
+ Reverse8: { kind: "func", params: [UINT8], returns: [UINT8] },
721
+ Reverse16: { kind: "func", params: [UINT16], returns: [UINT16] },
722
+ Reverse32: { kind: "func", params: [UINT32], returns: [UINT32] },
723
+ Reverse64: { kind: "func", params: [UINT64], returns: [UINT64] },
724
+ ReverseBytes: { kind: "func", params: [UINT], returns: [UINT] },
516
725
  ReverseBytes16: { kind: "func", params: [UINT16], returns: [UINT16] },
517
726
  ReverseBytes32: { kind: "func", params: [UINT32], returns: [UINT32] },
518
727
  ReverseBytes64: { kind: "func", params: [UINT64], returns: [UINT64] },
728
+ Len: { kind: "func", params: [UINT], returns: [INT] },
729
+ Len8: { kind: "func", params: [UINT8], returns: [INT] },
730
+ Len16: { kind: "func", params: [UINT16], returns: [INT] },
519
731
  Len32: { kind: "func", params: [UINT32], returns: [INT] },
520
732
  Len64: { kind: "func", params: [UINT64], returns: [INT] },
521
- Reverse32: { kind: "func", params: [UINT32], returns: [UINT32] },
522
- Reverse64: { kind: "func", params: [UINT64], returns: [UINT64] },
733
+ UintSize: UNTYPED_INT,
523
734
  },
524
735
  });
525
736
 
@@ -552,14 +763,29 @@ export function setupCoreGlobals(globals, types) {
552
763
  params: [STRING, STRING],
553
764
  returns: [TIME_T, ERROR],
554
765
  },
766
+ ParseDuration: {
767
+ kind: "func",
768
+ params: [STRING],
769
+ returns: [DURATION_T, ERROR],
770
+ },
555
771
  Unix: { kind: "func", params: [INT64, INT64], returns: [TIME_T] },
556
772
  UnixMicro: { kind: "func", params: [INT64], returns: [TIME_T] },
557
773
  UnixMilli: { kind: "func", params: [INT64], returns: [TIME_T] },
558
774
  Date: {
559
775
  kind: "func",
560
- params: [INT, INT, INT, INT, INT, INT, INT, ANY],
776
+ params: [INT, ANY, INT, INT, INT, INT, INT, ANY],
561
777
  returns: [TIME_T],
562
778
  },
779
+ FixedZone: {
780
+ kind: "func",
781
+ params: [STRING, INT],
782
+ returns: [LOCATION_PTR_T],
783
+ },
784
+ AfterFunc: {
785
+ kind: "func",
786
+ params: [DURATION_T, { kind: "func", params: [], returns: [VOID] }],
787
+ returns: [TIMER_PTR_T],
788
+ },
563
789
  Duration: DURATION_T,
564
790
  Nanosecond: DURATION_T,
565
791
  Microsecond: DURATION_T,
@@ -568,6 +794,10 @@ export function setupCoreGlobals(globals, types) {
568
794
  Minute: DURATION_T,
569
795
  Hour: DURATION_T,
570
796
  Time: TIME_T,
797
+ Month: MONTH_T,
798
+ Weekday: WEEKDAY_T,
799
+ Location: LOCATION_T,
800
+ Timer: TIMER_T,
571
801
  RFC3339: STRING,
572
802
  RFC3339Nano: STRING,
573
803
  DateOnly: STRING,
@@ -575,29 +805,33 @@ export function setupCoreGlobals(globals, types) {
575
805
  DateTime: STRING,
576
806
  UTC: ANY,
577
807
  Local: ANY,
578
- January: INT,
579
- February: INT,
580
- March: INT,
581
- April: INT,
582
- May: INT,
583
- June: INT,
584
- July: INT,
585
- August: INT,
586
- September: INT,
587
- October: INT,
588
- November: INT,
589
- December: INT,
590
- Sunday: INT,
591
- Monday: INT,
592
- Tuesday: INT,
593
- Wednesday: INT,
594
- Thursday: INT,
595
- Friday: INT,
596
- Saturday: INT,
808
+ January: MONTH_T,
809
+ February: MONTH_T,
810
+ March: MONTH_T,
811
+ April: MONTH_T,
812
+ May: MONTH_T,
813
+ June: MONTH_T,
814
+ July: MONTH_T,
815
+ August: MONTH_T,
816
+ September: MONTH_T,
817
+ October: MONTH_T,
818
+ November: MONTH_T,
819
+ December: MONTH_T,
820
+ Sunday: WEEKDAY_T,
821
+ Monday: WEEKDAY_T,
822
+ Tuesday: WEEKDAY_T,
823
+ Wednesday: WEEKDAY_T,
824
+ Thursday: WEEKDAY_T,
825
+ Friday: WEEKDAY_T,
826
+ Saturday: WEEKDAY_T,
597
827
  },
598
828
  });
599
829
  types.set("time.Duration", DURATION_T);
600
830
  types.set("time.Time", TIME_T);
831
+ types.set("time.Month", MONTH_T);
832
+ types.set("time.Weekday", WEEKDAY_T);
833
+ types.set("time.Location", LOCATION_T);
834
+ types.set("time.Timer", TIMER_T);
601
835
 
602
836
  const runeToStr = { kind: "func", params: [INT], returns: [BOOL] };
603
837
  const runeTrans = { kind: "func", params: [INT], returns: [INT] };
@@ -619,16 +853,67 @@ export function setupCoreGlobals(globals, types) {
619
853
  },
620
854
  });
621
855
 
856
+ const BYTE_SLICE_IO = { kind: "slice", elem: UINT8 };
857
+ const OS_FILE = {
858
+ kind: "named",
859
+ name: "os.File",
860
+ underlying: {
861
+ kind: "struct",
862
+ fields: new Map([["fd", INT]]),
863
+ methods: new Map([
864
+ [
865
+ "Write",
866
+ {
867
+ kind: "func",
868
+ params: [BYTE_SLICE_IO],
869
+ returns: [INT, ERROR],
870
+ _ptrRecv: true,
871
+ },
872
+ ],
873
+ [
874
+ "WriteString",
875
+ {
876
+ kind: "func",
877
+ params: [STRING],
878
+ returns: [INT, ERROR],
879
+ _ptrRecv: true,
880
+ },
881
+ ],
882
+ [
883
+ "Read",
884
+ {
885
+ kind: "func",
886
+ params: [BYTE_SLICE_IO],
887
+ returns: [INT, ERROR],
888
+ _ptrRecv: true,
889
+ },
890
+ ],
891
+ [
892
+ "Close",
893
+ {
894
+ kind: "func",
895
+ params: [],
896
+ returns: [ERROR],
897
+ _ptrRecv: true,
898
+ },
899
+ ],
900
+ ]),
901
+ },
902
+ };
903
+ const OS_FILE_PTR = { kind: "pointer", base: OS_FILE };
904
+ types.set("os.File", OS_FILE);
905
+
622
906
  globals.define("os", {
623
907
  kind: "namespace",
624
908
  name: "os",
625
909
  members: {
910
+ File: OS_FILE,
626
911
  Exit: { kind: "func", params: [INT], returns: [VOID] },
627
912
  Args: { kind: "slice", elem: STRING },
628
913
  Getenv: { kind: "func", params: [STRING], returns: [STRING] },
629
- Stdout: ANY,
630
- Stderr: ANY,
631
- Stdin: ANY,
914
+ Stdout: OS_FILE_PTR,
915
+ Stderr: OS_FILE_PTR,
916
+ Stdin: OS_FILE_PTR,
632
917
  },
633
918
  });
634
919
 
@@ -708,7 +993,6 @@ export function setupCoreGlobals(globals, types) {
708
993
  },
709
994
  });
710
995
 
711
- const BYTE_SLICE_IO = { kind: "slice", elem: UINT8 };
712
996
  const IO_WRITER = {
713
997
  kind: "interface",
714
998
  name: "io.Writer",
@@ -759,18 +1043,11 @@ export function setupCoreGlobals(globals, types) {
759
1043
  Closer: IO_CLOSER,
760
1044
  ReadWriter: IO_READWRITER,
761
1045
  EOF: ERROR,
762
- ErrUnexpectedEOF: ERROR,
763
- ErrShortWrite: ERROR,
764
1046
  WriteString: {
765
1047
  kind: "func",
766
1048
  params: [IO_WRITER, STRING],
767
1049
  returns: [INT, ERROR],
768
1050
  },
769
- ReadFull: {
770
- kind: "func",
771
- params: [IO_READER, BYTE_SLICE_IO],
772
- returns: [INT, ERROR],
773
- },
774
1051
  ReadAll: {
775
1052
  kind: "func",
776
1053
  params: [IO_READER],
@@ -794,6 +1071,7 @@ export function setupCoreGlobals(globals, types) {
794
1071
  Discard: IO_WRITER,
795
1072
  },
796
1073
  });
1074
+ types.set("fmt.Stringer", FMT_STRINGER);
797
1075
  types.set("io.Writer", IO_WRITER);
798
1076
  types.set("io.Reader", IO_READER);
799
1077
  types.set("io.Closer", IO_CLOSER);