Comparing version
import { JSON } from ".."; | ||
import { describe, expect } from "./lib"; | ||
describe("Should serialize integer arrays", () => { | ||
expect(JSON.stringify<u32[]>([0, 100, 101])).toBe("[0,100,101]"); | ||
// describe("Should serialize integer arrays", () => { | ||
// expect(JSON.stringify<u32[]>([0, 100, 101])).toBe("[0,100,101]"); | ||
expect(JSON.stringify<u64[]>([0, 100, 101])).toBe("[0,100,101]"); | ||
// expect(JSON.stringify<u64[]>([0, 100, 101])).toBe("[0,100,101]"); | ||
expect(JSON.stringify<i32[]>([0, 100, 101, -100, -101])).toBe("[0,100,101,-100,-101]"); | ||
// expect(JSON.stringify<i32[]>([0, 100, 101, -100, -101])).toBe("[0,100,101,-100,-101]"); | ||
expect(JSON.stringify<i64[]>([0, 100, 101, -100, -101])).toBe("[0,100,101,-100,-101]"); | ||
}); | ||
// expect(JSON.stringify<i64[]>([0, 100, 101, -100, -101])).toBe("[0,100,101,-100,-101]"); | ||
// }); | ||
describe("Should serialize float arrays", () => { | ||
expect(JSON.stringify<f64[]>([7.23, 10e2, 10e2, 123456e-5, 123456e-5, 0.0, 7.23])).toBe("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]"); | ||
// describe("Should serialize float arrays", () => { | ||
// expect(JSON.stringify<f64[]>([7.23, 10e2, 10e2, 123456e-5, 123456e-5, 0.0, 7.23])).toBe("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]"); | ||
expect(JSON.stringify<f64[]>([1e21, 1e22, 1e-7, 1e-8, 1e-9])).toBe("[1e+21,1e+22,1e-7,1e-8,1e-9]"); | ||
}); | ||
// expect(JSON.stringify<f64[]>([1e21, 1e22, 1e-7, 1e-8, 1e-9])).toBe("[1e+21,1e+22,1e-7,1e-8,1e-9]"); | ||
// }); | ||
describe("Should serialize boolean arrays", () => { | ||
expect(JSON.stringify<bool[]>([true, false])).toBe("[true,false]"); | ||
// describe("Should serialize boolean arrays", () => { | ||
// expect(JSON.stringify<bool[]>([true, false])).toBe("[true,false]"); | ||
expect(JSON.stringify<boolean[]>([true, false])).toBe("[true,false]"); | ||
}); | ||
// expect(JSON.stringify<boolean[]>([true, false])).toBe("[true,false]"); | ||
// }); | ||
describe("Should serialize string arrays", () => { | ||
expect(JSON.stringify<string[]>(['string "with random spa\nces and \nnewlines\n\n\n'])).toBe('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]'); | ||
}); | ||
// describe("Should serialize string arrays", () => { | ||
// expect(JSON.stringify<string[]>(['string "with random spa\nces and \nnewlines\n\n\n'])).toBe('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]'); | ||
// }); | ||
describe("Should serialize nested integer arrays", () => { | ||
expect(JSON.stringify<i64[][]>([[100, 101], [-100, -101], [0]])).toBe("[[100,101],[-100,-101],[0]]"); | ||
}); | ||
// describe("Should serialize nested integer arrays", () => { | ||
// expect(JSON.stringify<i64[][]>([[100, 101], [-100, -101], [0]])).toBe("[[100,101],[-100,-101],[0]]"); | ||
// }); | ||
describe("Should serialize nested float arrays", () => { | ||
expect(JSON.stringify<f64[][]>([[7.23], [10e2], [10e2], [123456e-5], [123456e-5], [0.0], [7.23]])).toBe("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]"); | ||
}); | ||
// describe("Should serialize nested float arrays", () => { | ||
// expect(JSON.stringify<f64[][]>([[7.23], [10e2], [10e2], [123456e-5], [123456e-5], [0.0], [7.23]])).toBe("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]"); | ||
// }); | ||
describe("Should serialize nested boolean arrays", () => { | ||
expect(JSON.stringify<bool[][]>([[true], [false]])).toBe("[[true],[false]]"); | ||
// describe("Should serialize nested boolean arrays", () => { | ||
// expect(JSON.stringify<bool[][]>([[true], [false]])).toBe("[[true],[false]]"); | ||
expect(JSON.stringify<boolean[][]>([[true], [false]])).toBe("[[true],[false]]"); | ||
}); | ||
// expect(JSON.stringify<boolean[][]>([[true], [false]])).toBe("[[true],[false]]"); | ||
// }); | ||
describe("Should serialize object arrays", () => { | ||
expect( | ||
JSON.stringify<Vec3[]>([ | ||
{ | ||
x: 3.4, | ||
y: 1.2, | ||
z: 8.3, | ||
}, | ||
{ | ||
x: 3.4, | ||
y: -2.1, | ||
z: 9.3, | ||
}, | ||
]), | ||
).toBe('[{"x":3.4,"y":1.2,"z":8.3},{"x":3.4,"y":-2.1,"z":9.3}]'); | ||
}); | ||
// describe("Should serialize object arrays", () => { | ||
// expect( | ||
// JSON.stringify<Vec3[]>([ | ||
// { | ||
// x: 3.4, | ||
// y: 1.2, | ||
// z: 8.3, | ||
// }, | ||
// { | ||
// x: 3.4, | ||
// y: -2.1, | ||
// z: 9.3, | ||
// }, | ||
// ]), | ||
// ).toBe('[{"x":3.4,"y":1.2,"z":8.3},{"x":3.4,"y":-2.1,"z":9.3}]'); | ||
// }); | ||
describe("Should deserialize integer arrays", () => { | ||
expect(JSON.stringify(JSON.parse<u32[]>("[0,100,101]"))).toBe("[0,100,101]"); | ||
expect(JSON.stringify(JSON.parse<u64[]>("[0,100,101]"))).toBe("[0,100,101]"); | ||
expect(JSON.stringify(JSON.parse<i32[]>("[0,100,101,-100,-101]"))).toBe("[0,100,101,-100,-101]"); | ||
expect(JSON.stringify(JSON.parse<i64[]>("[0,100,101,-100,-101]"))).toBe("[0,100,101,-100,-101]"); | ||
}); | ||
// describe("Should deserialize integer arrays", () => { | ||
// expect(JSON.stringify(JSON.parse<u32[]>("[0,100,101]"))).toBe("[0,100,101]"); | ||
// expect(JSON.stringify(JSON.parse<u64[]>("[0,100,101]"))).toBe("[0,100,101]"); | ||
// expect(JSON.stringify(JSON.parse<i32[]>("[0,100,101,-100,-101]"))).toBe("[0,100,101,-100,-101]"); | ||
// expect(JSON.stringify(JSON.parse<i64[]>("[0,100,101,-100,-101]"))).toBe("[0,100,101,-100,-101]"); | ||
// }); | ||
describe("Should deserialize float arrays", () => { | ||
expect(JSON.stringify(JSON.parse<f64[]>("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]"))).toBe("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]"); | ||
expect(JSON.stringify(JSON.parse<f64[]>("[1e+21,1e+22,1e-7,1e-8,1e-9]"))).toBe("[1e+21,1e+22,1e-7,1e-8,1e-9]"); | ||
}); | ||
// describe("Should deserialize float arrays", () => { | ||
// expect(JSON.stringify(JSON.parse<f64[]>("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]"))).toBe("[7.23,1000.0,1000.0,1.23456,1.23456,0.0,7.23]"); | ||
// expect(JSON.stringify(JSON.parse<f64[]>("[1e+21,1e+22,1e-7,1e-8,1e-9]"))).toBe("[1e+21,1e+22,1e-7,1e-8,1e-9]"); | ||
// }); | ||
describe("Should deserialize boolean arrays", () => { | ||
expect(JSON.stringify(JSON.parse<bool[]>("[true,false]"))).toBe("[true,false]"); | ||
expect(JSON.stringify(JSON.parse<boolean[]>("[true,false]"))).toBe("[true,false]"); | ||
}); | ||
// describe("Should deserialize boolean arrays", () => { | ||
// expect(JSON.stringify(JSON.parse<bool[]>("[true,false]"))).toBe("[true,false]"); | ||
// expect(JSON.stringify(JSON.parse<boolean[]>("[true,false]"))).toBe("[true,false]"); | ||
// }); | ||
describe("Should deserialize string arrays", () => { | ||
expect(JSON.stringify(JSON.parse<string[]>('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]'))).toBe('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]'); | ||
}); | ||
// describe("Should deserialize string arrays", () => { | ||
// expect(JSON.stringify(JSON.parse<string[]>('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]'))).toBe('["string \\"with random spa\\nces and \\nnewlines\\n\\n\\n"]'); | ||
// }); | ||
describe("Should deserialize nested integer arrays", () => { | ||
expect(JSON.stringify(JSON.parse<i64[][]>("[[100,101],[-100,-101],[0]]"))).toBe("[[100,101],[-100,-101],[0]]"); | ||
}); | ||
// describe("Should deserialize nested integer arrays", () => { | ||
// expect(JSON.stringify(JSON.parse<i64[][]>("[[100,101],[-100,-101],[0]]"))).toBe("[[100,101],[-100,-101],[0]]"); | ||
// }); | ||
describe("Should deserialize nested float arrays", () => { | ||
expect(JSON.stringify(JSON.parse<f64[][]>("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]"))).toBe("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]"); | ||
}); | ||
// describe("Should deserialize nested float arrays", () => { | ||
// expect(JSON.stringify(JSON.parse<f64[][]>("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]"))).toBe("[[7.23],[1000.0],[1000.0],[1.23456],[1.23456],[0.0],[7.23]]"); | ||
// }); | ||
describe("Should deserialize nested boolean arrays", () => { | ||
expect(JSON.stringify(JSON.parse<bool[][]>("[[true],[false]]"))).toBe("[[true],[false]]"); | ||
expect(JSON.stringify(JSON.parse<boolean[][]>("[[true],[false]]"))).toBe("[[true],[false]]"); | ||
}); | ||
// describe("Should deserialize nested boolean arrays", () => { | ||
// expect(JSON.stringify(JSON.parse<bool[][]>("[[true],[false]]"))).toBe("[[true],[false]]"); | ||
// expect(JSON.stringify(JSON.parse<boolean[][]>("[[true],[false]]"))).toBe("[[true],[false]]"); | ||
// }); | ||
@@ -105,2 +105,68 @@ describe("Should deserialize object arrays", () => { | ||
z: f64 = 0.0; | ||
__DESERIALIZE<__JSON_T>(srcStart: usize, srcEnd: usize, out: __JSON_T): __JSON_T { | ||
let keyStart: usize = 0; | ||
let keyEnd: usize = 0; | ||
let isKey = false; | ||
let lastIndex: usize = 0; | ||
while (srcStart < srcEnd && JSON.Util.isSpace(load<u16>(srcStart))) srcStart += 2; | ||
while (srcEnd > srcStart && JSON.Util.isSpace(load<u16>(srcEnd - 2))) srcEnd -= 2; | ||
if (srcStart - srcEnd == 0) throw new Error("Input string had zero length or was all whitespace"); | ||
if (load<u16>(srcStart) != 123) throw new Error("Expected '{' at start of object at position " + (srcEnd - srcStart).toString()); | ||
if (load<u16>(srcEnd - 2) != 125) throw new Error("Expected '}' at end of object at position " + (srcEnd - srcStart).toString()); | ||
srcStart += 2; | ||
while (srcStart < srcEnd) { | ||
let code = load<u16>(srcStart); | ||
while (JSON.Util.isSpace(code)) code = load<u16>(srcStart += 2); | ||
if (keyStart == 0) { | ||
if (code == 34 && load<u16>(srcStart - 2) !== 92) { | ||
if (isKey) { | ||
keyStart = lastIndex; | ||
keyEnd = srcStart; | ||
while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) { } | ||
if (code !== 58) throw new Error("Expected ':' after key at position " + (srcEnd - srcStart).toString()); | ||
isKey = false; | ||
} else { | ||
isKey = true; | ||
lastIndex = srcStart + 2; | ||
} | ||
} | ||
srcStart += 2; | ||
} else { | ||
if (code - 48 <= 9 || code == 45) { | ||
lastIndex = srcStart; | ||
srcStart += 2; | ||
while (srcStart < srcEnd) { | ||
const code = load<u16>(srcStart); | ||
if (code == 44 || code == 125 || JSON.Util.isSpace(code)) { | ||
switch (<u32>keyEnd - <u32>keyStart) { | ||
case 2: { | ||
const code16 = load<u16>(keyStart); | ||
if (code16 == 120) { // x | ||
store<f64>(changetype<usize>(out), JSON.__deserialize<f64>(lastIndex, srcStart), offsetof<this>("x")); | ||
keyStart = 0; | ||
break; | ||
} else if (code16 == 121) { // y | ||
store<f64>(changetype<usize>(out), JSON.__deserialize<f64>(lastIndex, srcStart), offsetof<this>("y")); | ||
keyStart = 0; | ||
break; | ||
} else if (code16 == 122) { // z | ||
store<f64>(changetype<usize>(out), JSON.__deserialize<f64>(lastIndex, srcStart), offsetof<this>("z")); | ||
keyStart = 0; | ||
break; | ||
} | ||
} | ||
} | ||
break; | ||
} | ||
srcStart += 2; | ||
} | ||
} else { | ||
srcStart += 2; | ||
} | ||
} | ||
} | ||
return out; | ||
} | ||
} |
@@ -18,5 +18,5 @@ import { JSON } from "../.."; | ||
else if (firstChar == CHAR_N) { | ||
return JSON.Value.from(null); | ||
return JSON.Value.from<usize>(0); | ||
} | ||
return unreachable(); | ||
} |
@@ -11,3 +11,2 @@ /// <reference path="./index.d.ts" /> | ||
import { deserializeFloat } from "./deserialize/simple/float"; | ||
import { deserializeStruct } from "./deserialize/simple/struct"; | ||
import { deserializeMap } from "./deserialize/simple/map"; | ||
@@ -617,3 +616,3 @@ import { deserializeDate } from "./deserialize/simple/date"; | ||
} | ||
namespace Util { | ||
export namespace Util { | ||
// @ts-ignore: decorator | ||
@@ -620,0 +619,0 @@ @inline export function isSpace(code: u16): boolean { |
import { JSON } from "."; | ||
import { bytes } from "./util"; | ||
// @json | ||
// class Obj { | ||
// public a: string = "hello"; | ||
// public b: string = "world"; | ||
// public c: string = '"\t\f\u0000\u0001'; | ||
// } | ||
@json | ||
class Obj { | ||
public a: string = "hello"; | ||
public b: string = "world"; | ||
public c: string = '"\t\f\u0000\u0001'; | ||
} | ||
// @json | ||
// class Vec3 { | ||
// x: f32 = 0.0; | ||
// y: f32 = 0.0; | ||
// z: f32 = 0.0; | ||
// } | ||
@json | ||
class Vec3 { | ||
x: f32 = 0.0; | ||
y: f32 = 0.0; | ||
z: f32 = 0.0; | ||
} | ||
// @json | ||
// class Player { | ||
// @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) => self.age < 18) | ||
// age!: i32; | ||
@json | ||
class Player { | ||
@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) => self.age < 18) | ||
age!: i32; | ||
// @omitnull() | ||
// pos!: Vec3 | null; | ||
// isVerified!: boolean; | ||
// } | ||
@omitnull() | ||
pos!: Vec3 | null; | ||
isVerified!: boolean; | ||
} | ||
// @json | ||
// class Point {} | ||
@json | ||
class Point {} | ||
// @json | ||
// class NewPoint { | ||
// x: f64 = 0.0; | ||
// y: f64 = 0.0; | ||
// constructor(x: f64, y: f64) { | ||
// this.x = x; | ||
// this.y = y; | ||
// } | ||
@json | ||
class NewPoint { | ||
x: f64 = 0.0; | ||
y: f64 = 0.0; | ||
constructor(x: f64, y: f64) { | ||
this.x = x; | ||
this.y = y; | ||
} | ||
// @serializer | ||
// serializer(self: NewPoint): string { | ||
// return `x=${self.x},y=${self.y}`; | ||
// } | ||
@serializer | ||
serializer(self: NewPoint): string { | ||
return `x=${self.x},y=${self.y}`; | ||
} | ||
// @deserializer | ||
// deserializer(data: string): NewPoint { | ||
// const dataSize = bytes(data); | ||
@deserializer | ||
deserializer(data: string): NewPoint { | ||
const dataSize = bytes(data); | ||
// const c = data.indexOf(","); | ||
// const x = data.slice(2, c); | ||
// const y = data.slice(c + 3); | ||
const c = data.indexOf(","); | ||
const x = data.slice(2, c); | ||
const y = data.slice(c + 3); | ||
// return new NewPoint(f64.parse(x), f64.parse(y)); | ||
// } | ||
// } | ||
return new NewPoint(f64.parse(x), f64.parse(y)); | ||
} | ||
} | ||
// @json | ||
// class InnerObj<T> { | ||
// obj: T = instantiate<T>(); | ||
// } | ||
@json | ||
class InnerObj<T> { | ||
obj: T = instantiate<T>(); | ||
} | ||
// @json | ||
// class ObjWithBracketString { | ||
// data: string = ""; | ||
// } | ||
@json | ||
class ObjWithBracketString { | ||
data: string = ""; | ||
} | ||
// const player: Player = { | ||
// firstName: "Jairus", | ||
// lastName: "Tanaka", | ||
// lastActive: [2, 7, 2025], | ||
// age: 18, | ||
// pos: { | ||
// x: 3.4, | ||
// y: 1.2, | ||
// z: 8.3, | ||
// }, | ||
// isVerified: true, | ||
// }; | ||
const player: Player = { | ||
firstName: "Jairus", | ||
lastName: "Tanaka", | ||
lastActive: [2, 7, 2025], | ||
age: 18, | ||
pos: { | ||
x: 3.4, | ||
y: 1.2, | ||
z: 8.3, | ||
}, | ||
isVerified: true, | ||
}; | ||
// const a1 = JSON.stringify("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000a\u000b\u000c\u000d\u000e\u000f\u000f\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f"); | ||
// // console.log("Bytes " + bytes(a1).toString()); | ||
// console.log("a1: " + a1); | ||
const a1 = JSON.stringify("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000a\u000b\u000c\u000d\u000e\u000f\u000f\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f"); | ||
// console.log("Bytes " + bytes(a1).toString()); | ||
console.log("a1: " + a1); | ||
// const obj = new Obj(); | ||
// const a2 = JSON.stringify(obj); | ||
// // console.log("Bytes " + bytes(a2).toString()); | ||
// console.log("a2: " + a2); | ||
const obj = new Obj(); | ||
const a2 = JSON.stringify(obj); | ||
// console.log("Bytes " + bytes(a2).toString()); | ||
console.log("a2: " + a2); | ||
// const a3 = JSON.stringify(player); | ||
// // console.log("Bytes " + bytes(a3).toString()); | ||
// console.log("a3: " + a3); | ||
const a3 = JSON.stringify(player); | ||
// console.log("Bytes " + bytes(a3).toString()); | ||
console.log("a3: " + a3); | ||
// const a4 = new JSON.Obj(); | ||
const a4 = new JSON.Obj(); | ||
// a4.set("x", 1.5); | ||
// a4.set("y", 5.4); | ||
// a4.set("z", 9.8); | ||
// a4.set("obj", obj); | ||
// a4.set<boolean>("bool", false); | ||
a4.set("x", 1.5); | ||
a4.set("y", 5.4); | ||
a4.set("z", 9.8); | ||
a4.set("obj", obj); | ||
a4.set<boolean>("bool", false); | ||
// console.log("a4: " + JSON.stringify(a4)); | ||
console.log("a4: " + JSON.stringify(a4)); | ||
// const a5 = JSON.parse<JSON.Obj>('{"foo":"bar"}'); | ||
const a5 = JSON.parse<JSON.Obj>('{"foo":"bar"}'); | ||
// console.log("a5: " + JSON.stringify(a5)); | ||
console.log("a5: " + JSON.stringify(a5)); | ||
// const a6 = JSON.parse<JSON.Obj>('{"x":1.5,"y":5.4,"z":9.8,"obj":{"foo":"bar"}}'); | ||
const a6 = JSON.parse<JSON.Obj>('{"x":1.5,"y":5.4,"z":9.8,"obj":{"foo":"bar"}}'); | ||
// console.log("a6: " + JSON.stringify(a6)); | ||
console.log("a6: " + JSON.stringify(a6)); | ||
// const a7 = JSON.parse<JSON.Value[]>('["string",true,3.14,{"x":1.0,"y":2.0,"z":3.0},[1,2,3,true]]'); | ||
const a7 = JSON.parse<JSON.Value[]>('["string",true,3.14,{"x":1.0,"y":2.0,"z":3.0},[1,2,3,true]]'); | ||
// console.log("a7: " + JSON.stringify(a7)); | ||
console.log("a7: " + JSON.stringify(a7)); | ||
// const a8 = JSON.stringify(["hello", JSON.stringify("world"), "working?"]); | ||
const a8 = JSON.stringify(["hello", JSON.stringify("world"), "working?"]); | ||
// console.log("a8: " + a8); | ||
console.log("a8: " + a8); | ||
// const a9 = JSON.stringify<JSON.Raw>(JSON.Raw.from('"hello world"')); | ||
const a9 = JSON.stringify<JSON.Raw>(JSON.Raw.from('"hello world"')); | ||
// console.log("a9: " + a9); | ||
console.log("a9: " + a9); | ||
// const m10 = new Map<string, JSON.Raw>(); | ||
// m10.set("hello", new JSON.Raw('"world"')); | ||
// m10.set("pos", new JSON.Raw('{"x":1.0,"y":2.0,"z":3.0}')); | ||
const m10 = new Map<string, JSON.Raw>(); | ||
m10.set("hello", new JSON.Raw('"world"')); | ||
m10.set("pos", new JSON.Raw('{"x":1.0,"y":2.0,"z":3.0}')); | ||
// const a10 = JSON.stringify(m10); | ||
const a10 = JSON.stringify(m10); | ||
// console.log("a10: " + a10); | ||
console.log("a10: " + a10); | ||
// const a11 = JSON.parse<JSON.Obj>(' { "x" : 3.4 , "y" : 1.2 , "z" : 8.3 } '); | ||
const a11 = JSON.parse<JSON.Obj>(' { "x" : 3.4 , "y" : 1.2 , "z" : 8.3 } '); | ||
// console.log("a11: " + JSON.stringify(a11)); | ||
console.log("a11: " + JSON.stringify(a11)); | ||
// const a12 = JSON.parse<InnerObj<ObjWithBracketString>>('{"obj":{"data":"hello} world"}}'); | ||
const a12 = JSON.parse<InnerObj<ObjWithBracketString>>('{"obj":{"data":"hello} world"}}'); | ||
// console.log("a12: " + JSON.stringify(a12)); | ||
console.log("a12: " + JSON.stringify(a12)); | ||
// const a13 = JSON.stringify<JSON.Obj>(new JSON.Obj()); | ||
const a13 = JSON.stringify<JSON.Obj>(new JSON.Obj()); | ||
// console.log("a13: " + a13); | ||
console.log("a13: " + a13); | ||
// const a14 = JSON.stringify(new Point()); | ||
// console.log("a14: " + a14); | ||
const a14 = JSON.stringify(new Point()); | ||
console.log("a14: " + a14); | ||
// const a15 = JSON.parse<Point>(a14); | ||
// console.log("a15: " + JSON.stringify(a15)); | ||
const a15 = JSON.parse<Point>(a14); | ||
console.log("a15: " + JSON.stringify(a15)); | ||
// const a16 = JSON.stringify(new NewPoint(1.0, 2.0)); | ||
// console.log("a16: " + a16); | ||
const a16 = JSON.stringify(new NewPoint(1.0, 2.0)); | ||
console.log("a16: " + a16); | ||
// const a17 = JSON.parse<NewPoint>(a16); | ||
// console.log("a17: " + JSON.stringify(a17)); | ||
const a17 = JSON.parse<NewPoint>(a16); | ||
console.log("a17: " + JSON.stringify(a17)); | ||
// const a18 = JSON.parse<JSON.Obj[]>('[{"x":1.0,"y":2.0,"z":3.0},{"x":4.0,"y":5.0,"z":6.0},{"x":7.0,"y":8.0,"z":9.0}]'); | ||
// console.log("a18: " + JSON.stringify(a18)); | ||
const a18 = JSON.parse<JSON.Obj[]>('[{"x":1.0,"y":2.0,"z":3.0},{"x":4.0,"y":5.0,"z":6.0},{"x":7.0,"y":8.0,"z":9.0}]'); | ||
console.log("a18: " + JSON.stringify(a18)); | ||
// const a19 = JSON.stringify<JSON.Obj[]>(a18); | ||
// console.log("a19: " + a19); | ||
const a19 = JSON.stringify<JSON.Obj[]>(a18); | ||
console.log("a19: " + a19); | ||
// const a20 = JSON.parse<JSON.Box<f64>[]>("[1.3,4.7,9.5]"); | ||
// console.log("a20: " + JSON.stringify(a20)); | ||
const a20 = JSON.parse<JSON.Box<f64>[]>("[1.3,4.7,9.5]"); | ||
console.log("a20: " + JSON.stringify(a20)); | ||
// const a21 = JSON.stringify<JSON.Box<f64>[]>(a20); | ||
// console.log("a21: " + a21); | ||
const a21 = JSON.stringify<JSON.Box<f64>[]>(a20); | ||
console.log("a21: " + a21); | ||
@@ -182,1 +182,38 @@ const a22 = JSON.parse<Foo>('{"id":"0xb8","firstName":"Jairus","lastName":"Tanaka"}'); | ||
} | ||
@json | ||
class SrvInfo { | ||
accessUrl: string = "https://example.com"; | ||
cardTypes: i32[] = [1, 2, 3]; | ||
customService: string = "Contact us at support@example.com"; | ||
invoiceApplicationStatus: i32 = 1; | ||
isCertification: bool = true; | ||
isOnlineRecharge: bool = false; | ||
loginTypes: i32[] = [0, 1]; // e.g. 0 = password, 1 = OTP | ||
record: string = "ICP 12345678"; | ||
regCompanyAudit: i32 = 2; | ||
regCompanyPipeline: i32[] = [101, 102, 103]; | ||
regPwdLimit: i32 = 8; // min password length | ||
serverTime: i64 = 1650000000000; // dummy timestamp | ||
srvDescription: string = "A demo service for handling customer operations."; | ||
srvHiddenMenu: string[] = ["admin", "beta"]; | ||
srvHost: string = "srv.example.com"; | ||
srvId: i32 = 999; | ||
srvKeywords: string[] = ["finance", "payments", "online"]; | ||
srvLogoImgUrl: string = "https://example.com/logo.png"; | ||
srvName: string = "ExampleService"; | ||
srvPageId: i32 = 5; | ||
thirdAuthUrl: string = "https://auth.example.com"; | ||
userCenterStyle: i32 = 1; // e.g. 1 = modern, 0 = legacy | ||
} | ||
const a23 = JSON.stringify(new SrvInfo()); | ||
console.log("a23: " + a23); | ||
const a24 = '{"accessUrl":"https://example.com","cardTypes":[1,2,3],"customService":"Contact us at support@example.com","invoiceApplicationStatus":1,"isCertification":true,"isOnlineRecharge":false,"loginTypes":[0,1],"record":"ICP 12345678","regCompanyAudit":2,"regCompanyPipeline":[101,102,103],"regPwdLimit":8,"serverTime":1650000000000,"srvDescription":"A demo service for handling customer operations.","srvHiddenMenu":["admin","beta"],"srvHost":"srv.example.com","srvId":999,"srvKeywords":["finance","payments","online"],"srvLogoImgUrl":"https://example.com/logo.png","srvName":"ExampleService","srvPageId":5,"thirdAuthUrl":"https://auth.example.com","userCenterStyle":1}'; | ||
console.log("a25: " + (a24 == a23).toString()); | ||
const a26 = JSON.parse<SrvInfo>(a23); | ||
console.log("a26: " + JSON.stringify(a26)); | ||
console.log("a27: " + (JSON.stringify(a26) == a23).toString()) |
# Change Log | ||
## 2025-05-23 - 1.1.3 | ||
- feat: group properties of structs before code generation | ||
- fix: break out of switch case after completion | ||
- ci: make compatible with act for local testing | ||
## 2025-05-22 - 1.1.2 | ||
@@ -4,0 +10,0 @@ |
27
index.ts
@@ -1,1 +0,26 @@ | ||
export { JSON } from "./assembly/index"; | ||
class SrvInfo { | ||
accessUrl: string = "https://example.com"; | ||
cardTypes: number[] = [1, 2, 3]; | ||
customService: string = "Contact us at support@example.com"; | ||
invoiceApplicationStatus: number = 1; | ||
isCertification: bool = true; | ||
isOnlineRecharge: bool = false; | ||
loginTypes: number[] = [0, 1]; // e.g. 0 = password, 1 = OTP | ||
record: string = "ICP 12345678"; | ||
regCompanyAudit: number = 2; | ||
regCompanyPipeline: number[] = [101, 102, 103]; | ||
regPwdLimit: number = 8; // min password length | ||
serverTime: i64 = 1650000000000; // dummy timestamp | ||
srvDescription: string = "A demo service for handling customer operations."; | ||
srvHiddenMenu: string[] = ["admin", "beta"]; | ||
srvHost: string = "srv.example.com"; | ||
srvId: number = 999; | ||
srvKeywords: string[] = ["finance", "payments", "online"]; | ||
srvLogoImgUrl: string = "https://example.com/logo.png"; | ||
srvName: string = "ExampleService"; | ||
srvPageId: number = 5; | ||
thirdAuthUrl: string = "https://auth.example.com"; | ||
userCenterStyle: number = 1; // e.g. 1 = modern, 0 = legacy | ||
} | ||
console.log(JSON.stringify(new SrvInfo())) |
{ | ||
"name": "json-as", | ||
"version": "1.1.2", | ||
"version": "1.1.3", | ||
"author": "Jairus Tanaka", | ||
@@ -18,2 +18,3 @@ "description": "The only JSON library you'll need for AssemblyScript. SIMD enabled", | ||
"scripts": { | ||
"ci": "act", | ||
"test": "bash ./run-tests.sh", | ||
@@ -20,0 +21,0 @@ "bench:as": "bash ./run-bench.as.sh", |
@@ -9,3 +9,3 @@ <h6 align="center"> | ||
</span> | ||
AssemblyScript - v1.1.2 | ||
AssemblyScript - v1.1.3 | ||
</pre> | ||
@@ -12,0 +12,0 @@ </h6> |
@@ -11,3 +11,3 @@ import { Node } from "assemblyscript/dist/assemblyscript.js"; | ||
const DEBUG = process.env["JSON_DEBUG"]; | ||
const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false"; | ||
const STRICT = !(process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false"); | ||
class JSONTransform extends Visitor { | ||
@@ -306,4 +306,3 @@ static SN = new JSONTransform(); | ||
DESERIALIZE += indent + " let keyStart: usize = 0;\n"; | ||
if (shouldGroup || DEBUG) | ||
DESERIALIZE += indent + " let keyEnd: usize = 0;\n"; | ||
DESERIALIZE += indent + " let keyEnd: usize = 0;\n"; | ||
DESERIALIZE += indent + " let isKey = false;\n"; | ||
@@ -326,4 +325,3 @@ if (sortedMembers.object.length || sortedMembers.array.length) | ||
DESERIALIZE += indent + " keyStart = lastIndex;\n"; | ||
if (shouldGroup || DEBUG) | ||
DESERIALIZE += indent + " keyEnd = srcStart;\n"; | ||
DESERIALIZE += indent + " keyEnd = srcStart;\n"; | ||
DESERIALIZE += indent + " while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) {}\n"; | ||
@@ -340,20 +338,31 @@ DESERIALIZE += indent + " if (code !== 58) throw new Error(\"Expected ':' after key at position \" + (srcEnd - srcStart).toString());\n"; | ||
const groupMembers = (members) => { | ||
let sorted = []; | ||
let len = -1; | ||
members | ||
.slice() | ||
.sort((a, b) => (a.alias?.length || a.name.length) - (b.alias?.length || b.name.length)) | ||
.forEach((member) => { | ||
const _nameLength = member.alias?.length || member.name.length; | ||
if (_nameLength === len) { | ||
sorted[sorted.length - 1].push(member); | ||
const groups = new Map(); | ||
for (const member of members) { | ||
const name = member.alias || member.name; | ||
const length = name.length; | ||
if (!groups.has(length)) { | ||
groups.set(length, []); | ||
} | ||
else { | ||
sorted.push([member]); | ||
len = _nameLength; | ||
} | ||
}); | ||
sorted = sorted.sort((a, b) => b.length - a.length); | ||
return sorted; | ||
groups.get(length).push(member); | ||
} | ||
return [...groups.values()] | ||
.map(group => group.sort((a, b) => { | ||
const aLen = (a.alias || a.name).length; | ||
const bLen = (b.alias || b.name).length; | ||
return aLen - bLen; | ||
})) | ||
.sort((a, b) => b.length - a.length); | ||
}; | ||
const generateGroups = (members, cb) => { | ||
const groups = groupMembers(members); | ||
DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n"; | ||
for (const group of groups) { | ||
const groupLen = (group[0].alias || group[0].name).length << 1; | ||
DESERIALIZE += " case " + groupLen + ": {\n"; | ||
cb(group); | ||
DESERIALIZE += "\n }\n"; | ||
} | ||
DESERIALIZE += " }\n"; | ||
DESERIALIZE += " break;\n"; | ||
}; | ||
const generateComparisions = (members) => { | ||
@@ -378,3 +387,3 @@ if (members.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(firstMemberName) + "));\n"; | ||
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(members[0].name) + "));\n"; | ||
if (isString(members[0].type)) | ||
@@ -391,4 +400,4 @@ DESERIALIZE += indent + " srcStart += 4;\n"; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(memberName) + "));\n"; | ||
if (isString(members[0].type)) | ||
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), JSON.__deserialize<" + member.type + ">(lastIndex, srcStart" + (isString(member.type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(member.name) + "));\n"; | ||
if (isString(member.type)) | ||
DESERIALIZE += indent + " srcStart += 4;\n"; | ||
@@ -415,3 +424,3 @@ else if (!complex) | ||
DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n"; | ||
generateComparisions(sortedMembers.string); | ||
generateGroups(sortedMembers.string, generateComparisions); | ||
DESERIALIZE += " }\n"; | ||
@@ -430,3 +439,3 @@ DESERIALIZE += " srcStart += 2;\n"; | ||
DESERIALIZE += " if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {\n"; | ||
generateComparisions(sortedMembers.number); | ||
generateGroups(sortedMembers.number, generateComparisions); | ||
DESERIALIZE += " }\n"; | ||
@@ -452,3 +461,3 @@ DESERIALIZE += " srcStart += 2;\n"; | ||
indent = " "; | ||
generateComparisions(sortedMembers.object); | ||
generateGroups(sortedMembers.object, generateComparisions); | ||
indent = ""; | ||
@@ -476,3 +485,3 @@ DESERIALIZE += " }\n"; | ||
indent = " "; | ||
generateComparisions(sortedMembers.array); | ||
generateGroups(sortedMembers.array, generateComparisions); | ||
indent = ""; | ||
@@ -490,39 +499,41 @@ DESERIALIZE += " }\n"; | ||
DESERIALIZE += " srcStart += 8;\n"; | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.boolean.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = sortedMembers.boolean[0].alias || sortedMembers.boolean[0].name; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
for (let i = 1; i < sortedMembers.boolean.length; i++) { | ||
const member = sortedMembers.boolean[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
generateGroups(sortedMembers.boolean, (group) => { | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = group[0].alias || group[0].name; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
for (let i = 1; i < group.length; i++) { | ||
const member = group[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(member.name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
}); | ||
DESERIALIZE += " }"; | ||
@@ -532,13 +543,21 @@ mbElse = " else "; | ||
DESERIALIZE += " srcStart += 10;\n"; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
for (let i = 1; i < sortedMembers.boolean.length; i++) { | ||
const member = sortedMembers.boolean[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n"; | ||
generateGroups(sortedMembers.boolean, (group) => { | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = group[0].alias || group[0].name; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
@@ -548,8 +567,18 @@ DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
for (let i = 1; i < group.length; i++) { | ||
const member = group[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(member.name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
}); | ||
DESERIALIZE += " }\n"; | ||
@@ -562,29 +591,21 @@ DESERIALIZE += " }"; | ||
DESERIALIZE += " srcStart += 8;\n"; | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.null.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = sortedMembers.null[0].alias || sortedMembers.null[0].name; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
for (let i = 1; i < sortedMembers.null.length; i++) { | ||
const member = sortedMembers.null[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n"; | ||
generateGroups(sortedMembers.null, (group) => { | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = group[0].alias || group[0].name; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
@@ -594,8 +615,18 @@ DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
for (let i = 1; i < group.length; i++) { | ||
const member = group[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
}); | ||
DESERIALIZE += " }"; | ||
@@ -602,0 +633,0 @@ DESERIALIZE += "\n }"; |
@@ -13,3 +13,3 @@ import { ClassDeclaration, FieldDeclaration, IdentifierExpression, Parser, Source, NodeKind, CommonFlags, ImportStatement, Node, Tokenizer, SourceKind, NamedTypeNode, Range, FEATURE_SIMD, FunctionExpression, MethodDeclaration, Statement, Program, Feature } from "assemblyscript/dist/assemblyscript.js"; | ||
const DEBUG = process.env["JSON_DEBUG"]; | ||
const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false"; | ||
const STRICT = !(process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false"); | ||
@@ -331,3 +331,3 @@ class JSONTransform extends Visitor { | ||
DESERIALIZE += indent + " let keyStart: usize = 0;\n"; | ||
if (shouldGroup || DEBUG) DESERIALIZE += indent + " let keyEnd: usize = 0;\n"; | ||
DESERIALIZE += indent + " let keyEnd: usize = 0;\n"; | ||
DESERIALIZE += indent + " let isKey = false;\n"; | ||
@@ -351,3 +351,3 @@ if (sortedMembers.object.length || sortedMembers.array.length) DESERIALIZE += indent + " let depth: i32 = 0;\n"; | ||
DESERIALIZE += indent + " keyStart = lastIndex;\n"; | ||
if (shouldGroup || DEBUG) DESERIALIZE += indent + " keyEnd = srcStart;\n"; | ||
DESERIALIZE += indent + " keyEnd = srcStart;\n"; | ||
DESERIALIZE += indent + " while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) {}\n"; | ||
@@ -365,23 +365,42 @@ DESERIALIZE += indent + " if (code !== 58) throw new Error(\"Expected ':' after key at position \" + (srcEnd - srcStart).toString());\n"; | ||
const groupMembers = (members: Property[]) => { | ||
let sorted: Property[][] = []; | ||
const groupMembers = (members: Property[]): Property[][] => { | ||
const groups = new Map<number, Property[]>(); | ||
let len = -1; | ||
members | ||
.slice() | ||
.sort((a, b) => (a.alias?.length || a.name.length) - (b.alias?.length || b.name.length)) | ||
.forEach((member) => { | ||
const _nameLength = member.alias?.length || member.name.length; | ||
if (_nameLength === len) { | ||
sorted[sorted.length - 1].push(member); | ||
} else { | ||
sorted.push([member]); | ||
len = _nameLength; | ||
} | ||
}); | ||
for (const member of members) { | ||
const name = member.alias || member.name; | ||
const length = name.length; | ||
sorted = sorted.sort((a, b) => b.length - a.length); | ||
return sorted; | ||
if (!groups.has(length)) { | ||
groups.set(length, []); | ||
} | ||
groups.get(length)!.push(member); | ||
} | ||
return [...groups.values()] | ||
.map(group => | ||
group.sort((a, b) => { | ||
const aLen = (a.alias || a.name).length; | ||
const bLen = (b.alias || b.name).length; | ||
return aLen - bLen; | ||
}) | ||
) | ||
.sort((a, b) => b.length - a.length); | ||
}; | ||
const generateGroups = (members: Property[], cb: (group: Property[]) => void) => { | ||
const groups = groupMembers(members); | ||
DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n"; | ||
for (const group of groups) { | ||
const groupLen = (group[0].alias || group[0].name).length << 1 | ||
DESERIALIZE += " case " + groupLen + ": {\n"; | ||
cb(group); | ||
DESERIALIZE += "\n }\n"; | ||
} | ||
DESERIALIZE += " }\n"; | ||
DESERIALIZE += " break;\n"; | ||
} | ||
const generateComparisions = (members: Property[]) => { | ||
@@ -407,3 +426,3 @@ if (members.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(firstMemberName) + "));\n"; | ||
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(members[0].name) + "));\n"; | ||
if (isString(members[0].type)) DESERIALIZE += indent + " srcStart += 4;\n"; | ||
@@ -419,4 +438,4 @@ else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(memberName) + "));\n"; | ||
if (isString(members[0].type)) DESERIALIZE += indent + " srcStart += 4;\n"; | ||
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), JSON.__deserialize<" + member.type + ">(lastIndex, srcStart" + (isString(member.type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(member.name) + "));\n"; | ||
if (isString(member.type)) DESERIALIZE += indent + " srcStart += 4;\n"; | ||
else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n"; | ||
@@ -437,2 +456,3 @@ DESERIALIZE += indent + " keyStart = 0;\n"; | ||
if (sortedMembers.string.length) { | ||
// generateGroups(sortedMembers.string, generateComparisions) | ||
DESERIALIZE += mbElse + "if (code == 34) {\n"; | ||
@@ -445,3 +465,3 @@ DESERIALIZE += " lastIndex = srcStart;\n"; | ||
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n"; | ||
generateComparisions(sortedMembers.string); | ||
generateGroups(sortedMembers.string, generateComparisions); | ||
DESERIALIZE += " }\n"; // Close break char check | ||
@@ -463,3 +483,3 @@ DESERIALIZE += " srcStart += 2;\n"; | ||
generateComparisions(sortedMembers.number); | ||
generateGroups(sortedMembers.number, generateComparisions); | ||
DESERIALIZE += " }\n"; // Close break char check | ||
@@ -487,3 +507,3 @@ DESERIALIZE += " srcStart += 2;\n"; | ||
indent = " "; | ||
generateComparisions(sortedMembers.object); | ||
generateGroups(sortedMembers.object, generateComparisions); | ||
indent = ""; | ||
@@ -514,3 +534,3 @@ | ||
indent = " "; | ||
generateComparisions(sortedMembers.array); | ||
generateGroups(sortedMembers.array, generateComparisions); | ||
indent = ""; | ||
@@ -530,42 +550,46 @@ | ||
DESERIALIZE += " srcStart += 8;\n"; | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.boolean.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = sortedMembers.boolean[0].alias || sortedMembers.boolean[0].name; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
for (let i = 1; i < sortedMembers.boolean.length; i++) { | ||
const member = sortedMembers.boolean[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
generateGroups(sortedMembers.boolean, (group) => { | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = group[0].alias || group[0].name; | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
for (let i = 1; i < group.length; i++) { | ||
const member = group[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(member.name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
}); | ||
DESERIALIZE += " }"; // Close first char check | ||
@@ -576,14 +600,22 @@ mbElse = " else "; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
generateGroups(sortedMembers.boolean, (group) => { | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = group[0].alias || group[0].name; | ||
for (let i = 1; i < sortedMembers.boolean.length; i++) { | ||
const member = sortedMembers.boolean[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n"; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
@@ -593,10 +625,20 @@ DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
for (let i = 1; i < group.length; i++) { | ||
const member = group[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(member.name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
}); | ||
DESERIALIZE += " }\n"; // Close first char check | ||
@@ -611,32 +653,22 @@ DESERIALIZE += " }"; // Close first char check | ||
DESERIALIZE += " srcStart += 8;\n"; | ||
generateGroups(sortedMembers.null, (group) => { | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 2)) { | ||
DESERIALIZE += " const code16 = load<u16>(keyStart);\n"; | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 4)) { | ||
DESERIALIZE += " const code32 = load<u32>(keyStart);\n"; | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 6)) { | ||
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n"; | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 8)) { | ||
DESERIALIZE += " const code64 = load<u64>(keyStart);\n"; | ||
} | ||
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 > 8)) { | ||
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.null.map((m) => (m.alias || m.name).length << 1)), " "); | ||
} | ||
const firstMemberName = sortedMembers.null[0].alias || sortedMembers.null[0].name; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
for (let i = 1; i < sortedMembers.null.length; i++) { | ||
const member = sortedMembers.null[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n"; | ||
const firstMemberName = group[0].alias || group[0].name; | ||
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n"; | ||
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
@@ -646,10 +678,21 @@ DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
for (let i = 1; i < group.length; i++) { | ||
const member = group[i]; | ||
const memberName = member.alias || member.name; | ||
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n"; | ||
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n"; | ||
DESERIALIZE += indent + " srcStart += 2;\n"; | ||
DESERIALIZE += indent + " keyStart = 0;\n"; | ||
DESERIALIZE += indent + " break;\n"; | ||
DESERIALIZE += indent + " }"; | ||
} | ||
if (STRICT) { | ||
DESERIALIZE += " else {\n"; | ||
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n'; | ||
DESERIALIZE += indent + " }\n"; | ||
} | ||
}); | ||
DESERIALIZE += " }"; // Close first char check | ||
@@ -656,0 +699,0 @@ DESERIALIZE += "\n }"; // Close first char check |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
563103
1.9%10307
1.85%4
33.33%