Skip to content

Commit

Permalink
finally finish the fucking deserialization
Browse files Browse the repository at this point in the history
  • Loading branch information
JairusSW committed Dec 29, 2024
1 parent 744dbc4 commit b338951
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 60 deletions.
2 changes: 1 addition & 1 deletion as-test.config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"input": ["./assembly/__tests__/simd/string.spec.ts"],
"input": ["./assembly/__tests__/*.spec.ts"],
"outDir": "./build",
"config": "none",
"plugins": {
Expand Down
18 changes: 9 additions & 9 deletions assembly/__tests__/simd/string.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@ describe("Should serialize strings", () => {
.toBe("\"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u000f\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f\"")
});

// describe("Should deserialize strings", () => {
// expect(deserialize_simd('"abcdefg"')).toBe("abcdefg");
// expect(deserialize_simd('"st\\"ring\\" w\\"\\"ith quotes\\""'))
// .toBe('st"ring" w""ith quotes"');
describe("Should deserialize strings", () => {
expect(deserialize_simd('"abcdefg"')).toBe("abcdefg");
expect(deserialize_simd('"st\\"ring\\" w\\"\\"ith quotes\\""'))
.toBe('st"ring" w""ith quotes"');

// // expect(deserialize_simd('"string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"'))
// // .toBe('string "with random spa\nces and \nnewlines\n\n\n');
expect(deserialize_simd('"string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"'))
.toBe('string "with random spa\nces and \nnewlines\n\n\n');

// // expect(deserialize_simd('"string with colon : comma , brace [ ] bracket { } and quote \\" and other quote \\""'))
// // .toBe('string with colon : comma , brace [ ] bracket { } and quote " and other quote "');
// });
expect(deserialize_simd('"string with colon : comma , brace [ ] bracket { } and quote \\" and other quote \\""'))
.toBe('string with colon : comma , brace [ ] bracket { } and quote " and other quote "');
});

run();
101 changes: 54 additions & 47 deletions assembly/deserialize/simd/string.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,7 @@ const SPLAT_92 = i16x8.splat(92); /* \ */
const backslash_indices = i16x8.eq(block, SPLAT_92);
let mask = i16x8.bitmask(backslash_indices);

let src_skips = 0;
let dst_skips = 0;

if (mask != 0) while (mask != 0) {
while (mask != 0) {
const lane_index = ctz(mask) << 1;
const dst_offset = dst_ptr + lane_index;
const src_offset = src_ptr + lane_index;
Expand All @@ -74,56 +71,66 @@ const SPLAT_92 = i16x8.splat(92); /* \ */
const escapedA = load<u8>(ESCAPE_HEX_TABLE + codeA);
const escapedB = load<u8>(ESCAPE_HEX_TABLE + codeB);
const escaped = (escapedA << 4) + escapedB;
console.log("Escaped:");
console.log(" a: " + escapedA.toString())
console.log(" b: " + escapedB.toString());
console.log(" c: " + escaped.toString());
console.log(" o: " + (dst_ptr - dst).toString());
console.log(" d: " + (lane_index).toString())
console.log(" l: " + (lane_index).toString())
store<u16>(dst_ptr, escaped);
v128.store(dst_offset, v128.load(src_offset, 4), 2);
dst_ptr += 2;
src_skips += 10;
dst_skips += 10;
// console.log("Escaped:");
// console.log(" a: " + escapedA.toString())
// console.log(" b: " + escapedB.toString());
// console.log(" c: " + escaped.toString());
// console.log(" o: " + (dst_ptr - dst).toString());
// console.log(" d: " + (dst_offset - dst).toString())
// console.log(" l: " + (lane_index).toString())
store<u16>(dst_offset, escaped);
v128.store(dst_offset, v128.load(src_offset, 4), 2);
if (lane_index >= 6) {
const bytes_left = lane_index - 4;
src_ptr += bytes_left;
dst_ptr += bytes_left;
// console.log(" e: " + (bytes_left).toString())
}
dst_ptr -= 10;
} else {
src_skips += 2;
const escaped = load<u16>(ESCAPE_TABLE + code);
const escaped = load<u8>(ESCAPE_TABLE + code);
store<u16>(dst_offset, escaped);
v128.store(dst_offset, v128.load(src_offset, 4), 2);
dst_ptr += 2;
src_skips += 2;
// console.log("Escaped:");
if (lane_index == 14) {
src_ptr += 2;
} else {
dst_ptr -= 2;
}
}
}

src_ptr += 16 + src_skips;
dst_ptr += 16 - dst_skips;
src_ptr += 16;
dst_ptr += 16;

// console.log("src: " + (src_ptr - changetype<usize>(src)).toString());
// console.log("dst: " + (dst_ptr - dst).toString());
}
while (src_ptr < src_end) {
let code = load<u16>(src_ptr);
if (code == BACK_SLASH) {
code = load<u16>(ESCAPE_TABLE + load<u8>(src_ptr, 2));
if (code == 117 && load<u32>(src_ptr, 4) == 3145776) {
const block = load<u32>(src_ptr, 8);
const codeA = block & 0xFFFF;
const codeB = (block >> 16) & 0xFFFF;
const escapedA = load<u8>(ESCAPE_HEX_TABLE + codeA);
const escapedB = load<u8>(ESCAPE_HEX_TABLE + codeB);
const escaped = (escapedA << 4) + escapedB;
store<u16>(dst_ptr, escaped);
dst_ptr += 2;
src_ptr += 12;
} else {
store<u16>(dst_ptr, code);
dst_ptr += 2;
src_ptr += 4;
}
} else {
store<u16>(dst_ptr, code);
dst_ptr += 2;
src_ptr += 2;
}
}
// while (src_ptr < src_end) {
// let code = load<u16>(src_ptr);
// if (code == BACK_SLASH) {
// code = load<u16>(ESCAPE_TABLE + load<u8>(src_ptr, 2));
// if (code == 117 && load<u32>(src_ptr, 4) == 3145776) {
// const block = load<u32>(src_ptr, 8);
// const codeA = block & 0xFFFF;
// const codeB = (block >> 16) & 0xFFFF;
// const escapedA = load<u8>(ESCAPE_HEX_TABLE + codeA);
// const escapedB = load<u8>(ESCAPE_HEX_TABLE + codeB);
// const escaped = (escapedA << 4) + escapedB;
// store<u16>(dst_ptr, escaped);
// dst_ptr += 2;
// src_ptr += 12;
// } else {
// store<u16>(dst_ptr, code);
// dst_ptr += 2;
// src_ptr += 4;
// }
// } else {
// store<u16>(dst_ptr, code);
// dst_ptr += 2;
// src_ptr += 2;
// }
// }

return dst_ptr - dst;
}
6 changes: 3 additions & 3 deletions assembly/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import { JSON } from ".";
// public z: T;
// }

let a = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007";
let b = "000000000000000000000000000000000000000"
let a = "\u0000\u0001";
let b = '"string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"'
let c = "000000000000000000000000000000000000000";
JSON.stringifyTo(a, b)
// JSON.stringifyTo(a, b)
c = JSON.parseTo(b, c);
// console.log(JSON.stringifyTo(a, a));

Expand Down

0 comments on commit b338951

Please sign in to comment.