json-as 1.1.2 → 1.1.3
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/.github/workflows/tests.yml +3 -1
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/assembly/__tests__/array.spec.ts +156 -90
- package/assembly/deserialize/simple/arbitrary.ts +1 -1
- package/assembly/index.ts +1 -2
- package/assembly/test.ts +164 -127
- package/index.ts +26 -1
- package/package.json +2 -1
- package/transform/lib/index.js +146 -115
- package/transform/lib/index.js.map +1 -1
- package/transform/src/index.ts +160 -117
package/transform/src/index.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { getClasses, getImportedClass } from "./linker.js";
|
|
|
10
10
|
let indent = " ";
|
|
11
11
|
|
|
12
12
|
const DEBUG = process.env["JSON_DEBUG"];
|
|
13
|
-
const STRICT = process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false";
|
|
13
|
+
const STRICT = !(process.env["JSON_STRICT"] && process.env["JSON_STRICT"] == "false");
|
|
14
14
|
|
|
15
15
|
class JSONTransform extends Visitor {
|
|
16
16
|
static SN: JSONTransform = new JSONTransform();
|
|
@@ -327,7 +327,7 @@ class JSONTransform extends Visitor {
|
|
|
327
327
|
|
|
328
328
|
// DESERIALIZE += indent + " console.log(\"data: \" + JSON.Util.ptrToStr(srcStart,srcEnd))\n";
|
|
329
329
|
DESERIALIZE += indent + " let keyStart: usize = 0;\n";
|
|
330
|
-
|
|
330
|
+
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
|
|
331
331
|
DESERIALIZE += indent + " let isKey = false;\n";
|
|
332
332
|
if (sortedMembers.object.length || sortedMembers.array.length) DESERIALIZE += indent + " let depth: i32 = 0;\n";
|
|
333
333
|
DESERIALIZE += indent + " let lastIndex: usize = 0;\n\n";
|
|
@@ -346,7 +346,7 @@ class JSONTransform extends Visitor {
|
|
|
346
346
|
DESERIALIZE += indent + " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
|
|
347
347
|
DESERIALIZE += indent + " if (isKey) {\n";
|
|
348
348
|
DESERIALIZE += indent + " keyStart = lastIndex;\n";
|
|
349
|
-
|
|
349
|
+
DESERIALIZE += indent + " keyEnd = srcStart;\n";
|
|
350
350
|
DESERIALIZE += indent + " while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) {}\n";
|
|
351
351
|
DESERIALIZE += indent + " if (code !== 58) throw new Error(\"Expected ':' after key at position \" + (srcEnd - srcStart).toString());\n";
|
|
352
352
|
DESERIALIZE += indent + " isKey = false;\n";
|
|
@@ -359,27 +359,46 @@ class JSONTransform extends Visitor {
|
|
|
359
359
|
DESERIALIZE += indent + " } else {\n";
|
|
360
360
|
// if (shouldGroup) DESERIALIZE += " const keySize = keyEnd - keyStart;\n";
|
|
361
361
|
|
|
362
|
-
const groupMembers = (members: Property[]) => {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
.
|
|
368
|
-
.sort((a, b) => (a.alias?.length || a.name.length) - (b.alias?.length || b.name.length))
|
|
369
|
-
.forEach((member) => {
|
|
370
|
-
const _nameLength = member.alias?.length || member.name.length;
|
|
371
|
-
if (_nameLength === len) {
|
|
372
|
-
sorted[sorted.length - 1].push(member);
|
|
373
|
-
} else {
|
|
374
|
-
sorted.push([member]);
|
|
375
|
-
len = _nameLength;
|
|
376
|
-
}
|
|
377
|
-
});
|
|
362
|
+
const groupMembers = (members: Property[]): Property[][] => {
|
|
363
|
+
const groups = new Map<number, Property[]>();
|
|
364
|
+
|
|
365
|
+
for (const member of members) {
|
|
366
|
+
const name = member.alias || member.name;
|
|
367
|
+
const length = name.length;
|
|
378
368
|
|
|
379
|
-
|
|
380
|
-
|
|
369
|
+
if (!groups.has(length)) {
|
|
370
|
+
groups.set(length, []);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
groups.get(length)!.push(member);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return [...groups.values()]
|
|
377
|
+
.map(group =>
|
|
378
|
+
group.sort((a, b) => {
|
|
379
|
+
const aLen = (a.alias || a.name).length;
|
|
380
|
+
const bLen = (b.alias || b.name).length;
|
|
381
|
+
return aLen - bLen;
|
|
382
|
+
})
|
|
383
|
+
)
|
|
384
|
+
.sort((a, b) => b.length - a.length);
|
|
381
385
|
};
|
|
382
386
|
|
|
387
|
+
const generateGroups = (members: Property[], cb: (group: Property[]) => void) => {
|
|
388
|
+
const groups = groupMembers(members);
|
|
389
|
+
DESERIALIZE += " switch (<u32>keyEnd - <u32>keyStart) {\n";
|
|
390
|
+
|
|
391
|
+
for (const group of groups) {
|
|
392
|
+
const groupLen = (group[0].alias || group[0].name).length << 1
|
|
393
|
+
DESERIALIZE += " case " + groupLen + ": {\n";
|
|
394
|
+
cb(group);
|
|
395
|
+
DESERIALIZE += "\n }\n";
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
DESERIALIZE += " }\n";
|
|
399
|
+
DESERIALIZE += " break;\n";
|
|
400
|
+
}
|
|
401
|
+
|
|
383
402
|
const generateComparisions = (members: Property[]) => {
|
|
384
403
|
if (members.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
385
404
|
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
@@ -400,7 +419,7 @@ class JSONTransform extends Visitor {
|
|
|
400
419
|
const complex = isStruct(members[0].type) || members[0].type != "JSON.Obj" || isArray(members[0].type);
|
|
401
420
|
const firstMemberName = members[0].alias || members[0].name;
|
|
402
421
|
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
403
|
-
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(
|
|
422
|
+
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart" + (isString(members[0].type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(members[0].name) + "));\n";
|
|
404
423
|
if (isString(members[0].type)) DESERIALIZE += indent + " srcStart += 4;\n";
|
|
405
424
|
else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n";
|
|
406
425
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
@@ -411,8 +430,8 @@ class JSONTransform extends Visitor {
|
|
|
411
430
|
const member = members[i];
|
|
412
431
|
const memberName = member.alias || member.name;
|
|
413
432
|
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
414
|
-
DESERIALIZE += indent + " store<" +
|
|
415
|
-
if (isString(
|
|
433
|
+
DESERIALIZE += indent + " store<" + member.type + ">(changetype<usize>(out), JSON.__deserialize<" + member.type + ">(lastIndex, srcStart" + (isString(member.type) ? " + 2" : "") + "), offsetof<this>(" + JSON.stringify(member.name) + "));\n";
|
|
434
|
+
if (isString(member.type)) DESERIALIZE += indent + " srcStart += 4;\n";
|
|
416
435
|
else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n";
|
|
417
436
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
418
437
|
DESERIALIZE += indent + " break;\n";
|
|
@@ -428,6 +447,7 @@ class JSONTransform extends Visitor {
|
|
|
428
447
|
|
|
429
448
|
let mbElse = " ";
|
|
430
449
|
if (sortedMembers.string.length) {
|
|
450
|
+
// generateGroups(sortedMembers.string, generateComparisions)
|
|
431
451
|
DESERIALIZE += mbElse + "if (code == 34) {\n";
|
|
432
452
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
433
453
|
DESERIALIZE += " srcStart += 2;\n";
|
|
@@ -435,7 +455,7 @@ class JSONTransform extends Visitor {
|
|
|
435
455
|
DESERIALIZE += " const code = load<u16>(srcStart);\n";
|
|
436
456
|
DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
|
|
437
457
|
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
|
|
438
|
-
|
|
458
|
+
generateGroups(sortedMembers.string, generateComparisions);
|
|
439
459
|
DESERIALIZE += " }\n"; // Close break char check
|
|
440
460
|
DESERIALIZE += " srcStart += 2;\n";
|
|
441
461
|
DESERIALIZE += " }\n"; // Close char scan loop
|
|
@@ -452,7 +472,7 @@ class JSONTransform extends Visitor {
|
|
|
452
472
|
DESERIALIZE += " if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {\n";
|
|
453
473
|
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
|
|
454
474
|
|
|
455
|
-
|
|
475
|
+
generateGroups(sortedMembers.number, generateComparisions);
|
|
456
476
|
DESERIALIZE += " }\n"; // Close break char check
|
|
457
477
|
DESERIALIZE += " srcStart += 2;\n";
|
|
458
478
|
DESERIALIZE += " }\n"; // Close char scan loop
|
|
@@ -475,7 +495,7 @@ class JSONTransform extends Visitor {
|
|
|
475
495
|
DESERIALIZE += " srcStart += 2;\n";
|
|
476
496
|
|
|
477
497
|
indent = " ";
|
|
478
|
-
|
|
498
|
+
generateGroups(sortedMembers.object, generateComparisions);
|
|
479
499
|
indent = "";
|
|
480
500
|
|
|
481
501
|
DESERIALIZE += " }\n"; // Close break char check
|
|
@@ -501,7 +521,7 @@ class JSONTransform extends Visitor {
|
|
|
501
521
|
// DESERIALIZE += " console.log(ptrToStr(keyStart,keyEnd) + \" = \" + (load<u64>(keyStart) & 0x0000FFFFFFFFFFFF) .toString());\n";
|
|
502
522
|
|
|
503
523
|
indent = " ";
|
|
504
|
-
|
|
524
|
+
generateGroups(sortedMembers.array, generateComparisions);
|
|
505
525
|
indent = "";
|
|
506
526
|
|
|
507
527
|
DESERIALIZE += " }\n"; // Close break char check
|
|
@@ -516,75 +536,97 @@ class JSONTransform extends Visitor {
|
|
|
516
536
|
DESERIALIZE += mbElse + "if (code == 116) {\n";
|
|
517
537
|
DESERIALIZE += " if (load<u64>(srcStart) == 28429475166421108) {\n";
|
|
518
538
|
DESERIALIZE += " srcStart += 8;\n";
|
|
519
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
520
|
-
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
521
|
-
}
|
|
522
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
523
|
-
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
524
|
-
}
|
|
525
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
526
|
-
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
527
|
-
}
|
|
528
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
529
|
-
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
530
|
-
}
|
|
531
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
532
|
-
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.boolean.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
533
|
-
}
|
|
534
|
-
const firstMemberName = sortedMembers.boolean[0].alias || sortedMembers.boolean[0].name;
|
|
535
|
-
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
536
|
-
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
|
|
537
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
538
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
539
|
-
DESERIALIZE += indent + " break;\n";
|
|
540
|
-
DESERIALIZE += indent + " }";
|
|
541
539
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
540
|
+
generateGroups(sortedMembers.boolean, (group) => {
|
|
541
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
542
|
+
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
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;
|
|
552
557
|
|
|
553
|
-
|
|
554
|
-
DESERIALIZE += "
|
|
555
|
-
DESERIALIZE += indent +
|
|
556
|
-
DESERIALIZE += indent + "
|
|
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";
|
|
570
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
571
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
572
|
+
DESERIALIZE += indent + " break;\n";
|
|
573
|
+
DESERIALIZE += indent + " }";
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
if (STRICT) {
|
|
577
|
+
DESERIALIZE += " else {\n";
|
|
578
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
579
|
+
DESERIALIZE += indent + " }\n";
|
|
580
|
+
}
|
|
581
|
+
});
|
|
558
582
|
|
|
559
583
|
DESERIALIZE += " }"; // Close first char check
|
|
560
584
|
mbElse = " else ";
|
|
561
585
|
DESERIALIZE += " else if (load<u64>(srcStart, 2) == 28429466576093281) {\n";
|
|
562
586
|
DESERIALIZE += " srcStart += 10;\n";
|
|
563
587
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
588
|
+
generateGroups(sortedMembers.boolean, (group) => {
|
|
589
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
590
|
+
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
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;
|
|
570
605
|
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
const memberName = member.alias || member.name;
|
|
574
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
575
|
-
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), false, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
|
|
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";
|
|
576
608
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
577
609
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
578
610
|
DESERIALIZE += indent + " break;\n";
|
|
579
611
|
DESERIALIZE += indent + " }";
|
|
580
|
-
}
|
|
581
612
|
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
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";
|
|
618
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
619
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
620
|
+
DESERIALIZE += indent + " break;\n";
|
|
621
|
+
DESERIALIZE += indent + " }";
|
|
622
|
+
}
|
|
587
623
|
|
|
624
|
+
if (STRICT) {
|
|
625
|
+
DESERIALIZE += " else {\n";
|
|
626
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
627
|
+
DESERIALIZE += indent + " }\n";
|
|
628
|
+
}
|
|
629
|
+
});
|
|
588
630
|
DESERIALIZE += " }\n"; // Close first char check
|
|
589
631
|
DESERIALIZE += " }"; // Close first char check
|
|
590
632
|
}
|
|
@@ -594,47 +636,48 @@ class JSONTransform extends Visitor {
|
|
|
594
636
|
|
|
595
637
|
DESERIALIZE += " if (load<u64>(srcStart) == 30399761348886638) {\n";
|
|
596
638
|
DESERIALIZE += " srcStart += 8;\n";
|
|
639
|
+
generateGroups(sortedMembers.null, (group) => {
|
|
640
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
641
|
+
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
642
|
+
}
|
|
643
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
644
|
+
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
645
|
+
}
|
|
646
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
647
|
+
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
648
|
+
}
|
|
649
|
+
if (group.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
650
|
+
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
651
|
+
}
|
|
652
|
+
if (group.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
653
|
+
DESERIALIZE += toMemCDecl(Math.max(...group.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
654
|
+
}
|
|
597
655
|
|
|
598
|
-
|
|
599
|
-
DESERIALIZE += "
|
|
600
|
-
|
|
601
|
-
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
602
|
-
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
603
|
-
}
|
|
604
|
-
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
605
|
-
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
606
|
-
}
|
|
607
|
-
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
608
|
-
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
609
|
-
}
|
|
610
|
-
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
611
|
-
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.null.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
const firstMemberName = sortedMembers.null[0].alias || sortedMembers.null[0].name;
|
|
615
|
-
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
616
|
-
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n";
|
|
617
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
618
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
619
|
-
DESERIALIZE += indent + " break;\n";
|
|
620
|
-
DESERIALIZE += indent + " }";
|
|
621
|
-
|
|
622
|
-
for (let i = 1; i < sortedMembers.null.length; i++) {
|
|
623
|
-
const member = sortedMembers.null[i];
|
|
624
|
-
const memberName = member.alias || member.name;
|
|
625
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
626
|
-
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n";
|
|
656
|
+
const firstMemberName = group[0].alias || group[0].name;
|
|
657
|
+
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
658
|
+
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
627
659
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
628
660
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
629
661
|
DESERIALIZE += indent + " break;\n";
|
|
630
662
|
DESERIALIZE += indent + " }";
|
|
631
|
-
}
|
|
632
663
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
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";
|
|
668
|
+
DESERIALIZE += indent + " store<" + group[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(group[0].name) + "));\n";
|
|
669
|
+
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
670
|
+
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
671
|
+
DESERIALIZE += indent + " break;\n";
|
|
672
|
+
DESERIALIZE += indent + " }";
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
if (STRICT) {
|
|
676
|
+
DESERIALIZE += " else {\n";
|
|
677
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
678
|
+
DESERIALIZE += indent + " }\n";
|
|
679
|
+
}
|
|
680
|
+
});
|
|
638
681
|
|
|
639
682
|
DESERIALIZE += " }"; // Close first char check
|
|
640
683
|
DESERIALIZE += "\n }"; // Close first char check
|