Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
refactoring
  • Loading branch information
MaxGraey committed Jun 27, 2022
commit 191c700fda0cc1652f02ab7f4f0beeebffddfab7
36 changes: 25 additions & 11 deletions src/bindings/js.ts
Original file line number Diff line number Diff line change
Expand Up @@ -720,21 +720,27 @@ export class JSBuilder extends ExportsWalker {
const entries = setInstance.offsetof("entries");
const emptyTagMask = 1 << 0;
const pointerSize = this.program.options.isWasm64 ? 8 : 4;
const pointerMask = pointerSize - 1;

sb.push(` function __liftSet(liftElement, byteSize, ptr) {
sb.push(` function __liftSet(liftElement, keySize, ptr) {
if (!ptr) return null;
const
mem32 = new Uint32Array(memory.buffer),
count = mem32[ptr + ${entriesOffset} >>> 2],
entries = mem32[ptr + ${entries} >>> 2],
tagOffset = Math.max(byteSize, ${pointerSize}),
entryMask = tagOffset - 1,
entrySize = (byteSize + ${pointerSize} + entryMask) & ~entryMask,
// key is known
keyMask = keySize - 1,
taggedOffset = (keySize + ${pointerMask}) & ~${pointerMask},
// end is all contents combined (here: pointer after value after key, net size unaligned)
endOffset = taggedOffset + ${pointerSize},
// entire thing is at least pointer aligned, or more if K or V is larger, i.e. v128
entryMask = Math.max(${pointerMask}, keyMask),
entrySize = (endOffset + entryMask) & ~entryMask,
res = new Set();
for (let i = 0; i < count; ++i) {
const
buf = entries + i * entrySize,
tag = mem32[buf + tagOffset >>> 2];
tag = mem32[buf + taggedOffset >>> 2];
if (!(tag & ${emptyTagMask})) {
res.add(liftElement(buf));
}
Expand All @@ -757,17 +763,25 @@ export class JSBuilder extends ExportsWalker {
mem32 = new Uint32Array(memory.buffer),
count = mem32[ptr + ${entriesOffset} >>> 2],
entries = mem32[ptr + ${entries} >>> 2],
alignedKeySize = (keySize + valueSize - 1) & ~(valueSize - 1),
tagOffset = ((alignedKeySize + valueSize) + ${pointerMask}) & ~${pointerMask},
entryMask = Math.max(keySize, valueSize, ${pointerSize}) - 1,
entrySize = (tagOffset + ${pointerSize} + entryMask) & ~entryMask,
// key is known
keyMask = keySize - 1,
keyOffset = 0,
// value is aligned after key
valueMask = valueSize - 1,
valueOffset = (keyOffset + keySize + valueMask) & ~valueMask,
taggedOffset = (valueOffset + valueSize + ${pointerMask}) & ~${pointerMask},
// end is all contents combined (here: pointer after value after key, net size unaligned)
endOffset = taggedOffset + ${pointerSize},
// entire thing is at least pointer aligned, or more if K or V is larger, i.e. v128
entryMask = Math.max(${pointerMask}, keyMask, valueMask),
entrySize = (endOffset + entryMask) & ~entryMask,
res = new Map();
for (let i = 0; i < count; ++i) {
const
buf = entries + i * entrySize,
tag = mem32[buf + tagOffset >>> 2];
tag = mem32[buf + taggedOffset >>> 2];
if (!(tag & ${emptyTagMask})) {
res.set(liftKeyElement(buf), liftValueElement(buf + alignedKeySize));
res.set(liftKeyElement(buf + keyOffset), liftValueElement(buf + valueOffset));
}
}
return res;
Expand Down
35 changes: 24 additions & 11 deletions tests/compiler/bindings/esm.debug.js
Original file line number Diff line number Diff line change
Expand Up @@ -335,20 +335,25 @@ async function instantiate(module, imports = {}) {
exports.__unpin(buf);
return buf;
}
function __liftSet(liftElement, byteSize, ptr) {
function __liftSet(liftElement, keySize, ptr) {
if (!ptr) return null;
const
mem32 = new Uint32Array(memory.buffer),
count = mem32[ptr + 16 >>> 2],
entries = mem32[ptr + 8 >>> 2],
tagOffset = Math.max(byteSize, 4),
entryMask = tagOffset - 1,
entrySize = (byteSize + 4 + entryMask) & ~entryMask,
// key is known
keyMask = keySize - 1,
taggedOffset = (keySize + 3) & ~3,
// end is all contents combined (here: pointer after value after key, net size unaligned)
endOffset = taggedOffset + 4,
// entire thing is at least pointer aligned, or more if K or V is larger, i.e. v128
entryMask = Math.max(3, keyMask),
entrySize = (endOffset + entryMask) & ~entryMask,
res = new Set();
for (let i = 0; i < count; ++i) {
const
buf = entries + i * entrySize,
tag = mem32[buf + tagOffset >>> 2];
tag = mem32[buf + taggedOffset >>> 2];
if (!(tag & 1)) {
res.add(liftElement(buf));
}
Expand All @@ -361,17 +366,25 @@ async function instantiate(module, imports = {}) {
mem32 = new Uint32Array(memory.buffer),
count = mem32[ptr + 16 >>> 2],
entries = mem32[ptr + 8 >>> 2],
alignedKeySize = (keySize + valueSize - 1) & ~(valueSize - 1),
tagOffset = ((alignedKeySize + valueSize) + 3) & ~3,
entryMask = Math.max(keySize, valueSize, 4) - 1,
entrySize = (tagOffset + 4 + entryMask) & ~entryMask,
// key is known
keyMask = keySize - 1,
keyOffset = 0,
// value is aligned after key
valueMask = valueSize - 1,
valueOffset = (keyOffset + keySize + valueMask) & ~valueMask,
taggedOffset = (valueOffset + valueSize + 3) & ~3,
// end is all contents combined (here: pointer after value after key, net size unaligned)
endOffset = taggedOffset + 4,
// entire thing is at least pointer aligned, or more if K or V is larger, i.e. v128
entryMask = Math.max(3, keyMask, valueMask),
entrySize = (endOffset + entryMask) & ~entryMask,
res = new Map();
for (let i = 0; i < count; ++i) {
const
buf = entries + i * entrySize,
tag = mem32[buf + tagOffset >>> 2];
tag = mem32[buf + taggedOffset >>> 2];
if (!(tag & 1)) {
res.set(liftKeyElement(buf), liftValueElement(buf + alignedKeySize));
res.set(liftKeyElement(buf + keyOffset), liftValueElement(buf + valueOffset));
}
}
return res;
Expand Down
35 changes: 24 additions & 11 deletions tests/compiler/bindings/esm.release.js
Original file line number Diff line number Diff line change
Expand Up @@ -335,20 +335,25 @@ async function instantiate(module, imports = {}) {
exports.__unpin(buf);
return buf;
}
function __liftSet(liftElement, byteSize, ptr) {
function __liftSet(liftElement, keySize, ptr) {
if (!ptr) return null;
const
mem32 = new Uint32Array(memory.buffer),
count = mem32[ptr + 16 >>> 2],
entries = mem32[ptr + 8 >>> 2],
tagOffset = Math.max(byteSize, 4),
entryMask = tagOffset - 1,
entrySize = (byteSize + 4 + entryMask) & ~entryMask,
// key is known
keyMask = keySize - 1,
taggedOffset = (keySize + 3) & ~3,
// end is all contents combined (here: pointer after value after key, net size unaligned)
endOffset = taggedOffset + 4,
// entire thing is at least pointer aligned, or more if K or V is larger, i.e. v128
entryMask = Math.max(3, keyMask),
entrySize = (endOffset + entryMask) & ~entryMask,
res = new Set();
for (let i = 0; i < count; ++i) {
const
buf = entries + i * entrySize,
tag = mem32[buf + tagOffset >>> 2];
tag = mem32[buf + taggedOffset >>> 2];
if (!(tag & 1)) {
res.add(liftElement(buf));
}
Expand All @@ -361,17 +366,25 @@ async function instantiate(module, imports = {}) {
mem32 = new Uint32Array(memory.buffer),
count = mem32[ptr + 16 >>> 2],
entries = mem32[ptr + 8 >>> 2],
alignedKeySize = (keySize + valueSize - 1) & ~(valueSize - 1),
tagOffset = ((alignedKeySize + valueSize) + 3) & ~3,
entryMask = Math.max(keySize, valueSize, 4) - 1,
entrySize = (tagOffset + 4 + entryMask) & ~entryMask,
// key is known
keyMask = keySize - 1,
keyOffset = 0,
// value is aligned after key
valueMask = valueSize - 1,
valueOffset = (keyOffset + keySize + valueMask) & ~valueMask,
taggedOffset = (valueOffset + valueSize + 3) & ~3,
// end is all contents combined (here: pointer after value after key, net size unaligned)
endOffset = taggedOffset + 4,
// entire thing is at least pointer aligned, or more if K or V is larger, i.e. v128
entryMask = Math.max(3, keyMask, valueMask),
entrySize = (endOffset + entryMask) & ~entryMask,
res = new Map();
for (let i = 0; i < count; ++i) {
const
buf = entries + i * entrySize,
tag = mem32[buf + tagOffset >>> 2];
tag = mem32[buf + taggedOffset >>> 2];
if (!(tag & 1)) {
res.set(liftKeyElement(buf), liftValueElement(buf + alignedKeySize));
res.set(liftKeyElement(buf + keyOffset), liftValueElement(buf + valueOffset));
}
}
return res;
Expand Down