warpo 3.2.0 → 3.2.2

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 (93) hide show
  1. package/assemblyscript/std/README.md +5 -0
  2. package/assemblyscript/std/assembly/array.ts +542 -0
  3. package/assemblyscript/std/assembly/arraybuffer.ts +72 -0
  4. package/assemblyscript/std/assembly/builtins.ts +2312 -0
  5. package/assemblyscript/std/assembly/compat.ts +2 -0
  6. package/assemblyscript/std/assembly/dataview.ts +144 -0
  7. package/assemblyscript/std/assembly/date.ts +383 -0
  8. package/assemblyscript/std/assembly/diagnostics.ts +11 -0
  9. package/assemblyscript/std/assembly/error.ts +39 -0
  10. package/assemblyscript/std/assembly/function.ts +44 -0
  11. package/assemblyscript/std/assembly/iterator.ts +24 -0
  12. package/assemblyscript/std/assembly/map.ts +304 -0
  13. package/assemblyscript/std/assembly/math.ts +3401 -0
  14. package/assemblyscript/std/assembly/memory.ts +110 -0
  15. package/assemblyscript/std/assembly/number.ts +388 -0
  16. package/assemblyscript/std/assembly/object.ts +30 -0
  17. package/assemblyscript/std/assembly/polyfills.ts +24 -0
  18. package/assemblyscript/std/assembly/process.ts +7 -0
  19. package/assemblyscript/std/assembly/promise.ts +172 -0
  20. package/assemblyscript/std/assembly/reference.ts +48 -0
  21. package/assemblyscript/std/assembly/regexp.ts +16 -0
  22. package/assemblyscript/std/assembly/rt/common.ts +79 -0
  23. package/assemblyscript/std/assembly/rt/index-incremental.ts +4 -0
  24. package/assemblyscript/std/assembly/rt/index-radical.ts +4 -0
  25. package/assemblyscript/std/assembly/rt/index.d.ts +37 -0
  26. package/assemblyscript/std/assembly/rt/itcms.ts +415 -0
  27. package/assemblyscript/std/assembly/rt/tcms.ts +276 -0
  28. package/assemblyscript/std/assembly/rt/tlsf.ts +564 -0
  29. package/assemblyscript/std/assembly/rt.ts +71 -0
  30. package/assemblyscript/std/assembly/set.ts +261 -0
  31. package/assemblyscript/std/assembly/shared/feature.ts +69 -0
  32. package/assemblyscript/std/assembly/shared/host.ts +12 -0
  33. package/assemblyscript/std/assembly/shared/runtime.ts +9 -0
  34. package/assemblyscript/std/assembly/shared/target.ts +9 -0
  35. package/assemblyscript/std/assembly/shared/tsconfig.json +9 -0
  36. package/assemblyscript/std/assembly/shared/typeinfo.ts +72 -0
  37. package/assemblyscript/std/assembly/staticarray.ts +446 -0
  38. package/assemblyscript/std/assembly/string.ts +892 -0
  39. package/assemblyscript/std/assembly/symbol.ts +61 -0
  40. package/assemblyscript/std/assembly/table.ts +15 -0
  41. package/assemblyscript/std/assembly/tsconfig.json +4 -0
  42. package/assemblyscript/std/assembly/tuple.ts +36 -0
  43. package/assemblyscript/std/assembly/typedarray.ts +2000 -0
  44. package/assemblyscript/std/assembly/uri.ts +17 -0
  45. package/assemblyscript/std/assembly/util/bytes.ts +90 -0
  46. package/assemblyscript/std/assembly/util/casemap.ts +264 -0
  47. package/assemblyscript/std/assembly/util/error.ts +54 -0
  48. package/assemblyscript/std/assembly/util/hash.ts +117 -0
  49. package/assemblyscript/std/assembly/util/math.ts +1922 -0
  50. package/assemblyscript/std/assembly/util/memory.ts +309 -0
  51. package/assemblyscript/std/assembly/util/number.ts +884 -0
  52. package/assemblyscript/std/assembly/util/sort.ts +282 -0
  53. package/assemblyscript/std/assembly/util/string.ts +1075 -0
  54. package/assemblyscript/std/assembly/util/uri.ts +251 -0
  55. package/assemblyscript/std/assembly/vector.ts +3 -0
  56. package/dist/debug_server/debugSession.d.ts +1 -0
  57. package/dist/debug_server/debugSession.js +15 -6
  58. package/dist/debug_server/debugSession.js.map +1 -1
  59. package/dist/debug_server/debuggerWasmModule.d.ts +3 -0
  60. package/dist/debug_server/debuggerWasmModule.js +47 -2
  61. package/dist/debug_server/debuggerWasmModule.js.map +1 -1
  62. package/dist/debug_server/tests/debugSession.test.js +96 -0
  63. package/dist/debug_server/tests/debugSession.test.js.map +1 -1
  64. package/dist/debug_server/tests/testModule/debugger_closure_stepping.d.ts +1 -0
  65. package/dist/debug_server/tests/testModule/debugger_closure_stepping.js +12 -0
  66. package/dist/debug_server/tests/testModule/debugger_closure_stepping.js.map +1 -0
  67. package/dist/debug_server/tests/testModule/debugger_std_array.d.ts +1 -0
  68. package/dist/debug_server/tests/testModule/debugger_std_array.js +6 -0
  69. package/dist/debug_server/tests/testModule/debugger_std_array.js.map +1 -0
  70. package/dist/debug_server/tests/testModule/debugger_string_stepping.d.ts +1 -0
  71. package/dist/debug_server/tests/testModule/debugger_string_stepping.js +9 -0
  72. package/dist/debug_server/tests/testModule/debugger_string_stepping.js.map +1 -0
  73. package/package.json +7 -7
  74. package/warpo_extension/std/tsconfig.json +4 -0
  75. package/warpo_extension/std/warpo/ffi.ts +16 -0
  76. package/warpo_extension/std/warpo/test/comparison.ts +122 -0
  77. package/warpo_extension/std/warpo/test/env.ts +33 -0
  78. package/warpo_extension/std/warpo/test/expect.ts +101 -0
  79. package/warpo_extension/std/warpo/test/formatPrint.ts +99 -0
  80. package/warpo_extension/std/warpo/test/implement.ts +41 -0
  81. package/warpo_extension/std/warpo/test/index.d.ts +0 -0
  82. package/warpo_extension/std/warpo/test/index.ts +39 -0
  83. package/warpo_extension/std/warpo/test/mockInstrument.ts +26 -0
  84. package/warpo_extension/std/warpo/utf8/const_str.ts +17 -0
  85. package/warpo_extension/std/wasi_snapshot_preview1/LICENSE +202 -0
  86. package/warpo_extension/std/wasi_snapshot_preview1/README.md +1 -0
  87. package/warpo_extension/std/wasi_snapshot_preview1/bindings/wasi_snapshot_preview1.ts +1731 -0
  88. package/warpo_extension/std/wasi_snapshot_preview1/wasi_console.ts +96 -0
  89. package/warpo_extension/std/wasi_snapshot_preview1/wasi_crypto.ts +8 -0
  90. package/warpo_extension/std/wasi_snapshot_preview1/wasi_date.ts +13 -0
  91. package/warpo_extension/std/wasi_snapshot_preview1/wasi_internal.ts +119 -0
  92. package/warpo_extension/std/wasi_snapshot_preview1/wasi_performance.ts +11 -0
  93. package/warpo_extension/std/wasi_snapshot_preview1/wasi_process.ts +191 -0
@@ -0,0 +1,884 @@
1
+ /// <reference path="../rt/index.d.ts" />
2
+
3
+ import { idof } from "../builtins";
4
+ import { CharCode } from "./string";
5
+
6
+ // @ts-ignore: decorator
7
+ @inline
8
+ export const MAX_DOUBLE_LENGTH = 28;
9
+
10
+ // @ts-ignore: decorator
11
+ @lazy @inline const POWERS10 = memory.data<u32>([
12
+ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000,
13
+ ]);
14
+
15
+ /*
16
+ Lookup table for pairwise char codes in range [0-99]
17
+
18
+ "00", "01", "02", "03", "04", "05", "06", "07", "08", "09",
19
+ "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
20
+ "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
21
+ "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",
22
+ "40", "41", "42", "43", "44", "45", "46", "47", "48", "49",
23
+ "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
24
+ "60", "61", "62", "63", "64", "65", "66", "67", "68", "69",
25
+ "70", "71", "72", "73", "74", "75", "76", "77", "78", "79",
26
+ "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
27
+ "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"
28
+ */
29
+ // @ts-ignore: decorator
30
+ @lazy @inline const DIGITS = memory.data<u32>([
31
+ 0x00300030, 0x00310030, 0x00320030, 0x00330030, 0x00340030, 0x00350030, 0x00360030, 0x00370030, 0x00380030,
32
+ 0x00390030, 0x00300031, 0x00310031, 0x00320031, 0x00330031, 0x00340031, 0x00350031, 0x00360031, 0x00370031,
33
+ 0x00380031, 0x00390031, 0x00300032, 0x00310032, 0x00320032, 0x00330032, 0x00340032, 0x00350032, 0x00360032,
34
+ 0x00370032, 0x00380032, 0x00390032, 0x00300033, 0x00310033, 0x00320033, 0x00330033, 0x00340033, 0x00350033,
35
+ 0x00360033, 0x00370033, 0x00380033, 0x00390033, 0x00300034, 0x00310034, 0x00320034, 0x00330034, 0x00340034,
36
+ 0x00350034, 0x00360034, 0x00370034, 0x00380034, 0x00390034, 0x00300035, 0x00310035, 0x00320035, 0x00330035,
37
+ 0x00340035, 0x00350035, 0x00360035, 0x00370035, 0x00380035, 0x00390035, 0x00300036, 0x00310036, 0x00320036,
38
+ 0x00330036, 0x00340036, 0x00350036, 0x00360036, 0x00370036, 0x00380036, 0x00390036, 0x00300037, 0x00310037,
39
+ 0x00320037, 0x00330037, 0x00340037, 0x00350037, 0x00360037, 0x00370037, 0x00380037, 0x00390037, 0x00300038,
40
+ 0x00310038, 0x00320038, 0x00330038, 0x00340038, 0x00350038, 0x00360038, 0x00370038, 0x00380038, 0x00390038,
41
+ 0x00300039, 0x00310039, 0x00320039, 0x00330039, 0x00340039, 0x00350039, 0x00360039, 0x00370039, 0x00380039,
42
+ 0x00390039,
43
+ ]);
44
+
45
+ // Lookup table for pairwise char codes in range [0x00-0xFF]
46
+ // @ts-ignore: decorator
47
+ @lazy @inline const HEX_DIGITS =
48
+ "000102030405060708090a0b0c0d0e0f\
49
+ 101112131415161718191a1b1c1d1e1f\
50
+ 202122232425262728292a2b2c2d2e2f\
51
+ 303132333435363738393a3b3c3d3e3f\
52
+ 404142434445464748494a4b4c4d4e4f\
53
+ 505152535455565758595a5b5c5d5e5f\
54
+ 606162636465666768696a6b6c6d6e6f\
55
+ 707172737475767778797a7b7c7d7e7f\
56
+ 808182838485868788898a8b8c8d8e8f\
57
+ 909192939495969798999a9b9c9d9e9f\
58
+ a0a1a2a3a4a5a6a7a8a9aaabacadaeaf\
59
+ b0b1b2b3b4b5b6b7b8b9babbbcbdbebf\
60
+ c0c1c2c3c4c5c6c7c8c9cacbcccdcecf\
61
+ d0d1d2d3d4d5d6d7d8d9dadbdcdddedf\
62
+ e0e1e2e3e4e5e6e7e8e9eaebecedeeef\
63
+ f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff";
64
+
65
+ // @ts-ignore: decorator
66
+ @lazy @inline const ANY_DIGITS = "0123456789abcdefghijklmnopqrstuvwxyz";
67
+
68
+ // @ts-ignore: decorator
69
+ @lazy @inline const EXP_POWERS = memory.data<i16>([
70
+ /* eslint-disable indent */ -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, -927, -901,
71
+ -874, -847, -821, -794, -768, -741, -715, -688, -661, -635, -608, -582, -555, -529, -502, -475, -449, -422, -396,
72
+ -369, -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77, -50, -24, 3, 30, 56, 83, 109, 136, 162, 189,
73
+ 216, 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800,
74
+ 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066,
75
+ /* eslint-enable indent */
76
+ ]);
77
+
78
+ // 1e-348, 1e-340, ..., 1e340
79
+ // @ts-ignore: decorator
80
+ @lazy @inline const FRC_POWERS = memory.data<u64>([
81
+ 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76, 0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d,
82
+ 0xe61acf033d1a45df, 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c, 0x8dd01fad907ffc3c,
83
+ 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, 0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57,
84
+ 0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7, 0xa086cfcd97bf97f4, 0xef340a98172aace5,
85
+ 0xb23867fb2a35b28e, 0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, 0xdbac6c247d62a584,
86
+ 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126, 0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053,
87
+ 0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f, 0xf8a95fcf88747d94, 0xb94470938fa89bcf,
88
+ 0x8a08f0f8bf0f156b, 0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06, 0xaa242499697392d3,
89
+ 0xfd87b5f28300ca0e, 0xbce5086492111aeb, 0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000,
90
+ 0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984, 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70,
91
+ 0xd5d238a4abe98068, 0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, 0x83c7088e1aab65db,
92
+ 0xc45d1df942711d9a, 0x924d692ca61be758, 0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85,
93
+ 0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d, 0x952ab45cfa97a0b3, 0xde469fbd99a05fe3,
94
+ 0xa59bc234db398c25, 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2, 0xcc20ce9bd35c78a5,
95
+ 0x98165af37b2153df, 0xe2a0b5dc971f303a, 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410,
96
+ 0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129, 0xe7109bfba19c0c9d, 0xac2820d9623bf429,
97
+ 0x80444b5e7aa7cf85, 0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, 0x9e19db92b4e31ba9,
98
+ 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b,
99
+ ]);
100
+
101
+ // @ts-ignore: decorator
102
+ @inline
103
+ export function isPowerOf2<T extends number>(value: T): bool {
104
+ return popcnt<T>(value) == 1;
105
+ }
106
+
107
+ // Count number of decimals for u32 values
108
+ // In our case input value always non-zero so we can simplify some parts
109
+ export function decimalCount32(value: u32): u32 {
110
+ if (value < 100000) {
111
+ if (value < 100) {
112
+ return 1 + u32(value >= 10);
113
+ } else {
114
+ return 3 + u32(value >= 10000) + u32(value >= 1000);
115
+ }
116
+ } else {
117
+ if (value < 10000000) {
118
+ return 6 + u32(value >= 1000000);
119
+ } else {
120
+ return 8 + u32(value >= 1000000000) + u32(value >= 100000000);
121
+ }
122
+ }
123
+ }
124
+
125
+ // Count number of decimals for u64 values
126
+ // In our case input value always greater than 2^32-1 so we can skip some parts
127
+ export function decimalCount64High(value: u64): u32 {
128
+ if (value < 1000000000000000) {
129
+ if (value < 1000000000000) {
130
+ return 10 + u32(value >= 100000000000) + u32(value >= 10000000000);
131
+ } else {
132
+ return 13 + u32(value >= 100000000000000) + u32(value >= 10000000000000);
133
+ }
134
+ } else {
135
+ if (value < 100000000000000000) {
136
+ return 16 + u32(value >= 10000000000000000);
137
+ } else {
138
+ return 18 + u32(value >= 10000000000000000000) + u32(value >= 1000000000000000000);
139
+ }
140
+ }
141
+ }
142
+
143
+ function ulog_base(num: u64, base: i32): u32 {
144
+ if (isPowerOf2(base)) {
145
+ return (63 - <u32>clz(num)) / (31 - <u32>clz(base)) + 1;
146
+ }
147
+ let b64 = u64(base),
148
+ b = b64,
149
+ e: u32 = 1;
150
+ while (num >= b) {
151
+ num /= b;
152
+ b *= b;
153
+ e <<= 1;
154
+ }
155
+ while (num >= 1) {
156
+ num /= b64;
157
+ e++;
158
+ }
159
+ return e - 1;
160
+ }
161
+
162
+ function utoa32_dec_lut(buffer: usize, num: u32, offset: usize): void {
163
+ while (num >= 10000) {
164
+ // in most VMs i32/u32 div and modulo by constant can be shared and simplification
165
+ let t = num / 10000;
166
+ let r = num % 10000;
167
+ num = t;
168
+
169
+ let d1 = r / 100;
170
+ let d2 = r % 100;
171
+
172
+ let digits1 = <u64>load<u32>(DIGITS + ((<usize>d1) << alignof<u32>()));
173
+ let digits2 = <u64>load<u32>(DIGITS + ((<usize>d2) << alignof<u32>()));
174
+
175
+ offset -= 4;
176
+ store<u64>(buffer + (offset << 1), digits1 | (digits2 << 32));
177
+ }
178
+
179
+ if (num >= 100) {
180
+ let t = num / 100;
181
+ let d1 = num % 100;
182
+ num = t;
183
+ offset -= 2;
184
+ let digits = load<u32>(DIGITS + ((<usize>d1) << alignof<u32>()));
185
+ store<u32>(buffer + (offset << 1), digits);
186
+ }
187
+
188
+ if (num >= 10) {
189
+ offset -= 2;
190
+ let digits = load<u32>(DIGITS + ((<usize>num) << alignof<u32>()));
191
+ store<u32>(buffer + (offset << 1), digits);
192
+ } else {
193
+ offset -= 1;
194
+ let digit = CharCode._0 + num;
195
+ store<u16>(buffer + (offset << 1), digit);
196
+ }
197
+ }
198
+
199
+ function utoa64_dec_lut(buffer: usize, num: u64, offset: usize): void {
200
+ while (num >= 100000000) {
201
+ let t = num / 100000000;
202
+ let r = <usize>(num - t * 100000000);
203
+ num = t;
204
+
205
+ let b = r / 10000;
206
+ let c = r % 10000;
207
+
208
+ let b1 = b / 100;
209
+ let b2 = b % 100;
210
+ let c1 = c / 100;
211
+ let c2 = c % 100;
212
+
213
+ let digits1 = <u64>load<u32>(DIGITS + ((<usize>c1) << alignof<u32>()));
214
+ let digits2 = <u64>load<u32>(DIGITS + ((<usize>c2) << alignof<u32>()));
215
+
216
+ offset -= 4;
217
+ store<u64>(buffer + (offset << 1), digits1 | (digits2 << 32));
218
+
219
+ digits1 = <u64>load<u32>(DIGITS + ((<usize>b1) << alignof<u32>()));
220
+ digits2 = <u64>load<u32>(DIGITS + ((<usize>b2) << alignof<u32>()));
221
+
222
+ offset -= 4;
223
+ store<u64>(buffer + (offset << 1), digits1 | (digits2 << 32));
224
+ }
225
+
226
+ utoa32_dec_lut(buffer, <u32>num, offset);
227
+ }
228
+
229
+ function utoa_hex_lut(buffer: usize, num: u64, offset: usize): void {
230
+ const lut = changetype<usize>(HEX_DIGITS);
231
+ while (offset >= 2) {
232
+ offset -= 2;
233
+ store<u32>(buffer + (offset << 1), load<u32>(lut + (((<usize>num) & 0xff) << alignof<u32>())));
234
+ num >>= 8;
235
+ }
236
+ if (offset & 1) {
237
+ store<u16>(buffer, load<u16>(lut + ((<usize>num) << 6)));
238
+ }
239
+ }
240
+
241
+ function utoa_dec_simple<T extends number>(buffer: usize, num: T, offset: usize): void {
242
+ do {
243
+ let t = num / 10;
244
+ let r = <u32>(num % 10);
245
+ num = changetype<T>(t);
246
+ offset--;
247
+ store<u16>(buffer + (offset << 1), CharCode._0 + r);
248
+ } while (num);
249
+ }
250
+
251
+ function utoa_hex_simple<T extends number>(buffer: usize, num: T, offset: usize): void {
252
+ do {
253
+ let d = (num & 0x0f) | CharCode._0;
254
+ d += select<T>(<T>0x27, <T>0, d > <T>CharCode._9);
255
+ offset--;
256
+ store<u16>(buffer + (offset << 1), d);
257
+ // @ts-ignore: type
258
+ num >>= 4;
259
+ } while (num);
260
+ }
261
+
262
+ // @ts-ignore: decorator
263
+ @inline
264
+ export function utoa32_dec_core(buffer: usize, num: u32, offset: usize): void {
265
+ if (ASC_SHRINK_LEVEL >= 1) {
266
+ utoa_dec_simple<u32>(buffer, num, offset);
267
+ } else {
268
+ utoa32_dec_lut(buffer, num, offset);
269
+ }
270
+ }
271
+
272
+ // @ts-ignore: decorator
273
+ @inline
274
+ function utoa32_hex_core(buffer: usize, num: u32, offset: usize): void {
275
+ if (ASC_SHRINK_LEVEL >= 1) {
276
+ utoa_hex_simple<u32>(buffer, num, offset);
277
+ } else {
278
+ utoa_hex_lut(buffer, num, offset);
279
+ }
280
+ }
281
+
282
+ // @ts-ignore: decorator
283
+ @inline
284
+ function utoa64_dec_core(buffer: usize, num: u64, offset: usize): void {
285
+ if (ASC_SHRINK_LEVEL >= 1) {
286
+ utoa_dec_simple<u64>(buffer, num, offset);
287
+ } else {
288
+ utoa64_dec_lut(buffer, num, offset);
289
+ }
290
+ }
291
+
292
+ // @ts-ignore: decorator
293
+ @inline
294
+ function utoa64_hex_core(buffer: usize, num: u64, offset: usize): void {
295
+ if (ASC_SHRINK_LEVEL >= 1) {
296
+ utoa_hex_simple<u64>(buffer, num, offset);
297
+ } else {
298
+ utoa_hex_lut(buffer, num, offset);
299
+ }
300
+ }
301
+
302
+ function utoa64_any_core(buffer: usize, num: u64, offset: usize, radix: i32): void {
303
+ const lut = changetype<usize>(ANY_DIGITS);
304
+ let base = u64(radix);
305
+ if ((radix & (radix - 1)) == 0) {
306
+ // for radix which pow of two
307
+ let shift = u64(ctz(radix) & 7);
308
+ let mask = base - 1;
309
+ do {
310
+ offset--;
311
+ store<u16>(buffer + (offset << 1), load<u16>(lut + (usize(num & mask) << 1)));
312
+ num >>= shift;
313
+ } while (num);
314
+ } else {
315
+ do {
316
+ offset--;
317
+ let q = num / base;
318
+ store<u16>(buffer + (offset << 1), load<u16>(lut + (usize(num - q * base) << 1)));
319
+ num = q;
320
+ } while (num);
321
+ }
322
+ }
323
+
324
+ export function utoa32(value: u32, radix: i32): String {
325
+ if (radix < 2 || radix > 36) {
326
+ throw new RangeError("toString() radix argument must be between 2 and 36");
327
+ }
328
+ if (!value) return "0";
329
+ let out: String;
330
+
331
+ if (radix == 10) {
332
+ let decimals = decimalCount32(value);
333
+ out = changetype<String>(__new(decimals << 1, idof<String>()));
334
+ utoa32_dec_core(changetype<usize>(out), value, decimals);
335
+ } else if (radix == 16) {
336
+ let decimals = ((31 - clz(value)) >> 2) + 1;
337
+ out = changetype<String>(__new(decimals << 1, idof<String>()));
338
+ utoa32_hex_core(changetype<usize>(out), value, decimals);
339
+ } else {
340
+ let decimals = ulog_base(value, radix);
341
+ out = changetype<String>(__new(decimals << 1, idof<String>()));
342
+ utoa64_any_core(changetype<usize>(out), value, decimals, radix);
343
+ }
344
+ return out;
345
+ }
346
+
347
+ export function itoa32(value: i32, radix: i32): String {
348
+ if (radix < 2 || radix > 36) {
349
+ throw new RangeError("toString() radix argument must be between 2 and 36");
350
+ }
351
+ if (!value) return "0";
352
+
353
+ let sign = (value >>> 31) << 1;
354
+ if (sign) value = -value;
355
+ let out: String;
356
+
357
+ if (radix == 10) {
358
+ let decimals = decimalCount32(value);
359
+ out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));
360
+ utoa32_dec_core(changetype<usize>(out) + sign, value, decimals);
361
+ } else if (radix == 16) {
362
+ let decimals = ((31 - clz(value)) >> 2) + 1;
363
+ out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));
364
+ utoa32_hex_core(changetype<usize>(out) + sign, value, decimals);
365
+ } else {
366
+ let val32 = u32(value);
367
+ let decimals = ulog_base(val32, radix);
368
+ out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));
369
+ utoa64_any_core(changetype<usize>(out) + sign, val32, decimals, radix);
370
+ }
371
+ if (sign) store<u16>(changetype<usize>(out), CharCode.MINUS);
372
+ return out;
373
+ }
374
+
375
+ export function utoa64(value: u64, radix: i32): String {
376
+ if (radix < 2 || radix > 36) {
377
+ throw new RangeError("toString() radix argument must be between 2 and 36");
378
+ }
379
+ if (!value) return "0";
380
+ let out: String;
381
+
382
+ if (radix == 10) {
383
+ if (value <= u32.MAX_VALUE) {
384
+ let val32 = <u32>value;
385
+ let decimals = decimalCount32(val32);
386
+ out = changetype<String>(__new(decimals << 1, idof<String>()));
387
+ utoa32_dec_core(changetype<usize>(out), val32, decimals);
388
+ } else {
389
+ let decimals = decimalCount64High(value);
390
+ out = changetype<String>(__new(decimals << 1, idof<String>()));
391
+ utoa64_dec_core(changetype<usize>(out), value, decimals);
392
+ }
393
+ } else if (radix == 16) {
394
+ let decimals = ((63 - u32(clz(value))) >> 2) + 1;
395
+ out = changetype<String>(__new(decimals << 1, idof<String>()));
396
+ utoa64_hex_core(changetype<usize>(out), value, decimals);
397
+ } else {
398
+ let decimals = ulog_base(value, radix);
399
+ out = changetype<String>(__new(decimals << 1, idof<String>()));
400
+ utoa64_any_core(changetype<usize>(out), value, decimals, radix);
401
+ }
402
+ return out;
403
+ }
404
+
405
+ export function itoa64(value: i64, radix: i32): String {
406
+ if (radix < 2 || radix > 36) {
407
+ throw new RangeError("toString() radix argument must be between 2 and 36");
408
+ }
409
+ if (!value) return "0";
410
+
411
+ let sign = u32(value >>> 63) << 1;
412
+ if (sign) value = -value;
413
+ let out: String;
414
+
415
+ if (radix == 10) {
416
+ if (<u64>value <= <u64>u32.MAX_VALUE) {
417
+ let val32 = <u32>value;
418
+ let decimals = decimalCount32(val32);
419
+ out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));
420
+ utoa32_dec_core(changetype<usize>(out) + sign, val32, decimals);
421
+ } else {
422
+ let decimals = decimalCount64High(value);
423
+ out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));
424
+ utoa64_dec_core(changetype<usize>(out) + sign, value, decimals);
425
+ }
426
+ } else if (radix == 16) {
427
+ let decimals = ((63 - u32(clz(value))) >> 2) + 1;
428
+ out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));
429
+ utoa64_hex_core(changetype<usize>(out) + sign, value, decimals);
430
+ } else {
431
+ let decimals = ulog_base(value, radix);
432
+ out = changetype<String>(__new((decimals << 1) + sign, idof<String>()));
433
+ utoa64_any_core(changetype<usize>(out) + sign, value, decimals, radix);
434
+ }
435
+ if (sign) store<u16>(changetype<usize>(out), CharCode.MINUS);
436
+ return out;
437
+ }
438
+
439
+ // @ts-ignore: decorator
440
+ @lazy let _K: i32 = 0;
441
+
442
+ // // @ts-ignore: decorator
443
+ // @lazy
444
+ // let _frc: u64 = 0;
445
+
446
+ // @ts-ignore: decorator
447
+ @lazy let _exp: i32 = 0;
448
+
449
+ // @ts-ignore: decorator
450
+ @lazy let _frc_minus: u64 = 0;
451
+
452
+ // @ts-ignore: decorator
453
+ @lazy let _frc_plus: u64 = 0;
454
+
455
+ // @ts-ignore: decorator
456
+ @lazy let _frc_pow: u64 = 0;
457
+
458
+ // @ts-ignore: decorator
459
+ @lazy let _exp_pow: i32 = 0;
460
+
461
+ // @ts-ignore: decorator
462
+ @inline
463
+ function umul64f(u: u64, v: u64): u64 {
464
+ let u0 = u & 0xffffffff;
465
+ let v0 = v & 0xffffffff;
466
+
467
+ let u1 = u >> 32;
468
+ let v1 = v >> 32;
469
+
470
+ let l = u0 * v0;
471
+ let t = u1 * v0 + (l >> 32);
472
+ let w = u0 * v1 + (t & 0xffffffff);
473
+
474
+ w += 0x7fffffff; // rounding
475
+
476
+ t >>= 32;
477
+ w >>= 32;
478
+
479
+ return u1 * v1 + t + w;
480
+ }
481
+
482
+ // @ts-ignore: decorator
483
+ @inline
484
+ function umul64e(e1: i32, e2: i32): i32 {
485
+ return e1 + e2 + 64; // where 64 is significand size
486
+ }
487
+
488
+ // @ts-ignore: decorator
489
+ @inline
490
+ function normalizedBoundaries(f: u64, e: i32, isSingle: bool): void {
491
+ let frc = (f << 1) + 1;
492
+ let exp = e - 1;
493
+ let off = <i32>clz<u64>(frc);
494
+ frc <<= off;
495
+ exp -= off;
496
+
497
+ let m = 1 + i32(f == (isSingle ? 0x00800000 : 0x0010000000000000));
498
+
499
+ _frc_plus = frc;
500
+ _frc_minus = ((f << m) - 1) << (e - m - exp);
501
+ _exp = exp;
502
+ }
503
+
504
+ // @ts-ignore: decorator
505
+ @inline
506
+ function grisuRound(buffer: usize, len: i32, delta: u64, rest: u64, ten_kappa: u64, wp_w: u64): void {
507
+ let lastp = buffer + ((len - 1) << 1);
508
+ let digit = load<u16>(lastp);
509
+ while (
510
+ rest < wp_w &&
511
+ delta - rest >= ten_kappa &&
512
+ (rest + ten_kappa < wp_w || wp_w - rest > rest + ten_kappa - wp_w)
513
+ ) {
514
+ --digit;
515
+ rest += ten_kappa;
516
+ }
517
+ store<u16>(lastp, digit);
518
+ }
519
+
520
+ // @ts-ignore: decorator
521
+ @inline
522
+ function getCachedPower(minExp: i32): void {
523
+ const c = reinterpret<f64>(0x3fd34413509f79fe); // 1 / lg(10) = 0.30102999566398114
524
+ let dk = (-61 - minExp) * c + 347; // dk must be positive, so can do ceiling in positive
525
+ let k = <i32>dk;
526
+ k += i32(k != dk); // conversion with ceil
527
+
528
+ let index = (k >> 3) + 1;
529
+ _K = 348 - (index << 3); // decimal exponent no need lookup table
530
+ _frc_pow = load<u64>(FRC_POWERS + ((<usize>index) << alignof<u64>()));
531
+ _exp_pow = load<i16>(EXP_POWERS + ((<usize>index) << alignof<i16>()));
532
+ }
533
+
534
+ // @ts-ignore: decorator
535
+ @inline
536
+ function grisu2(value: f64, buffer: usize, sign: i32, isSingle: bool): i32 {
537
+ let frc: u64;
538
+ let exp: i32;
539
+
540
+ // frexp routine
541
+ if (isSingle) {
542
+ let uv = reinterpret<u32>(<f32>value);
543
+ exp = (uv & 0x7f800000) >>> 23;
544
+ let sid = uv & 0x007fffff;
545
+ frc = (u64(exp != 0) << 23) + sid;
546
+ exp = (exp || 1) - (0x7f + 23);
547
+ } else {
548
+ let uv = reinterpret<u64>(value);
549
+ exp = i32((uv & 0x7ff0000000000000) >>> 52);
550
+ let sid = uv & 0x000fffffffffffff;
551
+ frc = (u64(exp != 0) << 52) + sid;
552
+ exp = (exp || 1) - (0x3ff + 52);
553
+ }
554
+
555
+ normalizedBoundaries(frc, exp, isSingle);
556
+ getCachedPower(_exp);
557
+
558
+ // normalize
559
+ let off = <i32>clz<u64>(frc);
560
+ frc <<= off;
561
+ exp -= off;
562
+
563
+ let frc_pow = _frc_pow;
564
+ let exp_pow = _exp_pow;
565
+
566
+ let w_frc = umul64f(frc, frc_pow);
567
+ let w_exp = umul64e(exp, exp_pow);
568
+
569
+ let wp_frc = umul64f(_frc_plus, frc_pow) - 1;
570
+ let wp_exp = umul64e(_exp, exp_pow);
571
+
572
+ let wm_frc = umul64f(_frc_minus, frc_pow) + 1;
573
+ let delta = wp_frc - wm_frc;
574
+
575
+ return genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign);
576
+ }
577
+
578
+ function genDigits(buffer: usize, w_frc: u64, w_exp: i32, mp_frc: u64, mp_exp: i32, delta: u64, sign: i32): i32 {
579
+ let one_exp = -mp_exp;
580
+ let one_frc = (<u64>1) << one_exp;
581
+ let mask = one_frc - 1;
582
+
583
+ let wp_w_frc = mp_frc - w_frc;
584
+
585
+ let p1 = u32(mp_frc >> one_exp);
586
+ let p2 = mp_frc & mask;
587
+
588
+ let kappa = <i32>decimalCount32(p1);
589
+ let len = sign;
590
+
591
+ while (kappa > 0) {
592
+ let d: u32;
593
+ switch (kappa) {
594
+ case 10: {
595
+ d = p1 / 1000000000;
596
+ p1 %= 1000000000;
597
+ break;
598
+ }
599
+ case 9: {
600
+ d = p1 / 100000000;
601
+ p1 %= 100000000;
602
+ break;
603
+ }
604
+ case 8: {
605
+ d = p1 / 10000000;
606
+ p1 %= 10000000;
607
+ break;
608
+ }
609
+ case 7: {
610
+ d = p1 / 1000000;
611
+ p1 %= 1000000;
612
+ break;
613
+ }
614
+ case 6: {
615
+ d = p1 / 100000;
616
+ p1 %= 100000;
617
+ break;
618
+ }
619
+ case 5: {
620
+ d = p1 / 10000;
621
+ p1 %= 10000;
622
+ break;
623
+ }
624
+ case 4: {
625
+ d = p1 / 1000;
626
+ p1 %= 1000;
627
+ break;
628
+ }
629
+ case 3: {
630
+ d = p1 / 100;
631
+ p1 %= 100;
632
+ break;
633
+ }
634
+ case 2: {
635
+ d = p1 / 10;
636
+ p1 %= 10;
637
+ break;
638
+ }
639
+ case 1: {
640
+ d = p1;
641
+ p1 = 0;
642
+ break;
643
+ }
644
+ default: {
645
+ d = 0;
646
+ break;
647
+ }
648
+ }
649
+
650
+ if (d | len) store<u16>(buffer + (len++ << 1), CharCode._0 + <u16>d);
651
+
652
+ --kappa;
653
+ let tmp = ((<u64>p1) << one_exp) + p2;
654
+ if (tmp <= delta) {
655
+ _K += kappa;
656
+ grisuRound(
657
+ buffer,
658
+ len,
659
+ delta,
660
+ tmp,
661
+ (<u64>load<u32>(POWERS10 + ((<usize>kappa) << alignof<u32>()))) << one_exp,
662
+ wp_w_frc
663
+ );
664
+ return len;
665
+ }
666
+ }
667
+
668
+ while (true) {
669
+ p2 *= 10;
670
+ delta *= 10;
671
+
672
+ let d = p2 >> one_exp;
673
+ if (d | len) store<u16>(buffer + (len++ << 1), CharCode._0 + <u16>d);
674
+
675
+ p2 &= mask;
676
+ --kappa;
677
+ if (p2 < delta) {
678
+ _K += kappa;
679
+ wp_w_frc *= <u64>load<u32>(POWERS10 + ((<usize>-kappa) << alignof<u32>()));
680
+ grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc);
681
+ return len;
682
+ }
683
+ }
684
+ }
685
+
686
+ // @ts-ignore: decorator
687
+ @inline
688
+ function genExponent(buffer: usize, k: i32): i32 {
689
+ let sign = k < 0;
690
+ if (sign) k = -k;
691
+ let decimals = decimalCount32(k) + 1;
692
+ utoa32_dec_core(buffer, k, decimals);
693
+ store<u16>(buffer, <u16>select<u32>(CharCode.MINUS, CharCode.PLUS, sign));
694
+ return decimals;
695
+ }
696
+
697
+ function prettify(buffer: usize, length: i32, k: i32): i32 {
698
+ if (!k) {
699
+ store<u32>(buffer + (length << 1), CharCode.DOT | (CharCode._0 << 16));
700
+ return length + 2;
701
+ }
702
+
703
+ let kk = length + k;
704
+ if (length <= kk && kk <= 21) {
705
+ // 1234e7 -> 12340000000
706
+ for (let i = length; i < kk; ++i) {
707
+ store<u16>(buffer + (i << 1), CharCode._0);
708
+ }
709
+ store<u32>(buffer + (kk << 1), CharCode.DOT | (CharCode._0 << 16));
710
+ return kk + 2;
711
+ } else if (kk > 0 && kk <= 21) {
712
+ // 1234e-2 -> 12.34
713
+ let ptr = buffer + (kk << 1);
714
+ memory.copy(ptr + 2, ptr, -k << 1);
715
+ store<u16>(buffer + (kk << 1), CharCode.DOT);
716
+ return length + 1;
717
+ } else if (-6 < kk && kk <= 0) {
718
+ // 1234e-6 -> 0.001234
719
+ let offset = 2 - kk;
720
+ memory.copy(buffer + (offset << 1), buffer, length << 1);
721
+ store<u32>(buffer, CharCode._0 | (CharCode.DOT << 16));
722
+ for (let i = 2; i < offset; ++i) {
723
+ store<u16>(buffer + (i << 1), CharCode._0);
724
+ }
725
+ return length + offset;
726
+ } else if (length == 1) {
727
+ // 1e30
728
+ store<u16>(buffer, CharCode.e, 2);
729
+ length = genExponent(buffer + 4, kk - 1);
730
+ return length + 2;
731
+ } else {
732
+ let len = length << 1;
733
+ memory.copy(buffer + 4, buffer + 2, len - 2);
734
+ store<u16>(buffer, CharCode.DOT, 2);
735
+ store<u16>(buffer + len, CharCode.e, 2);
736
+ length += genExponent(buffer + len + 4, kk - 1);
737
+ return length + 2;
738
+ }
739
+ }
740
+
741
+ function dtoa_core(buffer: usize, value: f64, isSingle: bool): i32 {
742
+ let sign = i32(value < 0);
743
+ if (sign) {
744
+ value = -value;
745
+ store<u16>(buffer, CharCode.MINUS);
746
+ }
747
+ // assert(value > 0 && value <= (isSingle ? f32.MAX_VALUE : f64.MAX_VALUE));
748
+ let len = grisu2(value, buffer, sign, isSingle);
749
+ len = prettify(buffer + (sign << 1), len - sign, _K);
750
+ return len + sign;
751
+ }
752
+
753
+ // @ts-ignore: decorator
754
+ @lazy @inline const dtoa_buf = memory.data(MAX_DOUBLE_LENGTH << 1);
755
+
756
+ export function dtoa<T extends number>(value: T): String {
757
+ const isSingle = isFloat<T>() && sizeof<T>() == 4;
758
+ return dtoa_impl(value, isSingle);
759
+ }
760
+
761
+ // @ts-ignore: decorator
762
+ @inline
763
+ function dtoa_impl(value: f64, isSingle: bool): String {
764
+ if (value == 0) return "0.0";
765
+ if (!isFinite(value)) {
766
+ if (isNaN(value)) return "NaN";
767
+ return select<String>("-Infinity", "Infinity", value < 0);
768
+ }
769
+ let size = dtoa_core(dtoa_buf, value, isSingle) << 1;
770
+ let result = changetype<String>(__new(size, idof<String>()));
771
+ memory.copy(changetype<usize>(result), dtoa_buf, size);
772
+ return result;
773
+ }
774
+
775
+ export function itoa_buffered<T extends number>(buffer: usize, value: T): u32 {
776
+ let sign: u32 = 0;
777
+ if (isSigned<T>()) {
778
+ sign = u32(value < 0);
779
+ if (sign) {
780
+ if (sizeof<T>() == 1) {
781
+ if (value == -0x80) {
782
+ // -0x80 -> -128
783
+ store<u64>(
784
+ buffer,
785
+ (<u64>CharCode.MINUS) |
786
+ ((<u64>(CharCode._0 + 1)) << 16) |
787
+ ((<u64>(CharCode._0 + 2)) << 32) |
788
+ ((<u64>(CharCode._0 + 8)) << 48)
789
+ );
790
+ return 4;
791
+ }
792
+ }
793
+ if (sizeof<T>() == 2) {
794
+ if (value == -0x8000) {
795
+ // -0x8000 -> -32768
796
+ store<u64>(
797
+ buffer,
798
+ (<u64>CharCode.MINUS) |
799
+ ((<u64>(CharCode._0 + 3)) << 16) |
800
+ ((<u64>(CharCode._0 + 2)) << 32) |
801
+ ((<u64>(CharCode._0 + 7)) << 48)
802
+ ); // -327
803
+ store<u32>(buffer + 8, ((CharCode._0 + 6) << 0) | ((CharCode._0 + 8) << 16)); // 68
804
+ return 6;
805
+ }
806
+ }
807
+ store<u16>(buffer, CharCode.MINUS);
808
+ // @ts-ignore
809
+ value = -value;
810
+ }
811
+ }
812
+ let dest = buffer + (sign << 1);
813
+ if (ASC_SHRINK_LEVEL <= 1) {
814
+ if (isSigned<T>()) {
815
+ if (sizeof<T>() <= 4) {
816
+ if (<u32>value < 10) {
817
+ store<u16>(dest, value | CharCode._0);
818
+ return 1 + sign;
819
+ }
820
+ } else {
821
+ if (<u64>value < 10) {
822
+ store<u16>(dest, value | CharCode._0);
823
+ return 1 + sign;
824
+ }
825
+ }
826
+ } else {
827
+ if (value < 10) {
828
+ store<u16>(buffer, value | CharCode._0);
829
+ return 1;
830
+ }
831
+ }
832
+ }
833
+ let decimals: u32 = 0;
834
+ if (sizeof<T>() <= 4) {
835
+ let val32 = <u32>value;
836
+ decimals = decimalCount32(val32);
837
+ utoa32_dec_core(dest, val32, decimals);
838
+ } else {
839
+ if (<u64>value <= <u64>u32.MAX_VALUE) {
840
+ let val32 = <u32>value;
841
+ decimals = decimalCount32(val32);
842
+ utoa32_dec_core(dest, val32, decimals);
843
+ } else {
844
+ let val64 = <u64>value;
845
+ decimals = decimalCount64High(val64);
846
+ utoa64_dec_core(dest, val64, decimals);
847
+ }
848
+ }
849
+ return sign + decimals;
850
+ }
851
+
852
+ export function dtoa_buffered<T extends number>(buffer: usize, value: T): u32 {
853
+ const isSingle = isFloat<T>() && sizeof<T>() == 4;
854
+ return dtoa_buffered_impl(buffer, value, isSingle);
855
+ }
856
+
857
+ // @ts-ignore: decorator
858
+ @inline
859
+ function dtoa_buffered_impl(buffer: usize, value: f64, isSingle: bool): u32 {
860
+ if (value == 0) {
861
+ store<u16>(buffer, CharCode._0);
862
+ store<u16>(buffer, CharCode.DOT, 2);
863
+ store<u16>(buffer, CharCode._0, 4);
864
+ return 3;
865
+ }
866
+ if (!isFinite(value)) {
867
+ if (isNaN(value)) {
868
+ store<u16>(buffer, CharCode.N);
869
+ store<u16>(buffer, CharCode.a, 2);
870
+ store<u16>(buffer, CharCode.N, 4);
871
+ return 3;
872
+ } else {
873
+ let sign = value < 0;
874
+ if (sign) {
875
+ store<u16>(buffer, CharCode.MINUS); // -
876
+ buffer += 2;
877
+ }
878
+ store<u64>(buffer, 0x690066006e0049, 0); // ifnI
879
+ store<u64>(buffer, 0x7900740069006e, 8); // ytin
880
+ return 8 + u32(sign);
881
+ }
882
+ }
883
+ return dtoa_core(buffer, value, isSingle);
884
+ }