porffor 0.55.26 → 0.55.27
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.
@@ -188,6 +188,7 @@ export const __Porffor_object_hash = (key: any): i32 => {
|
|
188
188
|
|
189
189
|
// bytestring or string, fnv-1a hash (custom variant)
|
190
190
|
// todo/opt: custom wasm simd variant?
|
191
|
+
// todo/opt: pgo for if no hash collisions?
|
191
192
|
|
192
193
|
let ptr: i32 = Porffor.wasm`local.get ${key}`;
|
193
194
|
const len: i32 = Porffor.wasm.i32.load(key, 0, 0);
|
@@ -371,15 +372,9 @@ export const __Porffor_object_lookup = (obj: any, target: any, targetHash: i32):
|
|
371
372
|
let ptr: i32 = Porffor.wasm`local.get ${obj}` + 8;
|
372
373
|
const endPtr: i32 = ptr + Porffor.wasm.i32.load16_u(obj, 0, 0) * 18;
|
373
374
|
|
374
|
-
let out: boolean = false;
|
375
375
|
if (Porffor.wasm`local.get ${target+1}` == Porffor.TYPES.symbol) {
|
376
376
|
for (; ptr < endPtr; ptr += 18) {
|
377
377
|
const key: i32 = Porffor.wasm.i32.load(ptr, 0, 4);
|
378
|
-
if (key == 0) {
|
379
|
-
if (out) break; // ran out of keys
|
380
|
-
out = true;
|
381
|
-
}
|
382
|
-
|
383
378
|
if ((key >>> 30) == 3) { // MSB 1 and 2 set, symbol (unset MSB x2)
|
384
379
|
// todo: remove casts once weird bug which breaks unrelated things is fixed (https://github.com/CanadaHonk/porffor/commit/5747f0c1f3a4af95283ebef175cdacb21e332a52)
|
385
380
|
if ((key & 0x3FFFFFFF) as symbol == target as symbol) return ptr;
|
@@ -389,6 +384,11 @@ export const __Porffor_object_lookup = (obj: any, target: any, targetHash: i32):
|
|
389
384
|
for (; ptr < endPtr; ptr += 18) {
|
390
385
|
if (Porffor.wasm.i32.load(ptr, 0, 0) == targetHash) {
|
391
386
|
const key: i32 = Porffor.wasm.i32.load(ptr, 0, 4);
|
387
|
+
|
388
|
+
// fast path: check if same pointer first
|
389
|
+
if (key == Porffor.wasm`local.get ${target}`) return ptr;
|
390
|
+
|
391
|
+
// slow path: strcmp
|
392
392
|
Porffor.wasm`
|
393
393
|
local.get ${key}
|
394
394
|
i32.const 2147483647
|
@@ -86,9 +86,9 @@ params:[127,127],typedParams:1,returns:[127],returnType:1,
|
|
86
86
|
locals:[127,127,127,127,126,126],localNames:["key","key#type","ptr","len","hash","endPtr","x","shift"],
|
87
87
|
}
|
88
88
|
this.__Porffor_object_lookup = {
|
89
|
-
wasm:(_,{builtin})=>[[32,0],[69],[4,64],[65,127],[15],[26],[11],[32,1],[65,7],[71],[4,64],[32,0],[183],[32,1],[16,builtin('__Porffor_object_underlying')],[33,6],[252,2],[33,0],[32,6],[34,1],[65,7],[71],[4,64],[65,127],[15],[26],[11],[11],[32,0],[65,8],[106],[34,7],[32,0],[47,0,0],[65,18],[108],[106],[33,8],[
|
89
|
+
wasm:(_,{builtin})=>[[32,0],[69],[4,64],[65,127],[15],[26],[11],[32,1],[65,7],[71],[4,64],[32,0],[183],[32,1],[16,builtin('__Porffor_object_underlying')],[33,6],[252,2],[33,0],[32,6],[34,1],[65,7],[71],[4,64],[65,127],[15],[26],[11],[11],[32,0],[65,8],[106],[34,7],[32,0],[47,0,0],[65,18],[108],[106],[33,8],[32,3],[65,5],[70],[4,64],[3,64],[32,7],[32,8],[72],[4,64],[32,7],[40,0,4],[34,9],[65,30],[118],[65,3],[70],[4,64],[32,9],[65,255,255,255,255,3],[113],[32,2],[70],[4,64],[32,7],[15],[26],[11],[11],[32,7],[65,18],[106],[33,7],[12,1],[11],[11],[5],[3,64],[32,7],[32,8],[72],[4,64],[32,7],[40,0,0],[32,4],[70],[4,64],[32,7],[40,0,4],[34,9],[32,2],[70],[4,64],[32,7],[15],[26],[11],[32,9],[65,255,255,255,255,7],[113],[65,195,0],[65,195,1],[32,9],[65,30],[118],[27],[32,2],[32,3],[16,builtin('__Porffor_strcmp')],[4,64],[32,7],[15],[11],[11],[32,7],[65,18],[106],[33,7],[12,1],[11],[11],[11],[65,127],[15]],
|
90
90
|
params:[127,127,127,127,127,127],typedParams:1,returns:[127],returnType:1,
|
91
|
-
locals:[127,127,127,127
|
91
|
+
locals:[127,127,127,127],localNames:["obj","obj#type","target","target#type","targetHash","targetHash#type","#last_type","ptr","endPtr","key"],
|
92
92
|
usedTypes:[5],
|
93
93
|
}
|
94
94
|
this.__Porffor_object_readValue = {
|
package/package.json
CHANGED