json-as 1.1.1 → 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/.prettierignore +4 -1
- package/CHANGELOG.md +11 -1
- package/README.md +1 -1
- package/assembly/__tests__/array.spec.ts +156 -90
- package/assembly/__tests__/hierarchy.spec.ts +10 -4
- package/assembly/deserialize/simple/arbitrary.ts +1 -1
- package/assembly/index.ts +2 -3
- package/assembly/test.ts +49 -3
- package/index.ts +26 -1
- package/package.json +3 -2
- package/transform/lib/index.js +154 -113
- package/transform/lib/index.js.map +1 -1
- package/transform/src/index.ts +167 -115
package/transform/src/index.ts
CHANGED
|
@@ -10,6 +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
14
|
|
|
14
15
|
class JSONTransform extends Visitor {
|
|
15
16
|
static SN: JSONTransform = new JSONTransform();
|
|
@@ -326,7 +327,7 @@ class JSONTransform extends Visitor {
|
|
|
326
327
|
|
|
327
328
|
// DESERIALIZE += indent + " console.log(\"data: \" + JSON.Util.ptrToStr(srcStart,srcEnd))\n";
|
|
328
329
|
DESERIALIZE += indent + " let keyStart: usize = 0;\n";
|
|
329
|
-
|
|
330
|
+
DESERIALIZE += indent + " let keyEnd: usize = 0;\n";
|
|
330
331
|
DESERIALIZE += indent + " let isKey = false;\n";
|
|
331
332
|
if (sortedMembers.object.length || sortedMembers.array.length) DESERIALIZE += indent + " let depth: i32 = 0;\n";
|
|
332
333
|
DESERIALIZE += indent + " let lastIndex: usize = 0;\n\n";
|
|
@@ -345,7 +346,7 @@ class JSONTransform extends Visitor {
|
|
|
345
346
|
DESERIALIZE += indent + " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
|
|
346
347
|
DESERIALIZE += indent + " if (isKey) {\n";
|
|
347
348
|
DESERIALIZE += indent + " keyStart = lastIndex;\n";
|
|
348
|
-
|
|
349
|
+
DESERIALIZE += indent + " keyEnd = srcStart;\n";
|
|
349
350
|
DESERIALIZE += indent + " while (JSON.Util.isSpace((code = load<u16>((srcStart += 2))))) {}\n";
|
|
350
351
|
DESERIALIZE += indent + " if (code !== 58) throw new Error(\"Expected ':' after key at position \" + (srcEnd - srcStart).toString());\n";
|
|
351
352
|
DESERIALIZE += indent + " isKey = false;\n";
|
|
@@ -358,27 +359,46 @@ class JSONTransform extends Visitor {
|
|
|
358
359
|
DESERIALIZE += indent + " } else {\n";
|
|
359
360
|
// if (shouldGroup) DESERIALIZE += " const keySize = keyEnd - keyStart;\n";
|
|
360
361
|
|
|
361
|
-
const groupMembers = (members: Property[]) => {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
.
|
|
367
|
-
.sort((a, b) => (a.alias?.length || a.name.length) - (b.alias?.length || b.name.length))
|
|
368
|
-
.forEach((member) => {
|
|
369
|
-
const _nameLength = member.alias?.length || member.name.length;
|
|
370
|
-
if (_nameLength === len) {
|
|
371
|
-
sorted[sorted.length - 1].push(member);
|
|
372
|
-
} else {
|
|
373
|
-
sorted.push([member]);
|
|
374
|
-
len = _nameLength;
|
|
375
|
-
}
|
|
376
|
-
});
|
|
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;
|
|
377
368
|
|
|
378
|
-
|
|
379
|
-
|
|
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);
|
|
380
385
|
};
|
|
381
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
|
+
|
|
382
402
|
const generateComparisions = (members: Property[]) => {
|
|
383
403
|
if (members.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
384
404
|
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
@@ -399,8 +419,9 @@ class JSONTransform extends Visitor {
|
|
|
399
419
|
const complex = isStruct(members[0].type) || members[0].type != "JSON.Obj" || isArray(members[0].type);
|
|
400
420
|
const firstMemberName = members[0].alias || members[0].name;
|
|
401
421
|
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
402
|
-
DESERIALIZE += indent + " store<" + members[0].type + ">(changetype<usize>(out), JSON.__deserialize<" + members[0].type + ">(lastIndex, srcStart), offsetof<this>(" + JSON.stringify(
|
|
403
|
-
if (
|
|
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";
|
|
423
|
+
if (isString(members[0].type)) DESERIALIZE += indent + " srcStart += 4;\n";
|
|
424
|
+
else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n";
|
|
404
425
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
405
426
|
DESERIALIZE += indent + " break;\n";
|
|
406
427
|
DESERIALIZE += indent + " }";
|
|
@@ -409,30 +430,32 @@ class JSONTransform extends Visitor {
|
|
|
409
430
|
const member = members[i];
|
|
410
431
|
const memberName = member.alias || member.name;
|
|
411
432
|
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
412
|
-
DESERIALIZE += indent + " store<" +
|
|
413
|
-
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";
|
|
414
435
|
else if (!complex) DESERIALIZE += indent + " srcStart += 2;\n";
|
|
415
436
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
416
437
|
DESERIALIZE += indent + " break;\n";
|
|
417
438
|
DESERIALIZE += indent + " }";
|
|
418
439
|
}
|
|
419
440
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
441
|
+
if (STRICT) {
|
|
442
|
+
DESERIALIZE += " else {\n";
|
|
443
|
+
DESERIALIZE += indent + ' throw new Error("Unexpected key in JSON object \'" + String.fromCharCode(load<u16>(srcStart)) + "\' at position " + (srcEnd - srcStart).toString());\n';
|
|
444
|
+
DESERIALIZE += indent + " }\n";
|
|
445
|
+
}
|
|
423
446
|
};
|
|
424
447
|
|
|
425
448
|
let mbElse = " ";
|
|
426
449
|
if (sortedMembers.string.length) {
|
|
450
|
+
// generateGroups(sortedMembers.string, generateComparisions)
|
|
427
451
|
DESERIALIZE += mbElse + "if (code == 34) {\n";
|
|
428
452
|
DESERIALIZE += " lastIndex = srcStart;\n";
|
|
429
453
|
DESERIALIZE += " srcStart += 2;\n";
|
|
430
454
|
DESERIALIZE += " while (srcStart < srcEnd) {\n";
|
|
431
455
|
DESERIALIZE += " const code = load<u16>(srcStart);\n";
|
|
432
456
|
DESERIALIZE += " if (code == 34 && load<u16>(srcStart - 2) !== 92) {\n";
|
|
433
|
-
DESERIALIZE += " srcStart += 2;\n";
|
|
434
457
|
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
|
|
435
|
-
|
|
458
|
+
generateGroups(sortedMembers.string, generateComparisions);
|
|
436
459
|
DESERIALIZE += " }\n"; // Close break char check
|
|
437
460
|
DESERIALIZE += " srcStart += 2;\n";
|
|
438
461
|
DESERIALIZE += " }\n"; // Close char scan loop
|
|
@@ -449,7 +472,7 @@ class JSONTransform extends Visitor {
|
|
|
449
472
|
DESERIALIZE += " if (code == 44 || code == 125 || JSON.Util.isSpace(code)) {\n";
|
|
450
473
|
// DESERIALIZE += " console.log(JSON.Util.ptrToStr(keyStart,keyEnd) + \" = \" + load<u16>(keyStart).toString() + \" val \" + JSON.Util.ptrToStr(lastIndex, srcStart));\n";
|
|
451
474
|
|
|
452
|
-
|
|
475
|
+
generateGroups(sortedMembers.number, generateComparisions);
|
|
453
476
|
DESERIALIZE += " }\n"; // Close break char check
|
|
454
477
|
DESERIALIZE += " srcStart += 2;\n";
|
|
455
478
|
DESERIALIZE += " }\n"; // Close char scan loop
|
|
@@ -472,7 +495,7 @@ class JSONTransform extends Visitor {
|
|
|
472
495
|
DESERIALIZE += " srcStart += 2;\n";
|
|
473
496
|
|
|
474
497
|
indent = " ";
|
|
475
|
-
|
|
498
|
+
generateGroups(sortedMembers.object, generateComparisions);
|
|
476
499
|
indent = "";
|
|
477
500
|
|
|
478
501
|
DESERIALIZE += " }\n"; // Close break char check
|
|
@@ -498,7 +521,7 @@ class JSONTransform extends Visitor {
|
|
|
498
521
|
// DESERIALIZE += " console.log(ptrToStr(keyStart,keyEnd) + \" = \" + (load<u64>(keyStart) & 0x0000FFFFFFFFFFFF) .toString());\n";
|
|
499
522
|
|
|
500
523
|
indent = " ";
|
|
501
|
-
|
|
524
|
+
generateGroups(sortedMembers.array, generateComparisions);
|
|
502
525
|
indent = "";
|
|
503
526
|
|
|
504
527
|
DESERIALIZE += " }\n"; // Close break char check
|
|
@@ -513,71 +536,97 @@ class JSONTransform extends Visitor {
|
|
|
513
536
|
DESERIALIZE += mbElse + "if (code == 116) {\n";
|
|
514
537
|
DESERIALIZE += " if (load<u64>(srcStart) == 28429475166421108) {\n";
|
|
515
538
|
DESERIALIZE += " srcStart += 8;\n";
|
|
516
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 2)) {
|
|
517
|
-
DESERIALIZE += " const code16 = load<u16>(keyStart);\n";
|
|
518
|
-
}
|
|
519
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
520
|
-
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
521
|
-
}
|
|
522
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
523
|
-
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
524
|
-
}
|
|
525
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
526
|
-
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
527
|
-
}
|
|
528
|
-
if (sortedMembers.boolean.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
529
|
-
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.boolean.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
530
|
-
}
|
|
531
|
-
const firstMemberName = sortedMembers.boolean[0].alias || sortedMembers.boolean[0].name;
|
|
532
|
-
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
533
|
-
DESERIALIZE += indent + " store<" + sortedMembers.boolean[0].type + ">(changetype<usize>(out), true, offsetof<this>(" + JSON.stringify(sortedMembers.boolean[0].name) + "));\n";
|
|
534
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
535
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
536
|
-
DESERIALIZE += indent + " break;\n";
|
|
537
|
-
DESERIALIZE += indent + " }";
|
|
538
539
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
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;
|
|
549
557
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
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
|
+
});
|
|
553
582
|
|
|
554
583
|
DESERIALIZE += " }"; // Close first char check
|
|
555
584
|
mbElse = " else ";
|
|
556
585
|
DESERIALIZE += " else if (load<u64>(srcStart, 2) == 28429466576093281) {\n";
|
|
557
586
|
DESERIALIZE += " srcStart += 10;\n";
|
|
558
587
|
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
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;
|
|
565
605
|
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
const memberName = member.alias || member.name;
|
|
569
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
570
|
-
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";
|
|
571
608
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
572
609
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
573
610
|
DESERIALIZE += indent + " break;\n";
|
|
574
611
|
DESERIALIZE += indent + " }";
|
|
575
|
-
}
|
|
576
612
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
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
|
+
}
|
|
580
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
|
+
});
|
|
581
630
|
DESERIALIZE += " }\n"; // Close first char check
|
|
582
631
|
DESERIALIZE += " }"; // Close first char check
|
|
583
632
|
}
|
|
@@ -587,45 +636,48 @@ class JSONTransform extends Visitor {
|
|
|
587
636
|
|
|
588
637
|
DESERIALIZE += " if (load<u64>(srcStart) == 30399761348886638) {\n";
|
|
589
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
|
+
}
|
|
590
655
|
|
|
591
|
-
|
|
592
|
-
DESERIALIZE += "
|
|
593
|
-
|
|
594
|
-
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 4)) {
|
|
595
|
-
DESERIALIZE += " const code32 = load<u32>(keyStart);\n";
|
|
596
|
-
}
|
|
597
|
-
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 6)) {
|
|
598
|
-
DESERIALIZE += " const code48 = load<u64>(keyStart) & 0x0000FFFFFFFFFFFF;\n";
|
|
599
|
-
}
|
|
600
|
-
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 == 8)) {
|
|
601
|
-
DESERIALIZE += " const code64 = load<u64>(keyStart);\n";
|
|
602
|
-
}
|
|
603
|
-
if (sortedMembers.null.some((m) => (m.alias || m.name).length << 1 > 8)) {
|
|
604
|
-
DESERIALIZE += toMemCDecl(Math.max(...sortedMembers.null.map((m) => (m.alias || m.name).length << 1)), " ");
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
const firstMemberName = sortedMembers.null[0].alias || sortedMembers.null[0].name;
|
|
608
|
-
DESERIALIZE += indent + " if (" + getComparision(firstMemberName) + ") { // " + firstMemberName + "\n";
|
|
609
|
-
DESERIALIZE += indent + " store<" + sortedMembers.null[0].type + ">(changetype<usize>(out), null, offsetof<this>(" + JSON.stringify(sortedMembers.null[0].name) + "));\n";
|
|
610
|
-
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
611
|
-
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
612
|
-
DESERIALIZE += indent + " break;\n";
|
|
613
|
-
DESERIALIZE += indent + " }";
|
|
614
|
-
|
|
615
|
-
for (let i = 1; i < sortedMembers.null.length; i++) {
|
|
616
|
-
const member = sortedMembers.null[i];
|
|
617
|
-
const memberName = member.alias || member.name;
|
|
618
|
-
DESERIALIZE += indent + " else if (" + getComparision(memberName) + ") { // " + memberName + "\n";
|
|
619
|
-
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";
|
|
620
659
|
DESERIALIZE += indent + " srcStart += 2;\n";
|
|
621
660
|
DESERIALIZE += indent + " keyStart = 0;\n";
|
|
622
661
|
DESERIALIZE += indent + " break;\n";
|
|
623
662
|
DESERIALIZE += indent + " }";
|
|
624
|
-
}
|
|
625
663
|
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
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
|
+
});
|
|
629
681
|
|
|
630
682
|
DESERIALIZE += " }"; // Close first char check
|
|
631
683
|
DESERIALIZE += "\n }"; // Close first char check
|