porffor 0.19.2 → 0.19.4
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/compiler/builtins/arraybuffer.ts +3 -3
- package/compiler/builtins/dataview.ts +2 -2
- package/compiler/builtins/set.ts +1 -1
- package/compiler/builtins/z_weakmap.ts +40 -0
- package/compiler/builtins/z_weakset.ts +34 -0
- package/compiler/codegen.js +1 -1
- package/compiler/generated_builtins.js +655 -617
- package/compiler/types.js +14 -9
- package/compiler/wrap.js +30 -46
- package/package.json +1 -1
- package/runner/index.js +1 -1
- package/compiler/builtins/weakset.ts +0 -102
package/compiler/types.js
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
export const TYPES = {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
empty: 0x00,
|
3
|
+
number: 0x01,
|
4
|
+
boolean: 0x02,
|
5
|
+
string: 0x03,
|
6
|
+
undefined: 0x04,
|
7
|
+
object: 0x05,
|
8
|
+
function: 0x06,
|
9
|
+
symbol: 0x07,
|
10
|
+
bigint: 0x08
|
10
11
|
};
|
11
12
|
|
12
13
|
// flags
|
@@ -19,7 +20,10 @@ export const TYPE_FLAGS = {
|
|
19
20
|
// TYPES.string |= TYPE_FLAGS.iterable;
|
20
21
|
TYPES.string |= TYPE_FLAGS.length;
|
21
22
|
|
23
|
+
TYPES.undefined = TYPES.empty | TYPE_FLAGS.parity;
|
24
|
+
|
22
25
|
export const TYPE_NAMES = {
|
26
|
+
[TYPES.empty]: 'empty',
|
23
27
|
[TYPES.number]: 'Number',
|
24
28
|
[TYPES.boolean]: 'Boolean',
|
25
29
|
[TYPES.string]: 'String',
|
@@ -69,4 +73,5 @@ registerInternalType('Float32Array', ['iterable', 'length']);
|
|
69
73
|
registerInternalType('Float64Array', ['iterable', 'length']);
|
70
74
|
|
71
75
|
registerInternalType('WeakRef');
|
72
|
-
registerInternalType('WeakSet');
|
76
|
+
registerInternalType('WeakSet');
|
77
|
+
registerInternalType('WeakMap');
|
package/compiler/wrap.js
CHANGED
@@ -27,8 +27,11 @@ export const writeByteStr = (memory, ptr, str) => {
|
|
27
27
|
|
28
28
|
const porfToJSValue = ({ memory, funcs, pages }, value, type) => {
|
29
29
|
switch (type) {
|
30
|
+
case TYPES.empty:
|
31
|
+
case TYPES.undefined:
|
32
|
+
return undefined;
|
33
|
+
|
30
34
|
case TYPES.boolean: return Boolean(value);
|
31
|
-
case TYPES.undefined: return undefined;
|
32
35
|
case TYPES.object: return value === 0 ? null : {};
|
33
36
|
|
34
37
|
case TYPES.function: {
|
@@ -81,49 +84,6 @@ const porfToJSValue = ({ memory, funcs, pages }, value, type) => {
|
|
81
84
|
return new Date(t);
|
82
85
|
}
|
83
86
|
|
84
|
-
case TYPES.set: {
|
85
|
-
const size = (new Uint32Array(memory.buffer, value, 1))[0];
|
86
|
-
|
87
|
-
const out = new Set();
|
88
|
-
for (let i = 0; i < size; i++) {
|
89
|
-
const offset = value + 4 + (i * 9);
|
90
|
-
|
91
|
-
// have to slice because of memory alignment (?)
|
92
|
-
const v = (new Float64Array(memory.buffer.slice(offset, offset + 8), 0, 1))[0];
|
93
|
-
const t = (new Uint8Array(memory.buffer, offset + 8, 1))[0];
|
94
|
-
|
95
|
-
// console.log(`reading value at index ${i}...`)
|
96
|
-
// console.log(' memory:', Array.from(new Uint8Array(memory.buffer, offset, 9)).map(x => x.toString(16).padStart(2, '0')).join(' '));
|
97
|
-
// console.log(' read:', { value: v, type: t }, '\n');
|
98
|
-
|
99
|
-
out.add(porfToJSValue({ memory, funcs, pages }, v, t));
|
100
|
-
}
|
101
|
-
|
102
|
-
return out;
|
103
|
-
}
|
104
|
-
|
105
|
-
case TYPES.map: {
|
106
|
-
const [ keysPtr, valsPtr ] = (new Uint32Array(memory.buffer, value, 2));
|
107
|
-
const size = (new Uint32Array(memory.buffer, keysPtr, 1))[0];
|
108
|
-
|
109
|
-
const out = new Map();
|
110
|
-
for (let i = 0; i < size; i++) {
|
111
|
-
const offset = 4 + (i * 9);
|
112
|
-
|
113
|
-
const kValue = (new Float64Array(memory.buffer.slice(keysPtr + offset, keysPtr + offset + 8), 0, 1))[0];
|
114
|
-
const kType = (new Uint8Array(memory.buffer, keysPtr + offset + 8, 1))[0];
|
115
|
-
const k = porfToJSValue({ memory, funcs, pages }, kValue, kType);
|
116
|
-
|
117
|
-
const vValue = (new Float64Array(memory.buffer.slice(valsPtr + offset, valsPtr + offset + 8), 0, 1))[0];
|
118
|
-
const vType = (new Uint8Array(memory.buffer, valsPtr + offset + 8, 1))[0];
|
119
|
-
const v = porfToJSValue({ memory, funcs, pages }, vValue, vType);
|
120
|
-
|
121
|
-
out.set(k, v);
|
122
|
-
}
|
123
|
-
|
124
|
-
return out;
|
125
|
-
}
|
126
|
-
|
127
87
|
case TYPES.symbol: {
|
128
88
|
const descStore = pages.get('bytestring: __Porffor_symbol_descStore/ptr').ind * pageSize;
|
129
89
|
if (!descStore) return Symbol();
|
@@ -184,10 +144,11 @@ const porfToJSValue = ({ memory, funcs, pages }, value, type) => {
|
|
184
144
|
return new WeakRef(porfToJSValue({ memory, funcs, pages }, v, t));
|
185
145
|
}
|
186
146
|
|
187
|
-
case TYPES.weakset:
|
147
|
+
case TYPES.weakset:
|
148
|
+
case TYPES.set: {
|
188
149
|
const size = (new Uint32Array(memory.buffer, value, 1))[0];
|
189
150
|
|
190
|
-
const out = new WeakSet();
|
151
|
+
const out = type === TYPES.weakset ? new WeakSet() : new Set();
|
191
152
|
for (let i = 0; i < size; i++) {
|
192
153
|
const offset = value + 4 + (i * 9);
|
193
154
|
const v = (new Float64Array(memory.buffer.slice(offset, offset + 8), 0, 1))[0];
|
@@ -199,6 +160,29 @@ const porfToJSValue = ({ memory, funcs, pages }, value, type) => {
|
|
199
160
|
return out;
|
200
161
|
}
|
201
162
|
|
163
|
+
case TYPES.weakmap:
|
164
|
+
case TYPES.map: {
|
165
|
+
const [ keysPtr, valsPtr ] = (new Uint32Array(memory.buffer, value, 2));
|
166
|
+
const size = (new Uint32Array(memory.buffer, keysPtr, 1))[0];
|
167
|
+
|
168
|
+
const out = type === TYPES.weakmap ? new WeakMap() : new Map();
|
169
|
+
for (let i = 0; i < size; i++) {
|
170
|
+
const offset = 4 + (i * 9);
|
171
|
+
|
172
|
+
const kValue = (new Float64Array(memory.buffer.slice(keysPtr + offset, keysPtr + offset + 8), 0, 1))[0];
|
173
|
+
const kType = (new Uint8Array(memory.buffer, keysPtr + offset + 8, 1))[0];
|
174
|
+
const k = porfToJSValue({ memory, funcs, pages }, kValue, kType);
|
175
|
+
|
176
|
+
const vValue = (new Float64Array(memory.buffer.slice(valsPtr + offset, valsPtr + offset + 8), 0, 1))[0];
|
177
|
+
const vType = (new Uint8Array(memory.buffer, valsPtr + offset + 8, 1))[0];
|
178
|
+
const v = porfToJSValue({ memory, funcs, pages }, vValue, vType);
|
179
|
+
|
180
|
+
out.set(k, v);
|
181
|
+
}
|
182
|
+
|
183
|
+
return out;
|
184
|
+
}
|
185
|
+
|
202
186
|
default: return value;
|
203
187
|
}
|
204
188
|
};
|
package/package.json
CHANGED
package/runner/index.js
CHANGED
@@ -1,102 +0,0 @@
|
|
1
|
-
import type {} from './porffor.d.ts';
|
2
|
-
|
3
|
-
export const __WeakSet_prototype_has = (_this: WeakSet, value: any) => {
|
4
|
-
const size: number = Porffor.wasm.i32.load(_this, 0, 0);
|
5
|
-
|
6
|
-
for (let i: number = 0; i < size; i++) {
|
7
|
-
if (__Porffor_set_read(_this, i) === value) return true;
|
8
|
-
}
|
9
|
-
|
10
|
-
return false;
|
11
|
-
};
|
12
|
-
|
13
|
-
export const __WeakSet_prototype_add = (_this: WeakSet, value: any) => {
|
14
|
-
if (Porffor.rawType(value) < 0x04) throw new TypeError('Value in WeakSet needs to be an object or symbol');
|
15
|
-
|
16
|
-
const size: number = Porffor.wasm.i32.load(_this, 0, 0);
|
17
|
-
|
18
|
-
// check if already in set
|
19
|
-
for (let i: number = 0; i < size; i++) {
|
20
|
-
if (__Porffor_set_read(_this, i) === value) return _this;
|
21
|
-
}
|
22
|
-
|
23
|
-
// not, add it
|
24
|
-
// increment size by 1
|
25
|
-
Porffor.wasm.i32.store(_this, size + 1, 0, 0);
|
26
|
-
|
27
|
-
// write new value at end
|
28
|
-
__Porffor_set_write(_this, size, value);
|
29
|
-
|
30
|
-
return _this;
|
31
|
-
};
|
32
|
-
|
33
|
-
export const __WeakSet_prototype_delete = (_this: WeakSet, value: any) => {
|
34
|
-
const size: number = Porffor.wasm.i32.load(_this, 0, 0);
|
35
|
-
|
36
|
-
// check if already in set
|
37
|
-
for (let i: number = 0; i < size; i++) {
|
38
|
-
if (__Porffor_set_read(_this, i) === value) {
|
39
|
-
// found, delete
|
40
|
-
// decrement size by 1
|
41
|
-
Porffor.wasm.i32.store(_this, size - 1, 0, 0);
|
42
|
-
|
43
|
-
// offset all elements after by -1 ind
|
44
|
-
Porffor.wasm`
|
45
|
-
local offset i32
|
46
|
-
local.get ${i}
|
47
|
-
i32.to_u
|
48
|
-
i32.const 9
|
49
|
-
i32.mul
|
50
|
-
local.get ${_this}
|
51
|
-
i32.to_u
|
52
|
-
i32.add
|
53
|
-
i32.const 4
|
54
|
-
i32.add
|
55
|
-
local.set offset
|
56
|
-
|
57
|
-
;; dst = offset (this element)
|
58
|
-
local.get offset
|
59
|
-
|
60
|
-
;; src = offset + 9 (this element + 1 element)
|
61
|
-
local.get offset
|
62
|
-
i32.const 9
|
63
|
-
i32.add
|
64
|
-
|
65
|
-
;; size = (size - i - 1) * 9
|
66
|
-
local.get ${size}
|
67
|
-
local.get ${i}
|
68
|
-
f64.sub
|
69
|
-
i32.to_u
|
70
|
-
i32.const 1
|
71
|
-
i32.sub
|
72
|
-
i32.const 9
|
73
|
-
i32.mul
|
74
|
-
|
75
|
-
memory.copy 0 0`;
|
76
|
-
|
77
|
-
return true;
|
78
|
-
}
|
79
|
-
}
|
80
|
-
|
81
|
-
// not, return false
|
82
|
-
return false;
|
83
|
-
};
|
84
|
-
|
85
|
-
export const WeakSet = function (iterable: any): WeakSet {
|
86
|
-
if (!new.target) throw new TypeError("Constructor Set requires 'new'");
|
87
|
-
|
88
|
-
const out: WeakSet = __Porffor_allocate();
|
89
|
-
|
90
|
-
if (Porffor.rawType(iterable) != Porffor.TYPES.undefined) for (const x of iterable) {
|
91
|
-
__WeakSet_prototype_add(out, x);
|
92
|
-
}
|
93
|
-
|
94
|
-
return out;
|
95
|
-
};
|
96
|
-
|
97
|
-
export const __WeakSet_prototype_toString = (_this: WeakSet) => {
|
98
|
-
const out: bytestring = '[object WeakSet]';
|
99
|
-
return out;
|
100
|
-
};
|
101
|
-
|
102
|
-
export const __WeakSet_prototype_toLocaleString = (_this: WeakSet) => __WeakSet_prototype_toString(_this);
|