porffor 0.2.0-f2bbe1f → 0.2.0-f647e42

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 (53) hide show
  1. package/CONTRIBUTING.md +239 -0
  2. package/LICENSE +20 -20
  3. package/README.md +154 -89
  4. package/asur/README.md +2 -0
  5. package/asur/index.js +1262 -0
  6. package/byg/index.js +237 -0
  7. package/compiler/2c.js +317 -72
  8. package/compiler/{sections.js → assemble.js} +63 -15
  9. package/compiler/builtins/annexb_string.js +72 -0
  10. package/compiler/builtins/annexb_string.ts +19 -0
  11. package/compiler/builtins/array.ts +145 -0
  12. package/compiler/builtins/base64.ts +151 -0
  13. package/compiler/builtins/crypto.ts +120 -0
  14. package/compiler/builtins/date.ts +1858 -0
  15. package/compiler/builtins/escape.ts +141 -0
  16. package/compiler/builtins/int.ts +147 -0
  17. package/compiler/builtins/number.ts +527 -0
  18. package/compiler/builtins/porffor.d.ts +59 -0
  19. package/compiler/builtins/string.ts +1055 -0
  20. package/compiler/builtins/tostring.ts +45 -0
  21. package/compiler/builtins.js +449 -269
  22. package/compiler/{codeGen.js → codegen.js} +1153 -418
  23. package/compiler/decompile.js +0 -1
  24. package/compiler/embedding.js +22 -22
  25. package/compiler/encoding.js +108 -10
  26. package/compiler/generated_builtins.js +1454 -0
  27. package/compiler/index.js +36 -34
  28. package/compiler/log.js +6 -3
  29. package/compiler/opt.js +51 -36
  30. package/compiler/parse.js +33 -23
  31. package/compiler/precompile.js +128 -0
  32. package/compiler/prefs.js +27 -0
  33. package/compiler/prototype.js +177 -37
  34. package/compiler/types.js +37 -0
  35. package/compiler/wasmSpec.js +30 -7
  36. package/compiler/wrap.js +56 -40
  37. package/package.json +9 -5
  38. package/porf +4 -0
  39. package/rhemyn/compile.js +46 -27
  40. package/rhemyn/parse.js +322 -320
  41. package/rhemyn/test/parse.js +58 -58
  42. package/runner/compare.js +34 -34
  43. package/runner/debug.js +122 -0
  44. package/runner/index.js +91 -11
  45. package/runner/profiler.js +102 -0
  46. package/runner/repl.js +42 -9
  47. package/runner/sizes.js +37 -37
  48. package/compiler/builtins/base64.js +0 -92
  49. package/runner/info.js +0 -89
  50. package/runner/profile.js +0 -46
  51. package/runner/results.json +0 -1
  52. package/runner/transform.js +0 -15
  53. package/util/enum.js +0 -20
@@ -0,0 +1,527 @@
1
+ // @porf --funsafe-no-unlikely-proto-checks
2
+
3
+ // radix: number|any for rawType check
4
+ export const __Number_prototype_toString = (_this: number, radix: number|any) => {
5
+ let out: bytestring = '';
6
+ let outPtr: i32 = Porffor.wasm`local.get ${out}`;
7
+
8
+ if (!Number.isFinite(_this)) {
9
+ if (Number.isNaN(_this)) out = 'NaN';
10
+ else if (_this == Infinity) out = 'Infinity';
11
+ else out = '-Infinity';
12
+
13
+ return out;
14
+ }
15
+
16
+ if (Porffor.rawType(radix) != Porffor.TYPES.number) {
17
+ // todo: string to number
18
+ radix = 10;
19
+ }
20
+
21
+ radix |= 0;
22
+ if (radix < 2 || radix > 36) {
23
+ // todo: throw RangeError: toString() radix argument must be between 2 and 36
24
+ return out;
25
+ }
26
+
27
+ if (_this == 0) {
28
+ out = '0';
29
+ return out;
30
+ }
31
+
32
+ // if negative value
33
+ if (_this < 0) {
34
+ _this = -_this; // turn value positive for later use
35
+ Porffor.wasm.i32.store8(outPtr++, 45, 0, 4); // prepend -
36
+ }
37
+
38
+ let i: f64 = Math.trunc(_this);
39
+
40
+ let digits: bytestring = ''; // byte "array"
41
+
42
+ let l: i32 = 0;
43
+ if (radix == 10) {
44
+ if (i >= 1e21) {
45
+ // large exponential
46
+ let trailing: boolean = true;
47
+ let e: i32 = -1;
48
+ while (i > 0) {
49
+ const digit: f64 = i % radix;
50
+ i = Math.trunc(i / radix);
51
+
52
+ e++;
53
+ if (trailing) {
54
+ if (digit == 0) { // skip trailing 0s
55
+ continue;
56
+ }
57
+ trailing = false;
58
+ }
59
+
60
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, digit, 0, 4);
61
+ l++;
62
+ }
63
+
64
+ let digitsPtr: i32 = Porffor.wasm`local.get ${digits}` + l;
65
+ let endPtr: i32 = outPtr + l;
66
+ let dotPlace: i32 = outPtr + 1;
67
+ while (outPtr < endPtr) {
68
+ if (outPtr == dotPlace) {
69
+ Porffor.wasm.i32.store8(outPtr++, 46, 0, 4); // .
70
+ endPtr++;
71
+ }
72
+
73
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
74
+
75
+ if (digit < 10) digit += 48; // 0-9
76
+ else digit += 87; // a-z
77
+
78
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
79
+ }
80
+
81
+ Porffor.wasm.i32.store8(outPtr++, 101, 0, 4); // e
82
+ Porffor.wasm.i32.store8(outPtr++, 43, 0, 4); // +
83
+
84
+ l = 0;
85
+ for (; e > 0; l++) {
86
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, e % radix, 0, 4);
87
+ e = Math.trunc(e / radix);
88
+ }
89
+
90
+ digitsPtr = Porffor.wasm`local.get ${digits}` + l;
91
+
92
+ endPtr = outPtr + l;
93
+ while (outPtr < endPtr) {
94
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
95
+
96
+ if (digit < 10) digit += 48; // 0-9
97
+ else digit += 87; // a-z
98
+
99
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
100
+ }
101
+
102
+ out.length = outPtr - Porffor.wasm`local.get ${out}`;
103
+
104
+ return out;
105
+ }
106
+
107
+ if (_this < 1e-6) {
108
+ // small exponential
109
+ let decimal: f64 = _this;
110
+
111
+ let e: i32 = 1;
112
+ while (true) {
113
+ decimal *= radix;
114
+
115
+ const intPart: i32 = Math.trunc(decimal);
116
+ if (intPart > 0) {
117
+ if (decimal - intPart < 1e-10) break;
118
+ } else e++;
119
+ }
120
+
121
+ while (decimal > 0) {
122
+ const digit: f64 = decimal % radix;
123
+ decimal = Math.trunc(decimal / radix);
124
+
125
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, digit, 0, 4);
126
+ l++;
127
+ }
128
+
129
+ let digitsPtr: i32 = Porffor.wasm`local.get ${digits}` + l;
130
+ let endPtr: i32 = outPtr + l;
131
+ let dotPlace: i32 = outPtr + 1;
132
+ while (outPtr < endPtr) {
133
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
134
+
135
+ if (outPtr == dotPlace) {
136
+ Porffor.wasm.i32.store8(outPtr++, 46, 0, 4); // .
137
+ endPtr++;
138
+ }
139
+
140
+ if (digit < 10) digit += 48; // 0-9
141
+ else digit += 87; // a-z
142
+
143
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
144
+ }
145
+
146
+ Porffor.wasm.i32.store8(outPtr++, 101, 0, 4); // e
147
+ Porffor.wasm.i32.store8(outPtr++, 45, 0, 4); // -
148
+
149
+ l = 0;
150
+ for (; e > 0; l++) {
151
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, e % radix, 0, 4);
152
+ e = Math.trunc(e / radix);
153
+ }
154
+
155
+ digitsPtr = Porffor.wasm`local.get ${digits}` + l;
156
+
157
+ endPtr = outPtr + l;
158
+ while (outPtr < endPtr) {
159
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
160
+
161
+ if (digit < 10) digit += 48; // 0-9
162
+ else digit += 87; // a-z
163
+
164
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
165
+ }
166
+
167
+ out.length = outPtr - Porffor.wasm`local.get ${out}`;
168
+
169
+ return out;
170
+ }
171
+ }
172
+
173
+ if (i == 0) {
174
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}`, 0, 0, 4);
175
+ l = 1;
176
+ } else {
177
+ for (; i > 0; l++) {
178
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, i % radix, 0, 4);
179
+ i = Math.trunc(i / radix);
180
+ }
181
+ }
182
+
183
+ let digitsPtr: i32 = Porffor.wasm`local.get ${digits}` + l;
184
+ let endPtr: i32 = outPtr + l;
185
+ while (outPtr < endPtr) {
186
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
187
+
188
+ if (digit < 10) digit += 48; // 0-9
189
+ else digit += 87; // a-z
190
+
191
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
192
+ }
193
+
194
+ let decimal: f64 = _this - Math.trunc(_this);
195
+ if (decimal > 0) {
196
+ Porffor.wasm.i32.store8(outPtr++, 46, 0, 4); // .
197
+
198
+ decimal += 1;
199
+
200
+ // todo: doesn't handle non-10 radix properly
201
+ let decimalDigits: i32 = 16 - l;
202
+ for (let j: i32 = 0; j < decimalDigits; j++) {
203
+ decimal *= radix;
204
+ }
205
+
206
+ decimal = Math.round(decimal);
207
+
208
+ l = 0;
209
+ let trailing: boolean = true;
210
+ while (decimal > 1) {
211
+ const digit: f64 = decimal % radix;
212
+ decimal = Math.trunc(decimal / radix);
213
+
214
+ if (trailing) {
215
+ if (digit == 0) { // skip trailing 0s
216
+ continue;
217
+ }
218
+ trailing = false;
219
+ }
220
+
221
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, digit, 0, 4);
222
+ l++;
223
+ }
224
+
225
+ digitsPtr = Porffor.wasm`local.get ${digits}` + l;
226
+
227
+ endPtr = outPtr + l;
228
+ while (outPtr < endPtr) {
229
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
230
+
231
+ if (digit < 10) digit += 48; // 0-9
232
+ else digit += 87; // a-z
233
+
234
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
235
+ }
236
+ }
237
+
238
+ out.length = outPtr - Porffor.wasm`local.get ${out}`;
239
+
240
+ return out;
241
+ };
242
+
243
+ export const __Number_prototype_toFixed = (_this: number, fractionDigits: number) => {
244
+ let out: bytestring = '';
245
+ let outPtr: i32 = Porffor.wasm`local.get ${out}`;
246
+
247
+ if (!Number.isFinite(_this)) {
248
+ if (Number.isNaN(_this)) out = 'NaN';
249
+ else if (_this == Infinity) out = 'Infinity';
250
+ else out = '-Infinity';
251
+
252
+ return out;
253
+ }
254
+
255
+ fractionDigits |= 0;
256
+ if (fractionDigits < 0 || fractionDigits > 100) {
257
+ // todo: throw RangeError: toFixed() digits argument must be between 0 and 100
258
+ return out;
259
+ }
260
+
261
+ // if negative value
262
+ if (_this < 0) {
263
+ _this = -_this; // turn value positive for later use
264
+ Porffor.wasm.i32.store8(outPtr++, 45, 0, 4); // prepend -
265
+ }
266
+
267
+ let i: f64 = Math.trunc(_this);
268
+
269
+ let digits: bytestring = ''; // byte "array"
270
+
271
+ let l: i32 = 0;
272
+
273
+ if (i == 0) {
274
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}`, 0, 0, 4);
275
+ l = 1;
276
+ } else {
277
+ for (; i > 0; l++) {
278
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, i % 10, 0, 4);
279
+ i = Math.trunc(i / 10);
280
+ }
281
+ }
282
+
283
+ let digitsPtr: i32 = Porffor.wasm`local.get ${digits}` + l;
284
+ let endPtr: i32 = outPtr + l;
285
+ while (outPtr < endPtr) {
286
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
287
+
288
+ if (digit < 10) digit += 48; // 0-9
289
+ else digit += 87; // a-z
290
+
291
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
292
+ }
293
+
294
+ let decimal: f64 = _this - Math.trunc(_this);
295
+ if (fractionDigits > 0) {
296
+ Porffor.wasm.i32.store8(outPtr++, 46, 0, 4); // .
297
+
298
+ decimal += 1;
299
+
300
+ for (let j: i32 = 0; j < fractionDigits; j++) {
301
+ decimal *= 10;
302
+ }
303
+
304
+ decimal = Math.round(decimal);
305
+
306
+ l = 0;
307
+ while (decimal > 1) {
308
+ const digit: f64 = decimal % 10;
309
+ decimal = Math.trunc(decimal / 10);
310
+
311
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, digit, 0, 4);
312
+ l++;
313
+ }
314
+
315
+ digitsPtr = Porffor.wasm`local.get ${digits}` + l;
316
+
317
+ endPtr = outPtr + l;
318
+ while (outPtr < endPtr) {
319
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
320
+
321
+ if (digit < 10) digit += 48; // 0-9
322
+ else digit += 87; // a-z
323
+
324
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
325
+ }
326
+ }
327
+
328
+ out.length = outPtr - Porffor.wasm`local.get ${out}`;
329
+
330
+ return out;
331
+ };
332
+
333
+ // fractionDigits: number|any for rawType check
334
+ export const __Number_prototype_toExponential = (_this: number, fractionDigits: number|any) => {
335
+ let out: bytestring = '';
336
+ let outPtr: i32 = Porffor.wasm`local.get ${out}`;
337
+
338
+ if (!Number.isFinite(_this)) {
339
+ if (Number.isNaN(_this)) out = 'NaN';
340
+ else if (_this == Infinity) out = 'Infinity';
341
+ else out = '-Infinity';
342
+
343
+ return out;
344
+ }
345
+
346
+ if (Porffor.rawType(fractionDigits) != Porffor.TYPES.number) {
347
+ // todo: string to number
348
+ fractionDigits = undefined;
349
+ } else {
350
+ fractionDigits |= 0;
351
+ if (fractionDigits < 0 || fractionDigits > 100) {
352
+ // todo: throw RangeError: toExponential() digits argument must be between 0 and 100
353
+ return out;
354
+ }
355
+ }
356
+
357
+ // if negative value
358
+ if (_this < 0) {
359
+ _this = -_this; // turn value positive for later use
360
+ Porffor.wasm.i32.store8(outPtr++, 45, 0, 4); // prepend -
361
+ }
362
+
363
+ let i: f64 = _this;
364
+
365
+ let digits: bytestring = ''; // byte "array"
366
+
367
+ let l: i32 = 0;
368
+ let e: i32 = 0;
369
+ let digitsPtr: i32;
370
+ let endPtr: i32;
371
+ if (_this == 0) {
372
+ Porffor.wasm.i32.store8(outPtr++, 48, 0, 4); // 0
373
+
374
+ if (fractionDigits > 0) {
375
+ Porffor.wasm.i32.store8(outPtr++, 46, 0, 4); // .
376
+ for (let j: i32 = 0; j < fractionDigits; j++) {
377
+ Porffor.wasm.i32.store8(outPtr++, 48, 0, 4); // 0
378
+ }
379
+ }
380
+
381
+ Porffor.wasm.i32.store8(outPtr++, 101, 0, 4); // e
382
+ Porffor.wasm.i32.store8(outPtr++, 43, 0, 4); // +
383
+ } else if (_this < 1) {
384
+ // small exponential
385
+ if (Porffor.rawType(fractionDigits) != Porffor.TYPES.number) {
386
+ e = 1;
387
+ while (true) {
388
+ i *= 10;
389
+
390
+ const intPart: i32 = Math.trunc(i);
391
+ if (intPart > 0) {
392
+ if (i - intPart < 1e-10) break;
393
+ } else e++;
394
+ }
395
+ } else {
396
+ e = 1;
397
+ let j: i32 = 0;
398
+ while (j <= fractionDigits) {
399
+ i *= 10;
400
+
401
+ const intPart: i32 = Math.trunc(i);
402
+ if (intPart == 0) e++;
403
+ else j++;
404
+ }
405
+ }
406
+
407
+ while (i > 0) {
408
+ const digit: f64 = i % 10;
409
+ i = Math.trunc(i / 10);
410
+
411
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, digit, 0, 4);
412
+ l++;
413
+ }
414
+
415
+ digitsPtr = Porffor.wasm`local.get ${digits}` + l;
416
+ endPtr = outPtr + l;
417
+ let dotPlace: i32 = outPtr + 1;
418
+ while (outPtr < endPtr) {
419
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
420
+
421
+ if (outPtr == dotPlace) {
422
+ Porffor.wasm.i32.store8(outPtr++, 46, 0, 4); // .
423
+ endPtr++;
424
+ }
425
+
426
+ if (digit < 10) digit += 48; // 0-9
427
+ else digit += 87; // a-z
428
+
429
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
430
+ }
431
+
432
+ Porffor.wasm.i32.store8(outPtr++, 101, 0, 4); // e
433
+ Porffor.wasm.i32.store8(outPtr++, 45, 0, 4); // -
434
+ } else {
435
+ // large exponential
436
+ e = -1;
437
+ while (i >= 1) {
438
+ i /= 10;
439
+ e++;
440
+ }
441
+
442
+ if (Porffor.rawType(fractionDigits) != Porffor.TYPES.number) {
443
+ while (true) {
444
+ i *= 10;
445
+
446
+ const intPart: i32 = Math.trunc(i);
447
+ if (intPart > 0) {
448
+ if (i - intPart < 1e-10) break;
449
+ } else e++;
450
+ }
451
+ } else {
452
+ // i = _this;
453
+ // if (e >= fractionDigits) {
454
+ // for (let j: i32 = 0; j < e - fractionDigits; j++) {
455
+ // i /= 10;
456
+ // }
457
+ // } else {
458
+ // for (let j: i32 = 0; j < fractionDigits - e; j++) {
459
+ // i *= 10;
460
+ // }
461
+ // }
462
+
463
+ // eg: 1.2345 -> 123.45, if fractionDigits = 2
464
+ for (let j: i32 = 0; j <= fractionDigits; j++) {
465
+ i *= 10;
466
+ }
467
+ }
468
+
469
+ // eg: 123.45 -> 123
470
+ i = Math.round(i);
471
+
472
+ while (i > 0) {
473
+ const digit: f64 = i % 10;
474
+ i = Math.trunc(i / 10);
475
+
476
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, digit, 0, 4);
477
+ l++;
478
+ }
479
+
480
+ digitsPtr = Porffor.wasm`local.get ${digits}` + l;
481
+ endPtr = outPtr + l;
482
+ let dotPlace: i32 = outPtr + 1;
483
+ while (outPtr < endPtr) {
484
+ if (outPtr == dotPlace) {
485
+ Porffor.wasm.i32.store8(outPtr++, 46, 0, 4); // .
486
+ endPtr++;
487
+ }
488
+
489
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
490
+
491
+ if (digit < 10) digit += 48; // 0-9
492
+ else digit += 87; // a-z
493
+
494
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
495
+ }
496
+
497
+ Porffor.wasm.i32.store8(outPtr++, 101, 0, 4); // e
498
+ Porffor.wasm.i32.store8(outPtr++, 43, 0, 4); // +
499
+ }
500
+
501
+ if (e == 0) {
502
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}`, 0, 0, 4);
503
+ l = 1;
504
+ } else {
505
+ l = 0;
506
+ for (; e > 0; l++) {
507
+ Porffor.wasm.i32.store8(Porffor.wasm`local.get ${digits}` + l, e % 10, 0, 4);
508
+ e = Math.trunc(e / 10);
509
+ }
510
+ }
511
+
512
+ digitsPtr = Porffor.wasm`local.get ${digits}` + l;
513
+
514
+ endPtr = outPtr + l;
515
+ while (outPtr < endPtr) {
516
+ let digit: i32 = Porffor.wasm.i32.load8_u(--digitsPtr, 0, 4);
517
+
518
+ if (digit < 10) digit += 48; // 0-9
519
+ else digit += 87; // a-z
520
+
521
+ Porffor.wasm.i32.store8(outPtr++, digit, 0, 4);
522
+ }
523
+
524
+ out.length = outPtr - Porffor.wasm`local.get ${out}`;
525
+
526
+ return out;
527
+ };
@@ -0,0 +1,59 @@
1
+ export type i32 = number;
2
+ export type i64 = number;
3
+ export type f64 = number;
4
+ export type bytestring = string;
5
+
6
+ type PorfforGlobal = {
7
+ wasm: {
8
+ (...args: any[]): any;
9
+ i32: {
10
+ load(pointer: i32, align: i32, offset: i32): i32;
11
+ store(pointer: i32, value: i32, align: i32, offset: i32): i32;
12
+ load8_u(pointer: i32, align: i32, offset: i32): i32;
13
+ store8(pointer: i32, value: i32, align: i32, offset: i32): i32;
14
+ load16_u(pointer: i32, align: i32, offset: i32): i32;
15
+ store16(pointer: i32, value: i32, align: i32, offset: i32): i32;
16
+ const(value: i32): i32;
17
+ }
18
+
19
+ f64: {
20
+ load(pointer: i32, align: i32, offset: i32): i32;
21
+ store(pointer: i32, value: f64, align: i32, offset: i32): f64;
22
+ }
23
+ }
24
+
25
+ randomByte(): i32;
26
+
27
+ type(x: any): bytestring;
28
+ rawType(x: any): i32;
29
+ TYPES: {
30
+ number: i32;
31
+ boolean: i32;
32
+ string: i32;
33
+ undefined: i32;
34
+ object: i32;
35
+ function: i32;
36
+ symbol: i32;
37
+ bigint: i32;
38
+
39
+ _array: i32;
40
+ _regexp: i32;
41
+ _bytestring: i32;
42
+ _date: i32;
43
+ }
44
+
45
+ fastOr(...args: any): boolean;
46
+ fastAnd(...args: any): boolean;
47
+
48
+ s(...args: any): string;
49
+ bs(...args: any): bytestring;
50
+ };
51
+
52
+ declare global {
53
+ const Porffor: PorfforGlobal;
54
+
55
+ type i32 = number;
56
+ type i64 = number;
57
+ type f64 = number;
58
+ type bytestring = string;
59
+ }