json-as 0.9.24 → 0.9.26
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.
- package/CHANGELOG +3 -1
- package/README.md +1 -1
- package/assembly/__benches__/misc.bench.ts +33 -0
- package/assembly/custom/util.ts +14 -11
- package/assembly/deserialize/array.ts +8 -0
- package/assembly/deserialize/bool.ts +16 -0
- package/assembly/deserialize/date.ts +17 -9
- package/assembly/deserialize/float.ts +12 -0
- package/assembly/deserialize/integer.ts +9 -0
- package/assembly/deserialize/map.ts +7 -0
- package/assembly/deserialize/object.ts +135 -0
- package/assembly/deserialize/string.ts +8 -1
- package/assembly/index.ts +59 -11
- package/assembly/test.ts +23 -23
- package/package.json +3 -5
- package/transform/lib/index.js +12 -20
- package/transform/lib/index.js.map +1 -0
- package/transform/package.json +1 -1
- package/transform/src/index.ts +8 -3
- package/transform/tsconfig.json +6 -26
- package/assembly/__benches__/bool.bench.ts +0 -14
- package/assembly/__benches__/simd.bench.ts +0 -36
- package/assembly/__benches__/string.bench.ts +0 -16
- package/assembly/util/strings.ts +0 -0
package/CHANGELOG
CHANGED
|
@@ -30,7 +30,9 @@ v0.9.19 - Fix arguments in @omitif declarations not working properly
|
|
|
30
30
|
v0.9.20 - Strings were being received with quotes attached via the toString functionality. Removed that.
|
|
31
31
|
v0.9.22 - Fix #89 and #93. Several bug fixes some severe such as ",null" being prepended when using @omit. Properly warn when a schema has fields that are not compatible with json
|
|
32
32
|
v0.9.23 - Comment out SIMD-related code for now
|
|
33
|
-
|
|
33
|
+
v0.9.24 - Remove transform changes from previous release
|
|
34
|
+
v0.9.25 - Implement JSON.parseSafe
|
|
35
|
+
v0.9.26 - Remove unnecessary dependencies
|
|
34
36
|
|
|
35
37
|
[UNRELEASED] v1.0.0
|
|
36
38
|
- Allow nullable primitives
|
package/README.md
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { JSON } from "..";
|
|
2
|
+
import { BRACE_LEFT, BRACKET_LEFT, CHAR_F, CHAR_T, QUOTE } from "../custom/chars";
|
|
3
|
+
|
|
4
|
+
bench("Match Type (string)", () => {
|
|
5
|
+
blackbox<boolean>(matchType(blackbox<string>("\""), JSON.Types.String));
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
bench("Match Type (bool)", () => {
|
|
9
|
+
blackbox<boolean>(matchType(blackbox<string>("t"), JSON.Types.Bool));
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
bench("Match Type (array)", () => {
|
|
13
|
+
blackbox<boolean>(matchType(blackbox<string>("["), JSON.Types.Array));
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
bench("Match Type (struct)", () => {
|
|
17
|
+
blackbox<boolean>(matchType(blackbox<string>("{"), JSON.Types.Obj));
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
bench("Match Type (raw)", () => {
|
|
21
|
+
blackbox<boolean>(matchType(blackbox<string>("\""), JSON.Types.Raw));
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
@inline function matchType(data: string, type: JSON.Types): boolean {
|
|
25
|
+
const firstChar = load<u8>(changetype<usize>(data));
|
|
26
|
+
if (JSON.Types.String == type && firstChar == QUOTE) return true;
|
|
27
|
+
else if (JSON.Types.Bool == type && (firstChar == CHAR_T || firstChar == CHAR_F)) return true;
|
|
28
|
+
else if (JSON.Types.Array == type && firstChar == BRACKET_LEFT) return true;
|
|
29
|
+
else if (JSON.Types.Obj == type && firstChar == BRACE_LEFT) return true;
|
|
30
|
+
else if (type < 7 && type > 0 && (firstChar < 58 && firstChar > 46)) return true;
|
|
31
|
+
else if (JSON.Types.Raw == type) return true;
|
|
32
|
+
else return false;
|
|
33
|
+
}
|
package/assembly/custom/util.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isSpace } from "util/string";
|
|
2
|
-
import { BACK_SLASH, QUOTE } from "./chars";
|
|
2
|
+
import { BACK_SLASH, BRACE_LEFT, BRACKET_LEFT, CHAR_F, CHAR_T, QUOTE } from "./chars";
|
|
3
3
|
import { Sink } from "./sink";
|
|
4
|
+
import { JSON } from "..";
|
|
4
5
|
|
|
5
6
|
// @ts-ignore: Decorator
|
|
6
7
|
export function isMap<T>(): bool {
|
|
@@ -9,12 +10,12 @@ export function isMap<T>(): bool {
|
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
// @ts-ignore: Decorator
|
|
12
|
-
export function unsafeCharCodeAt(data: string, pos: i32): i32 {
|
|
13
|
+
@inline export function unsafeCharCodeAt(data: string, pos: i32): i32 {
|
|
13
14
|
return load<u16>(changetype<usize>(data) + ((<usize>pos) << 1));
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
// @ts-ignore: Decorator
|
|
17
|
-
export function removeWhitespace(data: string): string {
|
|
18
|
+
@inline export function removeWhitespace(data: string): string {
|
|
18
19
|
const result = new Sink();
|
|
19
20
|
let instr = false;
|
|
20
21
|
for (let i = 0; i < data.length; i++) {
|
|
@@ -35,7 +36,7 @@ export function removeWhitespace(data: string): string {
|
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
// @ts-ignore: Decorator
|
|
38
|
-
export function escapeChar(char: string): string {
|
|
39
|
+
@inline export function escapeChar(char: string): string {
|
|
39
40
|
switch (unsafeCharCodeAt(char, 0)) {
|
|
40
41
|
case 0x22:
|
|
41
42
|
return '\\"';
|
|
@@ -93,7 +94,7 @@ export function getArrayDepth<T extends ArrayLike>(depth: i32 = 1): i32 {
|
|
|
93
94
|
* @param str - Any number. Can include scientific notation.
|
|
94
95
|
*/
|
|
95
96
|
// @ts-ignore: Decorator
|
|
96
|
-
export function snip_fast<T extends number>(str: string, len: u32 = 0, offset: u32 = 0): T {
|
|
97
|
+
@inline export function snip_fast<T extends number>(str: string, len: u32 = 0, offset: u32 = 0): T {
|
|
97
98
|
if (isSigned<T>()) {
|
|
98
99
|
const firstChar: u32 = load<u16>(changetype<usize>(str));
|
|
99
100
|
if (firstChar === 48) return 0 as T;
|
|
@@ -258,7 +259,7 @@ export function snip_fast<T extends number>(str: string, len: u32 = 0, offset: u
|
|
|
258
259
|
*/
|
|
259
260
|
|
|
260
261
|
// @ts-ignore
|
|
261
|
-
export function __atoi_fast<T extends number>(str: string, start: u32 = 0, end: u32 = 0): T {
|
|
262
|
+
@inline export function __atoi_fast<T extends number>(str: string, start: u32 = 0, end: u32 = 0): T {
|
|
262
263
|
// @ts-ignore
|
|
263
264
|
let val: T = 0;
|
|
264
265
|
if (!end) end = start + u32(str.length << 1);
|
|
@@ -293,7 +294,7 @@ export function __atoi_fast<T extends number>(str: string, start: u32 = 0, end:
|
|
|
293
294
|
*/
|
|
294
295
|
|
|
295
296
|
// @ts-ignore
|
|
296
|
-
export function parseSciInteger<T extends number>(str: string): T {
|
|
297
|
+
@inline export function parseSciInteger<T extends number>(str: string): T {
|
|
297
298
|
// @ts-ignore
|
|
298
299
|
let val: T = 0;
|
|
299
300
|
let offset = 0;
|
|
@@ -328,7 +329,7 @@ export function parseSciInteger<T extends number>(str: string): T {
|
|
|
328
329
|
}
|
|
329
330
|
|
|
330
331
|
// @ts-ignore
|
|
331
|
-
function sciNote<T extends number>(num: T): T {
|
|
332
|
+
@inline function sciNote<T extends number>(num: T): T {
|
|
332
333
|
let res = 1;
|
|
333
334
|
// @ts-ignore
|
|
334
335
|
if (num > 0) {
|
|
@@ -345,7 +346,7 @@ function sciNote<T extends number>(num: T): T {
|
|
|
345
346
|
}
|
|
346
347
|
|
|
347
348
|
// @ts-ignore
|
|
348
|
-
function equalsSlice(p1_data: string, p1_start: i32, p1_end: i32, p2_data: string, p2_start: i32, p2_end: i32): boolean {
|
|
349
|
+
@inline function equalsSlice(p1_data: string, p1_start: i32, p1_end: i32, p2_data: string, p2_start: i32, p2_end: i32): boolean {
|
|
349
350
|
const p1_len = p1_end - p1_start;
|
|
350
351
|
const p2_len = p2_end - p2_start;
|
|
351
352
|
if (p1_len != p2_len) return false;
|
|
@@ -356,14 +357,15 @@ function equalsSlice(p1_data: string, p1_start: i32, p1_end: i32, p2_data: strin
|
|
|
356
357
|
}
|
|
357
358
|
|
|
358
359
|
// @ts-ignore
|
|
359
|
-
export function containsCodePoint(str: string, code: u32, start: i32, end: i32): bool {
|
|
360
|
+
@inline export function containsCodePoint(str: string, code: u32, start: i32, end: i32): bool {
|
|
360
361
|
for (let i = start; i <= end; i++) {
|
|
361
362
|
if (unsafeCharCodeAt(str, i) == code) return true;
|
|
362
363
|
}
|
|
363
364
|
return false;
|
|
364
365
|
}
|
|
365
366
|
|
|
366
|
-
|
|
367
|
+
// @ts-ignore: Decorator
|
|
368
|
+
@inline export function _intTo16(int: i32): i32 {
|
|
367
369
|
if (int < 10) {
|
|
368
370
|
// 0-10
|
|
369
371
|
return 48 + int;
|
|
@@ -373,6 +375,7 @@ export function _intTo16(int: i32): i32 {
|
|
|
373
375
|
}
|
|
374
376
|
}
|
|
375
377
|
|
|
378
|
+
// @ts-ignore: Decorator
|
|
376
379
|
@inline export function intTo16(int: i32): i32 {
|
|
377
380
|
const high = int >> 4;
|
|
378
381
|
const low = int & 0x0F;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BRACKET_LEFT } from "../custom/chars";
|
|
1
2
|
import { isMap } from "../custom/util";
|
|
2
3
|
import { deserializeArrayArray } from "./array/array";
|
|
3
4
|
import { deserializeBooleanArray } from "./array/bool";
|
|
@@ -36,3 +37,10 @@ export function deserializeArray<T extends unknown[]>(data: string): T {
|
|
|
36
37
|
throw new Error("Could not parse array of type " + nameof<T>() + "!");
|
|
37
38
|
}
|
|
38
39
|
}
|
|
40
|
+
|
|
41
|
+
// @ts-ignore: Decorator valid here
|
|
42
|
+
export function deserializeArray_Safe<T extends unknown[]>(data: string): T {
|
|
43
|
+
const firstChar = load<u8>(changetype<usize>(data));
|
|
44
|
+
if (firstChar != BRACKET_LEFT) throw new Error("Mismatched Types! Expected " + nameof<T>() + " but got \"" + data.slice(0, 100) + "\" instead!");
|
|
45
|
+
return deserializeArray<T>(data);
|
|
46
|
+
}
|
|
@@ -15,4 +15,20 @@ import { unsafeCharCodeAt } from "../custom/util";
|
|
|
15
15
|
if (len === 4 && firstChar === CHAR_T && load<u64>(ptr) === 28429475166421108) return true;
|
|
16
16
|
else if (len === 5 && firstChar === CHAR_F && load<u64>(ptr, 2) === 28429466576093281) return false;
|
|
17
17
|
return false//ERROR(`Expected to find boolean, but found "${data.slice(0, 100)}" instead!`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Deserialize a string to type boolean (safely)
|
|
22
|
+
* @param data data to parse
|
|
23
|
+
* @returns boolean
|
|
24
|
+
*/
|
|
25
|
+
// @ts-ignore: Decorator valid here
|
|
26
|
+
@inline export function deserializeBoolean_Safe(data: string, start: i32 = 0, end: i32 = 0): boolean {
|
|
27
|
+
if (!end) end = data.length;
|
|
28
|
+
const len = end - start;
|
|
29
|
+
const ptr = changetype<usize>(data) + <usize>(start << 1);
|
|
30
|
+
const firstChar = unsafeCharCodeAt(data, start);
|
|
31
|
+
if (len === 4 && firstChar === CHAR_T && load<u64>(ptr) === 28429475166421108) return true;
|
|
32
|
+
else if (len === 5 && firstChar === CHAR_F && load<u64>(ptr, 2) === 28429466576093281) return false;
|
|
33
|
+
throw new Error("Mismatched Types! Expected boolean but got \"" + data.slice(0, 100) + "\" instead!");
|
|
18
34
|
}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
|
+
import { QUOTE } from "../custom/chars";
|
|
2
|
+
|
|
1
3
|
// @ts-ignore: Decorator valid here
|
|
2
4
|
@inline export function deserializeDate(dateTimeString: string): Date {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
// Use AssemblyScript's date parser
|
|
6
|
+
const d = Date.fromString(dateTimeString);
|
|
7
|
+
|
|
8
|
+
// Return a new object instead of the one that the parser returned.
|
|
9
|
+
// This may seem redundant, but addreses the issue when Date
|
|
10
|
+
// is globally aliased to wasi_Date (or some other superclass).
|
|
11
|
+
return new Date(d.getTime());
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// @ts-ignore: Decorator valid here
|
|
15
|
+
@inline export function deserializeDate_Safe(dateTimeString: string): Date {
|
|
16
|
+
const firstChar = load<u8>(changetype<usize>(dateTimeString));
|
|
17
|
+
if (firstChar != QUOTE) throw new Error("Mismatched Types! Expected Date but got \"" + dateTimeString.slice(0, 100) + "\" instead!");
|
|
18
|
+
return deserializeDate(dateTimeString);
|
|
19
|
+
}
|
|
@@ -6,4 +6,16 @@
|
|
|
6
6
|
if (type instanceof f64) return f64.parse(data);
|
|
7
7
|
// @ts-ignore
|
|
8
8
|
return f32.parse(data);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// @ts-ignore: Decorator valid here
|
|
12
|
+
@inline export function deserializeFloat_Safe<T>(data: string): T {
|
|
13
|
+
const firstChar = load<u8>(changetype<usize>(data));
|
|
14
|
+
if ((firstChar < 48 || firstChar > 57) && firstChar != 45) throw new Error("Mismatched Types! Expected float but got \""+data.slice(0, 100)+"\" instead!");
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
const type: T = 0;
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
if (type instanceof f64) return f64.parse(data);
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
return f32.parse(data);
|
|
9
21
|
}
|
|
@@ -4,4 +4,13 @@ import { snip_fast } from "../custom/util";
|
|
|
4
4
|
@inline export function deserializeInteger<T>(data: string): T {
|
|
5
5
|
// @ts-ignore
|
|
6
6
|
return snip_fast<T>(data);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// @ts-ignore: Decorator valid here
|
|
10
|
+
@inline export function deserializeInteger_Safe<T>(data: string): T {
|
|
11
|
+
const firstChar = load<u8>(changetype<usize>(data));
|
|
12
|
+
console.log(firstChar.toString())
|
|
13
|
+
if ((firstChar < 48 || firstChar > 57) && firstChar != 45) throw new Error("Mismatched Types! Expected " + nameof<T>() + " but got \""+data.slice(0, 100)+"\" instead!");
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
return snip_fast<T>(data);
|
|
7
16
|
}
|
|
@@ -180,3 +180,10 @@ function deserializeMapKey<T>(key: Virtual<string>): T {
|
|
|
180
180
|
|
|
181
181
|
throw new Error(`JSON: Cannot parse JSON object to a Map with a key of type ${nameof<T>()}`);
|
|
182
182
|
}
|
|
183
|
+
|
|
184
|
+
// @ts-ignore: Decorator valid here
|
|
185
|
+
@inline export function deserializeMap_Safe<T extends Map>(data: string): T {
|
|
186
|
+
const firstChar = load<u8>(changetype<usize>(data));
|
|
187
|
+
if (firstChar != BRACE_LEFT) throw new Error("Mismatched Types! Expected " + nameof<T>() + " but got \"" + data.slice(0, 100) + "\" instead!");
|
|
188
|
+
return deserializeMap<T>(data);
|
|
189
|
+
}
|
|
@@ -133,4 +133,139 @@ import { isSpace } from "util/string";
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
return schema;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// @ts-ignore: Decorator valid here
|
|
139
|
+
@inline export function deserializeObject_Safe<T>(data: string): T {
|
|
140
|
+
const firstChar = load<u8>(changetype<usize>(data));
|
|
141
|
+
if (firstChar != BRACE_LEFT) throw new Error("Mismatched Types! Expected " + nameof<T>() + " but got \"" + data.slice(0, 100) + "\" instead!");
|
|
142
|
+
const schema: nonnull<T> = changetype<nonnull<T>>(
|
|
143
|
+
__new(offsetof<nonnull<T>>(), idof<nonnull<T>>())
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
// @ts-ignore
|
|
147
|
+
schema.__INITIALIZE();
|
|
148
|
+
|
|
149
|
+
let key_start: i32 = 0;
|
|
150
|
+
let key_end: i32 = 0;
|
|
151
|
+
let isKey = false;
|
|
152
|
+
let depth = 0;
|
|
153
|
+
let outerLoopIndex = 1;
|
|
154
|
+
for (; outerLoopIndex < data.length - 1; outerLoopIndex++) {
|
|
155
|
+
const char = unsafeCharCodeAt(data, outerLoopIndex);
|
|
156
|
+
if (char === BRACKET_LEFT) {
|
|
157
|
+
for (
|
|
158
|
+
let arrayValueIndex = outerLoopIndex;
|
|
159
|
+
arrayValueIndex < data.length - 1;
|
|
160
|
+
arrayValueIndex++
|
|
161
|
+
) {
|
|
162
|
+
const char = unsafeCharCodeAt(data, arrayValueIndex);
|
|
163
|
+
if (char === BRACKET_LEFT) {
|
|
164
|
+
depth++;
|
|
165
|
+
} else if (char === BRACKET_RIGHT) {
|
|
166
|
+
depth--;
|
|
167
|
+
if (depth === 0) {
|
|
168
|
+
++arrayValueIndex;
|
|
169
|
+
// @ts-ignore
|
|
170
|
+
schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, arrayValueIndex);
|
|
171
|
+
outerLoopIndex = arrayValueIndex;
|
|
172
|
+
isKey = false;
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
} else if (char === BRACE_LEFT) {
|
|
178
|
+
for (
|
|
179
|
+
let objectValueIndex = outerLoopIndex;
|
|
180
|
+
objectValueIndex < data.length - 1;
|
|
181
|
+
objectValueIndex++
|
|
182
|
+
) {
|
|
183
|
+
const char = unsafeCharCodeAt(data, objectValueIndex);
|
|
184
|
+
if (char === BRACE_LEFT) {
|
|
185
|
+
depth++;
|
|
186
|
+
} else if (char === BRACE_RIGHT) {
|
|
187
|
+
depth--;
|
|
188
|
+
if (depth === 0) {
|
|
189
|
+
++objectValueIndex;
|
|
190
|
+
// @ts-ignore
|
|
191
|
+
schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, objectValueIndex);
|
|
192
|
+
outerLoopIndex = objectValueIndex;
|
|
193
|
+
isKey = false;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
} else if (char === QUOTE) {
|
|
199
|
+
let escaping = false;
|
|
200
|
+
for (
|
|
201
|
+
let stringValueIndex = ++outerLoopIndex;
|
|
202
|
+
stringValueIndex < data.length - 1;
|
|
203
|
+
stringValueIndex++
|
|
204
|
+
) {
|
|
205
|
+
const char = unsafeCharCodeAt(data, stringValueIndex);
|
|
206
|
+
if (char === BACK_SLASH && !escaping) {
|
|
207
|
+
escaping = true;
|
|
208
|
+
} else {
|
|
209
|
+
if (char === QUOTE && !escaping) {
|
|
210
|
+
if (isKey === false) {
|
|
211
|
+
key_start = outerLoopIndex;
|
|
212
|
+
key_end = stringValueIndex;
|
|
213
|
+
isKey = true;
|
|
214
|
+
} else {
|
|
215
|
+
// @ts-ignore
|
|
216
|
+
schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex - 1, stringValueIndex + 1);
|
|
217
|
+
isKey = false;
|
|
218
|
+
}
|
|
219
|
+
outerLoopIndex = ++stringValueIndex;
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
escaping = false;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
} else if (
|
|
226
|
+
char == CHAR_N &&
|
|
227
|
+
unsafeCharCodeAt(data, outerLoopIndex + 1) === CHAR_U &&
|
|
228
|
+
unsafeCharCodeAt(data, outerLoopIndex + 2) === CHAR_L &&
|
|
229
|
+
unsafeCharCodeAt(data, outerLoopIndex + 3) === CHAR_L
|
|
230
|
+
) {
|
|
231
|
+
// @ts-ignore
|
|
232
|
+
schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, outerLoopIndex + 4);
|
|
233
|
+
outerLoopIndex += 3;
|
|
234
|
+
isKey = false;
|
|
235
|
+
} else if (
|
|
236
|
+
char === CHAR_T &&
|
|
237
|
+
unsafeCharCodeAt(data, outerLoopIndex + 1) === CHAR_R &&
|
|
238
|
+
unsafeCharCodeAt(data, outerLoopIndex + 2) === CHAR_U &&
|
|
239
|
+
unsafeCharCodeAt(data, outerLoopIndex + 3) === CHAR_E
|
|
240
|
+
) {
|
|
241
|
+
// @ts-ignore
|
|
242
|
+
schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, outerLoopIndex + 4);
|
|
243
|
+
outerLoopIndex += 3;
|
|
244
|
+
isKey = false;
|
|
245
|
+
} else if (
|
|
246
|
+
char === CHAR_F &&
|
|
247
|
+
unsafeCharCodeAt(data, outerLoopIndex + 1) === CHAR_A &&
|
|
248
|
+
unsafeCharCodeAt(data, outerLoopIndex + 2) === CHAR_L &&
|
|
249
|
+
unsafeCharCodeAt(data, outerLoopIndex + 3) === CHAR_S &&
|
|
250
|
+
unsafeCharCodeAt(data, outerLoopIndex + 4) === CHAR_E
|
|
251
|
+
) {
|
|
252
|
+
// @ts-ignore
|
|
253
|
+
schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex, outerLoopIndex + 5);
|
|
254
|
+
outerLoopIndex += 4;
|
|
255
|
+
isKey = false;
|
|
256
|
+
} else if ((char >= 48 && char <= 57) || char === 45) {
|
|
257
|
+
let numberValueIndex = ++outerLoopIndex;
|
|
258
|
+
for (; numberValueIndex < data.length; numberValueIndex++) {
|
|
259
|
+
const char = unsafeCharCodeAt(data, numberValueIndex);
|
|
260
|
+
if (char === COMMA || char === BRACE_RIGHT || isSpace(char)) {
|
|
261
|
+
// @ts-ignore
|
|
262
|
+
schema.__DESERIALIZE_SAFE(data, key_start, key_end, outerLoopIndex - 1, numberValueIndex);
|
|
263
|
+
outerLoopIndex = numberValueIndex;
|
|
264
|
+
isKey = false;
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return schema;
|
|
136
271
|
}
|
|
@@ -154,4 +154,11 @@ import { unsafeCharCodeAt } from "../custom/util";
|
|
|
154
154
|
// if (end > last) {
|
|
155
155
|
// result.write(data, last, end);
|
|
156
156
|
// }
|
|
157
|
-
// }
|
|
157
|
+
// }
|
|
158
|
+
|
|
159
|
+
// @ts-ignore: Decorator valid here
|
|
160
|
+
@inline export function deserializeString_Safe(data: string, start: i32 = 0, end: i32 = 0): string {
|
|
161
|
+
const firstChar = load<u8>(changetype<usize>(data));
|
|
162
|
+
if (firstChar != QUOTE) throw new Error("Mismatched Types! Expected string but got \""+data.slice(0, 100)+"\" instead!");
|
|
163
|
+
return deserializeString(data, start, end);
|
|
164
|
+
}
|
package/assembly/index.ts
CHANGED
|
@@ -7,15 +7,15 @@ import { serializeObject, serializeObject_Pretty } from "./serialize/object";
|
|
|
7
7
|
import { serializeDate } from "./serialize/date";
|
|
8
8
|
import { serializeArray } from "./serialize/array";
|
|
9
9
|
import { serializeMap } from "./serialize/map";
|
|
10
|
-
import { deserializeBoolean } from "./deserialize/bool";
|
|
11
|
-
import { deserializeArray } from "./deserialize/array";
|
|
10
|
+
import { deserializeBoolean, deserializeBoolean_Safe } from "./deserialize/bool";
|
|
11
|
+
import { deserializeArray, deserializeArray_Safe } from "./deserialize/array";
|
|
12
12
|
import { deserializeFloat } from "./deserialize/float";
|
|
13
|
-
import { deserializeObject } from "./deserialize/object";
|
|
14
|
-
import { deserializeMap } from "./deserialize/map";
|
|
13
|
+
import { deserializeObject, deserializeObject_Safe } from "./deserialize/object";
|
|
14
|
+
import { deserializeMap, deserializeMap_Safe } from "./deserialize/map";
|
|
15
15
|
import { deserializeDate } from "./deserialize/date";
|
|
16
|
-
import { NULL_WORD } from "./custom/chars";
|
|
17
|
-
import { deserializeInteger } from "./deserialize/integer";
|
|
18
|
-
import { deserializeString } from "./deserialize/string";
|
|
16
|
+
import { BRACE_LEFT, BRACKET_LEFT, CHAR_F, CHAR_N, CHAR_T, NULL_WORD, QUOTE } from "./custom/chars";
|
|
17
|
+
import { deserializeInteger, deserializeInteger_Safe } from "./deserialize/integer";
|
|
18
|
+
import { deserializeString, deserializeString_Safe } from "./deserialize/string";
|
|
19
19
|
import { Sink } from "./custom/sink";
|
|
20
20
|
import { getArrayDepth } from "./custom/util";
|
|
21
21
|
|
|
@@ -174,7 +174,7 @@ export namespace JSON {
|
|
|
174
174
|
* @returns string
|
|
175
175
|
*/
|
|
176
176
|
// @ts-ignore: Decorator
|
|
177
|
-
export function stringify<T>(data: T/*, options: SerializeOptions = DEFAULT_SERIALIZE_OPTIONS*/): string {
|
|
177
|
+
@inline export function stringify<T>(data: T/*, options: SerializeOptions = DEFAULT_SERIALIZE_OPTIONS*/): string {
|
|
178
178
|
if (isBoolean<T>()) {
|
|
179
179
|
return serializeBool(data as bool);
|
|
180
180
|
} else if (isInteger<T>()) {
|
|
@@ -222,7 +222,7 @@ export namespace JSON {
|
|
|
222
222
|
*/
|
|
223
223
|
|
|
224
224
|
// @ts-ignore: Decorator
|
|
225
|
-
export function parse<T>(data: string): T {
|
|
225
|
+
@inline export function parse<T>(data: string): T {
|
|
226
226
|
if (isBoolean<T>()) {
|
|
227
227
|
return deserializeBoolean(data) as T;
|
|
228
228
|
} else if (isInteger<T>()) {
|
|
@@ -256,14 +256,62 @@ export namespace JSON {
|
|
|
256
256
|
);
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* Parses valid JSON strings into their original format (safely).
|
|
261
|
+
* ```js
|
|
262
|
+
* JSON.parseSafe<T>(data)
|
|
263
|
+
* ```
|
|
264
|
+
* @param data string
|
|
265
|
+
* @returns T
|
|
266
|
+
*/
|
|
267
|
+
|
|
268
|
+
// @ts-ignore: Decorator
|
|
269
|
+
@inline export function parseSafe<T>(data: string): T {
|
|
270
|
+
if (isBoolean<T>()) {
|
|
271
|
+
return deserializeBoolean_Safe(data) as T;
|
|
272
|
+
} else if (isInteger<T>()) {
|
|
273
|
+
return deserializeInteger_Safe<T>(data);
|
|
274
|
+
} else if (isFloat<T>()) {
|
|
275
|
+
return deserializeFloat<T>(data);
|
|
276
|
+
} else if (isNullable<T>() && data.length === 4 && data == "null") {
|
|
277
|
+
// @ts-ignore
|
|
278
|
+
return null;
|
|
279
|
+
} else if (isString<T>()) {
|
|
280
|
+
// @ts-ignore
|
|
281
|
+
return deserializeString_Safe(data);
|
|
282
|
+
} else if (isArray<T>()) {
|
|
283
|
+
// @ts-ignore
|
|
284
|
+
return deserializeArray_Safe<nonnull<T>>(data);
|
|
285
|
+
}
|
|
286
|
+
let type: nonnull<T> = changetype<nonnull<T>>(0);
|
|
287
|
+
// @ts-ignore: Defined by transform
|
|
288
|
+
if (isDefined(type.__DESERIALIZE)) {
|
|
289
|
+
// @ts-ignore
|
|
290
|
+
return deserializeObject_Safe<nonnull<T>>(data.trimStart());
|
|
291
|
+
} else if (type instanceof Map) {
|
|
292
|
+
// @ts-ignore
|
|
293
|
+
return deserializeMap_Safe<nonnull<T>>(data.trimStart());
|
|
294
|
+
} else if (type instanceof Date) {
|
|
295
|
+
// @ts-ignore
|
|
296
|
+
return deserializeDate_Safe(data);
|
|
297
|
+
} else {
|
|
298
|
+
throw new Error(
|
|
299
|
+
`Could not deserialize data ${data} to type ${nameof<T>()}. Make sure to add the correct decorators to classes.`
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
259
303
|
}
|
|
260
304
|
|
|
261
305
|
// This allows JSON.stringify and JSON.parse to be available globally through an alias
|
|
262
306
|
// @ts-ignore: Decorator
|
|
263
|
-
@global function __SERIALIZE<T>(data: T): string {
|
|
307
|
+
@global @inline function __SERIALIZE<T>(data: T): string {
|
|
264
308
|
return JSON.stringify(data);
|
|
265
309
|
}
|
|
266
310
|
// @ts-ignore: Decorator
|
|
267
|
-
@global function __DESERIALIZE<T>(data: string): T {
|
|
311
|
+
@global @inline function __DESERIALIZE<T>(data: string): T {
|
|
268
312
|
return JSON.parse<T>(data);
|
|
313
|
+
}
|
|
314
|
+
// @ts-ignore: Decorator
|
|
315
|
+
@global @inline function __DESERIALIZE_SAFE<T>(data: string): T {
|
|
316
|
+
return JSON.parseSafe<T>(data);
|
|
269
317
|
}
|
package/assembly/test.ts
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
import { JSON } from "."
|
|
2
2
|
|
|
3
3
|
@json
|
|
4
|
-
class Vec3
|
|
4
|
+
class Vec3 {
|
|
5
5
|
public x: i32 = 0;
|
|
6
6
|
public y: i32 = 0;
|
|
7
|
-
public z:
|
|
7
|
+
public z: i32 = 0;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
@json
|
|
11
|
-
class Base {
|
|
12
|
-
|
|
13
|
-
}
|
|
10
|
+
// @json
|
|
11
|
+
// class Base {
|
|
12
|
+
// public bam: string = "harekogkeorgke"
|
|
13
|
+
// }
|
|
14
14
|
|
|
15
|
-
@json
|
|
16
|
-
class Foo extends Base {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
15
|
+
// @json
|
|
16
|
+
// class Foo extends Base {
|
|
17
|
+
// public bar: JSON.Raw = "\"this is ok\'"
|
|
18
|
+
// public baz: i32 = 0;
|
|
19
|
+
// public pos: Vec3<Vec3<i32>> = {
|
|
20
|
+
// x: 1,
|
|
21
|
+
// y: 2,
|
|
22
|
+
// z: {
|
|
23
|
+
// x: 1,
|
|
24
|
+
// y: 2,
|
|
25
|
+
// z: 3
|
|
26
|
+
// }
|
|
27
|
+
// }
|
|
28
|
+
// // ^ this is not okay
|
|
29
|
+
// }
|
|
30
30
|
|
|
31
|
-
const serialized = JSON.stringify(new
|
|
31
|
+
const serialized = JSON.stringify(new Vec3());
|
|
32
32
|
console.log("Serialized: " + serialized);
|
|
33
|
-
const deserialized = JSON.
|
|
33
|
+
const deserialized = JSON.parseSafe<Vec3>(`{"x":1,"y":true,"z":3}`);
|
|
34
34
|
console.log("Deserialized: " + JSON.stringify(deserialized));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json-as",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.26",
|
|
4
4
|
"description": "The only JSON library you'll need for AssemblyScript. SIMD enabled",
|
|
5
5
|
"types": "assembly/index.ts",
|
|
6
6
|
"author": "Jairus Tanaka",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"test": "ast test && rm -rf ./build/",
|
|
20
20
|
"pretest": "rm -rf ./build/ && ast build",
|
|
21
21
|
"bench": "astral --enable simd --runtime stub",
|
|
22
|
-
"build:test": "rm -rf ./build/ && asc assembly/test.ts --transform ./transform -o ./build/test.wasm",
|
|
22
|
+
"build:test": "rm -rf ./build/ && JSON_DEBUG=true asc assembly/test.ts --transform ./transform -o ./build/test.wasm",
|
|
23
23
|
"build:transform": "tsc -p ./transform",
|
|
24
24
|
"test:wasmtime": "wasmtime ./build/test.wasm",
|
|
25
25
|
"test:wavm": "wavm run ./build/test.wasm",
|
|
@@ -44,9 +44,7 @@
|
|
|
44
44
|
"visitor-as": "^0.11.4"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"
|
|
48
|
-
"as-virtual": "^0.2.0",
|
|
49
|
-
"chalk": "^5.3.0"
|
|
47
|
+
"as-virtual": "^0.2.0"
|
|
50
48
|
},
|
|
51
49
|
"overrides": {
|
|
52
50
|
"assemblyscript": "$assemblyscript"
|
package/transform/lib/index.js
CHANGED
|
@@ -24,7 +24,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
24
24
|
schema.node = node;
|
|
25
25
|
schema.name = node.name.text;
|
|
26
26
|
const members = [
|
|
27
|
-
...node.members.filter((v) => v.kind === 54
|
|
27
|
+
...node.members.filter((v) => v.kind === 54),
|
|
28
28
|
];
|
|
29
29
|
if (node.extendsType) {
|
|
30
30
|
schema.parent = this.schemasList.find((v) => v.name == node.extendsType?.name.identifier.text);
|
|
@@ -39,17 +39,14 @@ class JSONTransform extends BaseVisitor {
|
|
|
39
39
|
}
|
|
40
40
|
if (!members.length) {
|
|
41
41
|
let SERIALIZE_RAW_EMPTY = '__SERIALIZE(): string {\n return "{}";\n}';
|
|
42
|
-
//let SERIALIZE_PRETTY_EMPTY = "__SERIALIZE_PRETTY(): string {\n return \"{}\";\n}";
|
|
43
42
|
let INITIALIZE_EMPTY = "__INITIALIZE(): this {\n return this;\n}";
|
|
44
43
|
let DESERIALIZE_EMPTY = "__DESERIALIZE(data: string, key_start: i32, key_end: i32, value_start: i32, value_end: i32): boolean {\n return false;\n}";
|
|
45
44
|
if (process.env["JSON_DEBUG"]) {
|
|
46
45
|
console.log(SERIALIZE_RAW_EMPTY);
|
|
47
|
-
//console.log(SERIALIZE_PRETTY_EMPTY);
|
|
48
46
|
console.log(INITIALIZE_EMPTY);
|
|
49
47
|
console.log(DESERIALIZE_EMPTY);
|
|
50
48
|
}
|
|
51
49
|
const SERIALIZE_RAW_METHOD_EMPTY = SimpleParser.parseClassMember(SERIALIZE_RAW_EMPTY, node);
|
|
52
|
-
//const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
|
|
53
50
|
const INITIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(INITIALIZE_EMPTY, node);
|
|
54
51
|
const DESERIALIZE_METHOD_EMPTY = SimpleParser.parseClassMember(DESERIALIZE_EMPTY, node);
|
|
55
52
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
|
|
@@ -74,11 +71,11 @@ class JSONTransform extends BaseVisitor {
|
|
|
74
71
|
if (type.startsWith("(") && type.includes("=>"))
|
|
75
72
|
continue;
|
|
76
73
|
const value = member.initializer ? toString(member.initializer) : null;
|
|
77
|
-
if (member.flags == 32
|
|
74
|
+
if (member.flags == 32)
|
|
78
75
|
continue;
|
|
79
|
-
if (member.flags === 512
|
|
76
|
+
if (member.flags === 512)
|
|
80
77
|
continue;
|
|
81
|
-
if (member.flags === 1024
|
|
78
|
+
if (member.flags === 1024)
|
|
82
79
|
continue;
|
|
83
80
|
const mem = new Property();
|
|
84
81
|
mem.name = name.text;
|
|
@@ -122,7 +119,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
122
119
|
}
|
|
123
120
|
}
|
|
124
121
|
}
|
|
125
|
-
mem.generate();
|
|
122
|
+
mem.generate(false);
|
|
126
123
|
if (this.schemasList.find((v) => v.name == type)) {
|
|
127
124
|
mem.initialize =
|
|
128
125
|
"this." +
|
|
@@ -332,39 +329,36 @@ class JSONTransform extends BaseVisitor {
|
|
|
332
329
|
DESERIALIZE += " } ";
|
|
333
330
|
}
|
|
334
331
|
DESERIALIZE += "\n return false;\n}";
|
|
335
|
-
//console.log(sortedMembers);
|
|
336
332
|
if (process.env["JSON_DEBUG"]) {
|
|
337
333
|
console.log(SERIALIZE_RAW);
|
|
338
|
-
//console.log(SERIALIZE_PRETTY);
|
|
339
334
|
console.log(INITIALIZE);
|
|
340
335
|
console.log(DESERIALIZE);
|
|
341
336
|
}
|
|
342
337
|
const SERIALIZE_RAW_METHOD = SimpleParser.parseClassMember(SERIALIZE_RAW, node);
|
|
343
|
-
|
|
338
|
+
const DESERIALIZE_SAFE = DESERIALIZE.replaceAll("__DESERIALIZE", "__DESERIALIZE_SAFE");
|
|
344
339
|
const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node);
|
|
345
340
|
const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node);
|
|
341
|
+
const DESERIALIZE_SAFE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_SAFE, node);
|
|
346
342
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
|
|
347
343
|
node.members.push(SERIALIZE_RAW_METHOD);
|
|
348
344
|
if (!node.members.find((v) => v.name.text == "__INITIALIZE"))
|
|
349
345
|
node.members.push(INITIALIZE_METHOD);
|
|
350
346
|
if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
|
|
351
347
|
node.members.push(DESERIALIZE_METHOD);
|
|
348
|
+
if (!node.members.find((v) => v.name.text == "__DESERIALIZE_SAFE"))
|
|
349
|
+
node.members.push(DESERIALIZE_SAFE_METHOD);
|
|
352
350
|
this.schemasList.push(schema);
|
|
353
351
|
}
|
|
354
352
|
visitSource(node) {
|
|
355
353
|
super.visitSource(node);
|
|
356
|
-
// Only add the import statement to sources that have JSON decorated classes.
|
|
357
354
|
if (!this.sources.has(node)) {
|
|
358
355
|
return;
|
|
359
356
|
}
|
|
360
357
|
}
|
|
361
358
|
}
|
|
362
359
|
export default class Transformer extends Transform {
|
|
363
|
-
// Trigger the transform after parse.
|
|
364
360
|
afterParse(parser) {
|
|
365
|
-
// Create new transform
|
|
366
361
|
const transformer = new JSONTransform();
|
|
367
|
-
// Sort the sources so that user scripts are visited last
|
|
368
362
|
const sources = parser.sources
|
|
369
363
|
.filter((source) => !isStdlib(source))
|
|
370
364
|
.sort((_a, _b) => {
|
|
@@ -380,14 +374,11 @@ export default class Transformer extends Transform {
|
|
|
380
374
|
return 0;
|
|
381
375
|
}
|
|
382
376
|
});
|
|
383
|
-
// Loop over every source
|
|
384
377
|
for (const source of sources) {
|
|
385
|
-
// Ignore all lib and std. Visit everything else.
|
|
386
378
|
if (!isStdlib(source)) {
|
|
387
379
|
transformer.visit(source);
|
|
388
380
|
}
|
|
389
381
|
}
|
|
390
|
-
// Check that every parent and child class is hooked up correctly
|
|
391
382
|
const schemas = transformer.schemasList;
|
|
392
383
|
for (const schema of schemas) {
|
|
393
384
|
if (schema.parent) {
|
|
@@ -419,7 +410,7 @@ class Property {
|
|
|
419
410
|
node;
|
|
420
411
|
right_s = "";
|
|
421
412
|
right_d = "";
|
|
422
|
-
generate() {
|
|
413
|
+
generate(safe) {
|
|
423
414
|
const name = this.name;
|
|
424
415
|
const escapedName = escapeString(JSON.stringify(this.alias || this.name));
|
|
425
416
|
const type = this.type;
|
|
@@ -438,7 +429,7 @@ class Property {
|
|
|
438
429
|
else {
|
|
439
430
|
this.right_s = "__SERIALIZE<" + type + ">(this." + name + ")";
|
|
440
431
|
this.right_d =
|
|
441
|
-
"__DESERIALIZE<" + type + ">(data.substring(value_start, value_end))";
|
|
432
|
+
(safe ? "__DESERIALIZE_SAFE" : "__DESERIALIZE") + "<" + type + ">(data.substring(value_start, value_end))";
|
|
442
433
|
}
|
|
443
434
|
if (this.flags.has(PropertyFlags.OmitIf)) {
|
|
444
435
|
const condition = this.flags.get(PropertyFlags.OmitIf)[0];
|
|
@@ -537,3 +528,4 @@ function getArgs(args) {
|
|
|
537
528
|
}
|
|
538
529
|
return out;
|
|
539
530
|
}
|
|
531
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/transform/package.json
CHANGED
package/transform/src/index.ts
CHANGED
|
@@ -174,7 +174,7 @@ class JSONTransform extends BaseVisitor {
|
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
-
mem.generate();
|
|
177
|
+
mem.generate(false);
|
|
178
178
|
|
|
179
179
|
if (this.schemasList.find((v) => v.name == type)) {
|
|
180
180
|
mem.initialize =
|
|
@@ -393,9 +393,12 @@ class JSONTransform extends BaseVisitor {
|
|
|
393
393
|
SERIALIZE_RAW,
|
|
394
394
|
node,
|
|
395
395
|
);
|
|
396
|
+
|
|
397
|
+
const DESERIALIZE_SAFE = DESERIALIZE.replaceAll("__DESERIALIZE", "__DESERIALIZE_SAFE")
|
|
396
398
|
//const SERIALIZE_PRETTY_METHOD = SimpleParser.parseClassMember(SERIALIZE_PRETTY, node);
|
|
397
399
|
const INITIALIZE_METHOD = SimpleParser.parseClassMember(INITIALIZE, node);
|
|
398
400
|
const DESERIALIZE_METHOD = SimpleParser.parseClassMember(DESERIALIZE, node);
|
|
401
|
+
const DESERIALIZE_SAFE_METHOD = SimpleParser.parseClassMember(DESERIALIZE_SAFE, node);
|
|
399
402
|
|
|
400
403
|
if (!node.members.find((v) => v.name.text == "__SERIALIZE"))
|
|
401
404
|
node.members.push(SERIALIZE_RAW_METHOD);
|
|
@@ -403,6 +406,8 @@ class JSONTransform extends BaseVisitor {
|
|
|
403
406
|
node.members.push(INITIALIZE_METHOD);
|
|
404
407
|
if (!node.members.find((v) => v.name.text == "__DESERIALIZE"))
|
|
405
408
|
node.members.push(DESERIALIZE_METHOD);
|
|
409
|
+
if (!node.members.find((v) => v.name.text == "__DESERIALIZE_SAFE"))
|
|
410
|
+
node.members.push(DESERIALIZE_SAFE_METHOD);
|
|
406
411
|
|
|
407
412
|
this.schemasList.push(schema);
|
|
408
413
|
}
|
|
@@ -486,7 +491,7 @@ class Property {
|
|
|
486
491
|
private right_s: string = "";
|
|
487
492
|
private right_d: string = "";
|
|
488
493
|
|
|
489
|
-
public generate(): void {
|
|
494
|
+
public generate(safe: boolean): void {
|
|
490
495
|
const name = this.name;
|
|
491
496
|
const escapedName = escapeString(JSON.stringify(this.alias || this.name));
|
|
492
497
|
const type = this.type;
|
|
@@ -503,7 +508,7 @@ class Property {
|
|
|
503
508
|
} else {
|
|
504
509
|
this.right_s = "__SERIALIZE<" + type + ">(this." + name + ")";
|
|
505
510
|
this.right_d =
|
|
506
|
-
"__DESERIALIZE<" + type + ">(data.substring(value_start, value_end))";
|
|
511
|
+
(safe ? "__DESERIALIZE_SAFE" : "__DESERIALIZE") + "<" + type + ">(data.substring(value_start, value_end))";
|
|
507
512
|
}
|
|
508
513
|
|
|
509
514
|
if (this.flags.has(PropertyFlags.OmitIf)) {
|
package/transform/tsconfig.json
CHANGED
|
@@ -1,30 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
"target": "
|
|
4
|
-
"module": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
"
|
|
9
|
-
"noImplicitAny": true,
|
|
10
|
-
"strictNullChecks": true,
|
|
11
|
-
"strictFunctionTypes": true,
|
|
12
|
-
"strictBindCallApply": true,
|
|
13
|
-
"strictPropertyInitialization": true,
|
|
14
|
-
"noImplicitThis": true,
|
|
15
|
-
"alwaysStrict": true,
|
|
16
|
-
|
|
17
|
-
"noUnusedLocals": true,
|
|
18
|
-
"noUnusedParameters": false,
|
|
19
|
-
"noImplicitReturns": true,
|
|
20
|
-
"noFallthroughCasesInSwitch": true,
|
|
21
|
-
"noUncheckedIndexedAccess": true,
|
|
22
|
-
"noPropertyAccessFromIndexSignature": true,
|
|
23
|
-
|
|
24
|
-
"moduleResolution": "node",
|
|
25
|
-
"esModuleInterop": false,
|
|
26
|
-
|
|
27
|
-
"skipLibCheck": false,
|
|
28
|
-
"forceConsistentCasingInFileNames": true
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ES2020",
|
|
5
|
+
"moduleResolution": "Node",
|
|
6
|
+
"removeComments": true,
|
|
7
|
+
"outDir": "./lib",
|
|
8
|
+
"sourceMap": true
|
|
29
9
|
}
|
|
30
10
|
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
// import { bs } from "../custom/bs";
|
|
2
|
-
// import { serializeBool, serializeBool_BS } from "../serialize/bool"
|
|
3
|
-
|
|
4
|
-
// const out = memory.data(65536);
|
|
5
|
-
|
|
6
|
-
// bench("Serialize Bool", () => {
|
|
7
|
-
// blackbox<string>(serializeBool(true));
|
|
8
|
-
// });
|
|
9
|
-
|
|
10
|
-
// bench("Serialize Bool BS", () => {
|
|
11
|
-
// serializeBool_BS(true);
|
|
12
|
-
// bs._out(out);
|
|
13
|
-
// bs.reset();
|
|
14
|
-
// });
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
// function esc_128(data: string): bool {
|
|
2
|
-
// let len = data.length;
|
|
3
|
-
|
|
4
|
-
// let running = v128.splat<i64>(0);
|
|
5
|
-
// let i = 0;
|
|
6
|
-
|
|
7
|
-
// while (i + 15 < len) {
|
|
8
|
-
// let w = v128.load(changetype<usize>(data));
|
|
9
|
-
// running = v128.or(running, v128.eq<i16>(w, i16x8.splat(34)));
|
|
10
|
-
// running = v128.or(running, v128.eq<i16>(w, i16x8.splat(92)));
|
|
11
|
-
|
|
12
|
-
// const subtracted = v128.sub<i16>(w, i8x16.splat(31));
|
|
13
|
-
// running = v128.or(running, v128.eq<i16>(subtracted, v128.splat<i64>(0)));
|
|
14
|
-
// i += 16;
|
|
15
|
-
// }
|
|
16
|
-
|
|
17
|
-
// return v128.any_true(running);
|
|
18
|
-
// }
|
|
19
|
-
|
|
20
|
-
// function esc_16(data: string): bool {
|
|
21
|
-
// let len = data.length;
|
|
22
|
-
// let b: u16 = 0;
|
|
23
|
-
// while (len--) {
|
|
24
|
-
// const c = load<u16>(changetype<usize>(data) + (len << 1));
|
|
25
|
-
// b |= u16(c < 32) | u16(c == 34) | u16(c == 92);
|
|
26
|
-
// }
|
|
27
|
-
// return bool(b);
|
|
28
|
-
// }
|
|
29
|
-
|
|
30
|
-
// bench("needs escaping 128", () => {
|
|
31
|
-
// blackbox<bool>(esc_128("hel\"o !!"));
|
|
32
|
-
// })
|
|
33
|
-
|
|
34
|
-
// bench("needs escaping 16", () => {
|
|
35
|
-
// blackbox<bool>(esc_16("hel\"o !!"));
|
|
36
|
-
// })
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
bench("UTF-16 to UTF-8", () => {
|
|
3
|
-
blackbox<ArrayBuffer>(String.UTF8.encode(blackbox<string>("hello world")));
|
|
4
|
-
});
|
|
5
|
-
// bench("Serialize String Native", () => {
|
|
6
|
-
// blackbox<string>(serializeString("hello \"world abc"));
|
|
7
|
-
// });
|
|
8
|
-
|
|
9
|
-
// bench("Serialize String Sink", () => {
|
|
10
|
-
// serializeString_BS("hello \"world abc");
|
|
11
|
-
// bs.reset();
|
|
12
|
-
// });
|
|
13
|
-
|
|
14
|
-
// bench("Serialize String SIMD", () => {
|
|
15
|
-
// serialize_simd_v1("hello \"world abc", out);
|
|
16
|
-
// })
|
package/assembly/util/strings.ts
DELETED
|
File without changes
|