From fc4e0f18562d372cc855b0b73c73bcd9181a91a1 Mon Sep 17 00:00:00 2001 From: Jairus Date: Mon, 20 Jan 2025 16:05:03 -0500 Subject: [PATCH] first working example --- assembly/deserialize/simple/array.ts | 4 +- .../deserialize/simple/array/arbitrary.ts | 4 +- assembly/deserialize/simple/array/array.ts | 2 +- assembly/deserialize/simple/array/bool.ts | 2 +- assembly/deserialize/simple/array/float.ts | 2 +- assembly/deserialize/simple/array/integer.ts | 6 +- assembly/deserialize/simple/array/map.ts | 2 +- assembly/deserialize/simple/array/object.ts | 2 +- assembly/deserialize/simple/array/string.ts | 2 +- assembly/deserialize/simple/map.ts | 2 +- assembly/deserialize/simple/object.ts | 60 ++++++++++------- assembly/deserialize/simple/string.ts | 2 + assembly/index.ts | 8 ++- assembly/test.ts | 65 +++++++++++++++++-- 14 files changed, 119 insertions(+), 44 deletions(-) diff --git a/assembly/deserialize/simple/array.ts b/assembly/deserialize/simple/array.ts index c316132..5cc1a22 100644 --- a/assembly/deserialize/simple/array.ts +++ b/assembly/deserialize/simple/array.ts @@ -9,7 +9,7 @@ import { deserializeObjectArray } from "./array/object"; import { deserializeStringArray } from "./array/string"; // @ts-ignore: Decorator valid here -export function deserializeArray(srcStart: usize, srcEnd: usize, dst: usize = 0): T { +export function deserializeArray(srcStart: usize, srcEnd: usize, dst: usize): T { if (isString>()) { return deserializeStringArray(srcStart, srcEnd, dst); } else if (isBoolean>()) { @@ -28,7 +28,7 @@ export function deserializeArray(srcStart: usize, srcEnd: u const type = changetype>>(0); if (type instanceof JSON.Value) { // @ts-ignore: type - return deserializeArbitraryArray(srcStart, srcEnd, dst); + return deserializeArbitraryArray(srcStart, srcEnd, dst); } else if (type instanceof Map) { // @ts-ignore: type return deserializeMapArray(srcStart, srcEnd, dst); diff --git a/assembly/deserialize/simple/array/arbitrary.ts b/assembly/deserialize/simple/array/arbitrary.ts index d99b45f..6c02a56 100644 --- a/assembly/deserialize/simple/array/arbitrary.ts +++ b/assembly/deserialize/simple/array/arbitrary.ts @@ -3,8 +3,8 @@ 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: JSON.Value[] = []; +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) { diff --git a/assembly/deserialize/simple/array/array.ts b/assembly/deserialize/simple/array/array.ts index 5acbbfd..ca27dc7 100644 --- a/assembly/deserialize/simple/array/array.ts +++ b/assembly/deserialize/simple/array/array.ts @@ -2,7 +2,7 @@ import { BRACKET_LEFT, BRACKET_RIGHT } from "../../../custom/chars"; import { JSON } from "../../../"; export function deserializeArrayArray(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = changetype(dst); + const out = dst ? changetype(dst) : instantiate(); let lastIndex: usize = 0; let depth: u32 = 0; while (srcStart < srcEnd) { diff --git a/assembly/deserialize/simple/array/bool.ts b/assembly/deserialize/simple/array/bool.ts index d1cf918..07b91df 100644 --- a/assembly/deserialize/simple/array/bool.ts +++ b/assembly/deserialize/simple/array/bool.ts @@ -1,7 +1,7 @@ import { CHAR_E, CHAR_F, CHAR_T } from "../../../custom/chars"; export function deserializeBooleanArray(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = changetype(dst); + const out = dst ? changetype(dst) : instantiate(); while (srcStart < srcEnd) { const code = load(srcStart); if (code == CHAR_T && load(srcStart, 8) == CHAR_E) { diff --git a/assembly/deserialize/simple/array/float.ts b/assembly/deserialize/simple/array/float.ts index 3166a2b..0ebf924 100644 --- a/assembly/deserialize/simple/array/float.ts +++ b/assembly/deserialize/simple/array/float.ts @@ -3,7 +3,7 @@ import { COMMA, BRACE_RIGHT, BRACKET_RIGHT } from "../../../custom/chars"; import { JSON } from "../../.."; export function deserializeFloatArray(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = changetype(dst || __new(offsetof(), idof())); + const out = dst ? changetype(dst) : instantiate(); let lastIndex: usize = 0; while (srcStart < srcEnd) { const code = load(srcStart); diff --git a/assembly/deserialize/simple/array/integer.ts b/assembly/deserialize/simple/array/integer.ts index 1321c02..2b4a4f9 100644 --- a/assembly/deserialize/simple/array/integer.ts +++ b/assembly/deserialize/simple/array/integer.ts @@ -1,10 +1,10 @@ -import { isSpace } from "../../../util"; +import { atoi, isSpace } from "../../../util"; import { COMMA, BRACE_RIGHT, BRACKET_RIGHT } from "../../../custom/chars"; import { JSON } from "../../.."; import { ptrToStr } from "../../../util/ptrToStr"; export function deserializeIntegerArray(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = changetype(dst || __new(offsetof(), idof())); + const out = dst ? changetype(dst) : instantiate(); let lastIndex: usize = 0; while (srcStart < srcEnd) { const code = load(srcStart); @@ -15,7 +15,7 @@ export function deserializeIntegerArray(srcStart: usize, src 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(JSON.__deserialize>(lastIndex, srcStart)); // while (isSpace(load((srcStart += 2)))) { // /* empty */ // } diff --git a/assembly/deserialize/simple/array/map.ts b/assembly/deserialize/simple/array/map.ts index cac93a9..85144ae 100644 --- a/assembly/deserialize/simple/array/map.ts +++ b/assembly/deserialize/simple/array/map.ts @@ -2,7 +2,7 @@ import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars"; import { JSON } from "../../.."; export function deserializeMapArray[]>(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = changetype(dst); + const out = dst ? changetype(dst) : instantiate(); let lastIndex: usize = 0; let depth: u32 = 0; while (srcStart < srcEnd) { diff --git a/assembly/deserialize/simple/array/object.ts b/assembly/deserialize/simple/array/object.ts index 28e293c..682b444 100644 --- a/assembly/deserialize/simple/array/object.ts +++ b/assembly/deserialize/simple/array/object.ts @@ -2,7 +2,7 @@ import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars"; import { JSON } from "../../.."; export function deserializeObjectArray(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = changetype(dst); + const out = dst ? changetype(dst) : instantiate(); let lastIndex: usize = 0; let depth: u32 = 0; while (srcStart < srcEnd) { diff --git a/assembly/deserialize/simple/array/string.ts b/assembly/deserialize/simple/array/string.ts index 299832a..d803f66 100644 --- a/assembly/deserialize/simple/array/string.ts +++ b/assembly/deserialize/simple/array/string.ts @@ -2,7 +2,7 @@ import { JSON } from "../../.."; import { BACK_SLASH, QUOTE } from "../../../custom/chars"; export function deserializeStringArray(srcStart: usize, srcEnd: usize, dst: usize): string[] { - const out = changetype(dst); + const out = dst ? changetype(dst) : new Array(); let lastPos = 2; let inString = false; while (srcStart < srcEnd) { diff --git a/assembly/deserialize/simple/map.ts b/assembly/deserialize/simple/map.ts index 8e361d8..587d128 100644 --- a/assembly/deserialize/simple/map.ts +++ b/assembly/deserialize/simple/map.ts @@ -3,7 +3,7 @@ import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRA import { isSpace } from "../../util"; export function deserializeMap>(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = changetype(dst); + const out = changetype(dst || __new(offsetof(), idof())); // @ts-ignore: type if (!isString>() && !isInteger>() && !isFloat>()) ERROR("Map key must also be a valid JSON key!"); diff --git a/assembly/deserialize/simple/object.ts b/assembly/deserialize/simple/object.ts index a18f76f..c7d33b8 100644 --- a/assembly/deserialize/simple/object.ts +++ b/assembly/deserialize/simple/object.ts @@ -3,7 +3,7 @@ import { isSpace } from "../../util"; import { ptrToStr } from "../../util/ptrToStr"; export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize): T { - const out = changetype(dst); + const out = changetype>(dst || __new(offsetof(), idof())); let keyStart: usize = 0; let keyEnd: usize = 0; @@ -22,6 +22,7 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) keyStart = lastIndex; keyEnd = srcStart; console.log("Key: " + ptrToStr(lastIndex, srcStart)); + console.log("Next: " + String.fromCharCode(load(srcStart + 2))); srcStart += 2; // while (isSpace((code = load((srcStart += 2))))) { // /* empty */ @@ -44,12 +45,12 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) const code = load(srcStart); if (code == QUOTE && load(srcStart - 2) !== BACK_SLASH) { console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2)); - console.log("Next: " + String.fromCharCode(load(srcStart + 4))); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart + 2, dst); // while (isSpace(load(srcStart))) srcStart += 2; - keyStart = 0; srcStart += 4; + console.log("Next: " + String.fromCharCode(load(srcStart))); + keyStart = 0; break; } srcStart += 2; @@ -63,9 +64,11 @@ export function deserializeObject(srcStart: usize, srcEnd: usize, dst: usize) // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst); console.log("Value (number): " + ptrToStr(lastIndex, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } + // while (isSpace(load((srcStart += 2)))) { + // /* empty */ + // } + srcStart += 2; + console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; break; } @@ -79,9 +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)); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart += 2, dst); - console.log("Value (object): " + ptrToStr(lastIndex, srcStart)); + console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; // while (isSpace(load(srcStart))) { // /* empty */ @@ -99,13 +103,14 @@ 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)); // @ts-ignore: exists - out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst); - console.log("Value (array): " + ptrToStr(lastIndex, srcStart)); + out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart += 2, dst); + console.log("Next: " + String.fromCharCode(load(srcStart))); keyStart = 0; - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } + // while (isSpace(load((srcStart += 2)))) { + // /* empty */ + // } break; } } else if (code == BRACKET_LEFT) depth++; @@ -113,32 +118,39 @@ 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)); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst); - console.log("Value (bool): " + ptrToStr(srcStart - 8, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } + // while (isSpace(load((srcStart += 2)))) { + // /* empty */ + // } + srcStart += 2; + 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)); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 10), dst); - console.log("Value (bool): " + ptrToStr(srcStart - 10, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } + // while (isSpace(load((srcStart += 2)))) { + // /* empty */ + // } + srcStart += 2; + 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)); // @ts-ignore: exists out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst); - console.log("Value (null): " + ptrToStr(srcStart - 8, srcStart)); - while (isSpace(load((srcStart += 2)))) { - /* empty */ - } + // while (isSpace(load((srcStart += 2)))) { + /* empty */ + // } + srcStart += 2; + console.log("Next: " + String.fromCharCode(load(srcStart))); + keyStart = 0; } } } diff --git a/assembly/deserialize/simple/string.ts b/assembly/deserialize/simple/string.ts index 9f31b16..e83e2a1 100644 --- a/assembly/deserialize/simple/string.ts +++ b/assembly/deserialize/simple/string.ts @@ -2,6 +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; + if (dst == 0) dst = __new(srcEnd - srcStart, idof()); let dstPtr = dst; let lastPtr = srcStart; while (srcStart < srcEnd) { diff --git a/assembly/index.ts b/assembly/index.ts index 901f304..eeb4af4 100644 --- a/assembly/index.ts +++ b/assembly/index.ts @@ -175,8 +175,11 @@ export namespace JSON { let type: nonnull = changetype>(0); // @ts-ignore: Defined by transform if (isDefined(type.__DESERIALIZE)) { + const out = __new(offsetof>(), idof>()); // @ts-ignore - return deserializeObject>(dataPtr, dataPtr + dataSize, __new(offsetof>(), idof>())); + changetype>(out).__INITIALIZE(); + // @ts-ignore + return deserializeObject>(dataPtr, dataPtr + dataSize, out); } else if (type instanceof Map) { // @ts-ignore return deserializeMap>(dataPtr, dataPtr + dataSize); @@ -414,6 +417,9 @@ export namespace JSON { } else if (isString()) { // @ts-ignore: type return deserializeString(srcStart, srcEnd, dst); + } else if (isArray()) { + // @ts-ignore + return deserializeArray(srcStart, srcEnd, dst); } else { let type: nonnull = changetype>(0); // @ts-ignore: declared by transform diff --git a/assembly/test.ts b/assembly/test.ts index 717fe09..4d70767 100644 --- a/assembly/test.ts +++ b/assembly/test.ts @@ -1,11 +1,17 @@ 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: f32 = 0.0; - y: f32 = 0.0; - z: f32 = 0.0; + x: f64 = 0.0; + y: f64 = 0.0; + z: f64 = 0.0; + __INITIALIZE(): Vec3 { + return this; + } } @json @@ -20,6 +26,55 @@ class Player { @omitnull() pos!: Vec3 | null; isVerified!: boolean; + __INITIALIZE(): Player { + this.firstName = ""; + this.lastName = ""; + this.lastActive = []; + this.age = null; + 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 = { @@ -37,5 +92,5 @@ const player: Player = { 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 +const parsed = JSON.parse(stringified); +console.log("Deserialized: " + JSON.stringify(parsed)); \ No newline at end of file