diff --git a/CHANGELOG b/CHANGELOG index d9994bb..326e2fb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -29,6 +29,7 @@ v0.9.18 - Should be able to use @alias and @omit*** or JSON.Raw v0.9.19 - Fix arguments in @omitif declarations not working properly v0.9.20 - Strings were being received with quotes attached via the toString functionality. Removed that. v0.9.22 - Fix #89 and #93. Several bug fixes some severe such as ",null" being prepended when using @omit. Properly warn when a schema has fields that are not compatible with json +v0.9.23 - Comment out SIMD-related code for now [UNRELEASED] v1.0.0 - Allow nullable primitives diff --git a/README.md b/README.md index d617da1..468f1c7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ __| || __|| || | | ___ | _ || __| | | ||__ || | || | | ||___|| ||__ | |_____||_____||_____||_|___| |__|__||_____| -v0.9.22 +v0.9.23 diff --git a/assembly/serialize/string.ts b/assembly/serialize/string.ts index a70e94c..977b2ea 100644 --- a/assembly/serialize/string.ts +++ b/assembly/serialize/string.ts @@ -12,153 +12,154 @@ import { bs } from "../custom/bs"; import { _intTo16, intTo16, unsafeCharCodeAt } from "../custom/util"; import { Sink } from "../custom/sink"; -function needsEscaping(data: string): bool { - let len = data.length; - - // if (len < 16) { - // while (len--) { - // const char = load(changetype(data) + len); - // if (char == 34 || char == 92 || char <= 31) { - // return true; - // } - // } - // return false; - // } +// function needsEscaping(data: string): bool { +// let len = data.length; - let running = v128.splat(0); - //let i = 0; +// // if (len < 16) { +// // while (len--) { +// // const char = load(changetype(data) + len); +// // if (char == 34 || char == 92 || char <= 31) { +// // return true; +// // } +// // } +// // return false; +// // } - //while (i + 15 < len) { - let w = v128.load(changetype(data)); - running = v128.or(running, v128.eq(w, i16x8.splat(34))); - running = v128.or(running, v128.eq(w, i16x8.splat(92))); +// let running = v128.splat(0); +// //let i = 0; - let subtracted = v128.sub(w, i8x16.splat(31)); - running = v128.or(running, v128.eq(subtracted, v128.splat(0))); - //i += 16; - //} +// //while (i + 15 < len) { +// let w = v128.load(changetype(data)); +// running = v128.or(running, v128.eq(w, i16x8.splat(34))); +// running = v128.or(running, v128.eq(w, i16x8.splat(92))); - return v128.any_true(running); -} +// let subtracted = v128.sub(w, i8x16.splat(31)); +// running = v128.or(running, v128.eq(subtracted, v128.splat(0))); +// //i += 16; +// //} -/** - * A prototype SIMD implementation for string serialization which can only work in 128-byte (or 16 chars with wtf-16). - * - * A faster version could perhaps look like the following: - */ -// @ts-ignore: Decorator -@inline export function serialize_simd_v1(src: string, dst: usize): void { - let src_ptr = changetype(src); - let dst_ptr = changetype(dst) + 2; +// return v128.any_true(running); +// } - store(changetype(dst), 34); /* " */ +// /** +// * A prototype SIMD implementation for string serialization which can only work in 128-byte (or 16 chars with wtf-16). +// * +// * A faster version could perhaps look like the following: +// */ +// // @ts-ignore: Decorator +// @inline export function serialize_simd_v1(src: string, dst: usize): void { +// let src_ptr = changetype(src); +// let dst_ptr = changetype(dst) + 2; - const src_end = src_ptr + u32(src.length << 1); - const src_end_15 = src_end - 15; +// store(changetype(dst), 34); /* " */ - while (src_ptr < src_end_15) { - const currentBlock = v128.load(src_ptr); - const backslash_indices = i16x8.eq(currentBlock, i16x8.splat(92)); - const quote_indices = i16x8.eq(currentBlock, i16x8.splat(34)); - const concat_indices = v128.or(quote_indices, backslash_indices); +// const src_end = src_ptr + u32(src.length << 1); +// const src_end_15 = src_end - 15; - const escape_indices = i16x8.lt_u(currentBlock, i16x8.splat(32)); +// while (src_ptr < src_end_15) { +// const currentBlock = v128.load(src_ptr); +// const backslash_indices = i16x8.eq(currentBlock, i16x8.splat(92)); +// const quote_indices = i16x8.eq(currentBlock, i16x8.splat(34)); +// const concat_indices = v128.or(quote_indices, backslash_indices); - if (v128.any_true(v128.or(escape_indices, concat_indices))) { - const mask = i16x8.bitmask(concat_indices); +// const escape_indices = i16x8.lt_u(currentBlock, i16x8.splat(32)); - const anomalies = popcnt(mask); - const start_index = (clz(mask) & ~1) + 2 // This essentially floors to the nearest even integer - if (anomalies === 1) { - memory.copy(dst_ptr, src_ptr, start_index >> 1); - store(dst_ptr + start_index, 34); - memory.copy(dst_ptr + start_index + 2, src_ptr + start_index, (32 - start_index) >> 1) - } +// if (v128.any_true(v128.or(escape_indices, concat_indices))) { +// const mask = i16x8.bitmask(concat_indices); - if (v128.any_true(escape_indices)) { +// const anomalies = popcnt(mask); +// const start_index = (clz(mask) & ~1) + 2 // This essentially floors to the nearest even integer +// if (anomalies === 1) { +// memory.copy(dst_ptr, src_ptr, start_index >> 1); +// store(dst_ptr + start_index, 34); +// memory.copy(dst_ptr + start_index + 2, src_ptr + start_index, (32 - start_index) >> 1) +// } - } - dst_ptr += 16; - src_ptr += 16; - } else { - v128.store(dst_ptr, currentBlock); - src_ptr += 16; - dst_ptr += 16; - } - } -} +// if (v128.any_true(escape_indices)) { -const back_slash_reg = i16x8.splat(92); // "\" -const quote_reg = i16x8.splat(34); // "\"" +// } +// dst_ptr += 16; +// src_ptr += 16; +// } else { +// v128.store(dst_ptr, currentBlock); +// src_ptr += 16; +// dst_ptr += 16; +// } +// } +// } -// @ts-ignore: Decorator -@inline export function serialize_simd_v2(src: string, dst: usize): void { - let src_ptr = changetype(src); - let dst_ptr = changetype(dst); - - let i = 0; - const len = src.length; - - while (i < len) { - const block = v128.load16x4_u(src_ptr); - console.log("block: " + prt(block)); - const backslash_mask = i16x8.eq(block, back_slash_reg); - const quote_mask = i16x8.eq(block, quote_reg); - const is_quote_or_backslash = v128.or(quote_mask, backslash_mask); - console.log("mask: " + prt10(is_quote_or_backslash)) + +// const back_slash_reg = i16x8.splat(92); // "\" +// const quote_reg = i16x8.splat(34); // "\"" + +// // @ts-ignore: Decorator +// @inline export function serialize_simd_v2(src: string, dst: usize): void { +// let src_ptr = changetype(src); +// let dst_ptr = changetype(dst); + +// let i = 0; +// const len = src.length; + +// while (i < len) { +// const block = v128.load16x4_u(src_ptr); +// console.log("block: " + prt(block)); +// const backslash_mask = i16x8.eq(block, back_slash_reg); +// const quote_mask = i16x8.eq(block, quote_reg); +// const is_quote_or_backslash = v128.or(quote_mask, backslash_mask); +// console.log("mask: " + prt10(is_quote_or_backslash)) - // store(dst_ptr, expanded); - src_ptr += 8; - dst_ptr += 16; - i += 8; - } -} +// // store(dst_ptr, expanded); +// src_ptr += 8; +// dst_ptr += 16; +// i += 8; +// } +// } -function prt(obj: v128): string { - let out = ""; - out += i16x8.extract_lane_u(obj, 0).toString() + " "; - out += i16x8.extract_lane_u(obj, 1).toString() + " "; - out += i16x8.extract_lane_u(obj, 2).toString() + " "; - out += i16x8.extract_lane_u(obj, 3).toString() + " "; - out += i16x8.extract_lane_u(obj, 4).toString() + " "; - out += i16x8.extract_lane_u(obj, 5).toString() + " "; - out += i16x8.extract_lane_u(obj, 6).toString() + " "; - out += i16x8.extract_lane_u(obj, 7).toString(); - return out; -} +// function prt(obj: v128): string { +// let out = ""; +// out += i16x8.extract_lane_u(obj, 0).toString() + " "; +// out += i16x8.extract_lane_u(obj, 1).toString() + " "; +// out += i16x8.extract_lane_u(obj, 2).toString() + " "; +// out += i16x8.extract_lane_u(obj, 3).toString() + " "; +// out += i16x8.extract_lane_u(obj, 4).toString() + " "; +// out += i16x8.extract_lane_u(obj, 5).toString() + " "; +// out += i16x8.extract_lane_u(obj, 6).toString() + " "; +// out += i16x8.extract_lane_u(obj, 7).toString(); +// return out; +// } -function prt10(obj: v128): string { - let out = ""; - out += (i16x8.extract_lane_u(obj, 0) ? "1" : "0") + " "; - out += (i16x8.extract_lane_u(obj, 1) ? "1" : "0") + " "; - out += (i16x8.extract_lane_u(obj, 2) ? "1" : "0") + " "; - out += (i16x8.extract_lane_u(obj, 3) ? "1" : "0") + " "; - out += (i16x8.extract_lane_u(obj, 4) ? "1" : "0") + " "; - out += (i16x8.extract_lane_u(obj, 5) ? "1" : "0") + " "; - out += (i16x8.extract_lane_u(obj, 6) ? "1" : "0") + " "; - out += i16x8.extract_lane_u(obj, 7) ? "1" : "0"; - return out; -} +// function prt10(obj: v128): string { +// let out = ""; +// out += (i16x8.extract_lane_u(obj, 0) ? "1" : "0") + " "; +// out += (i16x8.extract_lane_u(obj, 1) ? "1" : "0") + " "; +// out += (i16x8.extract_lane_u(obj, 2) ? "1" : "0") + " "; +// out += (i16x8.extract_lane_u(obj, 3) ? "1" : "0") + " "; +// out += (i16x8.extract_lane_u(obj, 4) ? "1" : "0") + " "; +// out += (i16x8.extract_lane_u(obj, 5) ? "1" : "0") + " "; +// out += (i16x8.extract_lane_u(obj, 6) ? "1" : "0") + " "; +// out += i16x8.extract_lane_u(obj, 7) ? "1" : "0"; +// return out; +// } -function vis(src_ptr: usize, mask: i32): void { - let chars = ""; - let bits = ""; - for (let i = 0; i < 8; i++) { - const char = load(src_ptr + (i << 1)); - const bit = (mask >> i) & 1; - chars += String.fromCharCode(char) + " "; - bits += bit.toString() + " "; - } - console.log(chars); - console.log(bits); -} +// function vis(src_ptr: usize, mask: i32): void { +// let chars = ""; +// let bits = ""; +// for (let i = 0; i < 8; i++) { +// const char = load(src_ptr + (i << 1)); +// const bit = (mask >> i) & 1; +// chars += String.fromCharCode(char) + " "; +// bits += bit.toString() + " "; +// } +// console.log(chars); +// console.log(bits); +// } // @ts-ignore: Decorator @inline export function serializeString(data: string): string { - if (!needsEscaping(data)) { - return "\"" + data + "\""; - } + // if (!needsEscaping(data)) { + // return "\"" + data + "\""; + // } if (data.length === 0) { return "\"\""; @@ -217,80 +218,81 @@ function vis(src_ptr: usize, mask: i32): void { result.writeCodePoint(34); return result.toString(); } -// @ts-ignore: Decorator valid here -@inline export function serializeString_BS(data: string): void { - const len = data.length << 1; - if (len === 0) { - bs.write_32(2228258); /* "" */ - return; - } - bs.write_16(QUOTE); +// // @ts-ignore: Decorator valid here +// @inline export function serializeString_BS(data: string): void { +// const len = data.length << 1; +// if (len === 0) { +// bs.write_32(2228258); /* "" */ +// return; +// } +// bs.write_16(QUOTE); - let last: i32 = 0; - for (let i = 0; i < len; i += 2) { - const char = load(changetype(data) + i); - if (char < 35) { - if (char === QUOTE) { - bs.write_s_se(data, last, i); - bs.write_16(BACK_SLASH); - last = i; - continue; - } else if (char < 32) { - if (char < 16) { - bs.write_s_se(data, last, i); - last = i + 2; - switch (char) { - case BACKSPACE: { - bs.write_32(6422620); - continue; - } - case TAB: { - bs.write_32(7602268); - continue; - } - case NEW_LINE: { - bs.write_32(7209052); - continue; - } - case FORM_FEED: { - bs.write_32(6684764); - continue; - } - case CARRIAGE_RETURN: { - bs.write_32(7471196); - continue; - } - default: { - // all chars 0-31 must be encoded as a four digit unicode escape sequence - // \u0000 to \u000f handled here - bs.write_64(13511005048209500) /* \\u00 */ - bs.write_32((_intTo16(char) << 16) | 48); /* 0_ */ - continue; - } - } - } else { - bs.write_s_se(data, last, i); - last = i + 2; - // all chars 0-31 must be encoded as a four digit unicode escape sequence - // \u0010 to \u001f handled here - bs.write_64(13511005048209500) /* \\u00 */ - bs.write_32((intTo16(char) << 16) | 48); /* 0_ */ - } - } - } else if (char === BACK_SLASH) { - bs.write_s_se(data, last, i); - bs.write_16(BACK_SLASH); - last = i; - } - } - if (last === 0) { - bs.write_s(data); - bs.write_16(QUOTE) - } else { - bs.write_s_se(data, last, changetype(changetype(data) - TOTAL_OVERHEAD).rtSize); - bs.write_16(QUOTE); - } -} \ No newline at end of file +// let last: i32 = 0; +// for (let i = 0; i < len; i += 2) { +// const char = load(changetype(data) + i); +// if (char < 35) { +// if (char === QUOTE) { +// bs.write_s_se(data, last, i); +// bs.write_16(BACK_SLASH); +// last = i; +// continue; +// } else if (char < 32) { +// if (char < 16) { +// bs.write_s_se(data, last, i); +// last = i + 2; +// switch (char) { +// case BACKSPACE: { +// bs.write_32(6422620); +// continue; +// } +// case TAB: { +// bs.write_32(7602268); +// continue; +// } +// case NEW_LINE: { +// bs.write_32(7209052); +// continue; +// } +// case FORM_FEED: { +// bs.write_32(6684764); +// continue; +// } +// case CARRIAGE_RETURN: { +// bs.write_32(7471196); +// continue; +// } +// default: { +// // all chars 0-31 must be encoded as a four digit unicode escape sequence +// // \u0000 to \u000f handled here +// bs.write_64(13511005048209500) /* \\u00 */ +// bs.write_32((_intTo16(char) << 16) | 48); /* 0_ */ +// continue; +// } +// } +// } else { +// bs.write_s_se(data, last, i); +// last = i + 2; +// // all chars 0-31 must be encoded as a four digit unicode escape sequence +// // \u0010 to \u001f handled here +// bs.write_64(13511005048209500) /* \\u00 */ +// bs.write_32((intTo16(char) << 16) | 48); /* 0_ */ +// } +// } +// } else if (char === BACK_SLASH) { +// bs.write_s_se(data, last, i); +// bs.write_16(BACK_SLASH); +// last = i; +// } +// } + +// if (last === 0) { +// bs.write_s(data); +// bs.write_16(QUOTE) +// } else { +// bs.write_s_se(data, last, changetype(changetype(data) - TOTAL_OVERHEAD).rtSize); +// bs.write_16(QUOTE); +// } +// } \ No newline at end of file diff --git a/package.json b/package.json index b9604c3..6b5fdd7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "json-as", - "version": "0.9.22", + "version": "0.9.23", "description": "The only JSON library you'll need for AssemblyScript. SIMD enabled", "types": "assembly/index.ts", "author": "Jairus Tanaka", @@ -19,7 +19,7 @@ "test": "ast test && rm -rf ./build/", "pretest": "rm -rf ./build/ && ast build", "bench": "astral --enable simd --runtime stub", - "build:test": "rm -rf ./build/ && asc assembly/test.ts --transform ./transform -o ./build/test.wasm --enable simd --enable relaxed-simd", + "build:test": "rm -rf ./build/ && asc assembly/test.ts --transform ./transform -o ./build/test.wasm", "build:transform": "tsc -p ./transform", "test:wasmtime": "wasmtime ./build/test.wasm", "test:wavm": "wavm run ./build/test.wasm", diff --git a/transform/package.json b/transform/package.json index eb9d6d1..d66806a 100644 --- a/transform/package.json +++ b/transform/package.json @@ -1,6 +1,6 @@ { "name": "@json-as/transform", - "version": "0.9.22", + "version": "0.9.23", "description": "The only JSON library you'll need for AssemblyScript. SIMD enabled", "main": "./lib/index.js", "author": "Jairus Tanaka",