json-as 1.1.8 → 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 +7 -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 +2 -2
- package/assembly/test.ts +52 -287
- package/index.ts +1 -1
- package/package.json +1 -1
- package/transform/lib/index.js +113 -44
- package/transform/lib/index.js.map +1 -1
- package/transform/lib/util.js.map +1 -1
- package/transform/src/index.ts +216 -149
- package/transform/src/types.ts +1 -1
- package/transform/src/util.ts +5 -16
package/transform/src/index.ts
CHANGED
|
@@ -10,27 +10,22 @@ 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
14
|
|
|
15
15
|
class CustomTransform extends Visitor {
|
|
16
16
|
static SN: CustomTransform = new CustomTransform();
|
|
17
17
|
|
|
18
18
|
private modify: boolean = false;
|
|
19
19
|
visitCallExpression(node: CallExpression) {
|
|
20
|
-
|
|
21
20
|
super.visit(node.args, node);
|
|
22
21
|
if (node.expression.kind != NodeKind.PropertyAccess || (node.expression as PropertyAccessExpression).property.text != "stringify") return;
|
|
23
22
|
if ((node.expression as PropertyAccessExpression).expression.kind != NodeKind.Identifier || ((node.expression as PropertyAccessExpression).expression as IdentifierExpression).text != "JSON") return;
|
|
24
23
|
|
|
25
24
|
if (this.modify) {
|
|
26
|
-
(node.expression as PropertyAccessExpression).expression = Node.createPropertyAccessExpression(
|
|
27
|
-
Node.createIdentifierExpression("JSON", node.expression.range),
|
|
28
|
-
Node.createIdentifierExpression("internal", node.expression.range),
|
|
29
|
-
node.expression.range
|
|
30
|
-
);
|
|
25
|
+
(node.expression as PropertyAccessExpression).expression = Node.createPropertyAccessExpression(Node.createIdentifierExpression("JSON", node.expression.range), Node.createIdentifierExpression("internal", node.expression.range), node.expression.range);
|
|
31
26
|
}
|
|
32
27
|
this.modify = true;
|
|
33
|
-
|
|
28
|
+
|
|
34
29
|
// console.log(toString(node));
|
|
35
30
|
// console.log(SimpleParser.parseStatement("JSON.internal.stringify").expression.expression)
|
|
36
31
|
}
|
|
@@ -98,7 +93,7 @@ class JSONTransform extends Visitor {
|
|
|
98
93
|
this.schema.custom = true;
|
|
99
94
|
const serializer = serializers[0];
|
|
100
95
|
const hasCall = CustomTransform.hasCall(serializer);
|
|
101
|
-
|
|
96
|
+
|
|
102
97
|
CustomTransform.visit(serializer);
|
|
103
98
|
|
|
104
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);
|
|
@@ -375,7 +370,7 @@ class JSONTransform extends Visitor {
|
|
|
375
370
|
DESERIALIZE += indent + " let keyStart: usize = 0;\n";
|
|
376
371
|
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
|
|
377
372
|
DESERIALIZE += indent + " let isKey = false;\n";
|
|
378
|
-
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";
|
|
379
374
|
DESERIALIZE += indent + " let lastIndex: usize = 0;\n\n";
|
|
380
375
|
|
|
381
376
|
DESERIALIZE += indent + " while (srcStart < srcEnd && JSON.Util.isSpace(load<u16>(srcStart))) srcStart += 2;\n";
|
|
@@ -425,12 +420,12 @@ class JSONTransform extends Visitor {
|
|
|
425
420
|
}
|
|
426
421
|
|
|
427
422
|
return [...groups.values()]
|
|
428
|
-
.map(group =>
|
|
423
|
+
.map((group) =>
|
|
429
424
|
group.sort((a, b) => {
|
|
430
425
|
const aLen = (a.alias || a.name).length;
|
|
431
426
|
const bLen = (b.alias || b.name).length;
|
|
432
427
|
return aLen - bLen;
|
|
433
|
-
})
|
|
428
|
+
}),
|
|
434
429
|
)
|
|
435
430
|
.sort((a, b) => b.length - a.length);
|
|
436
431
|
};
|
|
@@ -471,21 +466,40 @@ class JSONTransform extends Visitor {
|
|
|
471
466
|
// });
|
|
472
467
|
// };
|
|
473
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
|
+
}
|
|
474
489
|
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
DESERIALIZE += "
|
|
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";
|
|
484
501
|
}
|
|
485
|
-
|
|
486
|
-
DESERIALIZE += " }\n";
|
|
487
|
-
if (!members[0].node.type.isNullable && !isBoolean(members[0].type)) DESERIALIZE += " break;\n";
|
|
488
|
-
}
|
|
502
|
+
};
|
|
489
503
|
|
|
490
504
|
const generateComparisions = (members: Property[]) => {
|
|
491
505
|
if (members.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
@@ -528,13 +542,20 @@ class JSONTransform extends Visitor {
|
|
|
528
542
|
|
|
529
543
|
if (STRICT) {
|
|
530
544
|
DESERIALIZE += " else {\n";
|
|
531
|
-
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";
|
|
532
553
|
DESERIALIZE += indent + " }\n";
|
|
533
554
|
}
|
|
534
555
|
};
|
|
535
556
|
|
|
536
557
|
let mbElse = " ";
|
|
537
|
-
if (sortedMembers.string.length) {
|
|
558
|
+
if (!STRICT || sortedMembers.string.length) {
|
|
538
559
|
// generateGroups(sortedMembers.string, generateComparisions)
|
|
539
560
|
DESERIALIZE += mbElse + "if (code == 34) {\n";
|
|
540
561
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
@@ -543,7 +564,7 @@ class JSONTransform extends Visitor {
|
|
|
543
564
|
DESERIALIZE += " const code = load<u16>(srcStart);\n";
|
|
544
565
|
DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
|
|
545
566
|
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
|
|
546
|
-
generateGroups(sortedMembers.string, generateComparisions);
|
|
567
|
+
generateGroups(sortedMembers.string, generateComparisions, "string");
|
|
547
568
|
DESERIALIZE += " }\n"; // Close break char check
|
|
548
569
|
DESERIALIZE += " srcStart += 2;\n";
|
|
549
570
|
DESERIALIZE += " }\n"; // Close char scan loop
|
|
@@ -551,7 +572,7 @@ class JSONTransform extends Visitor {
|
|
|
551
572
|
mbElse = " else ";
|
|
552
573
|
}
|
|
553
574
|
|
|
554
|
-
if (sortedMembers.number.length) {
|
|
575
|
+
if (!STRICT || sortedMembers.number.length) {
|
|
555
576
|
DESERIALIZE += mbElse + "if (code - 48 <= 9 || code == 45) {\n";
|
|
556
577
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
557
578
|
DESERIALIZE += " srcStart += 2;\n";
|
|
@@ -560,7 +581,7 @@ class JSONTransform extends Visitor {
|
|
|
560
581
|
DESERIALIZE += " if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {\n";
|
|
561
582
|
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
|
|
562
583
|
|
|
563
|
-
generateGroups(sortedMembers.number, generateComparisions);
|
|
584
|
+
generateGroups(sortedMembers.number, generateComparisions, "number");
|
|
564
585
|
DESERIALIZE += " }\n"; // Close break char check
|
|
565
586
|
DESERIALIZE += " srcStart += 2;\n";
|
|
566
587
|
DESERIALIZE += " }\n"; // Close char scan loop
|
|
@@ -568,7 +589,7 @@ class JSONTransform extends Visitor {
|
|
|
568
589
|
mbElse = " else ";
|
|
569
590
|
}
|
|
570
591
|
|
|
571
|
-
if (sortedMembers.object.length) {
|
|
592
|
+
if (!STRICT || sortedMembers.object.length) {
|
|
572
593
|
DESERIALIZE += mbElse + "if (code == 123) {\n";
|
|
573
594
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
574
595
|
DESERIALIZE += " depth++;\n";
|
|
@@ -583,7 +604,7 @@ class JSONTransform extends Visitor {
|
|
|
583
604
|
DESERIALIZE += " srcStart += 2;\n";
|
|
584
605
|
|
|
585
606
|
indent = " ";
|
|
586
|
-
generateGroups(sortedMembers.object, generateComparisions);
|
|
607
|
+
generateGroups(sortedMembers.object, generateComparisions, "object");
|
|
587
608
|
indent = "";
|
|
588
609
|
|
|
589
610
|
DESERIALIZE += " }\n"; // Close break char check
|
|
@@ -593,7 +614,7 @@ class JSONTransform extends Visitor {
|
|
|
593
614
|
DESERIALIZE += " }"; // Close first char check
|
|
594
615
|
mbElse = " else ";
|
|
595
616
|
}
|
|
596
|
-
if (sortedMembers.array.length) {
|
|
617
|
+
if (!STRICT || sortedMembers.array.length) {
|
|
597
618
|
DESERIALIZE += mbElse + "if (code == 91) {\n";
|
|
598
619
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
599
620
|
DESERIALIZE += " depth++;\n";
|
|
@@ -609,7 +630,7 @@ class JSONTransform extends Visitor {
|
|
|
609
630
|
// DESERIALIZE += " console.log(ptrToStr(keyStart,keyEnd) + \" = \" + (load<u64>(keyStart) & 0x0000FFFFFFFFFFFF) .toString());\n";
|
|
610
631
|
|
|
611
632
|
indent = " ";
|
|
612
|
-
generateGroups(sortedMembers.array, generateComparisions);
|
|
633
|
+
generateGroups(sortedMembers.array, generateComparisions, "array");
|
|
613
634
|
indent = "";
|
|
614
635
|
|
|
615
636
|
DESERIALIZE += " }\n"; // Close break char check
|
|
@@ -620,152 +641,197 @@ class JSONTransform extends Visitor {
|
|
|
620
641
|
mbElse = " else ";
|
|
621
642
|
}
|
|
622
643
|
|
|
623
|
-
if (sortedMembers.boolean.length) {
|
|
644
|
+
if (!STRICT || sortedMembers.boolean.length) {
|
|
645
|
+
// TRUE
|
|
624
646
|
DESERIALIZE += mbElse + "if (code == 116) {\n";
|
|
647
|
+
|
|
625
648
|
DESERIALIZE += " if (load<u64>(srcStart) == 28429475166421108) {\n";
|
|
626
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
|
+
}
|
|
627
668
|
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
DESERIALIZE += "
|
|
631
|
-
}
|
|
632
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
633
|
-
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
634
|
-
}
|
|
635
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
636
|
-
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
637
|
-
}
|
|
638
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
639
|
-
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
640
|
-
}
|
|
641
|
-
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
642
|
-
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
643
|
-
}
|
|
644
|
-
const firstMemberName = group[0].alias || group[0].name;
|
|
645
|
-
|
|
646
|
-
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
647
|
-
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
648
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
649
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
650
|
-
DESERIALIZE += indent + " break;\n";
|
|
651
|
-
DESERIALIZE += indent + " }";
|
|
652
|
-
|
|
653
|
-
for (let i = 1; i < group.length; i++) {
|
|
654
|
-
const member = group[i];
|
|
655
|
-
const memberName = member.alias || member.name;
|
|
656
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
657
|
-
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";
|
|
658
672
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
659
673
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
660
674
|
DESERIALIZE += indent + " break;\n";
|
|
661
675
|
DESERIALIZE += indent + " }";
|
|
662
|
-
}
|
|
663
676
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
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
|
+
);
|
|
670
702
|
|
|
671
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
|
+
|
|
672
709
|
mbElse = " else ";
|
|
673
|
-
|
|
710
|
+
|
|
711
|
+
// FALSE
|
|
712
|
+
DESERIALIZE += mbElse + "if (code == 102) {\n";
|
|
713
|
+
|
|
714
|
+
DESERIALIZE += " if (load<u64>(srcStart, 2) == 28429466576093281) {\n";
|
|
674
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
|
+
}
|
|
675
734
|
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
DESERIALIZE += "
|
|
679
|
-
}
|
|
680
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
681
|
-
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
682
|
-
}
|
|
683
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
684
|
-
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
685
|
-
}
|
|
686
|
-
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
687
|
-
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
688
|
-
}
|
|
689
|
-
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
690
|
-
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
691
|
-
}
|
|
692
|
-
const firstMemberName = group[0].alias || group[0].name;
|
|
693
|
-
|
|
694
|
-
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
695
|
-
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
696
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
697
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
698
|
-
DESERIALIZE += indent + " break;\n";
|
|
699
|
-
DESERIALIZE += indent + " }";
|
|
700
|
-
|
|
701
|
-
for (let i = 1; i < group.length; i++) {
|
|
702
|
-
const member = group[i];
|
|
703
|
-
const memberName = member.alias || member.name;
|
|
704
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
705
|
-
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";
|
|
706
738
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
707
739
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
708
740
|
DESERIALIZE += indent + " break;\n";
|
|
709
741
|
DESERIALIZE += indent + " }";
|
|
710
|
-
}
|
|
711
742
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
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 ";
|
|
720
776
|
}
|
|
721
777
|
|
|
722
|
-
if (sortedMembers.null.length) {
|
|
778
|
+
if (!STRICT || sortedMembers.null.length) {
|
|
723
779
|
DESERIALIZE += mbElse + "if (code == 110) {\n";
|
|
724
780
|
|
|
725
781
|
DESERIALIZE += " if (load<u64>(srcStart) == 30399761348886638) {\n";
|
|
726
782
|
DESERIALIZE += " srcStart += 8;\n";
|
|
727
|
-
generateGroups(
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
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
|
+
}
|
|
743
801
|
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
747
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
748
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
749
|
-
DESERIALIZE += indent + " break;\n";
|
|
750
|
-
DESERIALIZE += indent + " }";
|
|
751
|
-
|
|
752
|
-
for (let i = 1; i < group.length; i++) {
|
|
753
|
-
const member = group[i];
|
|
754
|
-
const memberName = member.alias || member.name;
|
|
755
|
-
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";
|
|
756
804
|
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
757
805
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
758
806
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
759
807
|
DESERIALIZE += indent + " break;\n";
|
|
760
808
|
DESERIALIZE += indent + " }";
|
|
761
|
-
}
|
|
762
809
|
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
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
|
+
);
|
|
769
835
|
|
|
770
836
|
DESERIALIZE += " }"; // Close first char check
|
|
771
837
|
DESERIALIZE += "\n }"; // Close first char check
|
|
@@ -775,6 +841,7 @@ class JSONTransform extends Visitor {
|
|
|
775
841
|
|
|
776
842
|
DESERIALIZE += " else {\n";
|
|
777
843
|
DESERIALIZE += " srcStart += 2;\n";
|
|
844
|
+
DESERIALIZE += " keyStart = 0;\n";
|
|
778
845
|
DESERIALIZE += "}\n";
|
|
779
846
|
DESERIALIZE += "\n }\n"; // Close value portion
|
|
780
847
|
|
|
@@ -1188,4 +1255,4 @@ function getComparision(data: string) {
|
|
|
1188
1255
|
return toMemCCheck(data);
|
|
1189
1256
|
}
|
|
1190
1257
|
}
|
|
1191
|
-
}
|
|
1258
|
+
}
|
package/transform/src/types.ts
CHANGED
package/transform/src/util.ts
CHANGED
|
@@ -55,11 +55,7 @@ export function toString(node: Node): string {
|
|
|
55
55
|
return ASTBuilder.build(node);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
export function replaceRef(
|
|
59
|
-
node: Node,
|
|
60
|
-
replacement: Node | Node[],
|
|
61
|
-
ref: Node | Node[] | null,
|
|
62
|
-
): void {
|
|
58
|
+
export function replaceRef(node: Node, replacement: Node | Node[], ref: Node | Node[] | null): void {
|
|
63
59
|
if (!node || !ref) return;
|
|
64
60
|
const nodeExpr = stripExpr(node);
|
|
65
61
|
|
|
@@ -77,8 +73,7 @@ export function replaceRef(
|
|
|
77
73
|
if (Array.isArray(current)) {
|
|
78
74
|
for (let i = 0; i < current.length; i++) {
|
|
79
75
|
if (stripExpr(current[i]) === nodeExpr) {
|
|
80
|
-
if (Array.isArray(replacement))
|
|
81
|
-
current.splice(i, 1, ...replacement);
|
|
76
|
+
if (Array.isArray(replacement)) current.splice(i, 1, ...replacement);
|
|
82
77
|
else current.splice(i, 1, replacement);
|
|
83
78
|
return;
|
|
84
79
|
}
|
|
@@ -91,17 +86,11 @@ export function replaceRef(
|
|
|
91
86
|
}
|
|
92
87
|
}
|
|
93
88
|
|
|
94
|
-
export function cloneNode(
|
|
95
|
-
input: Node | Node[] | null,
|
|
96
|
-
seen = new WeakMap(),
|
|
97
|
-
path = "",
|
|
98
|
-
): Node | Node[] | null {
|
|
89
|
+
export function cloneNode(input: Node | Node[] | null, seen = new WeakMap(), path = ""): Node | Node[] | null {
|
|
99
90
|
if (input === null || typeof input !== "object") return input;
|
|
100
91
|
|
|
101
92
|
if (Array.isArray(input)) {
|
|
102
|
-
return input.map((item, index) =>
|
|
103
|
-
cloneNode(item, seen, `${path}[${index}]`),
|
|
104
|
-
) as Node | Node[] | null;
|
|
93
|
+
return input.map((item, index) => cloneNode(item, seen, `${path}[${index}]`)) as Node | Node[] | null;
|
|
105
94
|
}
|
|
106
95
|
|
|
107
96
|
if (seen.has(input)) return seen.get(input);
|
|
@@ -130,4 +119,4 @@ export function stripExpr(node: Node): Node {
|
|
|
130
119
|
if (!node) return node;
|
|
131
120
|
if (node.kind == NodeKind.Expression) return node["expression"];
|
|
132
121
|
return node;
|
|
133
|
-
}
|
|
122
|
+
}
|