porffor 0.2.0-5ac7ea0 → 0.2.0-5c24120
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.
- package/CONTRIBUTING.md +256 -0
- package/LICENSE +20 -20
- package/README.md +115 -82
- package/asur/index.js +624 -340
- package/byg/index.js +237 -0
- package/compiler/2c.js +1 -1
- package/compiler/{sections.js → assemble.js} +59 -12
- package/compiler/builtins/annexb_string.js +72 -0
- package/compiler/builtins/annexb_string.ts +18 -0
- package/compiler/builtins/array.ts +145 -0
- package/compiler/builtins/base64.ts +7 -84
- package/compiler/builtins/boolean.ts +20 -0
- package/compiler/builtins/crypto.ts +29 -41
- package/compiler/builtins/date.ts +2070 -0
- package/compiler/builtins/escape.ts +141 -0
- package/compiler/builtins/function.ts +7 -0
- package/compiler/builtins/int.ts +147 -0
- package/compiler/builtins/number.ts +534 -0
- package/compiler/builtins/object.ts +6 -0
- package/compiler/builtins/porffor.d.ts +42 -9
- package/compiler/builtins/string.ts +1080 -0
- package/compiler/builtins.js +60 -87
- package/compiler/{codeGen.js → codegen.js} +848 -316
- package/compiler/decompile.js +0 -1
- package/compiler/embedding.js +22 -22
- package/compiler/encoding.js +108 -10
- package/compiler/generated_builtins.js +1499 -7
- package/compiler/index.js +16 -14
- package/compiler/log.js +2 -2
- package/compiler/opt.js +23 -22
- package/compiler/parse.js +30 -22
- package/compiler/precompile.js +26 -27
- package/compiler/prefs.js +7 -6
- package/compiler/prototype.js +16 -32
- package/compiler/types.js +37 -0
- package/compiler/wasmSpec.js +11 -1
- package/compiler/wrap.js +41 -44
- package/package.json +9 -5
- package/porf +2 -0
- package/rhemyn/compile.js +44 -26
- package/rhemyn/parse.js +322 -320
- package/rhemyn/test/parse.js +58 -58
- package/runner/compare.js +34 -34
- package/runner/debug.js +122 -0
- package/runner/index.js +69 -12
- package/runner/profiler.js +45 -26
- package/runner/repl.js +42 -9
- package/runner/sizes.js +37 -37
- package/runner/info.js +0 -89
- package/runner/transform.js +0 -15
- package/util/enum.js +0 -20
@@ -1,95 +1,17 @@
|
|
1
|
-
// @porf
|
2
|
-
|
3
|
-
import type { i32, bytestring } from './porffor.d.ts';
|
4
|
-
|
5
|
-
// while (len >= 8) {
|
6
|
-
// Porffor.wasm`
|
7
|
-
// local tmp i64
|
8
|
-
// local.get ${i}
|
9
|
-
// i64.load 0 4
|
10
|
-
// local.set tmp
|
11
|
-
|
12
|
-
// local k i64
|
13
|
-
// i64.const 0
|
14
|
-
// local.set k
|
15
|
-
|
16
|
-
// loop 64
|
17
|
-
// local.get ${j}
|
18
|
-
|
19
|
-
// local.get ${keyStrPtr}
|
20
|
-
|
21
|
-
// local.get tmp
|
22
|
-
|
23
|
-
// ;; k * 6
|
24
|
-
// i64.const 58
|
25
|
-
|
26
|
-
// local.get k
|
27
|
-
// i64.const 6
|
28
|
-
// i64.mul
|
29
|
-
|
30
|
-
// i64.sub
|
31
|
-
|
32
|
-
// ;; tmp >> (58 - (k * 6))
|
33
|
-
// i64.shr_u
|
34
|
-
|
35
|
-
// ;; (tmp >> (58 - (k * 6))) & 0x3f
|
36
|
-
// i64.const 63
|
37
|
-
// i64.and
|
38
|
-
|
39
|
-
// i32.wrap_i64
|
40
|
-
|
41
|
-
// ;; keyStrPtr + ...
|
42
|
-
// i32.add
|
43
|
-
|
44
|
-
// ;; load character from keyStr
|
45
|
-
// i32.load8_u 0 4
|
46
|
-
|
47
|
-
// ;; store in output at j
|
48
|
-
// i32.store8 0 4
|
49
|
-
|
50
|
-
// local.get ${j}
|
51
|
-
// i32.const 1
|
52
|
-
// i32.add
|
53
|
-
// local.set ${j}
|
54
|
-
|
55
|
-
// local.get k
|
56
|
-
// i64.const 1
|
57
|
-
// i64.add
|
58
|
-
// local.tee k
|
59
|
-
|
60
|
-
// i64.const 8
|
61
|
-
// i64.lt_s
|
62
|
-
// br_if 0
|
63
|
-
// end
|
64
|
-
|
65
|
-
// `;
|
66
|
-
|
67
|
-
// // len -= 6;
|
68
|
-
// i += 6;
|
69
|
-
// }
|
70
|
-
|
71
|
-
// // while (k < 8) {
|
72
|
-
// // Porffor.wasm.i32.store8(j++, Porffor.wasm.i32.load8_u(keyStrPtr + Porffor.wasm.i32.wrap_i64(Porffor.wasm.i64.and(
|
73
|
-
// // Porffor.wasm.i64.shr_u(tmp, Porffor.wasm.i64.extend_i32_u(58 - k * 6)),
|
74
|
-
// // Porffor.wasm.i64.const(0x3f)
|
75
|
-
// // )), 0, 4), 0, 4);
|
76
|
-
// // k += 1;
|
77
|
-
// // }
|
78
|
-
|
79
|
-
// i += 6;
|
80
|
-
// len -= 6;
|
81
|
-
// }
|
1
|
+
// @porf --funsafe-no-unlikely-proto-checks --valtype=i32
|
82
2
|
|
83
3
|
export const btoa = (input: bytestring): bytestring => {
|
84
4
|
const keyStr: bytestring = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
85
|
-
const keyStrPtr: i32 = Porffor.
|
5
|
+
const keyStrPtr: i32 = Porffor.wasm`local.get ${keyStr}`;
|
86
6
|
|
87
7
|
let len: i32 = input.length;
|
88
8
|
let output: bytestring = '';
|
89
9
|
output.length = 4 * (len / 3 + !!(len % 3));
|
90
10
|
|
91
|
-
let i: i32 = Porffor.
|
92
|
-
j: i32 = Porffor.
|
11
|
+
let i: i32 = Porffor.wasm`local.get ${input}`,
|
12
|
+
j: i32 = Porffor.wasm`local.get ${output}`;
|
13
|
+
|
14
|
+
// todo/perf: add some per 6 char variant using bitwise magic
|
93
15
|
|
94
16
|
const endPtr = i + len;
|
95
17
|
while (i < endPtr) {
|
@@ -118,6 +40,7 @@ export const btoa = (input: bytestring): bytestring => {
|
|
118
40
|
return output;
|
119
41
|
};
|
120
42
|
|
43
|
+
// todo: impl atob by converting below to "porf ts"
|
121
44
|
/* var atob = function (input) {
|
122
45
|
const keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
123
46
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// @porf --funsafe-no-unlikely-proto-checks
|
2
|
+
|
3
|
+
// 20.3.3.2 Boolean.prototype.toString ()
|
4
|
+
// https://tc39.es/ecma262/#sec-boolean.prototype.tostring
|
5
|
+
export const __Boolean_prototype_toString = (_this: boolean) => {
|
6
|
+
// 1. Let b be ? ThisBooleanValue(this value).
|
7
|
+
// 2. If b is true, return "true"; else return "false".
|
8
|
+
let out: bytestring = '';
|
9
|
+
if (_this) out = 'true';
|
10
|
+
else out = 'false';
|
11
|
+
|
12
|
+
return out;
|
13
|
+
};
|
14
|
+
|
15
|
+
// 20.3.3.3 Boolean.prototype.valueOf ()
|
16
|
+
// https://tc39.es/ecma262/#sec-boolean.prototype.valueof
|
17
|
+
export const __Boolean_prototype_valueOf = (_this: boolean) => {
|
18
|
+
// 1. Return ? ThisBooleanValue(this value).
|
19
|
+
return _this;
|
20
|
+
};
|
@@ -1,16 +1,14 @@
|
|
1
|
-
// @porf
|
2
|
-
|
3
|
-
import type { i32, bytestring } from './porffor.d.ts';
|
1
|
+
// @porf --funsafe-no-unlikely-proto-checks --valtype=i32
|
4
2
|
|
5
3
|
export const __crypto_randomUUID = (): bytestring => {
|
6
4
|
let bytes: bytestring = '................';
|
7
5
|
|
8
|
-
|
6
|
+
const bytesPtr: i32 = Porffor.wasm`local.get ${bytes}`;
|
9
7
|
|
10
8
|
let a: i32 = bytesPtr;
|
11
9
|
let aEndPtr: i32 = a + 16;
|
12
10
|
while (a < aEndPtr) {
|
13
|
-
Porffor.wasm.i32.store8(a++, Porffor.
|
11
|
+
Porffor.wasm.i32.store8(a++, Porffor.randomByte(), 0, 4);
|
14
12
|
}
|
15
13
|
|
16
14
|
// bytes[6] = (bytes[6] & 0b00001111) | 0b01000000
|
@@ -31,7 +29,7 @@ export const __crypto_randomUUID = (): bytestring => {
|
|
31
29
|
|
32
30
|
let output: bytestring = '------------------------------------';
|
33
31
|
|
34
|
-
let i: i32 = Porffor.
|
32
|
+
let i: i32 = Porffor.wasm`local.get ${output}`;
|
35
33
|
let j: i32 = bytesPtr;
|
36
34
|
|
37
35
|
// bytes[0..4]-bytes[4..6]-bytes[6..8]-bytes[8..10]-bytes[10..15]
|
@@ -40,15 +38,13 @@ export const __crypto_randomUUID = (): bytestring => {
|
|
40
38
|
// bytes[0..4]-
|
41
39
|
let endPtr: i32 = i + 8;
|
42
40
|
while (i < endPtr) {
|
43
|
-
const byte = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
41
|
+
const byte: i32 = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
44
42
|
|
45
|
-
let lower = byte &
|
46
|
-
if (lower
|
47
|
-
else lower = 97 + (lower - 10);
|
43
|
+
let lower: i32 = (byte & 0x0f) + 48;
|
44
|
+
if (lower > 57) lower += 39;
|
48
45
|
|
49
|
-
let upper = byte >> 4;
|
50
|
-
if (upper
|
51
|
-
else upper = 97 + (upper - 10);
|
46
|
+
let upper: i32 = (byte >> 4) + 48;
|
47
|
+
if (upper > 57) upper += 39;
|
52
48
|
|
53
49
|
Porffor.wasm.i32.store8(i++, upper, 0, 4);
|
54
50
|
Porffor.wasm.i32.store8(i++, lower, 0, 4);
|
@@ -58,15 +54,13 @@ export const __crypto_randomUUID = (): bytestring => {
|
|
58
54
|
// bytes[4..6]-
|
59
55
|
endPtr = i + 4;
|
60
56
|
while (i < endPtr) {
|
61
|
-
const byte = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
57
|
+
const byte: i32 = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
62
58
|
|
63
|
-
let lower = byte &
|
64
|
-
if (lower
|
65
|
-
else lower = 97 + (lower - 10);
|
59
|
+
let lower: i32 = (byte & 0x0f) + 48;
|
60
|
+
if (lower > 57) lower += 39;
|
66
61
|
|
67
|
-
let upper = byte >> 4;
|
68
|
-
if (upper
|
69
|
-
else upper = 97 + (upper - 10);
|
62
|
+
let upper: i32 = (byte >> 4) + 48;
|
63
|
+
if (upper > 57) upper += 39;
|
70
64
|
|
71
65
|
Porffor.wasm.i32.store8(i++, upper, 0, 4);
|
72
66
|
Porffor.wasm.i32.store8(i++, lower, 0, 4);
|
@@ -76,15 +70,13 @@ export const __crypto_randomUUID = (): bytestring => {
|
|
76
70
|
// bytes[6..8]-
|
77
71
|
endPtr = i + 4;
|
78
72
|
while (i < endPtr) {
|
79
|
-
const byte = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
73
|
+
const byte: i32 = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
80
74
|
|
81
|
-
let lower = byte &
|
82
|
-
if (lower
|
83
|
-
else lower = 97 + (lower - 10);
|
75
|
+
let lower: i32 = (byte & 0x0f) + 48;
|
76
|
+
if (lower > 57) lower += 39;
|
84
77
|
|
85
|
-
let upper = byte >> 4;
|
86
|
-
if (upper
|
87
|
-
else upper = 97 + (upper - 10);
|
78
|
+
let upper: i32 = (byte >> 4) + 48;
|
79
|
+
if (upper > 57) upper += 39;
|
88
80
|
|
89
81
|
Porffor.wasm.i32.store8(i++, upper, 0, 4);
|
90
82
|
Porffor.wasm.i32.store8(i++, lower, 0, 4);
|
@@ -94,15 +86,13 @@ export const __crypto_randomUUID = (): bytestring => {
|
|
94
86
|
// bytes[8..10]-
|
95
87
|
endPtr = i + 4;
|
96
88
|
while (i < endPtr) {
|
97
|
-
const byte = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
89
|
+
const byte: i32 = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
98
90
|
|
99
|
-
let lower = byte &
|
100
|
-
if (lower
|
101
|
-
else lower = 97 + (lower - 10);
|
91
|
+
let lower: i32 = (byte & 0x0f) + 48;
|
92
|
+
if (lower > 57) lower += 39;
|
102
93
|
|
103
|
-
let upper = byte >> 4;
|
104
|
-
if (upper
|
105
|
-
else upper = 97 + (upper - 10);
|
94
|
+
let upper: i32 = (byte >> 4) + 48;
|
95
|
+
if (upper > 57) upper += 39;
|
106
96
|
|
107
97
|
Porffor.wasm.i32.store8(i++, upper, 0, 4);
|
108
98
|
Porffor.wasm.i32.store8(i++, lower, 0, 4);
|
@@ -112,15 +102,13 @@ export const __crypto_randomUUID = (): bytestring => {
|
|
112
102
|
// bytes[10..15]
|
113
103
|
endPtr = i + 12;
|
114
104
|
while (i < endPtr) {
|
115
|
-
const byte = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
105
|
+
const byte: i32 = Porffor.wasm.i32.load8_u(j++, 0, 4);
|
116
106
|
|
117
|
-
let lower = byte &
|
118
|
-
if (lower
|
119
|
-
else lower = 97 + (lower - 10);
|
107
|
+
let lower: i32 = (byte & 0x0f) + 48;
|
108
|
+
if (lower > 57) lower += 39;
|
120
109
|
|
121
|
-
let upper = byte >> 4;
|
122
|
-
if (upper
|
123
|
-
else upper = 97 + (upper - 10);
|
110
|
+
let upper: i32 = (byte >> 4) + 48;
|
111
|
+
if (upper > 57) upper += 39;
|
124
112
|
|
125
113
|
Porffor.wasm.i32.store8(i++, upper, 0, 4);
|
126
114
|
Porffor.wasm.i32.store8(i++, lower, 0, 4);
|