Skip to content

Commit 32fcf18

Browse files
committed
sync
1 parent b819f75 commit 32fcf18

25 files changed

+3074
-2995
lines changed

assembly/deserialize/simple/array.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,28 @@ import { deserializeObjectArray } from "./array/object";
99
import { deserializeStringArray } from "./array/string";
1010

1111
// @ts-ignore: Decorator valid here
12-
export function deserializeArray<T extends unknown[]>(data: string): T {
12+
export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize = 0): T {
1313
if (isString<valueof<T>>()) {
14-
return <T>deserializeStringArray(data);
14+
return <T>deserializeStringArray(srcStart, srcEnd, dst);
1515
} else if (isBoolean<valueof<T>>()) {
1616
// @ts-ignore
17-
return deserializeBooleanArray<T>(data);
17+
return deserializeBooleanArray<T>(srcStart, srcEnd, dst);
1818
} else if (isInteger<valueof<T>>()) {
1919
// @ts-ignore
20-
return deserializeIntegerArray<T>(data);
20+
return deserializeIntegerArray<T>(srcStart, srcEnd, dst);
2121
} else if (isFloat<valueof<T>>()) {
2222
// @ts-ignore
23-
return deserializeFloatArray<T>(data);
23+
return deserializeFloatArray<T>(srcStart, srcEnd, dst);
2424
} else if (isArrayLike<valueof<T>>()) {
2525
// @ts-ignore
26-
return deserializeArrayArray<T>(data);
26+
return deserializeArrayArray<T>(srcStart, srcEnd, dst);
2727
} else if (isMap<valueof<T>>()) {
28-
return deserializeMapArray<T>(data);
28+
return deserializeMapArray<T>(srcStart, srcEnd, dst);
2929
} else if (isManaged<valueof<T>>() || isReference<valueof<T>>()) {
3030
const type = changetype<nonnull<valueof<T>>>(0);
3131
// @ts-ignore
3232
if (isDefined(type.__DESERIALIZE)) {
33-
return deserializeObjectArray<T>(data);
33+
return deserializeObjectArray<T>(srcStart, srcEnd, dst);
3434
}
3535
throw new Error("Could not parse array of type " + nameof<T>() + "! Make sure to add the @json decorator over classes!");
3636
} else {
+12-13
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
import { CHAR_E, CHAR_F, CHAR_T } from "../../../custom/chars";
2-
import { unsafeCharCodeAt } from "../../../custom/util";
3-
import { deserializeBoolean } from "../bool";
42

53
// @ts-ignore: Decorator valid here
6-
@inline export function deserializeBooleanArray<T extends boolean[]>(data: string): T {
7-
const result = instantiate<T>();
8-
let lastPos = 1;
9-
for (let i = 1; i < data.length - 1; i++) {
10-
const char = unsafeCharCodeAt(data, i);
11-
if (char == CHAR_T || char == CHAR_F) {
12-
lastPos = i;
13-
} else if (char == CHAR_E) {
14-
i++;
15-
result.push(deserializeBoolean(data.slice(lastPos, i)));
4+
@inline export function deserializeBooleanArray<T extends boolean[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
5+
const out = changetype<T>(dst);
6+
while (srcStart < srcEnd) {
7+
const code = load<u16>(srcStart);
8+
if (code == CHAR_T && load<u16>(srcStart, 8) == CHAR_E) {
9+
out.push(true);
10+
srcStart += 10;
11+
} else if (code == CHAR_F && load<u16>(srcStart, 10) == CHAR_E) {
12+
out.push(false);
13+
srcStart += 12;
1614
}
15+
srcStart += 2;
1716
}
18-
return result;
17+
return out;
1918
}
+23-16
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,31 @@
11
import { isSpace } from "../../../util";
22
import { unsafeCharCodeAt } from "../../../custom/util";
3-
import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
3+
import { COMMA, BRACKET_RIGHT, BRACE_RIGHT } from "../../../custom/chars";
44
import { deserializeFloat } from "../float";
5+
import { JSON } from "../../..";
56

67
// @ts-ignore: Decorator valid here
7-
@inline export function deserializeFloatArray<T extends number[]>(data: string): T {
8-
const result = instantiate<T>();
9-
let lastPos = 0;
10-
let i = 1;
11-
let awaitingParse = false;
12-
for (; i < data.length; i++) {
13-
const char = unsafeCharCodeAt(data, i);
14-
if (lastPos == 0 && ((char >= 48 && char <= 57) || char == 45)) {
15-
awaitingParse = true;
16-
lastPos = i;
17-
} else if (awaitingParse && (isSpace(char) || char == COMMA || char == BRACKET_RIGHT) && lastPos > 0) {
18-
awaitingParse = false;
19-
result.push(deserializeFloat<valueof<T>>(data.slice(lastPos, i)));
20-
lastPos = 0;
8+
@inline export function deserializeFloatArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
9+
const out = changetype<T>(dst);
10+
let lastIndex: usize = 0;
11+
while (srcStart < srcEnd) {
12+
const code = load<u16>(srcStart);
13+
if (code - 48 <= 9 || code == 45) {
14+
lastIndex = srcStart;
15+
srcStart += 2;
16+
while (srcStart < srcEnd) {
17+
const code = load<u16>(srcStart);
18+
if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
19+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
20+
// while (isSpace(load<u16>((srcStart += 2)))) {
21+
// /* empty */
22+
// }
23+
break;
24+
}
25+
srcStart += 2;
26+
}
2127
}
28+
srcStart += 2;
2229
}
23-
return result;
30+
return out;
2431
}
+23-18
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
import { isSpace } from "../../../util";
2-
import { unsafeCharCodeAt } from "../../../custom/util";
3-
import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
4-
import { deserializeInteger } from "../integer";
2+
import { COMMA, BRACE_RIGHT } from "../../../custom/chars";
3+
import { JSON } from "../../..";
54

65
// @ts-ignore: Decorator valid here
7-
@inline export function deserializeIntegerArray<T extends number[]>(data: string): T {
8-
const result = instantiate<T>();
9-
let lastPos = 0;
10-
let i = 1;
11-
let awaitingParse = false;
12-
for (; i < data.length; i++) {
13-
const char = unsafeCharCodeAt(data, i);
14-
if (lastPos == 0 && ((char >= 48 && char <= 57) || char == 45)) {
15-
awaitingParse = true;
16-
lastPos = i;
17-
} else if (awaitingParse && (isSpace(char) || char == COMMA || char == BRACKET_RIGHT) && lastPos > 0) {
18-
awaitingParse = false;
19-
result.push(deserializeInteger<valueof<T>>(data.slice(lastPos, i)));
20-
lastPos = 0;
6+
@inline export function deserializeIntegerArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
7+
const out = changetype<T>(dst);
8+
let lastIndex: usize = 0;
9+
while (srcStart < srcEnd) {
10+
const code = load<u16>(srcStart);
11+
if (code - 48 <= 9 || code == 45) {
12+
lastIndex = srcStart;
13+
srcStart += 2;
14+
while (srcStart < srcEnd) {
15+
const code = load<u16>(srcStart);
16+
if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
17+
out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
18+
// while (isSpace(load<u16>((srcStart += 2)))) {
19+
// /* empty */
20+
// }
21+
break;
22+
}
23+
srcStart += 2;
24+
}
2125
}
26+
srcStart += 2;
2227
}
23-
return result;
28+
return out;
2429
}

assembly/deserialize/simple/array/map.ts

+6-19
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,12 @@ import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars";
22
import { JSON } from "../../..";
33
import { unsafeCharCodeAt } from "../../../custom/util";
44

5-
export function deserializeMapArray<T extends unknown[]>(data: string): T {
6-
const result = instantiate<T>();
7-
let lastPos: u32 = 1;
5+
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;
88
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-
}
23-
}
9+
while (srcStart < srcEnd) {
10+
2411
}
25-
return result;
12+
return out;
2613
}
+16-22
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,23 @@
1+
import { JSON } from "../../..";
12
import { BACK_SLASH, QUOTE } from "../../../custom/chars";
2-
import { unsafeCharCodeAt } from "../../../custom/util";
3-
import { deserializeString } from "../string";
43

54
// @ts-ignore: Decorator valid here
6-
@inline export function deserializeStringArray(data: string): string[] {
7-
const result: string[] = [];
8-
let lastPos = 0;
9-
let instr = false;
10-
let escaping = false;
11-
for (let i = 1; i < data.length - 1; i++) {
12-
const char = unsafeCharCodeAt(data, i);
13-
if (char == BACK_SLASH && !escaping) {
14-
escaping = true;
15-
} else {
16-
if (char == QUOTE && !escaping) {
17-
if (instr == false) {
18-
instr = true;
19-
lastPos = i;
20-
} else {
21-
instr = false;
22-
result.push(deserializeString(data, lastPos, i));
23-
}
5+
@inline export function deserializeStringArray(srcStart: usize, srcEnd: usize, dst: usize): string[] {
6+
const out = changetype<string[]>(dst);
7+
let lastPos = 2;
8+
let inString = false;
9+
while (srcStart < srcEnd) {
10+
const code = load<u16>(srcStart);
11+
if (code == QUOTE) {
12+
if (!inString) {
13+
inString = true;
14+
lastPos = srcStart;
15+
} else if (load<u16>(srcStart - 2) != BACK_SLASH) {
16+
out.push(JSON.__deserialize<string>(lastPos, srcStart));
17+
inString = false;
2418
}
25-
escaping = false;
2619
}
20+
srcStart += 2;
2721
}
28-
return result;
22+
return out;
2923
}

assembly/deserialize/simple/date.ts

+18
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,21 @@ import { QUOTE } from "../../custom/chars";
1010
// is globally aliased to wasi_Date (or some other superclass).
1111
return new Date(d.getTime());
1212
}
13+
14+
// @ts-ignore: Decorator valid here
15+
@inline export function deserializeDate_NEW(srcStart: usize, srcEnd: usize): Date {
16+
// Use AssemblyScript's date parser
17+
const d = Date.fromString(str(srcStart, srcEnd));
18+
19+
// Return a new object instead of the one that the parser returned.
20+
// This may seem redundant, but addreses the issue when Date
21+
// is globally aliased to wasi_Date (or some other superclass).
22+
return new Date(d.getTime());
23+
}
24+
25+
function str(start: usize, end: usize): string {
26+
const size = end - start;
27+
const out = __new(size, idof<string>());
28+
memory.copy(out, start, size);
29+
return changetype<string>(out);
30+
}

assembly/deserialize/simple/float.ts

+13-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@
1010

1111
// @ts-ignore: Decorator valid here
1212
@inline export function deserializeFloat_NEW<T>(srcStart: usize, srcEnd: usize): T {
13-
// todo: actually implement this
14-
return 3.14;
13+
// @ts-ignore
14+
const type: T = 0;
15+
// @ts-ignore
16+
if (type instanceof f64) return f64.parse(str(srcStart, srcEnd));
17+
// @ts-ignore
18+
return f32.parse(str(srcStart, srcEnd));
1519
}
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);
26+
}

assembly/deserialize/simple/integer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ import { strToInt } from "../../util/strToInt";
1010
// @ts-ignore: Decorator valid here
1111
@inline export function deserializeInteger_NEW<T>(srcStart: usize, srcEnd: usize): T {
1212
return strToInt<T>(srcStart, srcEnd);
13-
}
13+
}

assembly/deserialize/simple/map.ts

+2
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd:
131131
/* empty */
132132
}
133133
}
134+
} else {
135+
throw new Error("Unexpected character " + String.fromCharCode(code) +" or type " + nameof<valueof<T>>() + " does not match found type!")
134136
}
135137
}
136138
}

assembly/test.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
1+
import { JSON } from ".";
2+
import { deserializeMap } from "./deserialize/simple/map";
3+
import { deserializeObject } from "./deserialize/simple/object";
4+
import { bytes } from "./util";
5+
16
@json
27
class Vec3 {
38
a: i16 = 1
49
ab: i16 = 2;
510
abc: i16 = 3;
611
abcd: i16 = 4;
712
abcde: i16 = 5;
8-
}
13+
}
14+
15+
const serialized = JSON.stringify(new Vec3());
16+
console.log("Serialized: " + serialized);
17+
const deserialized = deserializeObject<Vec3>(changetype<usize>(serialized), changetype<usize>(serialized) + bytes(serialized));
18+
console.log("Deserialized: " + JSON.stringify(deserialized));

0 commit comments

Comments
 (0)