Skip to content

Commit c97f121

Browse files
committed
__DESERIALIZE should take in pointer
1 parent dd144e3 commit c97f121

File tree

17 files changed

+262
-332
lines changed

17 files changed

+262
-332
lines changed

assembly/deserialize/simple/array.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { BRACKET_LEFT } from "../../custom/chars";
2-
import { isMap } from "../../custom/util";
31
import { deserializeArrayArray } from "./array/array";
42
import { deserializeBooleanArray } from "./array/bool";
53
import { deserializeFloatArray } from "./array/float";
@@ -37,3 +35,8 @@ export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: u
3735
throw new Error("Could not parse array of type " + nameof<T>() + "!");
3836
}
3937
}
38+
39+
function isMap<T>(): boolean {
40+
let type: T = changetype<T>(0);
41+
return type instanceof Map;
42+
}
+12-24
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,18 @@
11
import { BRACKET_LEFT, BRACKET_RIGHT } from "../../../custom/chars";
22
import { JSON } from "../../../";
3-
import { unsafeCharCodeAt } from "../../../custom/util";
43

5-
export function deserializeArrayArray<T extends unknown[][]>(data: string): T {
6-
const result = instantiate<T>();
7-
let lastPos = 0;
8-
let depth = 0;
9-
let i = 1;
10-
// Find start of bracket
11-
//for (; unsafeCharCodeAt(data, i) !== leftBracketCode; i++) {}
12-
//i++;
13-
for (; i < data.length - 1; i++) {
14-
const char = unsafeCharCodeAt(data, i);
15-
if (char == BRACKET_LEFT) {
16-
if (depth == 0) {
17-
lastPos = i;
18-
}
19-
// Shifting is 6% faster than incrementing
20-
depth++;
21-
} else if (char == BRACKET_RIGHT) {
22-
depth--;
23-
if (depth == 0) {
24-
i++;
25-
result.push(JSON.parse<valueof<T>>(data.slice(lastPos, i)));
26-
}
4+
export function deserializeArrayArray<T extends unknown[][]>(srcStart: usize, srcEnd: usize, dst: usize): T {
5+
const out = changetype<T>(dst);
6+
let lastIndex: usize = 0;
7+
let depth: u32 = 0;
8+
while (srcStart < srcEnd) {
9+
const code = load<u16>(srcStart);
10+
if (code == BRACKET_LEFT && depth++ == 0) {
11+
lastIndex = srcStart;
12+
} else if (code == BRACKET_RIGHT && --depth == 0) {
13+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
2714
}
15+
srcStart += 2;
2816
}
29-
return result;
17+
return out;
3018
}

assembly/deserialize/simple/array/float.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { isSpace } from "../../../util";
2-
import { unsafeCharCodeAt } from "../../../custom/util";
3-
import { COMMA, BRACKET_RIGHT, BRACE_RIGHT } from "../../../custom/chars";
4-
import { deserializeFloat } from "../float";
2+
import { COMMA, BRACE_RIGHT } from "../../../custom/chars";
53
import { JSON } from "../../..";
64

75
// @ts-ignore: Decorator valid here
+9-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars";
22
import { JSON } from "../../..";
3-
import { unsafeCharCodeAt } from "../../../custom/util";
43

54
export function deserializeMapArray<T extends Map<any, any>[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
6-
const out = instantiate<T>();
7-
let lastPos: usize = 2;
5+
const out = changetype<T>(dst);
6+
let lastIndex: usize = 0;
87
let depth: u32 = 0;
98
while (srcStart < srcEnd) {
10-
9+
const code = load<u16>(srcStart);
10+
if (code == BRACE_LEFT && depth++ == 0) {
11+
lastIndex = srcStart;
12+
} else if (code == BRACE_RIGHT && --depth == 0) {
13+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
14+
}
15+
srcStart += 2;
1116
}
1217
return out;
1318
}
+11-19
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,18 @@
11
import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars";
22
import { JSON } from "../../..";
3-
import { unsafeCharCodeAt } from "../../../custom/util";
43

5-
export function deserializeObjectArray<T extends unknown[]>(data: string): T {
6-
const result = instantiate<T>();
7-
let lastPos: u32 = 1;
4+
export function deserializeObjectArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
5+
const out = changetype<T>(dst);
6+
let lastIndex: usize = 0;
87
let depth: u32 = 0;
9-
for (let pos: u32 = 0; pos < <u32>data.length; pos++) {
10-
const char = unsafeCharCodeAt(data, pos);
11-
if (char == BRACE_LEFT) {
12-
if (depth == 0) {
13-
lastPos = pos;
14-
}
15-
depth++;
16-
} else if (char == BRACE_RIGHT) {
17-
depth--;
18-
if (depth == 0) {
19-
pos++;
20-
result.push(JSON.parse<valueof<T>>(data.slice(lastPos, pos)));
21-
//lastPos = pos + 2;
22-
}
8+
while (srcStart < srcEnd) {
9+
const code = load<u16>(srcStart);
10+
if (code == BRACE_LEFT && depth++ == 0) {
11+
lastIndex = srcStart;
12+
} else if (code == BRACE_RIGHT && --depth == 0) {
13+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
2314
}
15+
srcStart += 2;
2416
}
25-
return result;
17+
return out;
2618
}

assembly/deserialize/simple/bool.ts

+1-18
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,7 @@
11
import { CHAR_F, CHAR_T } from "../../custom/chars";
2-
import { unsafeCharCodeAt } from "../../custom/util";
32

4-
/**
5-
* Deserialize a string to type boolean
6-
* @param data data to parse
7-
* @returns boolean
8-
*/
93
// @ts-ignore: Decorator valid here
10-
@inline export function deserializeBoolean(data: string, start: i32 = 0, end: i32 = 0): boolean {
11-
if (!end) end = data.length;
12-
const len = end - start;
13-
const ptr = changetype<usize>(data) + <usize>(start << 1);
14-
const firstChar = unsafeCharCodeAt(data, start);
15-
if (len == 4 && firstChar == CHAR_T && load<u64>(ptr) == 28429475166421108) return true;
16-
else if (len == 5 && firstChar == CHAR_F && load<u64>(ptr, 2) == 28429466576093281) return false;
17-
return false; //ERROR(`Expected to find boolean, but found "${data.slice(0, 100)}" instead!`);
18-
}
19-
20-
// @ts-ignore: Decorator valid here
21-
@inline export function deserializeBoolean_NEW(srcStart: usize, srcEnd: usize): boolean {
4+
@inline export function deserializeBoolean(srcStart: usize, srcEnd: usize): boolean {
225
const srcSize = srcEnd - srcStart;
236
const firstChar = load<u16>(srcStart);
247
if (srcSize == 4 && firstChar == CHAR_T && load<u64>(srcStart) == 28429475166421108) return true;

assembly/deserialize/simple/float.ts

+3-18
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,11 @@
1-
// @ts-ignore: Decorator valid here
2-
@inline export function deserializeFloat<T>(data: string): T {
3-
// @ts-ignore
4-
const type: T = 0;
5-
// @ts-ignore
6-
if (type instanceof f64) return f64.parse(data);
7-
// @ts-ignore
8-
return f32.parse(data);
9-
}
1+
import { ptrToStr } from "../../util/ptrToStr";
102

113
// @ts-ignore: Decorator valid here
12-
@inline export function deserializeFloat_NEW<T>(srcStart: usize, srcEnd: usize): T {
4+
@inline export function deserializeFloat<T>(srcStart: usize, srcEnd: usize): T {
135
// @ts-ignore
146
const type: T = 0;
157
// @ts-ignore
16-
if (type instanceof f64) return f64.parse(str(srcStart, srcEnd));
8+
if (type instanceof f64) return f64.parse(ptrToStr(srcStart, srcEnd));
179
// @ts-ignore
1810
return f32.parse(str(srcStart, srcEnd));
19-
}
20-
21-
function str(start: usize, end: usize): string {
22-
const size = end - start;
23-
const out = __new(size, idof<string>());
24-
memory.copy(out, start, size);
25-
return changetype<string>(out);
2611
}

assembly/deserialize/simple/object.ts

+16-21
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRACE_RIGHT, BRACKET_RIGHT, CHAR_T, COLON } from "../../custom/chars";
22
import { isSpace } from "../../util";
3+
import { ptrToStr } from "../../util/ptrToStr";
34

45
export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize): T {
6+
const out = changetype<T>(dst);
57
const srcPtr = srcStart;
68

79
let keyStart: usize = 0;
@@ -20,7 +22,7 @@ export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize)
2022
if (isKey) {
2123
keyStart = lastIndex;
2224
keyEnd = srcStart;
23-
console.log("Key: " + str(lastIndex, srcStart));
25+
console.log("Key: " + ptrToStr(lastIndex, srcStart));
2426
while (isSpace((code = load<u16>((srcStart += 2))))) {
2527
/* empty */
2628
}
@@ -43,9 +45,9 @@ export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize)
4345
while (isSpace(load<u16>((srcStart += 2)))) {
4446
/* empty */
4547
}
46-
console.log("Value (string): " + str(lastIndex, srcStart));
48+
console.log("Value (string): " + ptrToStr(lastIndex, srcStart));
4749
// @ts-ignore: exists
48-
dst.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart);
50+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst);
4951
keyStart = 0;
5052
break;
5153
}
@@ -58,8 +60,8 @@ export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize)
5860
const code = load<u16>(srcStart);
5961
if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
6062
// @ts-ignore: exists
61-
dst.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart);
62-
console.log("Value (number): " + str(lastIndex, srcStart));
63+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst);
64+
console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
6365
while (isSpace(load<u16>((srcStart += 2)))) {
6466
/* empty */
6567
}
@@ -77,8 +79,8 @@ export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize)
7779
if (((code ^ BRACE_RIGHT) | (code ^ BRACKET_RIGHT)) == 32) {
7880
if (--depth == 0) {
7981
// @ts-ignore: exists
80-
dst.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart);
81-
console.log("Value (object): " + str(lastIndex, srcStart));
82+
out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst);
83+
console.log("Value (object): " + ptrToStr(lastIndex, srcStart));
8284
keyStart = 0;
8385
while (isSpace(load<u16>((srcStart += 2)))) {
8486
/* empty */
@@ -91,8 +93,8 @@ export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize)
9193
} else if (code == CHAR_T) {
9294
if (load<u64>(srcStart) == 28429475166421108) {
9395
// @ts-ignore: exists
94-
dst.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8));
95-
console.log("Value (bool): " + str(srcStart - 8, srcStart));
96+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst);
97+
console.log("Value (bool): " + ptrToStr(srcStart - 8, srcStart));
9698
while (isSpace(load<u16>((srcStart += 2)))) {
9799
/* empty */
98100
}
@@ -101,8 +103,8 @@ export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize)
101103
} else if (code == CHAR_F) {
102104
if (load<u64>(srcStart, 2) == 28429466576093281) {
103105
// @ts-ignore: exists
104-
dst.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 10));
105-
console.log("Value (bool): " + str(srcStart - 10, srcStart));
106+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 10), dst);
107+
console.log("Value (bool): " + ptrToStr(srcStart - 10, srcStart));
106108
while (isSpace(load<u16>((srcStart += 2)))) {
107109
/* empty */
108110
}
@@ -111,21 +113,14 @@ export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize)
111113
} else if (code == CHAR_N) {
112114
if (load<u64>(srcStart) == 30399761348886638) {
113115
// @ts-ignore: exists
114-
dst.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8));
115-
console.log("Value (null): " + str(srcStart - 8, srcStart));
116+
out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst);
117+
console.log("Value (null): " + ptrToStr(srcStart - 8, srcStart));
116118
while (isSpace(load<u16>((srcStart += 2)))) {
117119
/* empty */
118120
}
119121
}
120122
}
121123
}
122124
}
123-
return dst;
124-
}
125-
126-
function str(start: usize, end: usize): string {
127-
const size = end - start;
128-
const out = __new(size, idof<string>());
129-
memory.copy(out, start, size);
130-
return changetype<string>(out);
125+
return out;
131126
}

0 commit comments

Comments
 (0)