From eb42dca93adeed3a478eccd828397a011c1b188e Mon Sep 17 00:00:00 2001 From: Jairus Date: Mon, 20 Jan 2025 20:00:19 -0500 Subject: [PATCH] release: v1.0.0-alpha.1 --- assembly/__benches__/misc.bench.ts | 2 +- assembly/custom/util.ts | 1 - assembly/deserialize/simple/array.ts | 2 +- .../deserialize/simple/array/arbitrary.ts | 204 ++--- assembly/deserialize/simple/array/integer.ts | 9 +- assembly/deserialize/simple/bool.ts | 2 +- assembly/deserialize/simple/date.ts | 2 +- assembly/deserialize/simple/float.ts | 14 +- assembly/deserialize/simple/integer.ts | 2 +- assembly/deserialize/simple/map.ts | 12 +- assembly/deserialize/simple/object.ts | 38 +- assembly/deserialize/simple/string.ts | 3 +- assembly/globals/tables.ts | 34 +- assembly/index.ts | 21 +- assembly/serialize/simd/string.ts | 2 +- assembly/serialize/simple/array.ts | 21 +- assembly/serialize/simple/bool.ts | 2 +- assembly/serialize/simple/date.ts | 2 +- assembly/serialize/simple/float.ts | 2 +- assembly/serialize/simple/integer.ts | 2 +- assembly/serialize/simple/map.ts | 2 +- assembly/serialize/simple/string.ts | 2 +- assembly/test.ts | 79 +- assembly/tsconfig.json | 2 +- assembly/util/getArrayDepth.ts | 18 +- assembly/util/ptrToStr.ts | 10 +- assembly/util/snp.ts | 106 ++- modules/bs/index.ts | 167 ++++ modules/tsconfig.json | 8 + package.json | 73 +- transform/lib/index.js | 125 +-- transform/lib/index.js.map | 2 +- transform/lib/index.old.js | 786 ++++++++---------- transform/src/index.ts | 203 ++--- 34 files changed, 995 insertions(+), 965 deletions(-) create mode 100644 modules/bs/index.ts create mode 100644 modules/tsconfig.json diff --git a/assembly/__benches__/misc.bench.ts b/assembly/__benches__/misc.bench.ts index c2668d9..3421d15 100644 --- a/assembly/__benches__/misc.bench.ts +++ b/assembly/__benches__/misc.bench.ts @@ -1,5 +1,5 @@ import { bench } from "as-bench/assembly/bench"; -import { bs } from "as-bs"; +import { bs } from "../../modules/bs"; import { deserializeString_SIMD } from "../deserialize/simd/string"; import { deserializeString } from "../deserialize/simple/string"; import { bytes } from "../util/bytes"; diff --git a/assembly/custom/util.ts b/assembly/custom/util.ts index 415f331..c1b3c50 100644 --- a/assembly/custom/util.ts +++ b/assembly/custom/util.ts @@ -2,7 +2,6 @@ import { isSpace } from "util/string"; import { BACK_SLASH, QUOTE } from "./chars"; import { Sink } from "./sink"; - /** Scientific Notation Integer Parsing - SNIP * This is absolutely the fastest algorithm I could think of while adding full support for Scientific Notation * Loads 32 bits and retrieves the high/low bits. diff --git a/assembly/deserialize/simple/array.ts b/assembly/deserialize/simple/array.ts index 5cc1a22..1dce7af 100644 --- a/assembly/deserialize/simple/array.ts +++ b/assembly/deserialize/simple/array.ts @@ -45,4 +45,4 @@ export function deserializeArray(srcStart: usize, srcEnd: u function isMap(): boolean { let type: T = changetype(0); return type instanceof Map; -} \ No newline at end of file +} diff --git a/assembly/deserialize/simple/array/arbitrary.ts b/assembly/deserialize/simple/array/arbitrary.ts index 6c02a56..f084a6e 100644 --- a/assembly/deserialize/simple/array/arbitrary.ts +++ b/assembly/deserialize/simple/array/arbitrary.ts @@ -1,113 +1,113 @@ import { BACK_SLASH, BRACE_LEFT, BRACE_RIGHT, BRACKET_LEFT, BRACKET_RIGHT, CHAR_F, CHAR_N, CHAR_T, COMMA, QUOTE } from "../../../custom/chars"; import { JSON } from "../../../"; import { isSpace } from "util/string"; -import { ptrToStr } from "../../../util/ptrToStr"; export function deserializeArbitraryArray(srcStart: usize, srcEnd: usize, dst: usize): JSON.Value[] { - const out = dst ? changetype(dst) : instantiate(); - let lastIndex: usize = 0; - let depth: u32 = 0; - while (srcStart < srcEnd) { + const out = dst ? changetype(dst) : instantiate(); + let lastIndex: usize = 0; + let depth: u32 = 0; + while (srcStart < srcEnd) { + const code = load(srcStart); + if (code == QUOTE) { + lastIndex = srcStart; + srcStart += 2; + while (srcStart < srcEnd) { const code = load(srcStart); - if (code == QUOTE) { - lastIndex = srcStart; - srcStart += 2; - while (srcStart < srcEnd) { - const code = load(srcStart); - if (code == QUOTE && load(srcStart - 2) !== BACK_SLASH) { - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } - console.log("Value (string): " + ptrToStr(lastIndex, srcStart)); - // @ts-ignore: exists - out.push(JSON.__deserialize>(lastIndex, srcStart)); - break; - } - srcStart += 2; - } - } else if (code - 48 <= 9 || code == 45) { - lastIndex = srcStart; - srcStart += 2; - while (srcStart < srcEnd) { - const code = load(srcStart); - if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) { - // @ts-ignore: type - out.push(JSON.__deserialize>(lastIndex, srcStart)); - console.log("Value (number): " + ptrToStr(lastIndex, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } - break; - } - srcStart += 2; - } - } else if (code == BRACE_LEFT) { - lastIndex = srcStart; - depth++; - srcStart += 2; - while (srcStart < srcEnd) { - const code = load(srcStart); - if (code == BRACE_RIGHT) { - if (--depth == 0) { - // @ts-ignore: type - out.push(JSON.__deserialize>(lastIndex, srcStart)); - console.log("Value (object): " + ptrToStr(lastIndex, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } - break; - } - } else if (code == BRACE_LEFT) depth++; - srcStart += 2; - } - } else if (code == BRACKET_LEFT) { - lastIndex = srcStart; - depth++; - srcStart += 2; - while (srcStart < srcEnd) { - const code = load(srcStart); - if (code == BRACKET_RIGHT) { - if (--depth == 0) { - // @ts-ignore: type - out.push(JSON.__deserialize>(lastIndex, srcStart)); - console.log("Value (array): " + ptrToStr(lastIndex, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } - break; - } - } else if (code == BRACKET_LEFT) depth++; - srcStart += 2; - } - } else if (code == CHAR_T) { - if (load(srcStart) == 28429475166421108) { - // @ts-ignore: type - out.push(JSON.__deserialize>(lastIndex, srcStart += 8)); - console.log("Value (bool): " + ptrToStr(srcStart - 8, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } - } - } else if (code == CHAR_F) { - if (load(srcStart, 2) == 28429466576093281) { - // @ts-ignore: type - out.push(JSON.__deserialize>(lastIndex, srcStart += 10)); - console.log("Value (bool): " + ptrToStr(srcStart - 10, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } + if (code == QUOTE && load(srcStart - 2) !== BACK_SLASH) { + while (isSpace(load((srcStart += 2)))) { + /* empty */ + } + // console.log("Value (string): " + ptrToStr(lastIndex, srcStart)); + // @ts-ignore: exists + out.push(JSON.__deserialize>(lastIndex, srcStart)); + break; + } + srcStart += 2; + } + } else if (code - 48 <= 9 || code == 45) { + lastIndex = srcStart; + srcStart += 2; + while (srcStart < srcEnd) { + const code = load(srcStart); + if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) { + // @ts-ignore: type + out.push(JSON.__deserialize>(lastIndex, srcStart)); + // console.log("Value (number): " + ptrToStr(lastIndex, srcStart)); + while (isSpace(load((srcStart += 2)))) { + /* empty */ + } + break; + } + srcStart += 2; + } + } else if (code == BRACE_LEFT) { + lastIndex = srcStart; + depth++; + srcStart += 2; + while (srcStart < srcEnd) { + const code = load(srcStart); + if (code == BRACE_RIGHT) { + if (--depth == 0) { + // @ts-ignore: type + out.push(JSON.__deserialize>(lastIndex, srcStart)); + // console.log("Value (object): " + ptrToStr(lastIndex, srcStart)); + while (isSpace(load((srcStart += 2)))) { + /* empty */ } - } else if (code == CHAR_N) { - if (load(srcStart) == 30399761348886638) { - // @ts-ignore: type - out.push(JSON.__deserialize>(lastIndex, srcStart += 8)); - console.log("Value (null): " + ptrToStr(srcStart - 8, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } + break; + } + } else if (code == BRACE_LEFT) depth++; + srcStart += 2; + } + } else if (code == BRACKET_LEFT) { + lastIndex = srcStart; + depth++; + srcStart += 2; + while (srcStart < srcEnd) { + const code = load(srcStart); + if (code == BRACKET_RIGHT) { + if (--depth == 0) { + // @ts-ignore: type + out.push(JSON.__deserialize>(lastIndex, srcStart)); + // console.log("Value (array): " + ptrToStr(lastIndex, srcStart)); + while (isSpace(load((srcStart += 2)))) { + /* empty */ } - } + break; + } + } else if (code == BRACKET_LEFT) depth++; srcStart += 2; + } + } else if (code == CHAR_T) { + if (load(srcStart) == 28429475166421108) { + // @ts-ignore: type + out.push(JSON.__deserialize>(lastIndex, (srcStart += 8))); + // console.log("Value (bool): " + ptrToStr(srcStart - 8, srcStart)); + while (isSpace(load((srcStart += 2)))) { + /* empty */ + } + } + } else if (code == CHAR_F) { + if (load(srcStart, 2) == 28429466576093281) { + // @ts-ignore: type + out.push(JSON.__deserialize>(lastIndex, (srcStart += 10))); + // console.log("Value (bool): " + ptrToStr(srcStart - 10, srcStart)); + while (isSpace(load((srcStart += 2)))) { + /* empty */ + } + } + } else if (code == CHAR_N) { + if (load(srcStart) == 30399761348886638) { + // @ts-ignore: type + out.push(JSON.__deserialize>(lastIndex, (srcStart += 8))); + // console.log("Value (null): " + ptrToStr(srcStart - 8, srcStart)); + while (isSpace(load((srcStart += 2)))) { + /* empty */ + } + } } - return out; + srcStart += 2; + } + // @ts-ignore: type + return out; } diff --git a/assembly/deserialize/simple/array/integer.ts b/assembly/deserialize/simple/array/integer.ts index 2b4a4f9..dbf9f57 100644 --- a/assembly/deserialize/simple/array/integer.ts +++ b/assembly/deserialize/simple/array/integer.ts @@ -1,10 +1,8 @@ import { atoi, isSpace } from "../../../util"; -import { COMMA, BRACE_RIGHT, BRACKET_RIGHT } from "../../../custom/chars"; -import { JSON } from "../../.."; -import { ptrToStr } from "../../../util/ptrToStr"; +import { COMMA, BRACKET_RIGHT } from "../../../custom/chars"; export function deserializeIntegerArray(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = dst ? changetype(dst) : instantiate(); + const out: T = dst ? changetype(dst) : instantiate(); let lastIndex: usize = 0; while (srcStart < srcEnd) { const code = load(srcStart); @@ -14,8 +12,7 @@ export function deserializeIntegerArray(srcStart: usize, src while (srcStart < srcEnd) { const code = load(srcStart); if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) { - console.log("element: " + ptrToStr(lastIndex, srcStart)) - out.push(JSON.__deserialize>(lastIndex, srcStart)); + out.push(atoi>(lastIndex, srcStart)); // while (isSpace(load((srcStart += 2)))) { // /* empty */ // } diff --git a/assembly/deserialize/simple/bool.ts b/assembly/deserialize/simple/bool.ts index 1f29027..eb27e77 100644 --- a/assembly/deserialize/simple/bool.ts +++ b/assembly/deserialize/simple/bool.ts @@ -6,4 +6,4 @@ export function deserializeBoolean(srcStart: usize, srcEnd: usize): boolean { if (firstChar == CHAR_T && load(srcStart) == 28429475166421108) return true; else if (firstChar == CHAR_F && load(srcSize, 2) == 28429466576093281) return false; return false; //ERROR(`Expected to find boolean, but found "${data.slice(0, 100)}" instead!`); -} \ No newline at end of file +} diff --git a/assembly/deserialize/simple/date.ts b/assembly/deserialize/simple/date.ts index de2c2f9..b4317a7 100644 --- a/assembly/deserialize/simple/date.ts +++ b/assembly/deserialize/simple/date.ts @@ -8,4 +8,4 @@ export function deserializeDate(srcStart: usize, srcEnd: usize): Date { // This may seem redundant, but addreses the issue when Date // is globally aliased to wasi_Date (or some other superclass). return new Date(d.getTime()); -} \ No newline at end of file +} diff --git a/assembly/deserialize/simple/float.ts b/assembly/deserialize/simple/float.ts index f514776..b00233c 100644 --- a/assembly/deserialize/simple/float.ts +++ b/assembly/deserialize/simple/float.ts @@ -1,10 +1,10 @@ import { ptrToStr } from "../../util/ptrToStr"; export function deserializeFloat(srcStart: usize, srcEnd: usize): T { - // @ts-ignore - const type: T = 0; - // @ts-ignore - if (type instanceof f64) return f64.parse(ptrToStr(srcStart, srcEnd)); - // @ts-ignore - return f32.parse(ptrToStr(srcStart, srcEnd)); -} \ No newline at end of file + // @ts-ignore + const type: T = 0; + // @ts-ignore + if (type instanceof f64) return f64.parse(ptrToStr(srcStart, srcEnd)); + // @ts-ignore + return f32.parse(ptrToStr(srcStart, srcEnd)); +} diff --git a/assembly/deserialize/simple/integer.ts b/assembly/deserialize/simple/integer.ts index 0c67436..532c380 100644 --- a/assembly/deserialize/simple/integer.ts +++ b/assembly/deserialize/simple/integer.ts @@ -2,4 +2,4 @@ import { atoi } from "../../util/atoi"; export function deserializeInteger(srcStart: usize, srcEnd: usize): T { return atoi(srcStart, srcEnd); -} \ No newline at end of file +} diff --git a/assembly/deserialize/simple/map.ts b/assembly/deserialize/simple/map.ts index 587d128..b8230f1 100644 --- a/assembly/deserialize/simple/map.ts +++ b/assembly/deserialize/simple/map.ts @@ -53,7 +53,7 @@ export function deserializeMap>(srcStart: usize, srcEnd: srcStart += 2; } // @ts-ignore: type - } else if (!isBoolean>() && isInteger>() && code - 48 <= 9 || code == 45) { + } else if ((!isBoolean>() && isInteger>() && code - 48 <= 9) || code == 45) { lastIndex = srcStart; srcStart += 2; while (srcStart < srcEnd) { @@ -113,7 +113,7 @@ export function deserializeMap>(srcStart: usize, srcEnd: } else if (isBoolean>() && code == CHAR_T) { if (load(srcStart) == 28429475166421108) { // @ts-ignore: type - out.set(key, JSON.__deserialize>(srcStart, srcStart += 8)); + out.set(key, JSON.__deserialize>(srcStart, (srcStart += 8))); while (isSpace(load((srcStart += 2)))) { /* empty */ } @@ -123,7 +123,7 @@ export function deserializeMap>(srcStart: usize, srcEnd: } else if (isBoolean>() && code == CHAR_F) { if (load(srcStart, 2) == 28429466576093281) { // @ts-ignore: type - out.set(key, JSON.__deserialize>(srcStart, srcStart += 10)); + out.set(key, JSON.__deserialize>(srcStart, (srcStart += 10))); while (isSpace(load((srcStart += 2)))) { /* empty */ } @@ -132,14 +132,14 @@ export function deserializeMap>(srcStart: usize, srcEnd: } else if ((isNullable() || nameof() == "usize") && code == CHAR_N) { if (load(srcStart) == 30399761348886638) { // @ts-ignore: type - out.set(key, JSON.__deserialize>(srcStart, srcStart += 8)); + out.set(key, JSON.__deserialize>(srcStart, (srcStart += 8))); while (isSpace(load((srcStart += 2)))) { /* empty */ } } } else { // @ts-ignore: type - throw new Error("Unexpected character " + String.fromCharCode(code) + " or type " + nameof>() + " does not match found type!") + throw new Error("Unexpected character " + String.fromCharCode(code) + " or type " + nameof>() + " does not match found type!"); } } } @@ -151,4 +151,4 @@ function sliceTo(srcStart: usize, srcEnd: usize): string { const dst = __new(dstSize, idof()); memory.copy(dst, srcStart, dstSize); return changetype(dst); -} \ No newline at end of file +} diff --git a/assembly/deserialize/simple/object.ts b/assembly/deserialize/simple/object.ts index c7d33b8..494cb03 100644 --- a/assembly/deserialize/simple/object.ts +++ b/assembly/deserialize/simple/object.ts @@ -21,8 +21,8 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) if (isKey) { keyStart = lastIndex; keyEnd = srcStart; - console.log("Key: " + ptrToStr(lastIndex, srcStart)); - console.log("Next: " + String.fromCharCode(load(srcStart + 2))); + // console.log("Key: " + ptrToStr(lastIndex, srcStart)); + // console.log("Next: " + String.fromCharCode(load(srcStart + 2))); srcStart += 2; // while (isSpace((code = load((srcStart += 2))))) { // /* empty */ @@ -30,7 +30,7 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) // if (code !== COLON) throw new Error("Expected ':' after key at position " + (srcStart - srcPtr).toString()); isKey = false; } else { - console.log("Got key start"); + // console.log("Got key start"); isKey = true; // i don't like this lastIndex = srcStart + 2; } @@ -44,12 +44,12 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) while (srcStart < srcEnd) { const code = load(srcStart); if (code == QUOTE && load(srcStart - 2) !== BACK_SLASH) { - console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2)); + // console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2)); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart + 2, dst); // while (isSpace(load(srcStart))) srcStart += 2; srcStart += 4; - console.log("Next: " + String.fromCharCode(load(srcStart))); + // console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; break; } @@ -63,12 +63,12 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) { // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst); - console.log("Value (number): " + ptrToStr(lastIndex, srcStart)); + // console.log("Value (number): " + ptrToStr(lastIndex, srcStart)); // while (isSpace(load((srcStart += 2)))) { // /* empty */ // } srcStart += 2; - console.log("Next: " + String.fromCharCode(load(srcStart))); + // console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; break; } @@ -82,10 +82,10 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) const code = load(srcStart); if (code == BRACE_RIGHT) { if (--depth == 0) { - console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2)); + // console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2)); // @ts-ignore: exists - out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart += 2, dst); - console.log("Next: " + String.fromCharCode(load(srcStart))); + out.__DESERIALIZE(keyStart, keyEnd, lastIndex, (srcStart += 2), dst); + // console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; // while (isSpace(load(srcStart))) { // /* empty */ @@ -103,10 +103,10 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) const code = load(srcStart); if (code == BRACKET_RIGHT) { if (--depth == 0) { - console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2)); + // console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2)); // @ts-ignore: exists - out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart += 2, dst); - console.log("Next: " + String.fromCharCode(load(srcStart))); + out.__DESERIALIZE(keyStart, keyEnd, lastIndex, (srcStart += 2), dst); + // console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; // while (isSpace(load((srcStart += 2)))) { // /* empty */ @@ -118,38 +118,38 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) } } else if (code == CHAR_T) { if (load(srcStart) == 28429475166421108) { - console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 8)); + // console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 8)); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst); // while (isSpace(load((srcStart += 2)))) { // /* empty */ // } srcStart += 2; - console.log("Next: " + String.fromCharCode(load(srcStart)) + " " + (srcStart < srcEnd).toString()); + // console.log("Next: " + String.fromCharCode(load(srcStart)) + " " + (srcStart < srcEnd).toString()); keyStart = 0; } } else if (code == CHAR_F) { if (load(srcStart, 2) == 28429466576093281) { - console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 10)); + // console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 10)); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 10), dst); // while (isSpace(load((srcStart += 2)))) { // /* empty */ // } srcStart += 2; - console.log("Next: " + String.fromCharCode(load(srcStart))); + // console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; } } else if (code == CHAR_N) { if (load(srcStart) == 30399761348886638) { - console.log("Value (null): " + ptrToStr(srcStart, srcStart + 8)); + // console.log("Value (null): " + ptrToStr(srcStart, srcStart + 8)); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst); // while (isSpace(load((srcStart += 2)))) { /* empty */ // } srcStart += 2; - console.log("Next: " + String.fromCharCode(load(srcStart))); + // console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; } } diff --git a/assembly/deserialize/simple/string.ts b/assembly/deserialize/simple/string.ts index e83e2a1..ec31807 100644 --- a/assembly/deserialize/simple/string.ts +++ b/assembly/deserialize/simple/string.ts @@ -2,7 +2,8 @@ import { BACK_SLASH } from "../../custom/chars"; import { DESERIALIZE_ESCAPE_TABLE, ESCAPE_HEX_TABLE } from "../../globals/tables"; export function deserializeString(srcStart: usize, srcEnd: usize, dst: usize): string { - srcStart += 2; srcEnd -= 2; + srcStart += 2; + srcEnd -= 2; if (dst == 0) dst = __new(srcEnd - srcStart, idof()); let dstPtr = dst; let lastPtr = srcStart; diff --git a/assembly/globals/tables.ts b/assembly/globals/tables.ts index 0d27328..9b028b3 100644 --- a/assembly/globals/tables.ts +++ b/assembly/globals/tables.ts @@ -412,36 +412,6 @@ export const ESCAPE_HEX_TABLE = 15, // 48-54 ]) - 48; -export const POW_TEN_TABLE_32 = memory.data([ - 1, - 10, - 1_000, - 10_000, - 100_000, - 1_000_000, - 10_000_000, - 100_000_000, - 1_000_000_000 -]); +export const POW_TEN_TABLE_32 = memory.data([1, 10, 1_000, 10_000, 100_000, 1_000_000, 10_000_000, 100_000_000, 1_000_000_000]); -export const POW_TEN_TABLE_64 = memory.data([ - 1, - 10, - 1_000, - 10_000, - 100_000, - 1_000_000, - 10_000_000, - 100_000_000, - 1_000_000_000, - 10_000_000_000, - 100_000_000_000, - 1_000_000_000_000, - 10_000_000_000_000, - 100_000_000_000_000, - 1_000_000_000_000_000, - 10_000_000_000_000_000, - 100_000_000_000_000_000, - 1_000_000_000_000_000_000, - 10_000_000_000_000_000_000 -]); \ No newline at end of file +export const POW_TEN_TABLE_64 = memory.data([1, 10, 1_000, 10_000, 100_000, 1_000_000, 10_000_000, 100_000_000, 1_000_000_000, 10_000_000_000, 100_000_000_000, 1_000_000_000_000, 10_000_000_000_000, 100_000_000_000_000, 1_000_000_000_000_000, 10_000_000_000_000_000, 100_000_000_000_000_000, 1_000_000_000_000_000_000, 10_000_000_000_000_000_000]); diff --git a/assembly/index.ts b/assembly/index.ts index eeb4af4..ae0887e 100644 --- a/assembly/index.ts +++ b/assembly/index.ts @@ -1,5 +1,5 @@ /// -import { bs } from "as-bs"; +import { bs } from "../modules/bs"; import { serializeString } from "./serialize/simple/string"; import { serializeArray } from "./serialize/simple/array"; @@ -25,8 +25,6 @@ import { ptrToStr } from "./util/ptrToStr"; import { bytes } from "./util"; import { serializeString_SIMD } from "./serialize/simd/string"; -class Nullable { } - export type Raw = string; /** @@ -108,7 +106,7 @@ export namespace JSON { return changetype(newBuf); } serializeString(changetype(data)); - return bs.shrinkTo(); + return bs.out(); // @ts-ignore: Supplied by transform } else if (isDefined(data.__SERIALIZE) && isDefined(data.__ALLOCATE)) { // @ts-ignore @@ -117,9 +115,6 @@ export namespace JSON { data.__SERIALIZE(changetype(data)); return bs.out(); // @ts-ignore: Supplied by transform - } else if (isDefined(data.__SERIALIZE)) { - // @ts-ignore - return data.__SERIALIZE(changetype(data)); } else if (data instanceof Date) { out = out ? changetype(__renew(changetype(out), 52)) : changetype(__new(52, idof())); @@ -130,14 +125,14 @@ export namespace JSON { } else if (data instanceof Array) { // @ts-ignore serializeArray(changetype>(data)); - return bs.shrinkTo(); + return bs.out(); } else if (data instanceof Map) { // @ts-ignore serializeMap(changetype>(data)); - return bs.shrinkTo(); + return bs.out(); } else if (data instanceof JSON.Value) { serializeArbitrary(data); - return bs.shrinkTo(); + return bs.out(); } else if (data instanceof JSON.Box) { return JSON.stringify(data.value); } else { @@ -170,11 +165,11 @@ export namespace JSON { return deserializeString(dataPtr, dataPtr + dataSize); } else if (isArray()) { // @ts-ignore - return deserializeArray>(data); + return deserializeArray>(dataPtr, dataPtr + dataSize, changetype(instantiate())); } let type: nonnull = changetype>(0); // @ts-ignore: Defined by transform - if (isDefined(type.__DESERIALIZE)) { + if (isDefined(type.__DESERIALIZE) && isDefined(type.__INITIALIZE)) { const out = __new(offsetof>(), idof>()); // @ts-ignore changetype>(out).__INITIALIZE(); @@ -345,7 +340,7 @@ export namespace JSON { * Box for primitive types */ export class Box { - constructor(public value: T) { } + constructor(public value: T) {} /** * Creates a reference to a primitive type * This means that it can create a nullable primitive diff --git a/assembly/serialize/simd/string.ts b/assembly/serialize/simd/string.ts index 3c5e021..905e47a 100644 --- a/assembly/serialize/simd/string.ts +++ b/assembly/serialize/simd/string.ts @@ -1,4 +1,4 @@ -import { bs } from "as-bs"; +import { bs } from "../../../modules/bs"; import { BACK_SLASH } from "../../custom/chars"; import { SERIALIZE_ESCAPE_TABLE } from "../../globals/tables"; import { OBJECT, TOTAL_OVERHEAD } from "rt/common"; diff --git a/assembly/serialize/simple/array.ts b/assembly/serialize/simple/array.ts index a65b118..f4c30f5 100644 --- a/assembly/serialize/simple/array.ts +++ b/assembly/serialize/simple/array.ts @@ -1,35 +1,30 @@ -import { bs } from "as-bs"; +import { bs } from "../../../modules/bs"; import { COMMA, BRACKET_RIGHT, BRACKET_LEFT } from "../../custom/chars"; import { JSON } from "../.."; export function serializeArray(src: T): void { - const srcSize = load(changetype(src), offsetof("byteLength")); - - if (srcSize == 0) { + const end = src.length - 1; + let i = 0; + if (end == -1) { bs.ensureSize(4); store(bs.offset, 6094939); bs.offset += 4; return; } - - let srcPtr = src.dataStart; - const srcEnd = srcPtr + srcSize - sizeof>(); - - bs.ensureSize(srcSize << 3); + bs.ensureSize(end << 3); store(bs.offset, BRACKET_LEFT); bs.offset += 2; - while (srcPtr < srcEnd) { - const block = load>(srcPtr); + while (i < end) { + const block = unchecked(src[i++]); JSON.__serialize>(block); bs.ensureSize(2); store(bs.offset, COMMA); bs.offset += 2; - srcPtr += sizeof(); } - const lastBlock = load>(srcPtr); + const lastBlock = unchecked(src[end]); JSON.__serialize>(lastBlock); bs.ensureSize(2); store(bs.offset, BRACKET_RIGHT); diff --git a/assembly/serialize/simple/bool.ts b/assembly/serialize/simple/bool.ts index 633eba5..61c969d 100644 --- a/assembly/serialize/simple/bool.ts +++ b/assembly/serialize/simple/bool.ts @@ -1,4 +1,4 @@ -import { bs } from "as-bs"; +import { bs } from "../../../modules/bs"; /** * Serialize a bool to type string diff --git a/assembly/serialize/simple/date.ts b/assembly/serialize/simple/date.ts index 91be907..a8a9914 100644 --- a/assembly/serialize/simple/date.ts +++ b/assembly/serialize/simple/date.ts @@ -1,4 +1,4 @@ -import { bs } from "as-bs"; +import { bs } from "../../../modules/bs"; import { QUOTE } from "../../custom/chars"; import { bytes } from "../../util/bytes"; diff --git a/assembly/serialize/simple/float.ts b/assembly/serialize/simple/float.ts index 054b7bc..9db35e8 100644 --- a/assembly/serialize/simple/float.ts +++ b/assembly/serialize/simple/float.ts @@ -1,5 +1,5 @@ import { dtoa_buffered } from "util/number"; -import { bs } from "as-bs"; +import { bs } from "../../../modules/bs"; export function serializeFloat(data: T): void { bs.ensureSize(64); diff --git a/assembly/serialize/simple/integer.ts b/assembly/serialize/simple/integer.ts index 47b4b3c..ee36178 100644 --- a/assembly/serialize/simple/integer.ts +++ b/assembly/serialize/simple/integer.ts @@ -1,5 +1,5 @@ import { itoa_buffered } from "util/number"; -import { bs } from "as-bs"; +import { bs } from "../../../modules/bs"; export function serializeInteger(data: T): void { bs.ensureSize(sizeof() << 3); diff --git a/assembly/serialize/simple/map.ts b/assembly/serialize/simple/map.ts index c76619c..7e6ab21 100644 --- a/assembly/serialize/simple/map.ts +++ b/assembly/serialize/simple/map.ts @@ -1,6 +1,6 @@ import { JSON } from "../.."; import { BRACE_LEFT, BRACE_RIGHT, COLON, COMMA } from "../../custom/chars"; -import { bs } from "as-bs"; +import { bs } from "../../../modules/bs"; export function serializeMap>(src: T): void { const srcSize = src.size; diff --git a/assembly/serialize/simple/string.ts b/assembly/serialize/simple/string.ts index 3b5e99e..8c03fed 100644 --- a/assembly/serialize/simple/string.ts +++ b/assembly/serialize/simple/string.ts @@ -1,6 +1,6 @@ import { _intTo16 } from "../../custom/util"; import { bytes } from "../../util/bytes"; -import { bs } from "as-bs"; +import { bs } from "../../../modules/bs"; import { BACK_SLASH, QUOTE } from "../../custom/chars"; import { SERIALIZE_ESCAPE_TABLE } from "../../globals/tables"; diff --git a/assembly/test.ts b/assembly/test.ts index 4d70767..b85b0a1 100644 --- a/assembly/test.ts +++ b/assembly/test.ts @@ -1,96 +1,49 @@ import { JSON } from "."; -import { deserializeString } from "./deserialize/simple/string"; -import { bytes } from "./util"; -import { ptrToStr } from "./util/ptrToStr"; - // @json or @serializable work here @json class Vec3 { x: f64 = 0.0; y: f64 = 0.0; z: f64 = 0.0; - __INITIALIZE(): Vec3 { - return this; - } } + @json class Player { - @alias("first name") + // @alias("first name") firstName!: string; lastName!: string; lastActive!: i32[]; // Drop in a code block, function, or expression that evaluates to a boolean - // @omitif((self: Player) => i32(self.age < 18) - age: JSON.Box | null = null; - @omitnull() + @omitif((self: Player): boolean => self.age < 18) + age!: i32; + // @omitnull() pos!: Vec3 | null; isVerified!: boolean; - __INITIALIZE(): Player { + @inline __INITIALIZE(): this { this.firstName = ""; this.lastName = ""; - this.lastActive = []; - this.age = null; - this.pos = changetype(__new(offsetof(), idof())).__INITIALIZE() + this.pos = changetype>(__new(offsetof>(), idof>())).__INITIALIZE(); return this; } - __DESERIALIZE(keyStart: usize, keyEnd: usize, valStart: usize, valEnd: usize, ptr: usize): void { - console.log(`${ptrToStr(keyStart, keyEnd)} -> ${ptrToStr(valStart, valEnd)} (${keyEnd - keyStart})`) - switch (keyEnd - keyStart) { - case 20: { - const code0 = load(keyStart, 0); - const code1 = load(keyStart, 8); - const code2 = load(keyStart, 16); - if (code0 == 32370111954878566 && code1 == 27303545189433460 && code2 == 6619245) { // first name - store(ptr, JSON.__deserialize(valStart, valEnd), offsetof("firstName")); - return; - } else if (code0 == 32651591226032236 && code1 == 29555370777313345 && code2 == 6619254) { // lastActive - store>(ptr, JSON.__deserialize>(valStart, valEnd), offsetof("lastActive")); - return; - } else if (code0 == 28429342022500457 && code1 == 29555310648164466 && code2 == 6553701) { // isVerified - store(ptr, JSON.__deserialize(valStart, valEnd), offsetof("isVerified")); - return; - } - return; - } - case 6: { - let code = (load(keyStart) << 16) | load(keyStart, 4); - if (code == 493928513648) { // pos - store(ptr, JSON.__deserialize(valStart, valEnd), offsetof("pos")); - return; - } else if (code == 433798447201) { // age - store | null>(ptr, JSON.__deserialize | null>(valStart, valEnd), offsetof("age")); - return; - } - return; - } - case 16: { - const code0 = load(keyStart, 0); - const code1 = load(keyStart, 8); - if (code0 == 32651591226032236 && code1 == 28429440805568590) { // lastName - store(ptr, JSON.__deserialize(valStart, valEnd), offsetof("lastName")); - return; - } - return; - } - } - } } const player: Player = { - firstName: "Emmet", - lastName: "West", - lastActive: [8, 27, 2022], - age: null, + firstName: "Jairus", + lastName: "Tanaka", + lastActive: [1, 20, 2025], + age: 18, pos: { x: 3.4, y: 1.2, - z: 8.3 + z: 8.3, }, - isVerified: true + isVerified: true, }; const stringified = JSON.stringify(player); console.log("Serialized: " + stringified); const parsed = JSON.parse(stringified); -console.log("Deserialized: " + JSON.stringify(parsed)); \ No newline at end of file +console.log("Deserialized: " + JSON.stringify(parsed)); + +console.log("Deserialized: " + JSON.stringify(JSON.parse("[1,2,3]"))) \ No newline at end of file diff --git a/assembly/tsconfig.json b/assembly/tsconfig.json index f3cd60c..2ed0bb1 100644 --- a/assembly/tsconfig.json +++ b/assembly/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "assemblyscript/std/assembly.json", - "include": ["./**/*.ts", "util/atoi"], + "include": ["./**/*.ts"], "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true diff --git a/assembly/util/getArrayDepth.ts b/assembly/util/getArrayDepth.ts index 3d7429d..58f9105 100644 --- a/assembly/util/getArrayDepth.ts +++ b/assembly/util/getArrayDepth.ts @@ -6,12 +6,12 @@ // @ts-ignore: Decorator export function getArrayDepth(depth: i32 = 1): i32 { - if (!isArray()) { - return 0; - } else if (isArray>()) { - depth++; - return getArrayDepth>(depth); - } else { - return depth; - } -} \ No newline at end of file + if (!isArray()) { + return 0; + } else if (isArray>()) { + depth++; + return getArrayDepth>(depth); + } else { + return depth; + } +} diff --git a/assembly/util/ptrToStr.ts b/assembly/util/ptrToStr.ts index 7b755ab..cf8d547 100644 --- a/assembly/util/ptrToStr.ts +++ b/assembly/util/ptrToStr.ts @@ -1,7 +1,7 @@ // @ts-ignore: decorator @inline export function ptrToStr(start: usize, end: usize): string { - const size = end - start; - const out = __new(size, idof()); - memory.copy(out, start, size); - return changetype(out); -} \ No newline at end of file + const size = end - start; + const out = __new(size, idof()); + memory.copy(out, start, size); + return changetype(out); +} diff --git a/assembly/util/snp.ts b/assembly/util/snp.ts index 3274336..b890a38 100644 --- a/assembly/util/snp.ts +++ b/assembly/util/snp.ts @@ -8,64 +8,62 @@ import { atoi } from "./atoi"; // @ts-ignore: Decorator valid here @inline function snp(srcStart: usize, srcEnd: usize): T { - // @ts-ignore: type - let val: T = 0; - let char = load(srcStart) - 48; - if (isFloat()) { - while (srcStart < srcEnd) { - + // @ts-ignore: type + let val: T = 0; + let char = load(srcStart) - 48; + if (isFloat()) { + while (srcStart < srcEnd) {} + } else if (isInteger()) { + if (isSigned() && char == 65533) { + srcStart += 2; + while (srcStart < srcEnd) { + char = load(srcStart) - 48; + if (char < 10) { + // @ts-ignore: type + val = (val * 10 + char) as T; + } else if (char == 101 || char == 69) { + srcStart += 2; + char = load(srcStart); + if (char == 45) { + // @ts-ignore: type + return -(val / pow10(atoi(srcStart + 2, srcEnd))); + } else { + // @ts-ignore: type + return -(val * pow10(atoi(srcStart, srcEnd))); + } } - } else if (isInteger()) { - if (isSigned() && char == 65533) { - srcStart += 2; - while (srcStart < srcEnd) { - char = load(srcStart) - 48; - if (char < 10) { - // @ts-ignore: type - val = (val * 10 + char) as T; - } else if (char == 101 || char == 69) { - srcStart += 2; - char = load(srcStart); - if (char == 45) { - // @ts-ignore: type - return -(val / pow10(atoi(srcStart + 2, srcEnd))); - } else { - // @ts-ignore: type - return -(val * pow10(atoi(srcStart, srcEnd))); - } - } - srcStart += 2; - } - return -val as T; - } else { - while (srcStart < srcEnd) { - char = load(srcStart) - 48; // this operation is repeated twice - if (char < 10) { - // @ts-ignore: type - val = (val * 10 + char) as T; - } else if (char == 101 || char == 69) { - srcStart += 2; - char = load(srcStart); - if (char == 45) { - // @ts-ignore: type - return val / pow10(atoi(srcStart + 2, srcEnd)); - } else { - // @ts-ignore: type - return val * pow10(atoi(srcStart, srcEnd)); - } - } - srcStart += 2; - } - return val as T; + srcStart += 2; + } + return -val as T; + } else { + while (srcStart < srcEnd) { + char = load(srcStart) - 48; // this operation is repeated twice + if (char < 10) { + // @ts-ignore: type + val = (val * 10 + char) as T; + } else if (char == 101 || char == 69) { + srcStart += 2; + char = load(srcStart); + if (char == 45) { + // @ts-ignore: type + return val / pow10(atoi(srcStart + 2, srcEnd)); + } else { + // @ts-ignore: type + return val * pow10(atoi(srcStart, srcEnd)); + } } + srcStart += 2; + } + return val as T; } + } } // @ts-ignore: Decorator valid here @inline function pow10(x: u16): T { - if (sizeof() == 8) { - return load(POW_TEN_TABLE_64 + x); - } else { - return load(POW_TEN_TABLE_32 + x); - } -} \ No newline at end of file + if (sizeof() == 8) { + return load(POW_TEN_TABLE_64 + x); + } else { + return load(POW_TEN_TABLE_32 + x); + } +} diff --git a/modules/bs/index.ts b/modules/bs/index.ts new file mode 100644 index 0000000..8bb88a3 --- /dev/null +++ b/modules/bs/index.ts @@ -0,0 +1,167 @@ +import { OBJECT, TOTAL_OVERHEAD } from "rt/common"; + +let maxOffset: usize = __new(0, idof()); + +/** + * Central buffer namespace for managing memory operations. + */ +export namespace bs { + /** Current buffer pointer. */ + export let buffer: usize = maxOffset; + + /** Current offset within the buffer. */ + export let offset: usize = maxOffset; + + /** Byte length of the buffer. */ + export let byteLength: usize = 0; + + /** + * Sets the buffer to a given data object and initializes related properties. + * @param data - The data object to set as the buffer. + */ + // @ts-ignore: Decorator valid here + @inline export function setBuffer(data: T, byteLength: usize = bytes(data)): void { + buffer = changetype(data); + offset = changetype(data); + byteLength = byteLength; + maxOffset = byteLength + buffer; + } + + /** + * Ensures the buffer has sufficient capacity for a given size. + * If necessary, reallocates the buffer to accommodate the new size. + * @param size - The size to ensure capacity for. + */ + // @ts-ignore: Decorator valid here + @inline export function ensureCapacity(size: u32): void { + const newSize = offset + size; + if (newSize > maxOffset) { + const newPtr = __renew(buffer, (byteLength = nextPowerOf2(newSize - buffer))); + offset = offset - buffer + newPtr; + maxOffset = newPtr + byteLength; + buffer = newPtr; + } + } + + /** + * Ensures the buffer size is sufficient for a given size. + * If necessary, reallocates the buffer to the exact new size. + * @param size - The size to ensure. + */ + // @ts-ignore: Decorator valid here + @inline export function ensureSize(size: u32): void { + const newSize = offset + size; + if (newSize > maxOffset) { + const newPtr = __renew(buffer, (byteLength = newSize - buffer)); + offset = offset - buffer + newPtr; + maxOffset = newPtr + byteLength; + buffer = newPtr; + } + } + + /** + * Resizes the buffer to the specified size. + * @param newSize - The new buffer size. + */ + // @ts-ignore: Decorator valid here + @inline export function resize(newSize: u32): void { + const newPtr = __renew(buffer, newSize); + byteLength = newSize; + buffer = newPtr; + offset = buffer + newSize; + maxOffset = buffer + byteLength; + } + + /** + * Gets the remaining space available in the buffer. + * @returns The number of bytes remaining. + */ + // @ts-ignore: Decorator valid here + @inline export function getRemainingSize(): usize { + return maxOffset - offset; + } + + /** + * Clears data from a specified offset onward. + * @param fromOffset - The starting offset to clear from. + */ + // @ts-ignore: Decorator valid here + @inline export function clearFromOffset(fromOffset: usize): void { + if (fromOffset < offset) { + memory.fill(fromOffset, 0, offset - fromOffset); + offset = fromOffset; + } + } + + /** + * Shrinks the buffer to fit the current offset. + */ + // @ts-ignore: Decorator valid here + @inline export function shrink(): void { + if (offset > maxOffset) { + byteLength = offset - buffer; + buffer = __renew(buffer, byteLength); + maxOffset = byteLength + buffer; + } + } + + /** + * Shrinks the buffer and resets the offset, returning the buffer as a specified type. + * @returns The buffer cast to the specified type. + */ + // @ts-ignore: Decorator valid here + @inline export function shrinkTo(): T { + shrink(); + offset = buffer; + return changetype(buffer); + } + + /** + * Copies the buffer's content to a new object of a specified type. + * Optionally shrinks the buffer after copying. + * @param s - Whether to shrink the buffer after copying. + * @returns The new object containing the buffer's content. + */ + // @ts-ignore: Decorator valid here + @inline export function out(s: bool = false): T { + const len = offset - buffer; + const _out = __new(len, idof()); + memory.copy(_out, buffer, len); + if (s) shrink(); + offset = buffer; + return changetype(_out); + } + + /** + * Copies the buffer's content to a given destination pointer. + * Optionally shrinks the buffer after copying. + * @param dst - The destination pointer. + * @param s - Whether to shrink the buffer after copying. + * @returns The destination pointer cast to the specified type. + */ + // @ts-ignore: Decorator valid here + @inline export function outTo(dst: usize, s: bool = false): T { + const len = offset - buffer; + if (len != changetype(dst - TOTAL_OVERHEAD).rtSize) __renew(len, idof()); + memory.copy(dst, buffer, len); + if (s) shrink(); + offset = buffer; + return changetype(dst); + } +} + +// @ts-ignore: Decorator valid here +@inline function nextPowerOf2(n: u32): u32 { + return 1 << (32 - clz(n - 1)); +} + +// @ts-ignore: Decorator valid here +@inline function bytes(o: T): i32 { + if (isInteger() || isFloat()) { + return sizeof(); + } else if (isManaged() || isReference()) { + return changetype(changetype(o) - TOTAL_OVERHEAD).rtSize; + } else { + ERROR("Cannot convert type " + nameof() + " to bytes!"); + } +} \ No newline at end of file diff --git a/modules/tsconfig.json b/modules/tsconfig.json new file mode 100644 index 0000000..2ed0bb1 --- /dev/null +++ b/modules/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "assemblyscript/std/assembly.json", + "include": ["./**/*.ts"], + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true + } +} diff --git a/package.json b/package.json index d6c4bb4..3449db5 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,12 @@ { "name": "json-as", "version": "1.0.0-alpha.1", - "description": "The only JSON library you'll need for AssemblyScript. SIMD enabled", - "types": "assembly/index.ts", - "main": "transform/lib/index.js", "author": "Jairus Tanaka", - "contributors": [ - "DogWhich", - "Romdotdog", - "Derek Barrera", - "Frankk Taylor", - "lekiano", - "Florian Guitton", - "Matt Johnson-Pint", - "Tomáš Hromada" - ], - "license": "MIT", - "scripts": { - "test": "rm -rf ./build/ && ast test", - "build:bench": "rm -rf ./build/ && asc assembly/__benches__/misc.bench.ts -o ./build/bench.wasm --textFile ./build/bench.wat --transform ./transform --optimizeLevel 3 --shrinkLevel 0 --converge --noAssert --uncheckedBehavior always --runtime incremental --enable simd --enable bulk-memory", - "build:test": "rm -rf ./build/ && JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm --textFile ./build/test.wat --optimizeLevel 3 --shrinkLevel 0 --enable simd --runtime stub", - "build:test:simd": "rm -rf ./build/ && JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm --textFile ./build/test.wat --optimizeLevel 3 --shrinkLevel 0 --enable simd --runtime stub", - "test:wasmtime": "wasmtime ./build/test.wasm", - "test:wasmer": "wasmer ./build/test.wasm", - "build:transform": "tsc -p ./transform", - "bench:wasmer": "wasmer ./build/bench.wasm --llvm", - "prettier": "prettier -w ." + "repository": { + "type": "git", + "url": "git+https://github.com/JairusSW/as-json.git" }, + "main": "transform/lib/index.js", "devDependencies": { "@as-tral/cli": "^3.0.2", "@assemblyscript/wasi-shim": "^0.1.0", @@ -41,16 +21,21 @@ "typescript": "latest", "visitor-as": "^0.11.4" }, - "dependencies": { - "as-bs": "^1.0.1" - }, - "overrides": { - "assemblyscript": "$assemblyscript" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/JairusSW/as-json.git" + "bugs": { + "url": "https://github.com/JairusSW/as-json/issues" }, + "contributors": [ + "DogWhich", + "Romdotdog", + "Derek Barrera", + "Frankk Taylor", + "lekiano", + "Florian Guitton", + "Matt Johnson-Pint", + "Tomáš Hromada" + ], + "description": "The only JSON library you'll need for AssemblyScript. SIMD enabled", + "homepage": "https://github.com/JairusSW/as-json#readme", "keywords": [ "assemblyscript", "json", @@ -63,12 +48,24 @@ "fast", "algorithm" ], - "bugs": { - "url": "https://github.com/JairusSW/as-json/issues" + "license": "MIT", + "overrides": { + "assemblyscript": "$assemblyscript" }, - "homepage": "https://github.com/JairusSW/as-json#readme", - "type": "module", "publishConfig": { "@JairusSW:registry": "https://npm.pkg.github.com" - } + }, + "scripts": { + "test": "rm -rf ./build/ && ast test", + "build:bench": "rm -rf ./build/ && asc assembly/__benches__/misc.bench.ts -o ./build/bench.wasm --textFile ./build/bench.wat --transform ./transform --optimizeLevel 3 --shrinkLevel 0 --converge --noAssert --uncheckedBehavior always --runtime incremental --enable simd --enable bulk-memory", + "build:test": "rm -rf ./build/ && JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm --textFile ./build/test.wat --optimizeLevel 3 --shrinkLevel 0 --enable simd --runtime stub", + "build:test:simd": "rm -rf ./build/ && JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm --textFile ./build/test.wat --optimizeLevel 3 --shrinkLevel 0 --enable simd --runtime stub", + "test:wasmtime": "wasmtime ./build/test.wasm", + "test:wasmer": "wasmer ./build/test.wasm", + "build:transform": "tsc -p ./transform", + "bench:wasmer": "wasmer ./build/bench.wasm --llvm", + "prettier": "prettier -w ." + }, + "type": "module", + "types": "assembly/index.ts" } diff --git a/transform/lib/index.js b/transform/lib/index.js index 54eebf3..704e8b8 100644 --- a/transform/lib/index.js +++ b/transform/lib/index.js @@ -19,7 +19,7 @@ class JSONTransform extends Visitor { visitClassDeclaration(node) { if (!node.decorators?.length) return; - if (!node.decorators.some(decorator => { + if (!node.decorators.some((decorator) => { const name = decorator.name.text; return name === "json" || name === "serializable"; })) @@ -28,26 +28,25 @@ class JSONTransform extends Visitor { this.schema.node = node; this.schema.name = node.name.text; this.schemas.push(this.schema); - console.log("Created schema: " + this.schema.name); - const members = [...node.members.filter((v) => v.kind === 54 && - v.flags !== 32 && - v.flags !== 512 && - v.flags !== 1024 && - !v.decorators?.some(decorator => decorator.name.text === "omit"))]; + if (process.env["JSON_DEBUG"]) + console.log("Created schema: " + this.schema.name); + const members = [...node.members.filter((v) => v.kind === 54 && v.flags !== 32 && v.flags !== 512 && v.flags !== 1024 && !v.decorators?.some((decorator) => decorator.name.text === "omit"))]; if (node.extendsType) { const extendsName = node.extendsType?.name.identifier.text; this.schema.parent = this.schemas.find((v) => v.name == extendsName); if (!this.schema.parent) { - const internalSearch = getClasses(node.range.source).find(v => v.name.text == extendsName); + const internalSearch = getClasses(node.range.source).find((v) => v.name.text == extendsName); if (internalSearch) { - console.log("Found " + extendsName + " internally"); + if (process.env["JSON_DEBUG"]) + console.log("Found " + extendsName + " internally"); this.visitClassDeclaration(internalSearch); this.visitClassDeclaration(node); return; } const externalSearch = getImportedClass(extendsName, node.range.source, this.parser); if (externalSearch) { - console.log("Found " + extendsName + " externally"); + if (process.env["JSON_DEBUG"]) + console.log("Found " + extendsName + " externally"); this.visitClassDeclaration(externalSearch); this.visitClassDeclaration(node); return; @@ -127,7 +126,7 @@ class JSONTransform extends Visitor { let ALLOCATE = "@inline __ALLOCATE(): void {\n"; indent = " "; if (this.schema.static == false) { - if (this.schema.members.some(v => v.flags.has(PropertyFlags.OmitNull))) { + if (this.schema.members.some((v) => v.flags.has(PropertyFlags.OmitNull))) { SERIALIZE += indent + "let block: usize = 0;\n"; } this.schema.byteSize += 2; @@ -142,12 +141,27 @@ class JSONTransform extends Visitor { const aliasName = JSON.stringify(member.alias || member.name); const realName = member.name; const isLast = i == this.schema.members.length - 1; + const nonNullType = member.type.replace(" | null", ""); + if (member.value) { + INITIALIZE += ` this.${member.name} = ${member.value};\n`; + } + else if (this.schemas.find((v) => nonNullType == v.name)) { + INITIALIZE += ` this.${member.name} = changetype>(__new(offsetof>(), idof>())).__INITIALIZE();\n`; + } + else if (member.type.startsWith("Array<") || member.type.startsWith("Map<")) { + INITIALIZE += ` this.${member.name} = [];\n`; + } + else if (member.type == "string" || member.type == "String" || member.type == "JSON.Raw") { + INITIALIZE += ` this.${member.name} = "";\n`; + } if (!isRegular && !member.flags.has(PropertyFlags.OmitIf) && !member.flags.has(PropertyFlags.OmitNull)) isRegular = true; if (isRegular && isPure) { const keyPart = (isFirst ? "{" : ",") + aliasName + ":"; this.schema.byteSize += keyPart.length << 1; - SERIALIZE += this.getStores(keyPart).map(v => indent + v + "\n").join(""); + SERIALIZE += this.getStores(keyPart) + .map((v) => indent + v + "\n") + .join(""); SERIALIZE += indent + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof(${JSON.stringify(realName)})));\n`; if (isFirst) isFirst = false; @@ -155,7 +169,9 @@ class JSONTransform extends Visitor { else if (isRegular && !isPure) { const keyPart = (isFirst ? "" : ",") + aliasName + ":"; this.schema.byteSize += keyPart.length << 1; - SERIALIZE += this.getStores(keyPart).map(v => indent + v + "\n").join(""); + SERIALIZE += this.getStores(keyPart) + .map((v) => indent + v + "\n") + .join(""); SERIALIZE += indent + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof(${JSON.stringify(realName)})));\n`; if (isFirst) isFirst = false; @@ -166,7 +182,9 @@ class JSONTransform extends Visitor { indentInc(); const keyPart = aliasName + ":"; this.schema.byteSize += keyPart.length << 1; - SERIALIZE += this.getStores(keyPart).map(v => indent + v + "\n").join(""); + SERIALIZE += this.getStores(keyPart) + .map((v) => indent + v + "\n") + .join(""); SERIALIZE += indent + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof(${JSON.stringify(realName)})));\n`; if (!isLast) { this.schema.byteSize += 2; @@ -187,7 +205,9 @@ class JSONTransform extends Visitor { SERIALIZE += indent + `if (${toString(member.flags.get(PropertyFlags.OmitIf))}) {\n`; } indentInc(); - SERIALIZE += this.getStores(aliasName + ":").map(v => indent + v + "\n").join(""); + SERIALIZE += this.getStores(aliasName + ":") + .map((v) => indent + v + "\n") + .join(""); SERIALIZE += indent + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof(${JSON.stringify(realName)})));\n`; if (!isLast) { this.schema.byteSize += 2; @@ -276,16 +296,22 @@ class JSONTransform extends Visitor { SERIALIZE += "}"; ALLOCATE += indent + "bs.ensureSize(" + this.schema.byteSize + ");\n"; ALLOCATE += "}"; + INITIALIZE += " return this;\n"; + INITIALIZE += "}"; if (process.env["JSON_DEBUG"]) { console.log(SERIALIZE); + console.log(INITIALIZE); console.log(DESERIALIZE); console.log(ALLOCATE); } const SERIALIZE_METHOD = SimpleParser.parseClassMember(SERIALIZE, node); + const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node); const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node); const ALLOCATE_METHOD = SimpleParser.parseClassMember(ALLOCATE, node); if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_METHOD); + if (!node.members.find((v) => v.name.text == "__INITIALIZE")) + node.members.push(INITIALIZE_METHOD); if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD); if (!node.members.find((v) => v.name.text == "__ALLOCATE")) @@ -326,8 +352,7 @@ class JSONTransform extends Visitor { const source = this.parser.sources.find((src) => src.internalPath == node.internalPath); if (!source) return; - if (source.statements.some(stmt => stmt.kind === 59 && - stmt.name.text === "JSON")) + if (source.statements.some((stmt) => stmt.kind === 59 && stmt.name.text === "JSON")) this.imports.push(node); } visitSource(node) { @@ -336,10 +361,16 @@ class JSONTransform extends Visitor { } addRequiredImports(node) { if (!this.imports.find((i) => i.declarations.find((d) => d.foreignName.text == "bs"))) { - if (!this.bsImport) { - this.bsImport = "import { bs } from \"as-bs\""; + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + let relativePath = path.relative(path.dirname(node.range.source.normalizedPath), path.resolve(__dirname, "../../modules/bs/index.ts")); + if (!relativePath.startsWith(".") && !relativePath.startsWith("/")) + relativePath = "./" + relativePath; + const txt = `import { bs } from "${relativePath}";`; + if (!this.jsonImport) { + this.jsonImport = txt; if (process.env["JSON_DEBUG"]) - console.log("Added as-bs import: " + this.bsImport + "\n"); + console.log("Added bs import: " + txt + "\n"); } } if (!this.imports.find((i) => i.declarations.find((d) => d.foreignName.text == "JSON"))) { @@ -362,23 +393,23 @@ class JSONTransform extends Visitor { let offset = 0; for (const [size, num] of sizes) { if (size == "v128") { - let index = this.newStmts.simd.findIndex(v => v.includes(num)); + let index = this.newStmts.simd.findIndex((v) => v.includes(num)); let name = "SIMD_" + (index == -1 ? this.newStmts.simd.length : index); if (index && !this.newStmts.simd.includes(`const ${name} = ${num};`)) this.newStmts.simd.push(`const ${name} = ${num};`); - out.push("store(bs.offset, " + name + ", " + offset + "); // " + data.slice((offset >> 1), (offset >> 1) + 8)); + out.push("store(bs.offset, " + name + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 8)); offset += 16; } if (size == "u64") { - out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice((offset >> 1), (offset >> 1) + 4)); + out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 4)); offset += 8; } else if (size == "u32") { - out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice((offset >> 1), (offset >> 1) + 2)); + out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 2)); offset += 4; } else if (size == "u16") { - out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice((offset >> 1), (offset >> 1) + 1)); + out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 1)); offset += 2; } } @@ -485,22 +516,16 @@ function getArgs(args) { return out; } function toU16(data, offset = 0) { - return (data.charCodeAt(offset + 0)).toString(); + return data.charCodeAt(offset + 0).toString(); } function toU32(data, offset = 0) { - return ((data.charCodeAt(offset + 1) << 16) | - data.charCodeAt(offset + 0)).toString(); + return ((data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset + 0)).toString(); } function toU48(data, offset = 0) { - return ((BigInt(data.charCodeAt(offset + 2)) << 32n) | - (BigInt(data.charCodeAt(offset + 1)) << 16n) | - BigInt(data.charCodeAt(offset + 0))).toString(); + return ((BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0))).toString(); } function toU64(data, offset = 0) { - return ((BigInt(data.charCodeAt(offset + 3)) << 48n) | - (BigInt(data.charCodeAt(offset + 2)) << 32n) | - (BigInt(data.charCodeAt(offset + 1)) << 16n) | - BigInt(data.charCodeAt(offset + 0))).toString(); + return ((BigInt(data.charCodeAt(offset + 3)) << 48n) | (BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0))).toString(); } function toMemCDecl(n, indent) { let out = ""; @@ -543,31 +568,18 @@ function strToNum(data, simd = false, offset = 0) { const out = []; let n = data.length; while (n >= 8 && simd) { - out.push(["v128", "i16x8(" - + data.charCodeAt(offset + 0) + ", " - + data.charCodeAt(offset + 1) + ", " - + data.charCodeAt(offset + 2) + ", " - + data.charCodeAt(offset + 3) + ", " - + data.charCodeAt(offset + 4) + ", " - + data.charCodeAt(offset + 5) + ", " - + data.charCodeAt(offset + 6) + ", " - + data.charCodeAt(offset + 7) - + ")"]); + out.push(["v128", "i16x8(" + data.charCodeAt(offset + 0) + ", " + data.charCodeAt(offset + 1) + ", " + data.charCodeAt(offset + 2) + ", " + data.charCodeAt(offset + 3) + ", " + data.charCodeAt(offset + 4) + ", " + data.charCodeAt(offset + 5) + ", " + data.charCodeAt(offset + 6) + ", " + data.charCodeAt(offset + 7) + ")"]); offset += 8; n -= 8; } while (n >= 4) { - const value = ((BigInt(data.charCodeAt(offset + 3)) << 48n) | - (BigInt(data.charCodeAt(offset + 2)) << 32n) | - (BigInt(data.charCodeAt(offset + 1)) << 16n) | - BigInt(data.charCodeAt(offset + 0))); + const value = (BigInt(data.charCodeAt(offset + 3)) << 48n) | (BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0)); out.push(["u64", value.toString()]); offset += 4; n -= 4; } while (n >= 2) { - const value = ((data.charCodeAt(offset + 1) << 16) | - data.charCodeAt(offset + 0)); + const value = (data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset + 0); out.push(["u32", value.toString()]); offset += 2; n -= 2; @@ -579,13 +591,8 @@ function strToNum(data, simd = false, offset = 0) { return out; } function isPrimitive(type) { - const primitiveTypes = [ - "u8", "u16", "u32", "u64", - "i8", "i16", "i32", "i64", - "f32", "f64", - "bool", "boolean" - ]; - return primitiveTypes.some(v => type.includes(v)); + const primitiveTypes = ["u8", "u16", "u32", "u64", "i8", "i16", "i32", "i64", "f32", "f64", "bool", "boolean"]; + return primitiveTypes.some((v) => type.includes(v)); } function throwError(message, range) { const err = new Error(); @@ -621,6 +628,6 @@ function sizeof(type) { return 0; } function allPrimitive(schema) { - return !schema.members.some(p => p.byteSize == 0); + return !schema.members.some((p) => p.byteSize == 0); } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/transform/lib/index.js.map b/transform/lib/index.js.map index 052d228..6dbbf6a 100644 --- a/transform/lib/index.js.map +++ b/transform/lib/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/transform/lib/index.old.js b/transform/lib/index.old.js index 2ea265e..0893cd5 100644 --- a/transform/lib/index.old.js +++ b/transform/lib/index.old.js @@ -3,464 +3,402 @@ import { toString, isStdlib } from "visitor-as/dist/utils.js"; import { BaseVisitor, SimpleParser } from "visitor-as/dist/index.js"; import { Transform } from "assemblyscript/dist/transform.js"; class JSONTransform extends BaseVisitor { - schemasList = []; - currentClass; - sources = new Set(); - visitMethodDeclaration() { } - visitClassDeclaration(node) { - if (!node.decorators?.length) - return; - let found = false; - for (const decorator of node.decorators) { - const name = decorator.name.text; - if (name === "json" || name === "serializable") { - found = true; - break; - } - } - if (!found) - return; - const schema = new SchemaData(); - schema.node = node; - schema.name = node.name.text; - const members = [...node.members.filter((v) => v.kind === 54)]; - if (node.extendsType) { - schema.parent = this.schemasList.find((v) => v.name == node.extendsType?.name.identifier.text); - if (schema.parent?.members) { - for (let i = schema.parent.members.length - 1; i >= 0; i--) { - const replace = schema.members.find((v) => v.name == schema.parent?.members[i]?.name); - if (!replace) { - members.unshift(schema.parent?.members[i].node); - } - } - } - } - if (!members.length) { - let SERIALIZE_RAW_EMPTY = '__SERIALIZE(): string {\n return "{}";\n}'; - let INITIALIZE_EMPTY = "__INITIALIZE(): this {\n return this;\n}"; - let DESERIALIZE_EMPTY = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n return false;\n}"; - if (process.env["JSON_DEBUG"]) { - console.log(SERIALIZE_RAW_EMPTY); - console.log(INITIALIZE_EMPTY); - console.log(DESERIALIZE_EMPTY); - } - const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_RAW_EMPTY, node); - const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node); - const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node); - if (!node.members.find((v) => v.name.text == "__SERIALIZE")) - node.members.push(SERIALIZE_RAW_METHOD_EMPTY); - if (!node.members.find((v) => v.name.text == "__INITIALIZE")) - node.members.push(INITIALIZE_METHOD_EMPTY); - if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) - node.members.push(DESERIALIZE_METHOD_EMPTY); - this.schemasList.push(schema); - } - for (const member of members) { - const name = member.name; - if (!(member instanceof FieldDeclaration)) - continue; - if (!member.type) { - throw new Error("Fields must be strongly typed! Found " + toString(member) + " at " + node.range.source.normalizedPath); - } - const type = toString(member.type); - if (type.startsWith("(") && type.includes("=>")) - continue; - const value = member.initializer ? toString(member.initializer) : null; - if (member.flags == 32) - continue; - if (member.flags === 512) - continue; - if (member.flags === 1024) - continue; - const mem = new Property(); - mem.name = name.text; - mem.type = type; - mem.value = value; - mem.node = member; - if (type.includes("JSON.Raw")) { - mem.flags.set(PropertyFlags.JSON_Raw, []); - } - if (member.type.isNullable) { - mem.flags.set(PropertyFlags.Null, []); - } - if (member.decorators) { - for (const decorator of member.decorators) { - const decoratorName = decorator.name.text; - const args = getArgs(decorator.args); - switch (decoratorName) { - case "alias": { - if (!args.length) - throw new Error("Expected 1 argument but got zero at @alias in " + node.range.source.normalizedPath); - mem.alias = args[0]; - mem.flags.set(PropertyFlags.Alias, args); - break; - } - case "omit": { - mem.flags.set(PropertyFlags.Omit, args); - break; - } - case "omitif": { - if (!decorator.args?.length) - throw new Error("Expected 1 argument but got zero at @omitif in " + node.range.source.normalizedPath); - mem.flags.set(PropertyFlags.OmitIf, args); - break; - } - case "omitnull": { - mem.flags.set(PropertyFlags.OmitNull, args); - break; - } - } - } - } - mem.generate(false); - if (this.schemasList.find((v) => v.name == type)) { - mem.initialize = "this." + name.text + " = changetype>(__new(offsetof>(), idof>()));\n changetype>(this." + name.text + ").__INITIALIZE()"; - } - else if (mem.value) { - mem.initialize = "this." + name.text + " = " + mem.value; - } - else if (type === "Map") { - mem.initialize = "this." + name.text + " = new " + mem.type + "()"; - } - else if (type === "string") { - mem.initialize = "this." + name.text + ' = ""'; - } - else if (type === "Array") { - mem.initialize = "this." + name.text + " = instantiate<" + mem.type + ">()"; - } - else if (type === "bool" || type === "boolean") { - mem.initialize = "this." + name.text + " = false"; - } - else if (type === "JSON.Raw") { - mem.initialize = "this." + name.text + ' = ""'; - } - else if (type === "u8" || type === "u16" || type === "u32" || type === "u64" || type === "i8" || type === "i16" || type === "i32" || type === "i64") { - mem.initialize = "this." + name.text + " = 0"; - } - else if (type === "f32" || type === "f64") { - mem.initialize = "this." + name.text + " = 0.0"; - } - schema.members.push(mem); - } - let SERIALIZE_RAW = "__SERIALIZE(): string {\n let out = `{"; - let SERIALIZE_PRETTY = "__SERIALIZE_PRETTY(): string {\n let out = `{"; - let INITIALIZE = "__INITIALIZE(): this {\n"; - let DESERIALIZE = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n const len = key_end - key_start;\n"; - let indent = " "; - if (!schema.members.length) - return; - found = false; - if (schema.members[0]?.flags.has(PropertyFlags.OmitNull) || schema.members[0]?.flags.has(PropertyFlags.OmitIf)) { - SERIALIZE_RAW += schema.members[0]?.serialize; - SERIALIZE_PRETTY += "\\n" + schema.members[0]?.serialize; - } - else { - SERIALIZE_RAW += schema.members[0]?.serialize + ","; - SERIALIZE_PRETTY += "\\n" + schema.members[0]?.serialize + ",\\n"; - found = true; + schemasList = []; + currentClass; + sources = new Set(); + visitMethodDeclaration() {} + visitClassDeclaration(node) { + if (!node.decorators?.length) return; + let found = false; + for (const decorator of node.decorators) { + const name = decorator.name.text; + if (name === "json" || name === "serializable") { + found = true; + break; + } + } + if (!found) return; + const schema = new SchemaData(); + schema.node = node; + schema.name = node.name.text; + const members = [...node.members.filter((v) => v.kind === 54)]; + if (node.extendsType) { + schema.parent = this.schemasList.find((v) => v.name == node.extendsType?.name.identifier.text); + if (schema.parent?.members) { + for (let i = schema.parent.members.length - 1; i >= 0; i--) { + const replace = schema.members.find((v) => v.name == schema.parent?.members[i]?.name); + if (!replace) { + members.unshift(schema.parent?.members[i].node); + } } - if (schema.members[0]?.initialize) - INITIALIZE += " " + schema.members[0]?.initialize + ";\n"; - for (let i = 1; i < schema.members.length; i++) { - const member = schema.members[i]; - if (member.initialize) - INITIALIZE += " " + member.initialize + ";\n"; - if (member.flags.has(PropertyFlags.OmitNull) || member.flags.has(PropertyFlags.OmitIf)) { - SERIALIZE_RAW += member.serialize; - SERIALIZE_PRETTY += member.serialize; - } - else { - SERIALIZE_RAW += member.serialize + ","; - SERIALIZE_PRETTY += indent + member.serialize + ",\\n"; - found = true; - } + } + } + if (!members.length) { + let SERIALIZE_RAW_EMPTY = '__SERIALIZE(): string {\n return "{}";\n}'; + let INITIALIZE_EMPTY = "__INITIALIZE(): this {\n return this;\n}"; + let DESERIALIZE_EMPTY = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n return false;\n}"; + if (process.env["JSON_DEBUG"]) { + console.log(SERIALIZE_RAW_EMPTY); + console.log(INITIALIZE_EMPTY); + console.log(DESERIALIZE_EMPTY); + } + const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_RAW_EMPTY, node); + const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node); + const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node); + if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_RAW_METHOD_EMPTY); + if (!node.members.find((v) => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD_EMPTY); + if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD_EMPTY); + this.schemasList.push(schema); + } + for (const member of members) { + const name = member.name; + if (!(member instanceof FieldDeclaration)) continue; + if (!member.type) { + throw new Error("Fields must be strongly typed! Found " + toString(member) + " at " + node.range.source.normalizedPath); + } + const type = toString(member.type); + if (type.startsWith("(") && type.includes("=>")) continue; + const value = member.initializer ? toString(member.initializer) : null; + if (member.flags == 32) continue; + if (member.flags === 512) continue; + if (member.flags === 1024) continue; + const mem = new Property(); + mem.name = name.text; + mem.type = type; + mem.value = value; + mem.node = member; + if (type.includes("JSON.Raw")) { + mem.flags.set(PropertyFlags.JSON_Raw, []); + } + if (member.type.isNullable) { + mem.flags.set(PropertyFlags.Null, []); + } + if (member.decorators) { + for (const decorator of member.decorators) { + const decoratorName = decorator.name.text; + const args = getArgs(decorator.args); + switch (decoratorName) { + case "alias": { + if (!args.length) throw new Error("Expected 1 argument but got zero at @alias in " + node.range.source.normalizedPath); + mem.alias = args[0]; + mem.flags.set(PropertyFlags.Alias, args); + break; + } + case "omit": { + mem.flags.set(PropertyFlags.Omit, args); + break; + } + case "omitif": { + if (!decorator.args?.length) throw new Error("Expected 1 argument but got zero at @omitif in " + node.range.source.normalizedPath); + mem.flags.set(PropertyFlags.OmitIf, args); + break; + } + case "omitnull": { + mem.flags.set(PropertyFlags.OmitNull, args); + break; + } + } } - if (found) { - SERIALIZE_RAW += "`;\n store(changetype(out) + ((out.length - 1) << 1), 125);\n return out;\n}"; - SERIALIZE_PRETTY += "`;\n store(changetype(out) + ((out.length - 2) << 1), 8192010);\n return out;\n}"; + } + mem.generate(false); + if (this.schemasList.find((v) => v.name == type)) { + mem.initialize = "this." + name.text + " = changetype>(__new(offsetof>(), idof>()));\n changetype>(this." + name.text + ").__INITIALIZE()"; + } else if (mem.value) { + mem.initialize = "this." + name.text + " = " + mem.value; + } else if (type === "Map") { + mem.initialize = "this." + name.text + " = new " + mem.type + "()"; + } else if (type === "string") { + mem.initialize = "this." + name.text + ' = ""'; + } else if (type === "Array") { + mem.initialize = "this." + name.text + " = instantiate<" + mem.type + ">()"; + } else if (type === "bool" || type === "boolean") { + mem.initialize = "this." + name.text + " = false"; + } else if (type === "JSON.Raw") { + mem.initialize = "this." + name.text + ' = ""'; + } else if (type === "u8" || type === "u16" || type === "u32" || type === "u64" || type === "i8" || type === "i16" || type === "i32" || type === "i64") { + mem.initialize = "this." + name.text + " = 0"; + } else if (type === "f32" || type === "f64") { + mem.initialize = "this." + name.text + " = 0.0"; + } + schema.members.push(mem); + } + let SERIALIZE_RAW = "__SERIALIZE(): string {\n let out = `{"; + let SERIALIZE_PRETTY = "__SERIALIZE_PRETTY(): string {\n let out = `{"; + let INITIALIZE = "__INITIALIZE(): this {\n"; + let DESERIALIZE = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n const len = key_end - key_start;\n"; + let indent = " "; + if (!schema.members.length) return; + found = false; + if (schema.members[0]?.flags.has(PropertyFlags.OmitNull) || schema.members[0]?.flags.has(PropertyFlags.OmitIf)) { + SERIALIZE_RAW += schema.members[0]?.serialize; + SERIALIZE_PRETTY += "\\n" + schema.members[0]?.serialize; + } else { + SERIALIZE_RAW += schema.members[0]?.serialize + ","; + SERIALIZE_PRETTY += "\\n" + schema.members[0]?.serialize + ",\\n"; + found = true; + } + if (schema.members[0]?.initialize) INITIALIZE += " " + schema.members[0]?.initialize + ";\n"; + for (let i = 1; i < schema.members.length; i++) { + const member = schema.members[i]; + if (member.initialize) INITIALIZE += " " + member.initialize + ";\n"; + if (member.flags.has(PropertyFlags.OmitNull) || member.flags.has(PropertyFlags.OmitIf)) { + SERIALIZE_RAW += member.serialize; + SERIALIZE_PRETTY += member.serialize; + } else { + SERIALIZE_RAW += member.serialize + ","; + SERIALIZE_PRETTY += indent + member.serialize + ",\\n"; + found = true; + } + } + if (found) { + SERIALIZE_RAW += "`;\n store(changetype(out) + ((out.length - 1) << 1), 125);\n return out;\n}"; + SERIALIZE_PRETTY += "`;\n store(changetype(out) + ((out.length - 2) << 1), 8192010);\n return out;\n}"; + } else { + SERIALIZE_RAW += "}`;\n return out;\n}"; + SERIALIZE_PRETTY += "}`;\n return out;\n}"; + } + INITIALIZE += " return this;\n}"; + const sortedMembers = []; + const _sorted = schema.members.sort((a, b) => (a.alias?.length || a.name.length) - (b.alias?.length || b.name.length)); + let len = -1; + let offset = -1; + for (let i = 0; i < _sorted.length; i++) { + const member = _sorted[i]; + const _name = member.alias || member.name; + if (_name.length === len) { + sortedMembers[offset]?.push(member); + } else { + sortedMembers.push([member]); + len = _name.length; + offset++; + } + } + let first = true; + for (const memberSet of sortedMembers) { + const firstMember = memberSet[0]; + const _name = encodeKey(firstMember.alias || firstMember.name); + if (_name.length === 1) { + if (first) { + DESERIALIZE += " if (1 === len) {\n switch (load(changetype(data) + (key_start << 1))) {\n"; + first = false; + } else { + DESERIALIZE += "else if (1 === len) {\n switch (load(changetype(data) + (key_start << 1))) {\n"; } - else { - SERIALIZE_RAW += "}`;\n return out;\n}"; - SERIALIZE_PRETTY += "}`;\n return out;\n}"; + } else if (_name.length === 2) { + if (first) { + DESERIALIZE += " if (2 === len) {\n switch (load(changetype(data) + (key_start << 1))) {\n"; + first = false; + } else { + DESERIALIZE += "else if (2 === len) {\n switch (load(changetype(data) + (key_start << 1))) {\n"; } - INITIALIZE += " return this;\n}"; - const sortedMembers = []; - const _sorted = schema.members.sort((a, b) => (a.alias?.length || a.name.length) - (b.alias?.length || b.name.length)); - let len = -1; - let offset = -1; - for (let i = 0; i < _sorted.length; i++) { - const member = _sorted[i]; - const _name = member.alias || member.name; - if (_name.length === len) { - sortedMembers[offset]?.push(member); - } - else { - sortedMembers.push([member]); - len = _name.length; - offset++; - } + } else if (_name.length === 4) { + if (first) { + DESERIALIZE += " if (4 === len) {\n const code = load(changetype(data) + (key_start << 1));\n"; + first = false; + } else { + DESERIALIZE += "else if (4 === len) {\n const code = load(changetype(data) + (key_start << 1));\n"; } - let first = true; - for (const memberSet of sortedMembers) { - const firstMember = memberSet[0]; - const _name = encodeKey(firstMember.alias || firstMember.name); - if (_name.length === 1) { - if (first) { - DESERIALIZE += " if (1 === len) {\n switch (load(changetype(data) + (key_start << 1))) {\n"; - first = false; - } - else { - DESERIALIZE += "else if (1 === len) {\n switch (load(changetype(data) + (key_start << 1))) {\n"; - } - } - else if (_name.length === 2) { - if (first) { - DESERIALIZE += " if (2 === len) {\n switch (load(changetype(data) + (key_start << 1))) {\n"; - first = false; - } - else { - DESERIALIZE += "else if (2 === len) {\n switch (load(changetype(data) + (key_start << 1))) {\n"; - } - } - else if (_name.length === 4) { - if (first) { - DESERIALIZE += " if (4 === len) {\n const code = load(changetype(data) + (key_start << 1));\n"; - first = false; - } - else { - DESERIALIZE += "else if (4 === len) {\n const code = load(changetype(data) + (key_start << 1));\n"; - } - } - else { - if (first) { - DESERIALIZE += " if (" + _name.length + " === len) {\n"; - first = false; - } - else { - DESERIALIZE += "else if (" + _name.length + " === len) {\n"; - } - } - let f = true; - for (let i = 0; i < memberSet.length; i++) { - const member = memberSet[i]; - if (!member.deserialize) - continue; - const _name = encodeKey(member.alias || member.name); - if (_name.length === 1) { - DESERIALIZE += ` case ${_name.charCodeAt(0)}: { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; - } - else if (_name.length === 2) { - DESERIALIZE += ` case ${charCodeAt32(_name, 0)}: { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; - } - else if (_name.length === 4) { - if (f) { - f = false; - DESERIALIZE += ` if (${charCodeAt64(_name, 0)} === code) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; - } - else { - DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + `else if (${charCodeAt64(_name, 0)} === code) {\n ${member.deserialize}\n return true;\n }\n`; - } - } - else { - if (f) { - f = false; - DESERIALIZE += ` if (0 === memory.compare(changetype("${escapeQuote(escapeSlash(_name))}"), changetype(data) + (key_start << 1), ${_name.length << 1})) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; - } - else { - DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else if (0 === memory.compare(changetype("${escapeQuote(escapeSlash(_name))}"), changetype(data) + (key_start << 1), ${_name.length << 1})) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; - } - } - } - if (_name.length < 3) { - DESERIALIZE += ` default: {\n return false;\n }\n }\n`; - } - else if (_name.length == 4) { - DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else {\n return false;\n }\n`; - } - else { - DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else {\n return false;\n }\n`; - } - DESERIALIZE += " } "; + } else { + if (first) { + DESERIALIZE += " if (" + _name.length + " === len) {\n"; + first = false; + } else { + DESERIALIZE += "else if (" + _name.length + " === len) {\n"; } - DESERIALIZE += "\n return false;\n}"; - if (process.env["JSON_DEBUG"]) { - console.log(SERIALIZE_RAW); - console.log(INITIALIZE); - console.log(DESERIALIZE); + } + let f = true; + for (let i = 0; i < memberSet.length; i++) { + const member = memberSet[i]; + if (!member.deserialize) continue; + const _name = encodeKey(member.alias || member.name); + if (_name.length === 1) { + DESERIALIZE += ` case ${_name.charCodeAt(0)}: { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; + } else if (_name.length === 2) { + DESERIALIZE += ` case ${charCodeAt32(_name, 0)}: { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; + } else if (_name.length === 4) { + if (f) { + f = false; + DESERIALIZE += ` if (${charCodeAt64(_name, 0)} === code) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; + } else { + DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + `else if (${charCodeAt64(_name, 0)} === code) {\n ${member.deserialize}\n return true;\n }\n`; + } + } else { + if (f) { + f = false; + DESERIALIZE += ` if (0 === memory.compare(changetype("${escapeQuote(escapeSlash(_name))}"), changetype(data) + (key_start << 1), ${_name.length << 1})) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; + } else { + DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else if (0 === memory.compare(changetype("${escapeQuote(escapeSlash(_name))}"), changetype(data) + (key_start << 1), ${_name.length << 1})) { /* ${_name} */\n ${member.deserialize}\n return true;\n }\n`; + } } - const SERIALIZE_RAW_METHOD = SimpleParser.parseClassMember(SERIALIZE_RAW, node); - const DESERIALIZE_SAFE = DESERIALIZE.replaceAll("__DESERIALIZE", "__DESERIALIZE_SAFE"); - const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node); - const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node); - const DESERIALIZE_SAFE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_SAFE, node); - if (!node.members.find((v) => v.name.text == "__SERIALIZE")) - node.members.push(SERIALIZE_RAW_METHOD); - if (!node.members.find((v) => v.name.text == "__INITIALIZE")) - node.members.push(INITIALIZE_METHOD); - if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) - node.members.push(DESERIALIZE_METHOD); - if (!node.members.find((v) => v.name.text == "__DESERIALIZE_SAFE")) - node.members.push(DESERIALIZE_SAFE_METHOD); - this.schemasList.push(schema); + } + if (_name.length < 3) { + DESERIALIZE += ` default: {\n return false;\n }\n }\n`; + } else if (_name.length == 4) { + DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else {\n return false;\n }\n`; + } else { + DESERIALIZE = DESERIALIZE.slice(0, DESERIALIZE.length - 1) + ` else {\n return false;\n }\n`; + } + DESERIALIZE += " } "; } - visitSource(node) { - super.visitSource(node); - if (!this.sources.has(node)) { - return; - } + DESERIALIZE += "\n return false;\n}"; + if (process.env["JSON_DEBUG"]) { + console.log(SERIALIZE_RAW); + console.log(INITIALIZE); + console.log(DESERIALIZE); } + const SERIALIZE_RAW_METHOD = SimpleParser.parseClassMember(SERIALIZE_RAW, node); + const DESERIALIZE_SAFE = DESERIALIZE.replaceAll("__DESERIALIZE", "__DESERIALIZE_SAFE"); + const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node); + const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node); + const DESERIALIZE_SAFE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_SAFE, node); + if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_RAW_METHOD); + if (!node.members.find((v) => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD); + if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD); + if (!node.members.find((v) => v.name.text == "__DESERIALIZE_SAFE")) node.members.push(DESERIALIZE_SAFE_METHOD); + this.schemasList.push(schema); + } + visitSource(node) { + super.visitSource(node); + if (!this.sources.has(node)) { + return; + } + } } export default class Transformer extends Transform { - afterParse(parser) { - const transformer = new JSONTransform(); - const sources = parser.sources - .filter((source) => !isStdlib(source)) - .sort((_a, _b) => { - const a = _a.internalPath; - const b = _b.internalPath; - if (a[0] === "~" && b[0] !== "~") { - return -1; - } - else if (a[0] !== "~" && b[0] === "~") { - return 1; - } - else { - return 0; - } - }); - for (const source of sources) { - if (!isStdlib(source)) { - transformer.visit(source); - } - } - const schemas = transformer.schemasList; - for (const schema of schemas) { - if (schema.parent) { - const parent = schemas.find((v) => v.name === schema.parent?.name); - if (!parent) - throw new Error(`Class ${schema.name} extends its parent class ${schema.parent}, but ${schema.parent} does not include a @json or @serializable decorator! Add the decorator and rebuild.`); - } + afterParse(parser) { + const transformer = new JSONTransform(); + const sources = parser.sources + .filter((source) => !isStdlib(source)) + .sort((_a, _b) => { + const a = _a.internalPath; + const b = _b.internalPath; + if (a[0] === "~" && b[0] !== "~") { + return -1; + } else if (a[0] !== "~" && b[0] === "~") { + return 1; + } else { + return 0; } + }); + for (const source of sources) { + if (!isStdlib(source)) { + transformer.visit(source); + } + } + const schemas = transformer.schemasList; + for (const schema of schemas) { + if (schema.parent) { + const parent = schemas.find((v) => v.name === schema.parent?.name); + if (!parent) throw new Error(`Class ${schema.name} extends its parent class ${schema.parent}, but ${schema.parent} does not include a @json or @serializable decorator! Add the decorator and rebuild.`); + } } + } } var PropertyFlags; (function (PropertyFlags) { - PropertyFlags[PropertyFlags["Null"] = 0] = "Null"; - PropertyFlags[PropertyFlags["Omit"] = 1] = "Omit"; - PropertyFlags[PropertyFlags["OmitNull"] = 2] = "OmitNull"; - PropertyFlags[PropertyFlags["OmitIf"] = 3] = "OmitIf"; - PropertyFlags[PropertyFlags["Alias"] = 4] = "Alias"; - PropertyFlags[PropertyFlags["JSON_Raw"] = 5] = "JSON_Raw"; + PropertyFlags[(PropertyFlags["Null"] = 0)] = "Null"; + PropertyFlags[(PropertyFlags["Omit"] = 1)] = "Omit"; + PropertyFlags[(PropertyFlags["OmitNull"] = 2)] = "OmitNull"; + PropertyFlags[(PropertyFlags["OmitIf"] = 3)] = "OmitIf"; + PropertyFlags[(PropertyFlags["Alias"] = 4)] = "Alias"; + PropertyFlags[(PropertyFlags["JSON_Raw"] = 5)] = "JSON_Raw"; })(PropertyFlags || (PropertyFlags = {})); class Property { - name = ""; - alias = null; - type = ""; - value = null; - flags = new Map(); - serialize = null; - deserialize = null; - initialize = null; - node; - right_s = ""; - right_d = ""; - generate(safe) { - const name = this.name; - const escapedName = escapeString(JSON.stringify(this.alias || this.name)); - const type = this.type; - if (this.flags.has(PropertyFlags.Omit)) - return; - if (this.flags.has(PropertyFlags.JSON_Raw)) { - if (this.flags.has(PropertyFlags.Null)) { - this.right_s = "(this." + name + ' || "null")'; - this.right_d = "value_start === value_end - 4 && 30399761348886638 === load(changetype(data) + (value_start << 1)) ? null : data.substring(value_start, value_end)"; - } - else { - this.right_s = "this." + name; - this.right_d = "data.substring(value_start, value_end);"; - } - } - else { - this.right_s = "__SERIALIZE<" + type + ">(this." + name + ")"; - this.right_d = (safe ? "__DESERIALIZE_SAFE" : "__DESERIALIZE") + "<" + type + ">(data.substring(value_start, value_end))"; - } - if (this.flags.has(PropertyFlags.OmitIf)) { - const condition = this.flags.get(PropertyFlags.OmitIf)[0]; - if (!condition) - throw new Error("Could not find condition when using decorator @omitif! Provide at least one condition"); - this.serialize = "${" + condition + ' ? "" : \'' + escapedName + ":' + " + this.right_s + ' + ","}'; - this.deserialize = "this." + name + " = " + this.right_d + ";"; - } - else if (this.flags.has(PropertyFlags.OmitNull)) { - this.serialize = "${changetype(this." + name + ") == 0" + ' ? "" : \'' + escapedName + ":' + " + this.right_s + ' + ","}'; - this.deserialize = "this." + name + " = " + this.right_d + ";"; - } - else { - this.serialize = escapedName + ":${" + this.right_s + "}"; - this.deserialize = "this." + name + " = " + this.right_d + ";"; - } + name = ""; + alias = null; + type = ""; + value = null; + flags = new Map(); + serialize = null; + deserialize = null; + initialize = null; + node; + right_s = ""; + right_d = ""; + generate(safe) { + const name = this.name; + const escapedName = escapeString(JSON.stringify(this.alias || this.name)); + const type = this.type; + if (this.flags.has(PropertyFlags.Omit)) return; + if (this.flags.has(PropertyFlags.JSON_Raw)) { + if (this.flags.has(PropertyFlags.Null)) { + this.right_s = "(this." + name + ' || "null")'; + this.right_d = "value_start === value_end - 4 && 30399761348886638 === load(changetype(data) + (value_start << 1)) ? null : data.substring(value_start, value_end)"; + } else { + this.right_s = "this." + name; + this.right_d = "data.substring(value_start, value_end);"; + } + } else { + this.right_s = "__SERIALIZE<" + type + ">(this." + name + ")"; + this.right_d = (safe ? "__DESERIALIZE_SAFE" : "__DESERIALIZE") + "<" + type + ">(data.substring(value_start, value_end))"; + } + if (this.flags.has(PropertyFlags.OmitIf)) { + const condition = this.flags.get(PropertyFlags.OmitIf)[0]; + if (!condition) throw new Error("Could not find condition when using decorator @omitif! Provide at least one condition"); + this.serialize = "${" + condition + ' ? "" : \'' + escapedName + ":' + " + this.right_s + ' + ","}'; + this.deserialize = "this." + name + " = " + this.right_d + ";"; + } else if (this.flags.has(PropertyFlags.OmitNull)) { + this.serialize = "${changetype(this." + name + ") == 0" + ' ? "" : \'' + escapedName + ":' + " + this.right_s + ' + ","}'; + this.deserialize = "this." + name + " = " + this.right_d + ";"; + } else { + this.serialize = escapedName + ":${" + this.right_s + "}"; + this.deserialize = "this." + name + " = " + this.right_d + ";"; } + } } class SchemaData { - name = ""; - members = []; - parent = null; - node; + name = ""; + members = []; + parent = null; + node; } function charCodeAt32(data, offset) { - return (data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset); + return (data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset); } function charCodeAt64(data, offset) { - if (offset + 3 >= data.length) { - throw new Error("The string must have at least 4 characters from the specified offset."); - } - const firstCharCode = BigInt(data.charCodeAt(offset)); - const secondCharCode = BigInt(data.charCodeAt(offset + 1)); - const thirdCharCode = BigInt(data.charCodeAt(offset + 2)); - const fourthCharCode = BigInt(data.charCodeAt(offset + 3)); - const u64Value = (fourthCharCode << 48n) | (thirdCharCode << 32n) | (secondCharCode << 16n) | firstCharCode; - return u64Value; + if (offset + 3 >= data.length) { + throw new Error("The string must have at least 4 characters from the specified offset."); + } + const firstCharCode = BigInt(data.charCodeAt(offset)); + const secondCharCode = BigInt(data.charCodeAt(offset + 1)); + const thirdCharCode = BigInt(data.charCodeAt(offset + 2)); + const fourthCharCode = BigInt(data.charCodeAt(offset + 3)); + const u64Value = (fourthCharCode << 48n) | (thirdCharCode << 32n) | (secondCharCode << 16n) | firstCharCode; + return u64Value; } function encodeKey(key) { - const data = JSON.stringify(key); - return data.slice(1, data.length - 1); + const data = JSON.stringify(key); + return data.slice(1, data.length - 1); } function escapeString(data) { - return data.replace(/\\/g, "\\\\").replace(/\`/g, "\\`"); + return data.replace(/\\/g, "\\\\").replace(/\`/g, "\\`"); } function escapeSlash(data) { - return data.replace(/\\/g, "\\\\").replace(/\`/g, "\\`"); + return data.replace(/\\/g, "\\\\").replace(/\`/g, "\\`"); } function escapeQuote(data) { - return data.replace(/\"/g, '\\"'); + return data.replace(/\"/g, '\\"'); } function getArgs(args) { - if (!args) - return []; - let out = []; - for (const arg of args) { - if (arg instanceof StringLiteralExpression) { - out.push(arg.value); - } - else if (arg instanceof IntegerLiteralExpression) { - out.push(i64_to_string(arg.value)); - } - else if (arg instanceof FloatLiteralExpression) { - out.push(arg.value.toString()); - } - else if (arg instanceof NullExpression) { - out.push(arg.text); - } - else if (arg instanceof TrueExpression) { - out.push(arg.text); - } - else if (arg instanceof FalseExpression) { - out.push(arg.text); - } - else if (arg instanceof IdentifierExpression) { - out.push(arg.text); - } + if (!args) return []; + let out = []; + for (const arg of args) { + if (arg instanceof StringLiteralExpression) { + out.push(arg.value); + } else if (arg instanceof IntegerLiteralExpression) { + out.push(i64_to_string(arg.value)); + } else if (arg instanceof FloatLiteralExpression) { + out.push(arg.value.toString()); + } else if (arg instanceof NullExpression) { + out.push(arg.text); + } else if (arg instanceof TrueExpression) { + out.push(arg.text); + } else if (arg instanceof FalseExpression) { + out.push(arg.text); + } else if (arg instanceof IdentifierExpression) { + out.push(arg.text); } - return out; + } + return out; } -//# sourceMappingURL=index.old.js.map \ No newline at end of file +//# sourceMappingURL=index.old.js.map diff --git a/transform/src/index.ts b/transform/src/index.ts index 632e920..3b2021f 100644 --- a/transform/src/index.ts +++ b/transform/src/index.ts @@ -6,7 +6,6 @@ import * as path from "path"; import { fileURLToPath } from "url"; import { Property, PropertyFlags, Schema } from "./types.js"; import { getClasses, getImportedClass } from "./linker.js"; -import { deserialize } from "v8"; let indent = " "; @@ -20,40 +19,36 @@ class JSONTransform extends Visitor { public jsonImport: string | null = null; public bsImport: string | null = null; public newStmts: { - simd: string[] + simd: string[]; } = { simd: [] }; visitClassDeclaration(node: ClassDeclaration): void { if (!node.decorators?.length) return; - if (!node.decorators.some(decorator => { - const name = (decorator.name).text; - return name === "json" || name === "serializable"; - })) return; + if ( + !node.decorators.some((decorator) => { + const name = (decorator.name).text; + return name === "json" || name === "serializable"; + }) + ) + return; this.schema = new Schema(); this.schema.node = node; this.schema.name = node.name.text; this.schemas.push(this.schema); - console.log("Created schema: " + this.schema.name); + if (process.env["JSON_DEBUG"]) console.log("Created schema: " + this.schema.name); - const members: FieldDeclaration[] = [...node.members.filter( - (v) => - v.kind === NodeKind.FieldDeclaration && - v.flags !== CommonFlags.Static && - v.flags !== CommonFlags.Private && - v.flags !== CommonFlags.Protected && - !v.decorators?.some(decorator => (decorator.name).text === "omit") - ) as FieldDeclaration[]]; + const members: FieldDeclaration[] = [...(node.members.filter((v) => v.kind === NodeKind.FieldDeclaration && v.flags !== CommonFlags.Static && v.flags !== CommonFlags.Private && v.flags !== CommonFlags.Protected && !v.decorators?.some((decorator) => (decorator.name).text === "omit")) as FieldDeclaration[])]; if (node.extendsType) { const extendsName = node.extendsType?.name.identifier.text; this.schema.parent = this.schemas.find((v) => v.name == extendsName) as Schema | null; if (!this.schema.parent) { - const internalSearch = getClasses(node.range.source).find(v => v.name.text == extendsName); + const internalSearch = getClasses(node.range.source).find((v) => v.name.text == extendsName); if (internalSearch) { - console.log("Found " + extendsName + " internally"); + if (process.env["JSON_DEBUG"]) console.log("Found " + extendsName + " internally"); this.visitClassDeclaration(internalSearch); this.visitClassDeclaration(node); return; @@ -61,7 +56,7 @@ class JSONTransform extends Visitor { const externalSearch = getImportedClass(extendsName, node.range.source, this.parser); if (externalSearch) { - console.log("Found " + extendsName + " externally"); + if (process.env["JSON_DEBUG"]) console.log("Found " + extendsName + " externally"); this.visitClassDeclaration(externalSearch); this.visitClassDeclaration(node); return; @@ -148,7 +143,7 @@ class JSONTransform extends Visitor { indent = " "; if (this.schema.static == false) { - if (this.schema.members.some(v => v.flags.has(PropertyFlags.OmitNull))) { + if (this.schema.members.some((v) => v.flags.has(PropertyFlags.OmitNull))) { SERIALIZE += indent + "let block: usize = 0;\n"; } this.schema.byteSize += 2; @@ -165,18 +160,33 @@ class JSONTransform extends Visitor { const aliasName = JSON.stringify(member.alias || member.name); const realName = member.name; const isLast = i == this.schema.members.length - 1; + const nonNullType = member.type.replace(" | null", ""); + + if (member.value) { + INITIALIZE += ` this.${member.name} = ${member.value};\n`; + } else if (this.schemas.find((v) => nonNullType == v.name)) { + INITIALIZE += ` this.${member.name} = changetype>(__new(offsetof>(), idof>())).__INITIALIZE();\n`; + } else if (member.type.startsWith("Array<") || member.type.startsWith("Map<")) { + INITIALIZE += ` this.${member.name} = [];\n`; + } else if (member.type == "string" || member.type == "String" || member.type == "JSON.Raw") { + INITIALIZE += ` this.${member.name} = "";\n`; + } if (!isRegular && !member.flags.has(PropertyFlags.OmitIf) && !member.flags.has(PropertyFlags.OmitNull)) isRegular = true; if (isRegular && isPure) { const keyPart = (isFirst ? "{" : ",") + aliasName + ":"; this.schema.byteSize += keyPart.length << 1; - SERIALIZE += this.getStores(keyPart).map(v => indent + v + "\n").join(""); + SERIALIZE += this.getStores(keyPart) + .map((v) => indent + v + "\n") + .join(""); SERIALIZE += indent + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof(${JSON.stringify(realName)})));\n`; if (isFirst) isFirst = false; } else if (isRegular && !isPure) { const keyPart = (isFirst ? "" : ",") + aliasName + ":"; this.schema.byteSize += keyPart.length << 1; - SERIALIZE += this.getStores(keyPart).map(v => indent + v + "\n").join(""); + SERIALIZE += this.getStores(keyPart) + .map((v) => indent + v + "\n") + .join(""); SERIALIZE += indent + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof(${JSON.stringify(realName)})));\n`; if (isFirst) isFirst = false; } else { @@ -185,7 +195,9 @@ class JSONTransform extends Visitor { indentInc(); const keyPart = aliasName + ":"; this.schema.byteSize += keyPart.length << 1; - SERIALIZE += this.getStores(keyPart).map(v => indent + v + "\n").join(""); + SERIALIZE += this.getStores(keyPart) + .map((v) => indent + v + "\n") + .join(""); SERIALIZE += indent + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof(${JSON.stringify(realName)})));\n`; if (!isLast) { @@ -207,7 +219,9 @@ class JSONTransform extends Visitor { SERIALIZE += indent + `if (${toString(member.flags.get(PropertyFlags.OmitIf))}) {\n`; } indentInc(); - SERIALIZE += this.getStores(aliasName + ":").map(v => indent + v + "\n").join(""); + SERIALIZE += this.getStores(aliasName + ":") + .map((v) => indent + v + "\n") + .join(""); SERIALIZE += indent + `JSON.__serialize<${member.type}>(load<${member.type}>(ptr, offsetof(${JSON.stringify(realName)})));\n`; if (!isLast) { @@ -242,8 +256,9 @@ class JSONTransform extends Visitor { indentInc(); for (const memberGroup of sortedMembers) { - const memberLen = (memberGroup[0].alias || memberGroup[0].name).length << 1 - DESERIALIZE += `${indent}case ${memberLen}: {\n`; indentInc(); + const memberLen = (memberGroup[0].alias || memberGroup[0].name).length << 1; + DESERIALIZE += `${indent}case ${memberLen}: {\n`; + indentInc(); if (memberLen == 2) DESERIALIZE += `${indent}switch (load(keyStart)) {\n`; else if (memberLen == 4) DESERIALIZE += `${indent}switch (load(keyStart)) {\n`; else if (memberLen == 6) DESERIALIZE += `${indent}let code = (load(keyStart) << 16) | load(keyStart, 4);\n`; @@ -280,7 +295,7 @@ class JSONTransform extends Visitor { } indentDec(); DESERIALIZE += `${indent} return;\n`; // Break switch - DESERIALIZE += `${indent}}\n` // Close length switch + DESERIALIZE += `${indent}}\n`; // Close length switch } indentDec(); @@ -298,20 +313,23 @@ class JSONTransform extends Visitor { ALLOCATE += indent + "bs.ensureSize(" + this.schema.byteSize + ");\n"; ALLOCATE += "}"; + INITIALIZE += " return this;\n"; + INITIALIZE += "}"; + if (process.env["JSON_DEBUG"]) { console.log(SERIALIZE); - // console.log(INITIALIZE); + console.log(INITIALIZE); console.log(DESERIALIZE); console.log(ALLOCATE); } const SERIALIZE_METHOD = SimpleParser.parseClassMember(SERIALIZE, node); - // const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node); + const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node); const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node); const ALLOCATE_METHOD = SimpleParser.parseClassMember(ALLOCATE, node); if (!node.members.find((v) => v.name.text == "__SERIALIZE")) node.members.push(SERIALIZE_METHOD); - // if (!node.members.find((v) => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD); + if (!node.members.find((v) => v.name.text == "__INITIALIZE")) node.members.push(INITIALIZE_METHOD); if (!node.members.find((v) => v.name.text == "__DESERIALIZE")) node.members.push(DESERIALIZE_METHOD); if (!node.members.find((v) => v.name.text == "__ALLOCATE")) node.members.push(ALLOCATE_METHOD); super.visitClassDeclaration(node); @@ -373,22 +391,37 @@ class JSONTransform extends Visitor { const source = this.parser.sources.find((src) => src.internalPath == node.internalPath); if (!source) return; - if (source.statements.some(stmt => - stmt.kind === NodeKind.NamespaceDeclaration && - (stmt as NamespaceDeclaration).name.text === "JSON") - ) this.imports.push(node); + if (source.statements.some((stmt) => stmt.kind === NodeKind.NamespaceDeclaration && (stmt as NamespaceDeclaration).name.text === "JSON")) this.imports.push(node); } visitSource(node: Source): void { this.imports = []; super.visitSource(node); } addRequiredImports(node: ClassDeclaration): void { + // if (!this.imports.find((i) => i.declarations.find((d) => d.foreignName.text == "bs"))) { + // if (!this.bsImport) { + // this.bsImport = 'import { bs } from "as-bs"'; + // if (process.env["JSON_DEBUG"]) console.log("Added as-bs import: " + this.bsImport + "\n"); + // } + // } if (!this.imports.find((i) => i.declarations.find((d) => d.foreignName.text == "bs"))) { - if (!this.bsImport) { - this.bsImport = "import { bs } from \"as-bs\""; - if (process.env["JSON_DEBUG"]) console.log("Added as-bs import: " + this.bsImport + "\n"); + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + + let relativePath = path.relative(path.dirname(node.range.source.normalizedPath), path.resolve(__dirname, "../../modules/bs/index.ts")); + + if (!relativePath.startsWith(".") && !relativePath.startsWith("/")) relativePath = "./" + relativePath; + // if (!existsSync(relativePath)) { + // throw new Error("Could not find a valid json-as library to import from! Please add import { JSON } from \"path-to-json-as\"; in " + node.range.source.normalizedPath + "!"); + // } + + const txt = `import { bs } from "${relativePath}";`; + if (!this.jsonImport) { + this.jsonImport = txt; + if (process.env["JSON_DEBUG"]) console.log("Added bs import: " + txt + "\n"); } } + if (!this.imports.find((i) => i.declarations.find((d) => d.foreignName.text == "JSON"))) { const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -415,20 +448,20 @@ class JSONTransform extends Visitor { for (const [size, num] of sizes) { if (size == "v128") { // This could be put in its own file - let index = this.newStmts.simd.findIndex(v => v.includes(num)); + let index = this.newStmts.simd.findIndex((v) => v.includes(num)); let name = "SIMD_" + (index == -1 ? this.newStmts.simd.length : index); if (index && !this.newStmts.simd.includes(`const ${name} = ${num};`)) this.newStmts.simd.push(`const ${name} = ${num};`); - out.push("store(bs.offset, " + name + ", " + offset + "); // " + data.slice((offset >> 1), (offset >> 1) + 8)); + out.push("store(bs.offset, " + name + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 8)); offset += 16; } if (size == "u64") { - out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice((offset >> 1), (offset >> 1) + 4)); + out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 4)); offset += 8; } else if (size == "u32") { - out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice((offset >> 1), (offset >> 1) + 2)); + out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 2)); offset += 4; } else if (size == "u16") { - out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice((offset >> 1), (offset >> 1) + 1)); + out.push("store(bs.offset, " + num + ", " + offset + "); // " + data.slice(offset >> 1, (offset >> 1) + 1)); offset += 2; } } @@ -538,35 +571,23 @@ function getArgs(args: Expression[] | null): string[] { } function toU16(data: string, offset: number = 0): string { - return (data.charCodeAt(offset + 0)).toString(); + return data.charCodeAt(offset + 0).toString(); } function toU32(data: string, offset: number = 0): string { - return ( - (data.charCodeAt(offset + 1) << 16) | - data.charCodeAt(offset + 0) - ).toString(); + return ((data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset + 0)).toString(); } function toU48(data: string, offset: number = 0): string { - return ( - (BigInt(data.charCodeAt(offset + 2)) << 32n) | - (BigInt(data.charCodeAt(offset + 1)) << 16n) | - BigInt(data.charCodeAt(offset + 0)) - ).toString(); + return ((BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0))).toString(); } function toU64(data: string, offset: number = 0): string { - return ( - (BigInt(data.charCodeAt(offset + 3)) << 48n) | - (BigInt(data.charCodeAt(offset + 2)) << 32n) | - (BigInt(data.charCodeAt(offset + 1)) << 16n) | - BigInt(data.charCodeAt(offset + 0)) - ).toString(); + return ((BigInt(data.charCodeAt(offset + 3)) << 48n) | (BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0))).toString(); } function toMemCDecl(n: number, indent: string): string { - let out = "" + let out = ""; let offset = 0; let index = 0; while (n >= 8) { @@ -581,8 +602,7 @@ function toMemCDecl(n: number, indent: string): string { n -= 4; } - if (n == 1) - out += `${indent}const code${index++} = load(keyStart, ${offset});\n`; + if (n == 1) out += `${indent}const code${index++} = load(keyStart, ${offset});\n`; return out; } @@ -604,8 +624,7 @@ function toMemCCheck(data: string): string { n -= 4; } - if (n == 1) - out += ` && code${index++} == ${toU16(data, offset >> 1)}`; + if (n == 1) out += ` && code${index++} == ${toU16(data, offset >> 1)}`; return out.slice(4); } @@ -615,38 +634,21 @@ function strToNum(data: string, simd: boolean = false, offset: number = 0): stri let n = data.length; while (n >= 8 && simd) { - out.push(["v128", "i16x8(" - + data.charCodeAt(offset + 0) + ", " - + data.charCodeAt(offset + 1) + ", " - + data.charCodeAt(offset + 2) + ", " - + data.charCodeAt(offset + 3) + ", " - + data.charCodeAt(offset + 4) + ", " - + data.charCodeAt(offset + 5) + ", " - + data.charCodeAt(offset + 6) + ", " - + data.charCodeAt(offset + 7) - + ")"]); + out.push(["v128", "i16x8(" + data.charCodeAt(offset + 0) + ", " + data.charCodeAt(offset + 1) + ", " + data.charCodeAt(offset + 2) + ", " + data.charCodeAt(offset + 3) + ", " + data.charCodeAt(offset + 4) + ", " + data.charCodeAt(offset + 5) + ", " + data.charCodeAt(offset + 6) + ", " + data.charCodeAt(offset + 7) + ")"]); offset += 8; n -= 8; } while (n >= 4) { - const value = ( - (BigInt(data.charCodeAt(offset + 3)) << 48n) | - (BigInt(data.charCodeAt(offset + 2)) << 32n) | - (BigInt(data.charCodeAt(offset + 1)) << 16n) | - BigInt(data.charCodeAt(offset + 0)) - ); + const value = (BigInt(data.charCodeAt(offset + 3)) << 48n) | (BigInt(data.charCodeAt(offset + 2)) << 32n) | (BigInt(data.charCodeAt(offset + 1)) << 16n) | BigInt(data.charCodeAt(offset + 0)); out.push(["u64", value.toString()]); offset += 4; n -= 4; } while (n >= 2) { - const value = ( - (data.charCodeAt(offset + 1) << 16) | - data.charCodeAt(offset + 0) - ); + const value = (data.charCodeAt(offset + 1) << 16) | data.charCodeAt(offset + 0); out.push(["u32", value.toString()]); offset += 2; n -= 2; @@ -661,13 +663,8 @@ function strToNum(data: string, simd: boolean = false, offset: number = 0): stri } function isPrimitive(type: string): boolean { - const primitiveTypes = [ - "u8", "u16", "u32", "u64", - "i8", "i16", "i32", "i64", - "f32", "f64", - "bool", "boolean" - ]; - return primitiveTypes.some(v => type.includes(v)); + const primitiveTypes = ["u8", "u16", "u32", "u64", "i8", "i16", "i32", "i64", "f32", "f64", "bool", "boolean"]; + return primitiveTypes.some((v) => type.includes(v)); } function throwError(message: string, range: Range): never { @@ -685,18 +682,26 @@ function indentDec(): void { } function sizeof(type: string): number { - if (type == "u8") return 6; // -127 - else if (type == "i8") return 8; // 255 - else if (type == "u16") return 10; // 65536 - else if (type == "i16") return 12; // -32767 - else if (type == "u32") return 20; // 4294967295 - else if (type == "i32") return 22; // -2147483647 - else if (type == "u64") return 40; // 18446744073709551615 - else if (type == "i64") return 40; // -9223372036854775807 + if (type == "u8") + return 6; // -127 + else if (type == "i8") + return 8; // 255 + else if (type == "u16") + return 10; // 65536 + else if (type == "i16") + return 12; // -32767 + else if (type == "u32") + return 20; // 4294967295 + else if (type == "i32") + return 22; // -2147483647 + else if (type == "u64") + return 40; // 18446744073709551615 + else if (type == "i64") + return 40; // -9223372036854775807 else if (type == "bool" || type == "boolean") return 10; else return 0; } function allPrimitive(schema: Schema): boolean { - return !schema.members.some(p => p.byteSize == 0); -} \ No newline at end of file + return !schema.members.some((p) => p.byteSize == 0); +}