json-as 1.1.7 → 1.1.9
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.md +11 -0
- package/README.md +2 -2
- package/assembly/__benches__/large.bench.ts +214 -104
- package/assembly/__tests__/array.spec.ts +8 -5
- package/assembly/__tests__/lib/index.ts +20 -6
- package/assembly/__tests__/struct.spec.ts +2 -0
- package/assembly/__tests__/test.spec.ts +0 -119
- package/assembly/index.ts +135 -0
- package/assembly/test.ts +49 -210
- package/index.ts +1 -1
- package/lib/as-bs.ts +55 -0
- package/package.json +2 -2
- package/transform/lib/index.js +151 -48
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/types.js +1 -0
- package/transform/lib/types.js.map +1 -1
- package/transform/lib/util.js +69 -0
- package/transform/lib/util.js.map +1 -1
- package/transform/src/index.ts +300 -145
- package/transform/src/types.ts +1 -0
- package/transform/src/util.ts +67 -1
package/transform/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
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";
|
|
1
|
+
import { ClassDeclaration, FieldDeclaration, IdentifierExpression, Parser, Source, NodeKind, CommonFlags, ImportStatement, Node, Tokenizer, SourceKind, NamedTypeNode, Range, FEATURE_SIMD, FunctionExpression, MethodDeclaration, Statement, Program, Feature, CallExpression, PropertyAccessExpression } from "assemblyscript/dist/assemblyscript.js";
|
|
2
2
|
import { Transform } from "assemblyscript/dist/transform.js";
|
|
3
3
|
import { Visitor } from "./visitor.js";
|
|
4
|
-
import { isStdlib, SimpleParser, toString } from "./util.js";
|
|
4
|
+
import { cloneNode, isStdlib, replaceRef, SimpleParser, toString } from "./util.js";
|
|
5
5
|
import * as path from "path";
|
|
6
6
|
import { fileURLToPath } from "url";
|
|
7
7
|
import { Property, PropertyFlags, Schema } from "./types.js";
|
|
@@ -10,7 +10,38 @@ import { getClasses, getImportedClass } from "./linker.js";
|
|
|
10
10
|
let indent = " ";
|
|
11
11
|
|
|
12
12
|
const DEBUG = process.env["JSON_DEBUG"];
|
|
13
|
-
const STRICT =
|
|
13
|
+
const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "true";
|
|
14
|
+
|
|
15
|
+
class CustomTransform extends Visitor {
|
|
16
|
+
static SN: CustomTransform = new CustomTransform();
|
|
17
|
+
|
|
18
|
+
private modify: boolean = false;
|
|
19
|
+
visitCallExpression(node: CallExpression) {
|
|
20
|
+
super.visit(node.args, node);
|
|
21
|
+
if (node.expression.kind != NodeKind.PropertyAccess || (node.expression as PropertyAccessExpression).property.text != "stringify") return;
|
|
22
|
+
if ((node.expression as PropertyAccessExpression).expression.kind != NodeKind.Identifier || ((node.expression as PropertyAccessExpression).expression as IdentifierExpression).text != "JSON") return;
|
|
23
|
+
|
|
24
|
+
if (this.modify) {
|
|
25
|
+
(node.expression as PropertyAccessExpression).expression = Node.createPropertyAccessExpression(Node.createIdentifierExpression("JSON", node.expression.range), Node.createIdentifierExpression("internal", node.expression.range), node.expression.range);
|
|
26
|
+
}
|
|
27
|
+
this.modify = true;
|
|
28
|
+
|
|
29
|
+
// console.log(toString(node));
|
|
30
|
+
// console.log(SimpleParser.parseStatement("JSON.internal.stringify").expression.expression)
|
|
31
|
+
}
|
|
32
|
+
static visit(node: Node | Node[], ref: Node | null = null): void {
|
|
33
|
+
if (!node) return;
|
|
34
|
+
CustomTransform.SN.modify = true;
|
|
35
|
+
CustomTransform.SN.visit(node, ref);
|
|
36
|
+
CustomTransform.SN.modify = false;
|
|
37
|
+
}
|
|
38
|
+
static hasCall(node: Node | Node[]): boolean {
|
|
39
|
+
if (!node) return;
|
|
40
|
+
CustomTransform.SN.modify = false;
|
|
41
|
+
CustomTransform.SN.visit(node);
|
|
42
|
+
return CustomTransform.SN.modify;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
14
45
|
|
|
15
46
|
class JSONTransform extends Visitor {
|
|
16
47
|
static SN: JSONTransform = new JSONTransform();
|
|
@@ -61,6 +92,10 @@ class JSONTransform extends Visitor {
|
|
|
61
92
|
if (serializers.length) {
|
|
62
93
|
this.schema.custom = true;
|
|
63
94
|
const serializer = serializers[0];
|
|
95
|
+
const hasCall = CustomTransform.hasCall(serializer);
|
|
96
|
+
|
|
97
|
+
CustomTransform.visit(serializer);
|
|
98
|
+
|
|
64
99
|
// if (!serializer.signature.parameters.length) throwError("Could not find any parameters in custom serializer for " + this.schema.name + ". Serializers must have one parameter like 'serializer(self: " + this.schema.name + "): string {}'", serializer.range);
|
|
65
100
|
if (serializer.signature.parameters.length > 1) throwError("Found too many parameters in custom serializer for " + this.schema.name + ", but serializers can only accept one parameter of type '" + this.schema.name + "'!", serializer.signature.parameters[1].range);
|
|
66
101
|
if (serializer.signature.parameters.length > 0 && (<NamedTypeNode>serializer.signature.parameters[0].type).name.identifier.text != node.name.text && (<NamedTypeNode>serializer.signature.parameters[0].type).name.identifier.text != "this") throwError("Type of parameter for custom serializer does not match! It should be 'string'either be 'this' or '" + this.schema.name + "'", serializer.signature.parameters[0].type.range);
|
|
@@ -71,6 +106,7 @@ class JSONTransform extends Visitor {
|
|
|
71
106
|
}
|
|
72
107
|
SERIALIZE_CUSTOM += " __SERIALIZE(ptr: usize): void {\n";
|
|
73
108
|
SERIALIZE_CUSTOM += " const data = this." + serializer.name.text + "(" + (serializer.signature.parameters.length ? "this" : "") + ");\n";
|
|
109
|
+
if (hasCall) SERIALIZE_CUSTOM += " bs.resetState();\n";
|
|
74
110
|
SERIALIZE_CUSTOM += " const dataSize = data.length << 1;\n";
|
|
75
111
|
SERIALIZE_CUSTOM += " memory.copy(bs.offset, changetype<usize>(data), dataSize);\n";
|
|
76
112
|
SERIALIZE_CUSTOM += " bs.offset += dataSize;\n";
|
|
@@ -199,13 +235,18 @@ class JSONTransform extends Visitor {
|
|
|
199
235
|
}
|
|
200
236
|
|
|
201
237
|
for (const member of this.schema.members) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
238
|
+
if (isStruct(member.type)) {
|
|
239
|
+
const schema = this.schemas.find((v) => v.name == stripNull(member.type));
|
|
240
|
+
if (!schema) continue;
|
|
241
|
+
|
|
242
|
+
if (!this.schema.deps.includes(schema)) {
|
|
206
243
|
this.schema.deps.push(schema);
|
|
207
244
|
this.schema.byteSize += schema.byteSize;
|
|
208
245
|
}
|
|
246
|
+
|
|
247
|
+
// if (schema.custom) {
|
|
248
|
+
// member.flags.set(PropertyFlags.Custom, null);
|
|
249
|
+
// }
|
|
209
250
|
}
|
|
210
251
|
}
|
|
211
252
|
|
|
@@ -329,7 +370,7 @@ class JSONTransform extends Visitor {
|
|
|
329
370
|
DESERIALIZE += indent + " let keyStart: usize = 0;\n";
|
|
330
371
|
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
|
|
331
372
|
DESERIALIZE += indent + " let isKey = false;\n";
|
|
332
|
-
if (sortedMembers.object.length || sortedMembers.array.length) DESERIALIZE += indent + " let depth: i32 = 0;\n";
|
|
373
|
+
if (!STRICT || sortedMembers.object.length || sortedMembers.array.length) DESERIALIZE += indent + " let depth: i32 = 0;\n";
|
|
333
374
|
DESERIALIZE += indent + " let lastIndex: usize = 0;\n\n";
|
|
334
375
|
|
|
335
376
|
DESERIALIZE += indent + " while (srcStart < srcEnd && JSON.Util.isSpace(load<u16>(srcStart))) srcStart += 2;\n";
|
|
@@ -360,6 +401,11 @@ class JSONTransform extends Visitor {
|
|
|
360
401
|
// if (shouldGroup) DESERIALIZE += " const keySize = keyEnd - keyStart;\n";
|
|
361
402
|
|
|
362
403
|
const groupMembers = (members: Property[]): Property[][] => {
|
|
404
|
+
// const customMembers = this.schema.members.filter((m) => m.flags.has(PropertyFlags.Custom));
|
|
405
|
+
// console.log("Custom members: ", customMembers.map((m) => m.name));
|
|
406
|
+
|
|
407
|
+
// members.push(...customMembers)
|
|
408
|
+
|
|
363
409
|
const groups = new Map<number, Property[]>();
|
|
364
410
|
|
|
365
411
|
for (const member of members) {
|
|
@@ -374,30 +420,86 @@ class JSONTransform extends Visitor {
|
|
|
374
420
|
}
|
|
375
421
|
|
|
376
422
|
return [...groups.values()]
|
|
377
|
-
.map(group =>
|
|
423
|
+
.map((group) =>
|
|
378
424
|
group.sort((a, b) => {
|
|
379
425
|
const aLen = (a.alias || a.name).length;
|
|
380
426
|
const bLen = (b.alias || b.name).length;
|
|
381
427
|
return aLen - bLen;
|
|
382
|
-
})
|
|
428
|
+
}),
|
|
383
429
|
)
|
|
384
430
|
.sort((a, b) => b.length - a.length);
|
|
385
431
|
};
|
|
386
432
|
|
|
387
|
-
const
|
|
388
|
-
|
|
389
|
-
|
|
433
|
+
// const groupMembers = (members: Property[]): Property[][] => {
|
|
434
|
+
// const customMembers = this.schema.members.filter((m) =>
|
|
435
|
+
// m.flags.has(PropertyFlags.Custom)
|
|
436
|
+
// );
|
|
437
|
+
// console.log("Custom members: ", customMembers.map((m) => m.name));
|
|
390
438
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
cb(group);
|
|
395
|
-
DESERIALIZE += "\n }\n";
|
|
396
|
-
}
|
|
439
|
+
// const customSet = new Set(customMembers);
|
|
440
|
+
// members = members.filter((m) => !customSet.has(m));
|
|
441
|
+
// members.push(...customMembers);
|
|
397
442
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
443
|
+
// const groups = new Map<number, Property[]>();
|
|
444
|
+
|
|
445
|
+
// for (const member of members) {
|
|
446
|
+
// const name = member.alias || member.name;
|
|
447
|
+
// const length = name.length;
|
|
448
|
+
|
|
449
|
+
// if (!groups.has(length)) {
|
|
450
|
+
// groups.set(length, []);
|
|
451
|
+
// }
|
|
452
|
+
|
|
453
|
+
// groups.get(length)!.push(member);
|
|
454
|
+
// }
|
|
455
|
+
|
|
456
|
+
// return [...groups.entries()]
|
|
457
|
+
// .sort(([a], [b]) => a - b)
|
|
458
|
+
// .map(([_, group]) => {
|
|
459
|
+
// const regulars = group.filter((m) => !customSet.has(m));
|
|
460
|
+
// const customs = group.filter((m) => customSet.has(m));
|
|
461
|
+
|
|
462
|
+
// const sortByLength = (a: Property, b: Property) =>
|
|
463
|
+
// (a.alias || a.name).length - (b.alias || b.name).length;
|
|
464
|
+
|
|
465
|
+
// return [...regulars.sort(sortByLength), ...customs.sort(sortByLength)];
|
|
466
|
+
// });
|
|
467
|
+
// };
|
|
468
|
+
|
|
469
|
+
const generateGroups = (members: Property[], cb: (group: Property[]) => void, type: "string" | "array" | "object" | "number" | "boolean" | "null") => {
|
|
470
|
+
if (!members.length) {
|
|
471
|
+
if (STRICT) {
|
|
472
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
473
|
+
} else {
|
|
474
|
+
if (type == "string") DESERIALIZE += indent + " srcStart += 4;\n";
|
|
475
|
+
else DESERIALIZE += indent + " srcStart += 2;\n";
|
|
476
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
477
|
+
if (type != "boolean" && type != "null") DESERIALIZE += indent + " break;\n";
|
|
478
|
+
}
|
|
479
|
+
} else {
|
|
480
|
+
const groups = groupMembers(members);
|
|
481
|
+
DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n";
|
|
482
|
+
|
|
483
|
+
for (const group of groups) {
|
|
484
|
+
const groupLen = (group[0].alias || group[0].name).length << 1;
|
|
485
|
+
DESERIALIZE += " case " + groupLen + ": {\n";
|
|
486
|
+
cb(group);
|
|
487
|
+
DESERIALIZE += "\n }\n";
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
DESERIALIZE += " default: {\n";
|
|
491
|
+
if (STRICT) {
|
|
492
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
493
|
+
} else {
|
|
494
|
+
if (type == "string") DESERIALIZE += indent + " srcStart += 4;\n";
|
|
495
|
+
else DESERIALIZE += indent + " srcStart += 2;\n";
|
|
496
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
497
|
+
}
|
|
498
|
+
DESERIALIZE += " }\n";
|
|
499
|
+
DESERIALIZE += " }\n";
|
|
500
|
+
if (!members[0].node.type.isNullable && !isBoolean(members[0].type)) DESERIALIZE += " break;\n";
|
|
501
|
+
}
|
|
502
|
+
};
|
|
401
503
|
|
|
402
504
|
const generateComparisions = (members: Property[]) => {
|
|
403
505
|
if (members.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
@@ -440,13 +542,20 @@ class JSONTransform extends Visitor {
|
|
|
440
542
|
|
|
441
543
|
if (STRICT) {
|
|
442
544
|
DESERIALIZE += " else {\n";
|
|
443
|
-
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" +
|
|
545
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
546
|
+
DESERIALIZE += indent + " }\n";
|
|
547
|
+
} else {
|
|
548
|
+
DESERIALIZE += " else {\n";
|
|
549
|
+
if (isString(members[0].type)) DESERIALIZE += indent + " srcStart += 4;\n";
|
|
550
|
+
else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n";
|
|
551
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
552
|
+
DESERIALIZE += indent + " break;\n";
|
|
444
553
|
DESERIALIZE += indent + " }\n";
|
|
445
554
|
}
|
|
446
555
|
};
|
|
447
556
|
|
|
448
557
|
let mbElse = " ";
|
|
449
|
-
if (sortedMembers.string.length) {
|
|
558
|
+
if (!STRICT || sortedMembers.string.length) {
|
|
450
559
|
// generateGroups(sortedMembers.string, generateComparisions)
|
|
451
560
|
DESERIALIZE += mbElse + "if (code == 34) {\n";
|
|
452
561
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
@@ -455,7 +564,7 @@ class JSONTransform extends Visitor {
|
|
|
455
564
|
DESERIALIZE += " const code = load<u16>(srcStart);\n";
|
|
456
565
|
DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
|
|
457
566
|
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
|
|
458
|
-
generateGroups(sortedMembers.string, generateComparisions);
|
|
567
|
+
generateGroups(sortedMembers.string, generateComparisions, "string");
|
|
459
568
|
DESERIALIZE += " }\n"; // Close break char check
|
|
460
569
|
DESERIALIZE += " srcStart += 2;\n";
|
|
461
570
|
DESERIALIZE += " }\n"; // Close char scan loop
|
|
@@ -463,7 +572,7 @@ class JSONTransform extends Visitor {
|
|
|
463
572
|
mbElse = " else ";
|
|
464
573
|
}
|
|
465
574
|
|
|
466
|
-
if (sortedMembers.number.length) {
|
|
575
|
+
if (!STRICT || sortedMembers.number.length) {
|
|
467
576
|
DESERIALIZE += mbElse + "if (code - 48 <= 9 || code == 45) {\n";
|
|
468
577
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
469
578
|
DESERIALIZE += " srcStart += 2;\n";
|
|
@@ -472,7 +581,7 @@ class JSONTransform extends Visitor {
|
|
|
472
581
|
DESERIALIZE += " if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {\n";
|
|
473
582
|
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
|
|
474
583
|
|
|
475
|
-
generateGroups(sortedMembers.number, generateComparisions);
|
|
584
|
+
generateGroups(sortedMembers.number, generateComparisions, "number");
|
|
476
585
|
DESERIALIZE += " }\n"; // Close break char check
|
|
477
586
|
DESERIALIZE += " srcStart += 2;\n";
|
|
478
587
|
DESERIALIZE += " }\n"; // Close char scan loop
|
|
@@ -480,7 +589,7 @@ class JSONTransform extends Visitor {
|
|
|
480
589
|
mbElse = " else ";
|
|
481
590
|
}
|
|
482
591
|
|
|
483
|
-
if (sortedMembers.object.length) {
|
|
592
|
+
if (!STRICT || sortedMembers.object.length) {
|
|
484
593
|
DESERIALIZE += mbElse + "if (code == 123) {\n";
|
|
485
594
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
486
595
|
DESERIALIZE += " depth++;\n";
|
|
@@ -495,7 +604,7 @@ class JSONTransform extends Visitor {
|
|
|
495
604
|
DESERIALIZE += " srcStart += 2;\n";
|
|
496
605
|
|
|
497
606
|
indent = " ";
|
|
498
|
-
generateGroups(sortedMembers.object, generateComparisions);
|
|
607
|
+
generateGroups(sortedMembers.object, generateComparisions, "object");
|
|
499
608
|
indent = "";
|
|
500
609
|
|
|
501
610
|
DESERIALIZE += " }\n"; // Close break char check
|
|
@@ -505,7 +614,7 @@ class JSONTransform extends Visitor {
|
|
|
505
614
|
DESERIALIZE += " }"; // Close first char check
|
|
506
615
|
mbElse = " else ";
|
|
507
616
|
}
|
|
508
|
-
if (sortedMembers.array.length) {
|
|
617
|
+
if (!STRICT || sortedMembers.array.length) {
|
|
509
618
|
DESERIALIZE += mbElse + "if (code == 91) {\n";
|
|
510
619
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
511
620
|
DESERIALIZE += " depth++;\n";
|
|
@@ -521,7 +630,7 @@ class JSONTransform extends Visitor {
|
|
|
521
630
|
// DESERIALIZE += " console.log(ptrToStr(keyStart,keyEnd) + \" = \" + (load<u64>(keyStart) & 0x0000FFFFFFFFFFFF) .toString());\n";
|
|
522
631
|
|
|
523
632
|
indent = " ";
|
|
524
|
-
generateGroups(sortedMembers.array, generateComparisions);
|
|
633
|
+
generateGroups(sortedMembers.array, generateComparisions, "array");
|
|
525
634
|
indent = "";
|
|
526
635
|
|
|
527
636
|
DESERIALIZE += " }\n"; // Close break char check
|
|
@@ -532,152 +641,197 @@ class JSONTransform extends Visitor {
|
|
|
532
641
|
mbElse = " else ";
|
|
533
642
|
}
|
|
534
643
|
|
|
535
|
-
if (sortedMembers.boolean.length) {
|
|
644
|
+
if (!STRICT || sortedMembers.boolean.length) {
|
|
645
|
+
// TRUE
|
|
536
646
|
DESERIALIZE += mbElse + "if (code == 116) {\n";
|
|
647
|
+
|
|
537
648
|
DESERIALIZE += " if (load<u64>(srcStart) == 28429475166421108) {\n";
|
|
538
649
|
DESERIALIZE += " srcStart += 8;\n";
|
|
650
|
+
generateGroups(
|
|
651
|
+
sortedMembers.boolean,
|
|
652
|
+
(group) => {
|
|
653
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
654
|
+
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
655
|
+
}
|
|
656
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
657
|
+
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
658
|
+
}
|
|
659
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
660
|
+
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
661
|
+
}
|
|
662
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
663
|
+
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
664
|
+
}
|
|
665
|
+
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
666
|
+
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
667
|
+
}
|
|
539
668
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
DESERIALIZE += "
|
|
543
|
-
}
|
|
544
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
545
|
-
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
546
|
-
}
|
|
547
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
548
|
-
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
549
|
-
}
|
|
550
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
551
|
-
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
552
|
-
}
|
|
553
|
-
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
554
|
-
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
555
|
-
}
|
|
556
|
-
const firstMemberName = group[0].alias || group[0].name;
|
|
557
|
-
|
|
558
|
-
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
559
|
-
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
560
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
561
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
562
|
-
DESERIALIZE += indent + " break;\n";
|
|
563
|
-
DESERIALIZE += indent + " }";
|
|
564
|
-
|
|
565
|
-
for (let i = 1; i < group.length; i++) {
|
|
566
|
-
const member = group[i];
|
|
567
|
-
const memberName = member.alias || member.name;
|
|
568
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
569
|
-
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
|
|
669
|
+
const firstMemberName = group[0].alias || group[0].name;
|
|
670
|
+
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
671
|
+
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
570
672
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
571
673
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
572
674
|
DESERIALIZE += indent + " break;\n";
|
|
573
675
|
DESERIALIZE += indent + " }";
|
|
574
|
-
}
|
|
575
676
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
677
|
+
for (let i = 1; i < group.length; i++) {
|
|
678
|
+
const member = group[i];
|
|
679
|
+
const memberName = member.alias || member.name;
|
|
680
|
+
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
681
|
+
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
|
|
682
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
683
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
684
|
+
DESERIALIZE += indent + " break;\n";
|
|
685
|
+
DESERIALIZE += indent + " }";
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
if (STRICT) {
|
|
689
|
+
DESERIALIZE += " else {\n";
|
|
690
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
691
|
+
DESERIALIZE += indent + " }\n";
|
|
692
|
+
} else {
|
|
693
|
+
DESERIALIZE += " else { \n";
|
|
694
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
695
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
696
|
+
DESERIALIZE += indent + " break;\n";
|
|
697
|
+
DESERIALIZE += indent + " }\n";
|
|
698
|
+
}
|
|
699
|
+
},
|
|
700
|
+
"boolean",
|
|
701
|
+
);
|
|
582
702
|
|
|
583
703
|
DESERIALIZE += " }"; // Close first char check
|
|
704
|
+
DESERIALIZE += " else {\n";
|
|
705
|
+
DESERIALIZE += " throw new Error(\"Expected to find 'true' but found '\" + JSON.Util.ptrToStr(lastIndex, srcStart) + \"' instead at position \" + (srcEnd - srcStart).toString());\n";
|
|
706
|
+
DESERIALIZE += " }"; // Close error check
|
|
707
|
+
DESERIALIZE += "\n }"; // Close first char check
|
|
708
|
+
|
|
584
709
|
mbElse = " else ";
|
|
585
|
-
|
|
710
|
+
|
|
711
|
+
// FALSE
|
|
712
|
+
DESERIALIZE += mbElse + "if (code == 102) {\n";
|
|
713
|
+
|
|
714
|
+
DESERIALIZE += " if (load<u64>(srcStart, 2) == 28429466576093281) {\n";
|
|
586
715
|
DESERIALIZE += " srcStart += 10;\n";
|
|
716
|
+
generateGroups(
|
|
717
|
+
sortedMembers.boolean,
|
|
718
|
+
(group) => {
|
|
719
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
720
|
+
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
721
|
+
}
|
|
722
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
723
|
+
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
724
|
+
}
|
|
725
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
726
|
+
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
727
|
+
}
|
|
728
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
729
|
+
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
730
|
+
}
|
|
731
|
+
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
732
|
+
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
733
|
+
}
|
|
587
734
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
DESERIALIZE += "
|
|
591
|
-
}
|
|
592
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
593
|
-
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
594
|
-
}
|
|
595
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
596
|
-
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
597
|
-
}
|
|
598
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
599
|
-
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
600
|
-
}
|
|
601
|
-
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
602
|
-
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
603
|
-
}
|
|
604
|
-
const firstMemberName = group[0].alias || group[0].name;
|
|
605
|
-
|
|
606
|
-
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
607
|
-
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
608
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
609
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
610
|
-
DESERIALIZE += indent + " break;\n";
|
|
611
|
-
DESERIALIZE += indent + " }";
|
|
612
|
-
|
|
613
|
-
for (let i = 1; i < group.length; i++) {
|
|
614
|
-
const member = group[i];
|
|
615
|
-
const memberName = member.alias || member.name;
|
|
616
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
617
|
-
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
|
|
735
|
+
const firstMemberName = group[0].alias || group[0].name;
|
|
736
|
+
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
737
|
+
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
618
738
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
619
739
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
620
740
|
DESERIALIZE += indent + " break;\n";
|
|
621
741
|
DESERIALIZE += indent + " }";
|
|
622
|
-
}
|
|
623
742
|
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
743
|
+
for (let i = 1; i < group.length; i++) {
|
|
744
|
+
const member = group[i];
|
|
745
|
+
const memberName = member.alias || member.name;
|
|
746
|
+
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
747
|
+
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
|
|
748
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
749
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
750
|
+
DESERIALIZE += indent + " break;\n";
|
|
751
|
+
DESERIALIZE += indent + " }";
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
if (STRICT) {
|
|
755
|
+
DESERIALIZE += " else {\n";
|
|
756
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
757
|
+
DESERIALIZE += indent + " }\n";
|
|
758
|
+
} else {
|
|
759
|
+
DESERIALIZE += " else { \n";
|
|
760
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
761
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
762
|
+
DESERIALIZE += indent + " break;\n";
|
|
763
|
+
DESERIALIZE += indent + " }\n";
|
|
764
|
+
}
|
|
765
|
+
},
|
|
766
|
+
"boolean",
|
|
767
|
+
);
|
|
768
|
+
|
|
769
|
+
DESERIALIZE += " }"; // Close first char check
|
|
770
|
+
DESERIALIZE += " else {\n";
|
|
771
|
+
DESERIALIZE += " throw new Error(\"Expected to find 'false' but found '\" + JSON.Util.ptrToStr(lastIndex, srcStart) + \"' instead at position \" + (srcEnd - srcStart).toString());\n";
|
|
772
|
+
DESERIALIZE += " }"; // Close error check
|
|
773
|
+
DESERIALIZE += "\n }"; // Close first char check
|
|
774
|
+
|
|
775
|
+
mbElse = " else ";
|
|
632
776
|
}
|
|
633
777
|
|
|
634
|
-
if (sortedMembers.null.length) {
|
|
778
|
+
if (!STRICT || sortedMembers.null.length) {
|
|
635
779
|
DESERIALIZE += mbElse + "if (code == 110) {\n";
|
|
636
780
|
|
|
637
781
|
DESERIALIZE += " if (load<u64>(srcStart) == 30399761348886638) {\n";
|
|
638
782
|
DESERIALIZE += " srcStart += 8;\n";
|
|
639
|
-
generateGroups(
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
783
|
+
generateGroups(
|
|
784
|
+
sortedMembers.null,
|
|
785
|
+
(group) => {
|
|
786
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
787
|
+
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
788
|
+
}
|
|
789
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
790
|
+
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
791
|
+
}
|
|
792
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
793
|
+
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
794
|
+
}
|
|
795
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
796
|
+
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
797
|
+
}
|
|
798
|
+
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
799
|
+
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
800
|
+
}
|
|
655
801
|
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
659
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
660
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
661
|
-
DESERIALIZE += indent + " break;\n";
|
|
662
|
-
DESERIALIZE += indent + " }";
|
|
663
|
-
|
|
664
|
-
for (let i = 1; i < group.length; i++) {
|
|
665
|
-
const member = group[i];
|
|
666
|
-
const memberName = member.alias || member.name;
|
|
667
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
802
|
+
const firstMemberName = group[0].alias || group[0].name;
|
|
803
|
+
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
668
804
|
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
669
805
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
670
806
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
671
807
|
DESERIALIZE += indent + " break;\n";
|
|
672
808
|
DESERIALIZE += indent + " }";
|
|
673
|
-
}
|
|
674
809
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
810
|
+
for (let i = 1; i < group.length; i++) {
|
|
811
|
+
const member = group[i];
|
|
812
|
+
const memberName = member.alias || member.name;
|
|
813
|
+
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
814
|
+
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(member.name) + "));\n";
|
|
815
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
816
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
817
|
+
DESERIALIZE += indent + " break;\n";
|
|
818
|
+
DESERIALIZE += indent + " }";
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
if (STRICT) {
|
|
822
|
+
DESERIALIZE += " else {\n";
|
|
823
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key value pair in JSON object \'" + JSON.Util.ptrToStr(keyStart, keyEnd) + ":" + JSON.Util.ptrToStr(lastIndex, srcStart) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
824
|
+
DESERIALIZE += indent + " }\n";
|
|
825
|
+
} else {
|
|
826
|
+
DESERIALIZE += " else { \n";
|
|
827
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
828
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
829
|
+
DESERIALIZE += indent + " break;\n";
|
|
830
|
+
DESERIALIZE += indent + " }\n";
|
|
831
|
+
}
|
|
832
|
+
},
|
|
833
|
+
"null",
|
|
834
|
+
);
|
|
681
835
|
|
|
682
836
|
DESERIALIZE += " }"; // Close first char check
|
|
683
837
|
DESERIALIZE += "\n }"; // Close first char check
|
|
@@ -687,6 +841,7 @@ class JSONTransform extends Visitor {
|
|
|
687
841
|
|
|
688
842
|
DESERIALIZE += " else {\n";
|
|
689
843
|
DESERIALIZE += " srcStart += 2;\n";
|
|
844
|
+
DESERIALIZE += " keyStart = 0;\n";
|
|
690
845
|
DESERIALIZE += "}\n";
|
|
691
846
|
DESERIALIZE += "\n }\n"; // Close value portion
|
|
692
847
|
|