shallow-read.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.genShallowReader = void 0;
  4. const Codegen_1 = require("@jsonjoy.com/util/lib/codegen/Codegen");
  5. const toUtf8 = (str) => {
  6. const arr = [];
  7. const length = str.length;
  8. let curr = 0;
  9. while (curr < length) {
  10. let value = str.charCodeAt(curr++);
  11. if ((value & 0xffffff80) === 0) {
  12. arr.push(value);
  13. continue;
  14. }
  15. else if ((value & 0xfffff800) === 0) {
  16. arr.push(((value >> 6) & 0x1f) | 0xc0);
  17. }
  18. else {
  19. if (value >= 0xd800 && value <= 0xdbff) {
  20. if (curr < length) {
  21. const extra = str.charCodeAt(curr);
  22. if ((extra & 0xfc00) === 0xdc00) {
  23. curr++;
  24. value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;
  25. }
  26. }
  27. }
  28. if ((value & 0xffff0000) === 0) {
  29. arr.push(((value >> 12) & 0x0f) | 0xe0);
  30. arr.push(((value >> 6) & 0x3f) | 0x80);
  31. }
  32. else {
  33. arr.push(((value >> 18) & 0x07) | 0xf0);
  34. arr.push(((value >> 12) & 0x3f) | 0x80);
  35. arr.push(((value >> 6) & 0x3f) | 0x80);
  36. }
  37. }
  38. arr.push((value & 0x3f) | 0x80);
  39. }
  40. return arr;
  41. };
  42. const genShallowReader = (path) => {
  43. const codegen = new Codegen_1.Codegen({
  44. args: ['dec'],
  45. name: 'readShallow',
  46. prologue: 'var r = dec.reader;',
  47. epilogue: 'return r.x;',
  48. });
  49. for (let i = 0; i < path.length; i++) {
  50. const step = path[i];
  51. switch (typeof step) {
  52. case 'string': {
  53. const rObj = codegen.getRegister();
  54. const rIter = codegen.getRegister();
  55. const rFound = codegen.getRegister();
  56. codegen.js(`var ${rObj} = dec.readObjHdr();`);
  57. codegen.js(`var ${rFound} = false;`);
  58. codegen.js(`for(var ${rIter} = 0; ${rIter} < ${rObj}; ${rIter}++) {`);
  59. const utf8Arr = toUtf8(step);
  60. const length = utf8Arr.length;
  61. const rKey = codegen.getRegister();
  62. codegen.js(`var ${rKey} = dec.readStrHdr();`);
  63. codegen.js(`if (${rKey} !== ${length}) { r.x += ${rKey}; dec.skipAny(); continue; };`);
  64. while (utf8Arr.length > 0) {
  65. if (utf8Arr.length >= 4) {
  66. const word = utf8Arr.splice(0, 4);
  67. const utf8Chunk = '0x' + word.map((x) => x.toString(16)).join('');
  68. codegen.js(`if (r.u32() !== ${utf8Chunk}) { ${utf8Arr.length ? `r.x += ${utf8Arr.length}; ` : ''}dec.skipAny(); continue; }`);
  69. }
  70. else if (utf8Arr.length >= 2) {
  71. const word = utf8Arr.splice(0, 2);
  72. const utf8Chunk = '0x' + word.map((x) => x.toString(16)).join('');
  73. codegen.js(`if (r.u16() !== ${utf8Chunk}) { ${utf8Arr.length ? `r.x += ${utf8Arr.length}; ` : ''}dec.skipAny(); continue; }`);
  74. }
  75. else {
  76. const [octet] = utf8Arr.splice(0, 1);
  77. codegen.js(`if (r.u8() !== ${octet}) { ${utf8Arr.length ? `r.x += ${utf8Arr.length}; ` : ''}dec.skipAny(); continue; }`);
  78. }
  79. }
  80. codegen.js(`${rFound} = true;`);
  81. codegen.js(`break;`);
  82. codegen.js(`}`);
  83. codegen.js(`if (!${rFound}) throw new Error('KEY_NOT_FOUND');`);
  84. break;
  85. }
  86. case 'number': {
  87. const rObj = codegen.getRegister();
  88. codegen.js(`var ${rObj} = dec.readArrHdr();`);
  89. codegen.js(`if(${rObj} <= ${step}) throw new Error('INDEX_OUT_OF_BOUNDS');`);
  90. for (let i = 0; i < step; i++)
  91. codegen.js(`dec.skipAny();`);
  92. break;
  93. }
  94. default: {
  95. throw new Error('INVALID_PATH_STEP');
  96. }
  97. }
  98. }
  99. return codegen.compile();
  100. };
  101. exports.genShallowReader = genShallowReader;
  102. //# sourceMappingURL=shallow-read.js.map