json-as 0.9.28 → 1.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/.github/workflows/nodejs.yml +0 -3
  2. package/.prettierrc.json +4 -1
  3. package/CHANGELOG +13 -0
  4. package/LICENSE +1 -1
  5. package/README.md +22 -7
  6. package/as-test.config.json +1 -1
  7. package/asconfig.json +2 -2
  8. package/assembly/__benches__/misc.bench.ts +17 -31
  9. package/assembly/__tests__/bool.spec.ts +1 -1
  10. package/assembly/__tests__/simd/string.spec.ts +32 -0
  11. package/assembly/__tests__/types.ts +17 -0
  12. package/assembly/custom/chars.ts +2 -2
  13. package/assembly/custom/memory.ts +25 -0
  14. package/assembly/custom/types.ts +1 -0
  15. package/assembly/custom/util.ts +59 -140
  16. package/assembly/deserialize/simd/string.ts +103 -0
  17. package/assembly/deserialize/simple/arbitrary.ts +17 -0
  18. package/assembly/deserialize/simple/array/arbitrary.ts +113 -0
  19. package/assembly/deserialize/simple/array/array.ts +18 -0
  20. package/assembly/deserialize/simple/array/bool.ts +17 -0
  21. package/assembly/deserialize/simple/array/float.ts +28 -0
  22. package/assembly/deserialize/simple/array/integer.ts +27 -0
  23. package/assembly/deserialize/simple/array/map.ts +18 -0
  24. package/assembly/deserialize/simple/array/object.ts +18 -0
  25. package/assembly/deserialize/simple/array/string.ts +22 -0
  26. package/assembly/deserialize/simple/array.ts +48 -0
  27. package/assembly/deserialize/simple/bool.ts +9 -0
  28. package/assembly/deserialize/simple/date.ts +11 -0
  29. package/assembly/deserialize/simple/float.ts +10 -0
  30. package/assembly/deserialize/simple/integer.ts +5 -0
  31. package/assembly/deserialize/simple/map.ts +154 -0
  32. package/assembly/deserialize/simple/object.ts +159 -0
  33. package/assembly/deserialize/simple/string.ts +48 -0
  34. package/assembly/globals/tables.ts +417 -0
  35. package/assembly/index.d.ts +9 -13
  36. package/assembly/index.ts +282 -158
  37. package/assembly/serialize/simd/string.ts +176 -0
  38. package/assembly/serialize/simple/arbitrary.ts +36 -0
  39. package/assembly/serialize/simple/array.ts +32 -0
  40. package/assembly/serialize/simple/bool.ts +19 -0
  41. package/assembly/serialize/simple/date.ts +13 -0
  42. package/assembly/serialize/simple/float.ts +7 -0
  43. package/assembly/serialize/simple/integer.ts +7 -0
  44. package/assembly/serialize/simple/map.ts +43 -0
  45. package/assembly/serialize/simple/object.ts +7 -0
  46. package/assembly/serialize/simple/string.ts +48 -0
  47. package/assembly/test.ts +43 -28
  48. package/assembly/tsconfig.json +2 -91
  49. package/assembly/types.ts +0 -0
  50. package/assembly/util/atoi.ts +35 -0
  51. package/assembly/util/bytes.ts +12 -0
  52. package/assembly/util/concat.ts +9 -0
  53. package/assembly/util/getArrayDepth.ts +17 -0
  54. package/assembly/util/index.ts +5 -0
  55. package/assembly/util/isSpace.ts +4 -0
  56. package/assembly/util/nextPowerOf2.ts +4 -0
  57. package/assembly/util/ptrToStr.ts +7 -0
  58. package/assembly/util/snp.ts +69 -0
  59. package/bench.js +5 -5
  60. package/modules/bs/index.ts +167 -0
  61. package/modules/tsconfig.json +8 -0
  62. package/package.json +42 -47
  63. package/transform/lib/builder.js +1353 -0
  64. package/transform/lib/builder.js.map +1 -0
  65. package/transform/lib/index.js +497 -395
  66. package/transform/lib/index.js.map +1 -1
  67. package/transform/lib/index.old.js +404 -0
  68. package/transform/lib/index.old.js.map +1 -0
  69. package/transform/lib/linker.js +18 -0
  70. package/transform/lib/linker.js.map +1 -0
  71. package/transform/lib/types.js +25 -0
  72. package/transform/lib/types.js.map +1 -0
  73. package/transform/lib/util.js +47 -0
  74. package/transform/lib/util.js.map +1 -0
  75. package/transform/lib/visitor.js +529 -446
  76. package/transform/lib/visitor.js.map +1 -0
  77. package/transform/package.json +1 -34
  78. package/transform/src/builder.ts +1371 -0
  79. package/transform/src/index.ts +571 -481
  80. package/transform/src/linker.ts +21 -0
  81. package/transform/src/types.ts +27 -0
  82. package/transform/src/util.ts +56 -0
  83. package/transform/src/visitor.ts +531 -0
  84. package/transform/tsconfig.json +3 -1
  85. package/assembly/__benches__/as-tral.d.ts +0 -1
  86. package/assembly/custom/bs.ts +0 -211
  87. package/assembly/deserialize/array/array.ts +0 -31
  88. package/assembly/deserialize/array/bool.ts +0 -19
  89. package/assembly/deserialize/array/float.ts +0 -24
  90. package/assembly/deserialize/array/integer.ts +0 -24
  91. package/assembly/deserialize/array/map.ts +0 -27
  92. package/assembly/deserialize/array/object.ts +0 -27
  93. package/assembly/deserialize/array/string.ts +0 -29
  94. package/assembly/deserialize/array.ts +0 -46
  95. package/assembly/deserialize/bool.ts +0 -34
  96. package/assembly/deserialize/date.ts +0 -19
  97. package/assembly/deserialize/float.ts +0 -21
  98. package/assembly/deserialize/integer.ts +0 -16
  99. package/assembly/deserialize/map.ts +0 -189
  100. package/assembly/deserialize/object.ts +0 -271
  101. package/assembly/deserialize/string.ts +0 -164
  102. package/assembly/serialize/array.ts +0 -51
  103. package/assembly/serialize/bool.ts +0 -10
  104. package/assembly/serialize/date.ts +0 -4
  105. package/assembly/serialize/float.ts +0 -4
  106. package/assembly/serialize/integer.ts +0 -5
  107. package/assembly/serialize/map.ts +0 -24
  108. package/assembly/serialize/object.ts +0 -13
  109. package/assembly/serialize/string.ts +0 -287
  110. package/logs/test.log.json +0 -1049
@@ -0,0 +1,28 @@
1
+ import { isSpace } from "../../../util";
2
+ import { COMMA, BRACE_RIGHT, BRACKET_RIGHT } from "../../../custom/chars";
3
+ import { JSON } from "../../..";
4
+
5
+ export function deserializeFloatArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = dst ? changetype<T>(dst) : instantiate<T>();
7
+ let lastIndex: usize = 0;
8
+ while (srcStart < srcEnd) {
9
+ const code = load<u16>(srcStart);
10
+ if (code - 48 <= 9 || code == 45) {
11
+ lastIndex = srcStart;
12
+ srcStart += 2;
13
+ while (srcStart < srcEnd) {
14
+ const code = load<u16>(srcStart);
15
+ if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) {
16
+ out.push(JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
17
+ // while (isSpace(load<u16>((srcStart += 2)))) {
18
+ // /* empty */
19
+ // }
20
+ break;
21
+ }
22
+ srcStart += 2;
23
+ }
24
+ }
25
+ srcStart += 2;
26
+ }
27
+ return out;
28
+ }
@@ -0,0 +1,27 @@
1
+ import { atoi, isSpace } from "../../../util";
2
+ import { COMMA, BRACKET_RIGHT } from "../../../custom/chars";
3
+
4
+ export function deserializeIntegerArray<T extends number[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
5
+ const out: T = dst ? changetype<T>(dst) : instantiate<T>();
6
+ let lastIndex: usize = 0;
7
+ while (srcStart < srcEnd) {
8
+ const code = load<u16>(srcStart);
9
+ if (code - 48 <= 9 || code == 45) {
10
+ lastIndex = srcStart;
11
+ srcStart += 2;
12
+ while (srcStart < srcEnd) {
13
+ const code = load<u16>(srcStart);
14
+ if (code == COMMA || code == BRACKET_RIGHT || isSpace(code)) {
15
+ out.push(atoi<valueof<T>>(lastIndex, srcStart));
16
+ // while (isSpace(load<u16>((srcStart += 2)))) {
17
+ // /* empty */
18
+ // }
19
+ break;
20
+ }
21
+ srcStart += 2;
22
+ }
23
+ }
24
+ srcStart += 2;
25
+ }
26
+ return out;
27
+ }
@@ -0,0 +1,18 @@
1
+ import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars";
2
+ import { JSON } from "../../..";
3
+
4
+ export function deserializeMapArray<T extends Map<any, any>[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
5
+ const out = dst ? changetype<T>(dst) : instantiate<T>();
6
+ let lastIndex: usize = 0;
7
+ let depth: u32 = 0;
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));
14
+ }
15
+ srcStart += 2;
16
+ }
17
+ return out;
18
+ }
@@ -0,0 +1,18 @@
1
+ import { BRACE_LEFT, BRACE_RIGHT } from "../../../custom/chars";
2
+ import { JSON } from "../../..";
3
+
4
+ export function deserializeObjectArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
5
+ const out = dst ? changetype<T>(dst) : instantiate<T>();
6
+ let lastIndex: usize = 0;
7
+ let depth: u32 = 0;
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));
14
+ }
15
+ srcStart += 2;
16
+ }
17
+ return out;
18
+ }
@@ -0,0 +1,22 @@
1
+ import { JSON } from "../../..";
2
+ import { BACK_SLASH, QUOTE } from "../../../custom/chars";
3
+
4
+ export function deserializeStringArray(srcStart: usize, srcEnd: usize, dst: usize): string[] {
5
+ const out = dst ? changetype<string[]>(dst) : new Array<string>();
6
+ let lastPos = 2;
7
+ let inString = false;
8
+ while (srcStart < srcEnd) {
9
+ const code = load<u16>(srcStart);
10
+ if (code == QUOTE) {
11
+ if (!inString) {
12
+ inString = true;
13
+ lastPos = srcStart;
14
+ } else if (load<u16>(srcStart - 2) != BACK_SLASH) {
15
+ out.push(JSON.__deserialize<string>(lastPos, srcStart));
16
+ inString = false;
17
+ }
18
+ }
19
+ srcStart += 2;
20
+ }
21
+ return out;
22
+ }
@@ -0,0 +1,48 @@
1
+ import { JSON } from "../..";
2
+ import { deserializeArbitraryArray } from "./array/arbitrary";
3
+ import { deserializeArrayArray } from "./array/array";
4
+ import { deserializeBooleanArray } from "./array/bool";
5
+ import { deserializeFloatArray } from "./array/float";
6
+ import { deserializeIntegerArray } from "./array/integer";
7
+ import { deserializeMapArray } from "./array/map";
8
+ import { deserializeObjectArray } from "./array/object";
9
+ import { deserializeStringArray } from "./array/string";
10
+
11
+ // @ts-ignore: Decorator valid here
12
+ export function deserializeArray<T extends unknown[]>(srcStart: usize, srcEnd: usize, dst: usize): T {
13
+ if (isString<valueof<T>>()) {
14
+ return <T>deserializeStringArray(srcStart, srcEnd, dst);
15
+ } else if (isBoolean<valueof<T>>()) {
16
+ // @ts-ignore
17
+ return deserializeBooleanArray<T>(srcStart, srcEnd, dst);
18
+ } else if (isInteger<valueof<T>>()) {
19
+ // @ts-ignore
20
+ return deserializeIntegerArray<T>(srcStart, srcEnd, dst);
21
+ } else if (isFloat<valueof<T>>()) {
22
+ // @ts-ignore
23
+ return deserializeFloatArray<T>(srcStart, srcEnd, dst);
24
+ } else if (isArrayLike<valueof<T>>()) {
25
+ // @ts-ignore: type
26
+ return deserializeArrayArray<T>(srcStart, srcEnd, dst);
27
+ } else if (isManaged<valueof<T>>() || isReference<valueof<T>>()) {
28
+ const type = changetype<nonnull<valueof<T>>>(0);
29
+ if (type instanceof JSON.Value) {
30
+ // @ts-ignore: type
31
+ return deserializeArbitraryArray<T>(srcStart, srcEnd, dst);
32
+ } else if (type instanceof Map) {
33
+ // @ts-ignore: type
34
+ return deserializeMapArray<T>(srcStart, srcEnd, dst);
35
+ // @ts-ignore: defined by transform
36
+ } else if (isDefined(type.__DESERIALIZE)) {
37
+ return deserializeObjectArray<T>(srcStart, srcEnd, dst);
38
+ }
39
+ throw new Error("Could not parse array of type " + nameof<T>() + "!");
40
+ } else {
41
+ throw new Error("Could not parse array of type " + nameof<T>() + "!");
42
+ }
43
+ }
44
+
45
+ function isMap<T>(): boolean {
46
+ let type: T = changetype<T>(0);
47
+ return type instanceof Map;
48
+ }
@@ -0,0 +1,9 @@
1
+ import { CHAR_F, CHAR_T } from "../../custom/chars";
2
+
3
+ export function deserializeBoolean(srcStart: usize, srcEnd: usize): boolean {
4
+ const srcSize = srcEnd - srcStart;
5
+ const firstChar = load<u16>(srcStart);
6
+ if (firstChar == CHAR_T && load<u64>(srcStart) == 28429475166421108) return true;
7
+ else if (firstChar == CHAR_F && load<u64>(srcSize, 2) == 28429466576093281) return false;
8
+ return false; //ERROR(`Expected to find boolean, but found "${data.slice(0, 100)}" instead!`);
9
+ }
@@ -0,0 +1,11 @@
1
+ import { ptrToStr } from "../../util/ptrToStr";
2
+
3
+ export function deserializeDate(srcStart: usize, srcEnd: usize): Date {
4
+ // Use AssemblyScript's date parser
5
+ const d = Date.fromString(ptrToStr(srcStart, srcEnd));
6
+
7
+ // Return a new object instead of the one that the parser returned.
8
+ // This may seem redundant, but addreses the issue when Date
9
+ // is globally aliased to wasi_Date (or some other superclass).
10
+ return new Date(d.getTime());
11
+ }
@@ -0,0 +1,10 @@
1
+ import { ptrToStr } from "../../util/ptrToStr";
2
+
3
+ export function deserializeFloat<T>(srcStart: usize, srcEnd: usize): T {
4
+ // @ts-ignore
5
+ const type: T = 0;
6
+ // @ts-ignore
7
+ if (type instanceof f64) return f64.parse(ptrToStr(srcStart, srcEnd));
8
+ // @ts-ignore
9
+ return f32.parse(ptrToStr(srcStart, srcEnd));
10
+ }
@@ -0,0 +1,5 @@
1
+ import { atoi } from "../../util/atoi";
2
+
3
+ export function deserializeInteger<T>(srcStart: usize, srcEnd: usize): T {
4
+ return atoi<T>(srcStart, srcEnd);
5
+ }
@@ -0,0 +1,154 @@
1
+ import { JSON } from "../..";
2
+ import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRACE_RIGHT, BRACKET_RIGHT, CHAR_T, COLON } from "../../custom/chars";
3
+ import { isSpace } from "../../util";
4
+
5
+ export function deserializeMap<T extends Map<any, any>>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = changetype<T>(dst || __new(offsetof<T>(), idof<T>()));
7
+ // @ts-ignore: type
8
+ if (!isString<indexof<T>>() && !isInteger<indexof<T>>() && !isFloat<indexof<T>>()) ERROR("Map key must also be a valid JSON key!");
9
+
10
+ const srcPtr = srcStart;
11
+ let key: string | null = null;
12
+ let isKey = false;
13
+ let depth = 0;
14
+ let lastIndex = 0;
15
+
16
+ // while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
17
+ // while (srcEnd > srcStart && isSpace(load<u16>(srcEnd))) srcEnd -= 2;
18
+
19
+ while (srcStart < srcEnd) {
20
+ let code = load<u16>(srcStart); // while (isSpace(code)) code = load<u16>(srcStart += 2);
21
+ if (key == null) {
22
+ if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
23
+ if (isKey) {
24
+ key = sliceTo(lastIndex, srcStart);
25
+ while (isSpace((code = load<u16>((srcStart += 2))))) {
26
+ /* empty */
27
+ }
28
+ if (code !== COLON) throw new Error("Expected ':' after key at position " + (srcStart - srcPtr).toString());
29
+ isKey = false;
30
+ } else {
31
+ isKey = true;
32
+ lastIndex = srcStart + 2;
33
+ }
34
+ }
35
+ // isKey = !isKey;
36
+ srcStart += 2;
37
+ } else {
38
+ // @ts-ignore: type
39
+ if (isString<valueof<T>>() && code == QUOTE) {
40
+ lastIndex = srcStart;
41
+ srcStart += 2;
42
+ while (srcStart < srcEnd) {
43
+ const code = load<u16>(srcStart);
44
+ if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
45
+ while (isSpace(load<u16>((srcStart += 2)))) {
46
+ /* empty */
47
+ }
48
+ // @ts-ignore: type
49
+ out.set(key, JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
50
+ key = null;
51
+ break;
52
+ }
53
+ srcStart += 2;
54
+ }
55
+ // @ts-ignore: type
56
+ } else if ((!isBoolean<valueof<T>>() && isInteger<valueof<T>>() && code - 48 <= 9) || code == 45) {
57
+ lastIndex = srcStart;
58
+ srcStart += 2;
59
+ while (srcStart < srcEnd) {
60
+ const code = load<u16>(srcStart);
61
+ if (code == COMMA || isSpace(code) || code == BRACE_RIGHT) {
62
+ // @ts-ignore: type
63
+ out.set(key, JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
64
+ while (isSpace(load<u16>((srcStart += 2)))) {
65
+ /* empty */
66
+ }
67
+ key = null;
68
+ break;
69
+ }
70
+ srcStart += 2;
71
+ }
72
+ // @ts-ignore: type
73
+ } else if (isArray<valueof<T>>() && code == BRACKET_LEFT) {
74
+ lastIndex = srcStart;
75
+ depth++;
76
+ srcStart += 2;
77
+ while (srcStart < srcEnd) {
78
+ const code = load<u16>(srcStart);
79
+ if (((code ^ BRACE_RIGHT) | (code ^ BRACKET_RIGHT)) == 32) {
80
+ if (--depth == 0) {
81
+ // @ts-ignore: type
82
+ out.set(key, JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
83
+ while (isSpace(load<u16>((srcStart += 2)))) {
84
+ /* empty */
85
+ }
86
+ key = null;
87
+ break;
88
+ }
89
+ } else if (code == BRACKET_LEFT) depth++;
90
+ srcStart += 2;
91
+ }
92
+ // @ts-ignore: type
93
+ } else if (isDefined(changetype<nonnull<valueof<T>>>(0).__DESERIALIZE) && code == BRACE_LEFT) {
94
+ lastIndex = srcStart;
95
+ depth++;
96
+ srcStart += 2;
97
+ while (srcStart < srcEnd) {
98
+ const code = load<u16>(srcStart);
99
+ if (code == BRACE_RIGHT) {
100
+ if (--depth == 0) {
101
+ // @ts-ignore: type
102
+ out.set(key, JSON.__deserialize<valueof<T>>(lastIndex, srcStart));
103
+ while (isSpace(load<u16>((srcStart += 2)))) {
104
+ /* empty */
105
+ }
106
+ key = null;
107
+ break;
108
+ }
109
+ } else if (code == BRACE_LEFT) depth++;
110
+ srcStart += 2;
111
+ }
112
+ // @ts-ignore: type
113
+ } else if (isBoolean<valueof<T>>() && code == CHAR_T) {
114
+ if (load<u64>(srcStart) == 28429475166421108) {
115
+ // @ts-ignore: type
116
+ out.set(key, JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)));
117
+ while (isSpace(load<u16>((srcStart += 2)))) {
118
+ /* empty */
119
+ }
120
+ key = null;
121
+ }
122
+ // @ts-ignore: type
123
+ } else if (isBoolean<valueof<T>>() && code == CHAR_F) {
124
+ if (load<u64>(srcStart, 2) == 28429466576093281) {
125
+ // @ts-ignore: type
126
+ out.set(key, JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 10)));
127
+ while (isSpace(load<u16>((srcStart += 2)))) {
128
+ /* empty */
129
+ }
130
+ key = null;
131
+ }
132
+ } else if ((isNullable<T>() || nameof<T>() == "usize") && code == CHAR_N) {
133
+ if (load<u64>(srcStart) == 30399761348886638) {
134
+ // @ts-ignore: type
135
+ out.set(key, JSON.__deserialize<valueof<T>>(srcStart, (srcStart += 8)));
136
+ while (isSpace(load<u16>((srcStart += 2)))) {
137
+ /* empty */
138
+ }
139
+ }
140
+ } else {
141
+ // @ts-ignore: type
142
+ throw new Error("Unexpected character " + String.fromCharCode(code) + " or type " + nameof<valueof<T>>() + " does not match found type!");
143
+ }
144
+ }
145
+ }
146
+ return out;
147
+ }
148
+
149
+ function sliceTo(srcStart: usize, srcEnd: usize): string {
150
+ const dstSize = srcEnd - srcStart;
151
+ const dst = __new(dstSize, idof<string>());
152
+ memory.copy(dst, srcStart, dstSize);
153
+ return changetype<string>(dst);
154
+ }
@@ -0,0 +1,159 @@
1
+ import { BACK_SLASH, COMMA, CHAR_F, BRACE_LEFT, BRACKET_LEFT, CHAR_N, QUOTE, BRACE_RIGHT, BRACKET_RIGHT, CHAR_T, COLON } from "../../custom/chars";
2
+ import { isSpace } from "../../util";
3
+ import { ptrToStr } from "../../util/ptrToStr";
4
+
5
+ export function deserializeObject<T>(srcStart: usize, srcEnd: usize, dst: usize): T {
6
+ const out = changetype<nonnull<T>>(dst || __new(offsetof<T>(), idof<T>()));
7
+
8
+ let keyStart: usize = 0;
9
+ let keyEnd: usize = 0;
10
+ let isKey = false;
11
+ let depth = 0;
12
+ let lastIndex = 0;
13
+
14
+ // while (srcStart < srcEnd && isSpace(load<u16>(srcStart))) srcStart += 2;
15
+ // while (srcEnd > srcStart && isSpace(load<u16>(srcEnd))) srcEnd -= 2;
16
+ srcStart += 2;
17
+ while (srcStart < srcEnd) {
18
+ let code = load<u16>(srcStart); // while (isSpace(code)) code = load<u16>(srcStart += 2);
19
+ if (keyStart == 0) {
20
+ if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
21
+ if (isKey) {
22
+ keyStart = lastIndex;
23
+ keyEnd = srcStart;
24
+ // console.log("Key: " + ptrToStr(lastIndex, srcStart));
25
+ // console.log("Next: " + String.fromCharCode(load<u16>(srcStart + 2)));
26
+ srcStart += 2;
27
+ // while (isSpace((code = load<u16>((srcStart += 2))))) {
28
+ // /* empty */
29
+ // }
30
+ // if (code !== COLON) throw new Error("Expected ':' after key at position " + (srcStart - srcPtr).toString());
31
+ isKey = false;
32
+ } else {
33
+ // console.log("Got key start");
34
+ isKey = true; // i don't like this
35
+ lastIndex = srcStart + 2;
36
+ }
37
+ }
38
+ // isKey = !isKey;
39
+ srcStart += 2;
40
+ } else {
41
+ if (code == QUOTE) {
42
+ lastIndex = srcStart;
43
+ srcStart += 2;
44
+ while (srcStart < srcEnd) {
45
+ const code = load<u16>(srcStart);
46
+ if (code == QUOTE && load<u16>(srcStart - 2) !== BACK_SLASH) {
47
+ // console.log("Value (string): " + ptrToStr(lastIndex, srcStart + 2));
48
+ // @ts-ignore: exists
49
+ out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart + 2, dst);
50
+ // while (isSpace(load<u16>(srcStart))) srcStart += 2;
51
+ srcStart += 4;
52
+ // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
53
+ keyStart = 0;
54
+ break;
55
+ }
56
+ srcStart += 2;
57
+ }
58
+ } else if (code - 48 <= 9 || code == 45) {
59
+ lastIndex = srcStart;
60
+ srcStart += 2;
61
+ while (srcStart < srcEnd) {
62
+ const code = load<u16>(srcStart);
63
+ if (code == COMMA || code == BRACE_RIGHT || isSpace(code)) {
64
+ // @ts-ignore: exists
65
+ out.__DESERIALIZE(keyStart, keyEnd, lastIndex, srcStart, dst);
66
+ // console.log("Value (number): " + ptrToStr(lastIndex, srcStart));
67
+ // while (isSpace(load<u16>((srcStart += 2)))) {
68
+ // /* empty */
69
+ // }
70
+ srcStart += 2;
71
+ // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
72
+ keyStart = 0;
73
+ break;
74
+ }
75
+ srcStart += 2;
76
+ }
77
+ } else if (code == BRACE_LEFT) {
78
+ lastIndex = srcStart;
79
+ depth++;
80
+ srcStart += 2;
81
+ while (srcStart < srcEnd) {
82
+ const code = load<u16>(srcStart);
83
+ if (code == BRACE_RIGHT) {
84
+ if (--depth == 0) {
85
+ // console.log("Value (object): " + ptrToStr(lastIndex, srcStart + 2));
86
+ // @ts-ignore: exists
87
+ out.__DESERIALIZE(keyStart, keyEnd, lastIndex, (srcStart += 2), dst);
88
+ // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
89
+ keyStart = 0;
90
+ // while (isSpace(load<u16>(srcStart))) {
91
+ // /* empty */
92
+ // }
93
+ break;
94
+ }
95
+ } else if (code == BRACE_LEFT) depth++;
96
+ srcStart += 2;
97
+ }
98
+ } else if (code == BRACKET_LEFT) {
99
+ lastIndex = srcStart;
100
+ depth++;
101
+ srcStart += 2;
102
+ while (srcStart < srcEnd) {
103
+ const code = load<u16>(srcStart);
104
+ if (code == BRACKET_RIGHT) {
105
+ if (--depth == 0) {
106
+ // console.log("Value (array): " + ptrToStr(lastIndex, srcStart + 2));
107
+ // @ts-ignore: exists
108
+ out.__DESERIALIZE(keyStart, keyEnd, lastIndex, (srcStart += 2), dst);
109
+ // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
110
+ keyStart = 0;
111
+ // while (isSpace(load<u16>((srcStart += 2)))) {
112
+ // /* empty */
113
+ // }
114
+ break;
115
+ }
116
+ } else if (code == BRACKET_LEFT) depth++;
117
+ srcStart += 2;
118
+ }
119
+ } else if (code == CHAR_T) {
120
+ if (load<u64>(srcStart) == 28429475166421108) {
121
+ // console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 8));
122
+ // @ts-ignore: exists
123
+ out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst);
124
+ // while (isSpace(load<u16>((srcStart += 2)))) {
125
+ // /* empty */
126
+ // }
127
+ srcStart += 2;
128
+ // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)) + " " + (srcStart < srcEnd).toString());
129
+ keyStart = 0;
130
+ }
131
+ } else if (code == CHAR_F) {
132
+ if (load<u64>(srcStart, 2) == 28429466576093281) {
133
+ // console.log("Value (bool): " + ptrToStr(srcStart, srcStart + 10));
134
+ // @ts-ignore: exists
135
+ out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 10), dst);
136
+ // while (isSpace(load<u16>((srcStart += 2)))) {
137
+ // /* empty */
138
+ // }
139
+ srcStart += 2;
140
+ // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
141
+ keyStart = 0;
142
+ }
143
+ } else if (code == CHAR_N) {
144
+ if (load<u64>(srcStart) == 30399761348886638) {
145
+ // console.log("Value (null): " + ptrToStr(srcStart, srcStart + 8));
146
+ // @ts-ignore: exists
147
+ out.__DESERIALIZE(keyStart, keyEnd, srcStart, (srcStart += 8), dst);
148
+ // while (isSpace(load<u16>((srcStart += 2)))) {
149
+ /* empty */
150
+ // }
151
+ srcStart += 2;
152
+ // console.log("Next: " + String.fromCharCode(load<u16>(srcStart)));
153
+ keyStart = 0;
154
+ }
155
+ }
156
+ }
157
+ }
158
+ return out;
159
+ }
@@ -0,0 +1,48 @@
1
+ import { BACK_SLASH } from "../../custom/chars";
2
+ import { DESERIALIZE_ESCAPE_TABLE, ESCAPE_HEX_TABLE } from "../../globals/tables";
3
+
4
+ export function deserializeString(srcStart: usize, srcEnd: usize, dst: usize): string {
5
+ srcStart += 2;
6
+ srcEnd -= 2;
7
+ if (dst == 0) dst = __new(srcEnd - srcStart, idof<string>());
8
+ let dstPtr = dst;
9
+ let lastPtr = srcStart;
10
+ while (srcStart < srcEnd) {
11
+ let code = load<u16>(srcStart);
12
+ if (code == BACK_SLASH) {
13
+ code = load<u16>(DESERIALIZE_ESCAPE_TABLE + load<u8>(srcStart, 2));
14
+ if (code == 117 && load<u32>(srcStart, 4) == 3145776) {
15
+ const block = load<u32>(srcStart, 8);
16
+ const codeA = block & 0xffff;
17
+ const codeB = (block >> 16) & 0xffff;
18
+ const escapedA = load<u8>(ESCAPE_HEX_TABLE + codeA);
19
+ const escapedB = load<u8>(ESCAPE_HEX_TABLE + codeB);
20
+ const escaped = (escapedA << 4) + escapedB;
21
+ const remBytes = srcStart - lastPtr;
22
+ memory.copy(dstPtr, lastPtr, remBytes);
23
+ dstPtr += remBytes;
24
+ store<u16>(dst, escaped);
25
+ dstPtr += 2;
26
+ srcStart += 12;
27
+ lastPtr = srcStart;
28
+ } else {
29
+ const remBytes = srcStart - lastPtr;
30
+ memory.copy(dstPtr, lastPtr, remBytes);
31
+ dstPtr += remBytes;
32
+ store<u16>(dstPtr, code);
33
+ dstPtr += 2;
34
+ srcStart += 4;
35
+ lastPtr = srcStart;
36
+ }
37
+ } else {
38
+ srcStart += 2;
39
+ }
40
+ }
41
+
42
+ const remBytes = srcEnd - lastPtr;
43
+ memory.copy(dstPtr, lastPtr, remBytes);
44
+ dstPtr += remBytes;
45
+
46
+ if (lastPtr != srcStart) dst = __renew(dst, dstPtr - dst);
47
+ return changetype<string>(dst);
48
+ }