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