@futpib/parser 1.0.1 → 1.0.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.
Files changed (425) hide show
  1. package/.github/copilot-instructions.md +149 -0
  2. package/.github/workflows/copilot-setup-steps.yml +18 -0
  3. package/.github/workflows/main.yml +29 -8
  4. package/.yarn/releases/yarn-4.9.4.cjs +942 -0
  5. package/.yarnrc.yml +1 -1
  6. package/build/allSettledStream.js +32 -14
  7. package/build/allSettledStream.test.js +32 -0
  8. package/build/androidPackage.d.ts +39 -0
  9. package/build/androidPackageParser.d.ts +17 -0
  10. package/build/androidPackageParser.js +185 -0
  11. package/build/androidPackageParser.test.js +22 -0
  12. package/build/androidPackageUnparser.d.ts +4 -0
  13. package/build/androidPackageUnparser.js +94 -0
  14. package/build/androidPackageUnparser.test.js +26 -0
  15. package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
  16. package/build/arbitrarilySlicedAsyncInterable.js +3 -3
  17. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  18. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  19. package/build/arbitraryDalvikBytecode.js +640 -0
  20. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  21. package/build/arbitraryDalvikExecutable.js +282 -0
  22. package/build/arbitraryDosDateTime.js +1 -0
  23. package/build/arbitraryZipStream.js +1 -1
  24. package/build/arrayParser.js +2 -2
  25. package/build/arrayParser.test.js +3 -3
  26. package/build/arrayUnparser.d.ts +1 -1
  27. package/build/backsmali.d.ts +3 -0
  28. package/build/backsmali.js +50 -0
  29. package/build/bsonParser.js +6 -2
  30. package/build/customInvariant.d.ts +2 -1
  31. package/build/customInvariant.js +4 -6
  32. package/build/dalvikBytecodeParser/formatParsers.d.ts +171 -0
  33. package/build/dalvikBytecodeParser/formatParsers.js +304 -0
  34. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  35. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  36. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  37. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  38. package/build/dalvikBytecodeParser.d.ts +1207 -0
  39. package/build/dalvikBytecodeParser.js +1289 -0
  40. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  42. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  43. package/build/dalvikBytecodeUnparser.js +642 -0
  44. package/build/dalvikBytecodeUnparser.test.js +25 -0
  45. package/build/dalvikExecutable.d.ts +215 -0
  46. package/build/dalvikExecutable.js +56 -0
  47. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
  48. package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
  49. package/build/dalvikExecutableParser/typeParsers.d.ts +11 -0
  50. package/build/dalvikExecutableParser/typeParsers.js +39 -0
  51. package/build/dalvikExecutableParser/typedNumbers.d.ts +106 -0
  52. package/build/dalvikExecutableParser/typedNumbers.js +18 -0
  53. package/build/dalvikExecutableParser.d.ts +5 -0
  54. package/build/dalvikExecutableParser.js +1757 -0
  55. package/build/dalvikExecutableParser.test.js +72 -0
  56. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +275 -0
  57. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  58. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  59. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  60. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  61. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  62. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  63. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  64. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  65. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  66. package/build/dalvikExecutableUnparser/utils.js +108 -0
  67. package/build/dalvikExecutableUnparser.d.ts +4 -0
  68. package/build/dalvikExecutableUnparser.js +406 -0
  69. package/build/dalvikExecutableUnparser.test.js +31 -0
  70. package/build/debugLogInputParser.d.ts +4 -0
  71. package/build/debugLogInputParser.js +16 -0
  72. package/build/debugLogParser.js +14 -3
  73. package/build/disjunctionParser.d.ts +2 -1
  74. package/build/disjunctionParser.js +6 -4
  75. package/build/elementTerminatedArrayParser.d.ts +3 -0
  76. package/build/elementTerminatedArrayParser.js +18 -0
  77. package/build/elementTerminatedArrayParser.test.js +52 -0
  78. package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
  79. package/build/elementTerminatedSequenceArrayParser.js +32 -0
  80. package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
  81. package/build/elementTerminatedSequenceParser.d.ts +3 -0
  82. package/build/elementTerminatedSequenceParser.js +27 -0
  83. package/build/elementTerminatedSequenceParser.test.js +34 -0
  84. package/build/endOfInputParser.d.ts +1 -1
  85. package/build/exactElementParser.js +10 -5
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/exactSequenceParser.d.ts +2 -1
  89. package/build/exactSequenceParser.js +12 -2
  90. package/build/fetchCid.d.ts +1 -0
  91. package/build/fetchCid.js +103 -0
  92. package/build/fetchCid.test.js +16 -0
  93. package/build/fixedLengthSequenceParser.d.ts +1 -0
  94. package/build/fixedLengthSequenceParser.js +18 -1
  95. package/build/fixedLengthSequenceParser.test.js +41 -0
  96. package/build/hasExecutable.d.ts +1 -0
  97. package/build/hasExecutable.js +8 -0
  98. package/build/highResolutionTimer.d.ts +16 -0
  99. package/build/highResolutionTimer.js +42 -0
  100. package/build/inputReader.d.ts +11 -0
  101. package/build/inputReader.js +37 -0
  102. package/build/inputReader.test.js +161 -8
  103. package/build/inputReaderState.d.ts +10 -0
  104. package/build/inputReaderState.js +16 -0
  105. package/build/inspect.d.ts +1 -0
  106. package/build/inspect.js +7 -0
  107. package/build/javaKeyStoreParser.test.js +8 -8
  108. package/build/jsonParser.d.ts +2 -0
  109. package/build/jsonParser.js +19 -22
  110. package/build/lazyMessageError.d.ts +48 -0
  111. package/build/lazyMessageError.js +53 -0
  112. package/build/lazyMessageError.test.d.ts +1 -0
  113. package/build/lazyMessageError.test.js +15 -0
  114. package/build/leb128Parser.d.ts +7 -0
  115. package/build/leb128Parser.js +82 -0
  116. package/build/leb128Parser.test.d.ts +1 -0
  117. package/build/leb128Parser.test.js +107 -0
  118. package/build/lookaheadParser.d.ts +2 -0
  119. package/build/lookaheadParser.js +14 -0
  120. package/build/negativeLookaheadParser.js +22 -16
  121. package/build/negativeLookaheadParser.test.d.ts +1 -0
  122. package/build/negativeLookaheadParser.test.js +30 -0
  123. package/build/noStackCaptureOverheadError.d.ts +4 -0
  124. package/build/noStackCaptureOverheadError.js +9 -0
  125. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  126. package/build/noStackCaptureOverheadError.test.js +15 -0
  127. package/build/nonEmptyArrayParser.d.ts +2 -0
  128. package/build/nonEmptyArrayParser.js +32 -0
  129. package/build/nonEmptyArrayParser.test.d.ts +1 -0
  130. package/build/nonEmptyArrayParser.test.js +17 -0
  131. package/build/optionalParser.js +2 -2
  132. package/build/parser.d.ts +11 -1
  133. package/build/parser.js +82 -32
  134. package/build/parser.test.js +141 -25
  135. package/build/parserAccessorParser.js +9 -1
  136. package/build/parserConsumedSequenceParser.d.ts +1 -1
  137. package/build/parserConsumedSequenceParser.js +21 -16
  138. package/build/parserContext.d.ts +22 -6
  139. package/build/parserContext.js +113 -57
  140. package/build/parserContext.test.js +33 -2
  141. package/build/parserCreatorCompose.d.ts +1 -0
  142. package/build/parserCreatorCompose.js +8 -2
  143. package/build/parserError.d.ts +605 -40
  144. package/build/parserError.js +98 -53
  145. package/build/parserImplementationInvariant.d.ts +1 -1
  146. package/build/parserImplementationInvariant.js +2 -2
  147. package/build/parserInputCompanion.d.ts +15 -0
  148. package/build/parserInputCompanion.js +38 -0
  149. package/build/promiseCompose.d.ts +1 -1
  150. package/build/promiseCompose.js +11 -1
  151. package/build/promiseSettled.d.ts +1 -0
  152. package/build/promiseSettled.js +4 -0
  153. package/build/separatedArrayParser.d.ts +2 -0
  154. package/build/separatedArrayParser.js +39 -0
  155. package/build/separatedArrayParser.test.d.ts +1 -0
  156. package/build/separatedArrayParser.test.js +21 -0
  157. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  158. package/build/separatedNonEmptyArrayParser.js +40 -0
  159. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  160. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  161. package/build/sequenceBuffer.d.ts +10 -0
  162. package/build/sequenceBuffer.js +54 -2
  163. package/build/sequenceBuffer.test.js +57 -0
  164. package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
  165. package/build/sequenceTerminatedSequenceParser.js +32 -0
  166. package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
  167. package/build/sequenceTerminatedSequenceParser.test.js +37 -0
  168. package/build/sequenceUnparser.d.ts +1 -1
  169. package/build/skipParser.d.ts +1 -1
  170. package/build/skipParser.js +4 -2
  171. package/build/skipToParser.d.ts +2 -0
  172. package/build/skipToParser.js +11 -0
  173. package/build/sliceBoundedParser.d.ts +1 -1
  174. package/build/sliceBoundedParser.js +7 -2
  175. package/build/sliceBoundedParser.test.js +30 -1
  176. package/build/smali.d.ts +1 -0
  177. package/build/smali.js +21 -0
  178. package/build/smaliParser.d.ts +68 -0
  179. package/build/smaliParser.js +2081 -0
  180. package/build/smaliParser.test.d.ts +1 -0
  181. package/build/smaliParser.test.js +410 -0
  182. package/build/stringFromAsyncIterable.d.ts +1 -0
  183. package/build/stringFromAsyncIterable.js +7 -0
  184. package/build/terminatedArrayParser.d.ts +3 -1
  185. package/build/terminatedArrayParser.js +79 -2
  186. package/build/terminatedArrayParser.test.d.ts +1 -0
  187. package/build/terminatedArrayParser.test.js +131 -0
  188. package/build/toAsyncIterable.d.ts +1 -0
  189. package/build/toAsyncIterable.js +7 -0
  190. package/build/toAsyncIterator.d.ts +1 -0
  191. package/build/toAsyncIterator.js +33 -0
  192. package/build/tupleParser.d.ts +4 -0
  193. package/build/tupleParser.js +1 -5
  194. package/build/unionParser.d.ts +2 -1
  195. package/build/unionParser.js +29 -14
  196. package/build/unionParser.test.d.ts +1 -0
  197. package/build/unionParser.test.js +60 -0
  198. package/build/unparser.d.ts +3 -3
  199. package/build/unparser.js +6 -4
  200. package/build/unparser.test.js +7 -19
  201. package/build/unparserContext.d.ts +2 -2
  202. package/build/unparserContext.js +2 -3
  203. package/build/unparserError.d.ts +2 -1
  204. package/build/unparserError.js +2 -1
  205. package/build/unparserImplementationInvariant.d.ts +1 -1
  206. package/build/unparserOutputCompanion.d.ts +1 -1
  207. package/build/unparserOutputCompanion.js +1 -1
  208. package/build/zipParser.d.ts +7 -2
  209. package/build/zipParser.js +36 -12
  210. package/build/zipUnparser.d.ts +7 -4
  211. package/build/zipUnparser.js +64 -45
  212. package/build/zipUnparser.test.js +15 -15
  213. package/package.json +33 -24
  214. package/src/allSettledStream.test.ts +40 -0
  215. package/src/allSettledStream.ts +47 -15
  216. package/src/androidPackage.ts +48 -0
  217. package/src/androidPackageParser.test.ts +27 -0
  218. package/src/{apkParser.test.ts.md → androidPackageParser.test.ts.md} +4 -4
  219. package/src/androidPackageParser.test.ts.snap +0 -0
  220. package/src/androidPackageParser.ts +398 -0
  221. package/src/androidPackageUnparser.test.ts +34 -0
  222. package/src/androidPackageUnparser.ts +126 -0
  223. package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
  224. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  225. package/src/arbitraryDalvikBytecode.ts +992 -0
  226. package/src/arbitraryDalvikExecutable.ts +434 -0
  227. package/src/arbitraryDosDateTime.ts +1 -0
  228. package/src/arbitraryZipStream.ts +1 -1
  229. package/src/arrayParser.test.ts +3 -3
  230. package/src/arrayParser.ts +2 -2
  231. package/src/arrayUnparser.ts +2 -2
  232. package/src/backsmali.ts +74 -0
  233. package/src/bsonParser.test.ts +12 -14
  234. package/src/bsonParser.ts +13 -2
  235. package/src/customInvariant.ts +8 -12
  236. package/src/dalvikBytecodeParser/formatParsers.ts +780 -0
  237. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  238. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  239. package/src/dalvikBytecodeParser.ts +2873 -0
  240. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  241. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  242. package/src/dalvikBytecodeUnparser.ts +758 -0
  243. package/src/dalvikExecutable.ts +282 -0
  244. package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
  245. package/src/dalvikExecutableParser/typeParsers.ts +74 -0
  246. package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
  247. package/src/dalvikExecutableParser.test.ts +89 -0
  248. package/src/dalvikExecutableParser.test.ts.md +634 -0
  249. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  250. package/src/dalvikExecutableParser.ts +3245 -0
  251. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +363 -0
  252. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  253. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  254. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  255. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  256. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  257. package/src/dalvikExecutableUnparser.test.ts +57 -0
  258. package/src/dalvikExecutableUnparser.ts +581 -0
  259. package/src/debugLogInputParser.ts +28 -0
  260. package/src/debugLogParser.ts +19 -3
  261. package/src/disjunctionParser.ts +12 -7
  262. package/src/elementTerminatedArrayParser.test.ts +99 -0
  263. package/src/elementTerminatedArrayParser.ts +31 -0
  264. package/src/elementTerminatedSequenceArrayParser.test.ts +52 -0
  265. package/src/elementTerminatedSequenceArrayParser.ts +52 -0
  266. package/src/elementTerminatedSequenceParser.test.ts +52 -0
  267. package/src/elementTerminatedSequenceParser.ts +43 -0
  268. package/src/endOfInputParser.ts +1 -1
  269. package/src/exactElementParser.ts +17 -11
  270. package/src/exactElementSwitchParser.ts +41 -0
  271. package/src/exactSequenceParser.ts +23 -2
  272. package/src/fetchCid.test.ts +20 -0
  273. package/src/fetchCid.ts +121 -0
  274. package/src/fixedLengthSequenceParser.test.ts +75 -0
  275. package/src/fixedLengthSequenceParser.ts +28 -1
  276. package/src/hasExecutable.ts +11 -0
  277. package/src/highResolutionTimer.ts +49 -0
  278. package/src/inputReader.test.ts +204 -8
  279. package/src/inputReader.ts +76 -3
  280. package/src/inputReaderState.ts +33 -0
  281. package/src/inspect.ts +9 -0
  282. package/src/javaKeyStoreParser.test.ts +12 -15
  283. package/src/javaKeyStoreParser.ts +2 -6
  284. package/src/jsonParser.test.ts +2 -4
  285. package/src/jsonParser.ts +46 -62
  286. package/src/lazyMessageError.test.ts +21 -0
  287. package/src/lazyMessageError.ts +88 -0
  288. package/src/leb128Parser.test.ts +173 -0
  289. package/src/leb128Parser.ts +125 -0
  290. package/src/lookaheadParser.ts +19 -0
  291. package/src/negativeLookaheadParser.test.ts +49 -0
  292. package/src/negativeLookaheadParser.ts +27 -15
  293. package/src/noStackCaptureOverheadError.test.ts +17 -0
  294. package/src/noStackCaptureOverheadError.ts +12 -0
  295. package/src/nonEmptyArrayParser.test.ts +21 -0
  296. package/src/nonEmptyArrayParser.ts +44 -0
  297. package/src/optionalParser.ts +3 -2
  298. package/src/parser.test.ts +203 -31
  299. package/src/parser.test.ts.md +34 -27
  300. package/src/parser.test.ts.snap +0 -0
  301. package/src/parser.ts +172 -45
  302. package/src/parserAccessorParser.ts +12 -2
  303. package/src/parserConsumedSequenceParser.ts +26 -17
  304. package/src/parserContext.test.ts +37 -2
  305. package/src/parserContext.ts +185 -79
  306. package/src/parserCreatorCompose.ts +20 -2
  307. package/src/parserError.ts +144 -61
  308. package/src/parserImplementationInvariant.ts +3 -3
  309. package/src/parserInputCompanion.ts +55 -0
  310. package/src/promiseCompose.ts +17 -3
  311. package/src/promiseSettled.ts +6 -0
  312. package/src/separatedArrayParser.test.ts +34 -0
  313. package/src/separatedArrayParser.ts +55 -0
  314. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  315. package/src/separatedNonEmptyArrayParser.ts +61 -0
  316. package/src/sequenceBuffer.test.ts +70 -0
  317. package/src/sequenceBuffer.ts +88 -2
  318. package/src/sequenceTerminatedSequenceParser.test.ts +58 -0
  319. package/src/sequenceTerminatedSequenceParser.ts +62 -0
  320. package/src/sequenceUnparser.ts +2 -2
  321. package/src/skipParser.ts +7 -5
  322. package/src/skipToParser.ts +16 -0
  323. package/src/sliceBoundedParser.test.ts +35 -1
  324. package/src/sliceBoundedParser.ts +19 -1
  325. package/src/smali.ts +29 -0
  326. package/src/smaliParser.test.ts +443 -0
  327. package/src/smaliParser.test.ts.md +3907 -0
  328. package/src/smaliParser.test.ts.snap +0 -0
  329. package/src/smaliParser.ts +3348 -0
  330. package/src/stringFromAsyncIterable.ts +9 -0
  331. package/src/terminatedArrayParser.test.ts +258 -0
  332. package/src/terminatedArrayParser.ts +109 -6
  333. package/src/toAsyncIterable.ts +7 -0
  334. package/src/toAsyncIterator.ts +48 -0
  335. package/src/tupleParser.ts +8 -5
  336. package/src/uint8Array.ts +2 -3
  337. package/src/unionParser.test.ts +78 -0
  338. package/src/unionParser.ts +47 -21
  339. package/src/unparser.test.ts +18 -34
  340. package/src/unparser.ts +13 -9
  341. package/src/unparserContext.ts +9 -13
  342. package/src/unparserError.ts +2 -1
  343. package/src/unparserImplementationInvariant.ts +1 -1
  344. package/src/unparserOutputCompanion.ts +1 -1
  345. package/src/zip.ts +2 -6
  346. package/src/zipParser.ts +71 -20
  347. package/src/zipUnparser.test.ts +19 -19
  348. package/src/zipUnparser.ts +139 -90
  349. package/tsconfig.json +7 -1
  350. package/xo.config.ts +15 -0
  351. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
  352. package/build/apk.d.ts +0 -39
  353. package/build/apkParser.d.ts +0 -16
  354. package/build/apkParser.js +0 -164
  355. package/build/apkParser.test.js +0 -22
  356. package/build/apkUnparser.d.ts +0 -4
  357. package/build/apkUnparser.js +0 -90
  358. package/build/apkUnparser.test.js +0 -26
  359. package/build/arbitraryDosDate.d.ts +0 -2
  360. package/build/arbitraryDosDate.js +0 -8
  361. package/build/arbitraryZipEntry.d.ts +0 -3
  362. package/build/arbitraryZipEntry.js +0 -26
  363. package/build/createDisjunctionParser.d.ts +0 -2
  364. package/build/createDisjunctionParser.js +0 -47
  365. package/build/createExactParser.d.ts +0 -2
  366. package/build/createExactParser.js +0 -12
  367. package/build/createSequentialUnionParser.d.ts +0 -2
  368. package/build/createSequentialUnionParser.js +0 -69
  369. package/build/fixedLengthChunkParser.d.ts +0 -2
  370. package/build/fixedLengthChunkParser.js +0 -12
  371. package/build/fixedLengthParser.d.ts +0 -2
  372. package/build/fixedLengthParser.js +0 -12
  373. package/build/inputChunkBuffer.d.ts +0 -15
  374. package/build/inputChunkBuffer.js +0 -40
  375. package/build/inputChunkBuffer.test.js +0 -34
  376. package/build/inputCompanion.d.ts +0 -18
  377. package/build/inputCompanion.js +0 -28
  378. package/build/invariantDefined.d.ts +0 -1
  379. package/build/invariantDefined.js +0 -5
  380. package/build/invariantIdentity.d.ts +0 -3
  381. package/build/invariantIdentity.js +0 -5
  382. package/build/javaKeystoreParser.d.ts +0 -2
  383. package/build/javaKeystoreParser.js +0 -7
  384. package/build/jsonParser2.d.ts +0 -3
  385. package/build/jsonParser2.js +0 -52
  386. package/build/jsonParser2.test.js +0 -22
  387. package/build/negativeLookahead.d.ts +0 -2
  388. package/build/negativeLookahead.js +0 -18
  389. package/build/parserCompose.d.ts +0 -3
  390. package/build/parserCompose.js +0 -7
  391. package/build/parserImplementationInvariantInvariant.d.ts +0 -3
  392. package/build/parserImplementationInvariantInvariant.js +0 -15
  393. package/build/parserInvariant.d.ts +0 -4
  394. package/build/parserInvariant.js +0 -11
  395. package/build/promiseFish.d.ts +0 -1
  396. package/build/promiseFish.js +0 -3
  397. package/build/sequenceParser.d.ts +0 -3
  398. package/build/sequenceParser.js +0 -10
  399. package/build/terminatedSequenceParser.d.ts +0 -2
  400. package/build/terminatedSequenceParser.js +0 -24
  401. package/build/unparserInputCompanion.d.ts +0 -15
  402. package/build/unparserInputCompanion.js +0 -13
  403. package/build/zipEntry.d.ts +0 -28
  404. package/build/zipFile.d.ts +0 -32
  405. package/build/zipFileEntry.d.ts +0 -6
  406. package/src/apk.ts +0 -48
  407. package/src/apkParser.test.ts +0 -30
  408. package/src/apkParser.test.ts.snap +0 -0
  409. package/src/apkParser.ts +0 -392
  410. package/src/apkUnparser.test.ts +0 -37
  411. package/src/apkUnparser.ts +0 -120
  412. package/src/invariantDefined.ts +0 -6
  413. package/src/invariantIdentity.ts +0 -8
  414. /package/build/{apk.js → androidPackage.js} +0 -0
  415. /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
  416. /package/build/{apkUnparser.test.d.ts → androidPackageUnparser.test.d.ts} +0 -0
  417. /package/build/{arbitraryDosPermissions.d.ts → dalvikBytecodeUnparser.test.d.ts} +0 -0
  418. /package/build/{arbitraryDosPermissions.js → dalvikExecutableParser.test.d.ts} +0 -0
  419. /package/build/{inputChunkBuffer.test.d.ts → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
  420. /package/build/{jsonParser2.test.d.ts → dalvikExecutableUnparser.test.d.ts} +0 -0
  421. /package/build/{parserParsingInvariant.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
  422. /package/build/{parserParsingInvariant.js → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
  423. /package/build/{zipEntry.js → elementTerminatedSequenceParser.test.d.ts} +0 -0
  424. /package/build/{zipFile.js → fetchCid.test.d.ts} +0 -0
  425. /package/build/{zipFileEntry.js → fixedLengthSequenceParser.test.d.ts} +0 -0
@@ -0,0 +1,1757 @@
1
+ import invariant from 'invariant';
2
+ import { MUtf8Decoder } from 'mutf-8';
3
+ import { createExactElementParser } from './exactElementParser.js';
4
+ import { createExactSequenceParser } from './exactSequenceParser.js';
5
+ import { createFixedLengthSequenceParser } from './fixedLengthSequenceParser.js';
6
+ import { cloneParser, setParserName } from './parser.js';
7
+ import { parserCreatorCompose } from './parserCreatorCompose.js';
8
+ import { promiseCompose } from './promiseCompose.js';
9
+ import { createQuantifierParser } from './quantifierParser.js';
10
+ import { createTupleParser } from './tupleParser.js';
11
+ import { createParserAccessorParser } from './parserAccessorParser.js';
12
+ import { createSkipToParser } from './skipToParser.js';
13
+ import { createLookaheadParser } from './lookaheadParser.js';
14
+ import { getIsoTypedNumberArray, isoIndexIntoFieldIds, isoIndexIntoMethodIds, isoIndexIntoPrototypeIds, isoIndexIntoStringIds, isoIndexIntoTypeIds, isoOffsetFromEncodedCatchHandlerListToEncodedCatchHandler, isoOffsetToAnnotationItem, isoOffsetToAnnotationsDirectoryItem, isoOffsetToAnnotationSetItem, isoOffsetToAnnotationSetRefListItem, isoOffsetToClassDataItem, isoOffsetToCodeItem, isoOffsetToDebugInfoItem, isoOffsetToEncodedArrayItem, isoOffsetToStringDataItem, isoOffsetToTypeList, } from './dalvikExecutableParser/typedNumbers.js';
15
+ import { sleb128NumberParser, uleb128NumberParser } from './leb128Parser.js';
16
+ import { createDisjunctionParser } from './disjunctionParser.js';
17
+ import { createElementTerminatedSequenceParser } from './elementTerminatedSequenceParser.js';
18
+ import { createElementTerminatedArrayParserUnsafe } from './elementTerminatedArrayParser.js';
19
+ import { createDalvikBytecodeParser, resolveDalvikBytecodeOperation, } from './dalvikBytecodeParser.js';
20
+ import { byteParser, ubyteParser, uintParser, uleb128p1NumberParser, ushortParser, } from './dalvikExecutableParser/typeParsers.js';
21
+ // https://source.android.com/docs/core/runtime/dex-format
22
+ const createByteAlignParser = (byteAlignment) => async (parserContext) => {
23
+ const toSkip = (byteAlignment - (parserContext.position % byteAlignment)) % byteAlignment;
24
+ parserContext.skip(toSkip);
25
+ };
26
+ const byteAlign4Parser = createByteAlignParser(4);
27
+ const dalvikExecutableHeaderVersionParser = promiseCompose(createTupleParser([
28
+ createExactSequenceParser(Buffer.from('dex\n', 'utf8')),
29
+ createFixedLengthSequenceParser(3),
30
+ createExactElementParser(0),
31
+ ]), ([_magic1, versionUint8Array, _magic2]) => {
32
+ const versionBuffer = Buffer.from(versionUint8Array);
33
+ const versionString = versionBuffer.toString('utf8');
34
+ const version = Number.parseInt(versionString, 10);
35
+ return version;
36
+ });
37
+ const sizeOffsetParser = promiseCompose(createTupleParser([
38
+ uintParser,
39
+ uintParser,
40
+ ]), ([size, offset]) => ({ size, offset }));
41
+ const dalvikExecutableHeaderItemParser = promiseCompose(createTupleParser([
42
+ dalvikExecutableHeaderVersionParser,
43
+ uintParser,
44
+ createFixedLengthSequenceParser(20),
45
+ uintParser,
46
+ uintParser,
47
+ uintParser,
48
+ sizeOffsetParser,
49
+ uintParser,
50
+ sizeOffsetParser,
51
+ sizeOffsetParser,
52
+ sizeOffsetParser,
53
+ sizeOffsetParser,
54
+ sizeOffsetParser,
55
+ sizeOffsetParser,
56
+ sizeOffsetParser,
57
+ ]), ([version, checksum, sha1Hash, fileSize, headerSize, endianTag, link, mapOffset, stringIds, typeIds, prototypeIds, fieldIds, methodIds, classDefinitions, data,]) => ({
58
+ version,
59
+ checksum,
60
+ sha1Hash,
61
+ fileSize,
62
+ headerSize,
63
+ endianTag,
64
+ link,
65
+ mapOffset,
66
+ stringIds,
67
+ typeIds,
68
+ prototypeIds,
69
+ fieldIds,
70
+ methodIds,
71
+ classDefinitions,
72
+ data,
73
+ }));
74
+ const dalvikExecutableStringIdItemParser = promiseCompose(cloneParser(uintParser), offset => isoOffsetToStringDataItem.wrap(offset));
75
+ const isoDalvikExecutableStringIdItems = getIsoTypedNumberArray();
76
+ const createSkipToThenStringIdItemsParser = ({ size, offset }) => (size === 0
77
+ ? (() => isoDalvikExecutableStringIdItems.wrap([]))
78
+ : promiseCompose(createTupleParser([
79
+ createSkipToParser(offset),
80
+ createQuantifierParser(dalvikExecutableStringIdItemParser, size),
81
+ ]), ([_, stringIds]) => isoDalvikExecutableStringIdItems.wrap(stringIds)));
82
+ const dalvikExecutableTypeIdItemParser = promiseCompose(cloneParser(uintParser), index => isoIndexIntoStringIds.wrap(index));
83
+ const isoDalvikExecutableTypeIdItems = getIsoTypedNumberArray();
84
+ const createSkipToThenTypeIdItemsParser = ({ size, offset }) => (size === 0
85
+ ? (() => isoDalvikExecutableTypeIdItems.wrap([]))
86
+ : promiseCompose(createTupleParser([
87
+ createSkipToParser(offset),
88
+ createQuantifierParser(dalvikExecutableTypeIdItemParser, size),
89
+ ]), ([_, typeIds]) => isoDalvikExecutableTypeIdItems.wrap(typeIds)));
90
+ const prototypeIdItemParser = promiseCompose(createTupleParser([
91
+ byteAlign4Parser,
92
+ uintParser,
93
+ uintParser,
94
+ uintParser,
95
+ ]), ([_, shortyIndex, returnTypeIndex, parametersOffset]) => ({
96
+ shortyIndex: isoIndexIntoStringIds.wrap(shortyIndex),
97
+ returnTypeIndex: isoIndexIntoTypeIds.wrap(returnTypeIndex),
98
+ parametersOffset: isoOffsetToTypeList.wrap(parametersOffset),
99
+ }));
100
+ const isoDalvikExecutablePrototypeIdItems = getIsoTypedNumberArray();
101
+ const createSkipToThenPrototypeIdItemsParser = ({ size, offset }) => (size === 0
102
+ ? (() => isoDalvikExecutablePrototypeIdItems.wrap([]))
103
+ : promiseCompose(createTupleParser([
104
+ createSkipToParser(offset),
105
+ createQuantifierParser(prototypeIdItemParser, size),
106
+ ]), ([_, prototypeIds]) => isoDalvikExecutablePrototypeIdItems.wrap(prototypeIds)));
107
+ const createSkipToThenItemByOffsetParser = ({ sizeOffset: { size, offset }, itemParser, byteAlign4, isoOffset, parserName, }) => {
108
+ const skipToThenItemByOffsetParser = async (parserContext) => {
109
+ const itemByOffset = new Map();
110
+ if (size === 0) {
111
+ return itemByOffset;
112
+ }
113
+ await createSkipToParser(offset)(parserContext);
114
+ for (let i = 0; i < size; i++) {
115
+ if (byteAlign4) {
116
+ await byteAlign4Parser(parserContext);
117
+ }
118
+ const offset = parserContext.position;
119
+ const item = await itemParser(parserContext);
120
+ itemByOffset.set(isoOffset.wrap(offset), item);
121
+ }
122
+ return itemByOffset;
123
+ };
124
+ setParserName(skipToThenItemByOffsetParser, parserName);
125
+ return skipToThenItemByOffsetParser;
126
+ };
127
+ const dalvikExecutableFieldIdItemParser = promiseCompose(createTupleParser([
128
+ ushortParser,
129
+ ushortParser,
130
+ uintParser,
131
+ ]), ([classIndex, typeIndex, nameIndex]) => ({
132
+ classIndex: isoIndexIntoTypeIds.wrap(classIndex),
133
+ typeIndex: isoIndexIntoTypeIds.wrap(typeIndex),
134
+ nameIndex: isoIndexIntoStringIds.wrap(nameIndex),
135
+ }));
136
+ const isoDalvikExecutableFieldIdItems = getIsoTypedNumberArray();
137
+ const createSkipToThenFieldIdItemsParser = ({ size, offset }) => (size === 0
138
+ ? (() => isoDalvikExecutableFieldIdItems.wrap([]))
139
+ : promiseCompose(createTupleParser([
140
+ createSkipToParser(offset),
141
+ createQuantifierParser(dalvikExecutableFieldIdItemParser, size),
142
+ ]), ([_, fieldIds]) => isoDalvikExecutableFieldIdItems.wrap(fieldIds)));
143
+ const dalvikExecutableMethodIdItemParser = promiseCompose(createTupleParser([
144
+ ushortParser,
145
+ ushortParser,
146
+ uintParser,
147
+ ]), ([classIndex, prototypeIndex, nameIndex]) => ({
148
+ classIndex: isoIndexIntoTypeIds.wrap(classIndex),
149
+ prototypeIndex: isoIndexIntoPrototypeIds.wrap(prototypeIndex),
150
+ nameIndex: isoIndexIntoStringIds.wrap(nameIndex),
151
+ }));
152
+ const isoDalvikExecutableMethodIdItems = getIsoTypedNumberArray();
153
+ const createSkipToThenMethodIdItemsParser = ({ size, offset }) => (size === 0
154
+ ? (() => isoDalvikExecutableMethodIdItems.wrap([]))
155
+ : promiseCompose(createTupleParser([
156
+ createSkipToParser(offset),
157
+ createQuantifierParser(dalvikExecutableMethodIdItemParser, size),
158
+ ]), ([_, methodIds]) => isoDalvikExecutableMethodIdItems.wrap(methodIds)));
159
+ const parseAccessFlagsCommon = (flags) => ({
160
+ public: Boolean(flags & 0b0000_0001),
161
+ private: Boolean(flags & 0b0000_0010),
162
+ protected: Boolean(flags & 0b0000_0100),
163
+ static: Boolean(flags & 0b0000_1000),
164
+ final: Boolean(flags & 0b0001_0000),
165
+ synchronized: Boolean(flags & 0b0010_0000),
166
+ volatile: false,
167
+ bridge: false,
168
+ transient: Boolean(flags & 0b1000_0000),
169
+ varargs: Boolean(flags & 0b1000_0000),
170
+ native: Boolean(flags & 0b0000_0001_0000_0000),
171
+ interface: Boolean(flags & 0b0000_0010_0000_0000),
172
+ abstract: Boolean(flags & 0b0000_0100_0000_0000),
173
+ strict: Boolean(flags & 0b0000_1000_0000_0000),
174
+ synthetic: Boolean(flags & 0b0001_0000_0000_0000),
175
+ annotation: Boolean(flags & 0b0010_0000_0000_0000),
176
+ enum: Boolean(flags & 0b0100_0000_0000_0000),
177
+ constructor: Boolean(flags & 0b0000_0001_0000_0000_0000_0000),
178
+ declaredSynchronized: Boolean(flags & 0b0000_0010_0000_0000_0000_0000),
179
+ });
180
+ const parseAccessFlags = (flags) => parseAccessFlagsCommon(flags);
181
+ const parseFieldAccessFlags = (flags) => ({
182
+ ...parseAccessFlagsCommon(flags),
183
+ volatile: Boolean(flags & 0b0100_0000),
184
+ varargs: false, // Varargs is only for methods, not fields
185
+ bridge: false,
186
+ });
187
+ const parseMethodAccessFlags = (flags) => ({
188
+ ...parseAccessFlagsCommon(flags),
189
+ volatile: false,
190
+ transient: false, // Transient is only for fields, not methods
191
+ bridge: Boolean(flags & 0b0100_0000),
192
+ });
193
+ const uintAccessFlagsParser = promiseCompose(uintParser, parseAccessFlags);
194
+ const uleb128AccessFlagsParser = promiseCompose(uleb128NumberParser, parseAccessFlags);
195
+ const uleb128FieldAccessFlagsParser = promiseCompose(uleb128NumberParser, parseFieldAccessFlags);
196
+ const uleb128MethodAccessFlagsParser = promiseCompose(uleb128NumberParser, parseMethodAccessFlags);
197
+ const DEX_CLASS_DEFINITION_ITEM_SOURCE_FILE_NO_INDEX = 0xFF_FF_FF_FF;
198
+ const createSkipToThenClassDefinitionItemsParser = ({ size, offset }) => (size === 0
199
+ ? (() => [])
200
+ : promiseCompose(createTupleParser([
201
+ createSkipToParser(offset),
202
+ createQuantifierParser(promiseCompose(createTupleParser([
203
+ uintParser,
204
+ uintAccessFlagsParser,
205
+ uintParser,
206
+ uintParser,
207
+ uintParser,
208
+ uintParser,
209
+ uintParser,
210
+ uintParser,
211
+ ]), ([classIndex, accessFlags, superclassIndex, interfacesOffset, sourceFileIndex, annotationsOffset, classDataOffset, staticValuesOffset,]) => ({
212
+ classIndex: isoIndexIntoTypeIds.wrap(classIndex),
213
+ accessFlags,
214
+ superclassIndex: isoIndexIntoTypeIds.wrap(superclassIndex),
215
+ interfacesOffset: isoOffsetToTypeList.wrap(interfacesOffset),
216
+ sourceFileIndex: (sourceFileIndex === DEX_CLASS_DEFINITION_ITEM_SOURCE_FILE_NO_INDEX
217
+ ? undefined
218
+ : isoIndexIntoStringIds.wrap(sourceFileIndex)),
219
+ annotationsOffset: isoOffsetToAnnotationsDirectoryItem.wrap(annotationsOffset),
220
+ classDataOffset: isoOffsetToClassDataItem.wrap(classDataOffset),
221
+ staticValuesOffset: isoOffsetToEncodedArrayItem.wrap(staticValuesOffset),
222
+ })), size),
223
+ ]), ([_, classDefinitions]) => classDefinitions));
224
+ const createRawDataParser = ({ size, offset }) => (size === 0
225
+ ? (() => undefined)
226
+ : promiseCompose(createTupleParser([
227
+ createSkipToParser(offset),
228
+ createFixedLengthSequenceParser(size),
229
+ ]), ([_, data]) => data));
230
+ const stringDataItemParser = promiseCompose(createTupleParser([
231
+ uleb128NumberParser,
232
+ createElementTerminatedSequenceParser(0),
233
+ ]), ([utf16Size, data]) => ({
234
+ utf16Size,
235
+ data: new Uint8Array(data),
236
+ }));
237
+ const stringDataItemStringParser = promiseCompose(stringDataItemParser, ({ utf16Size, data }) => {
238
+ const mutf8Decoder = new MUtf8Decoder();
239
+ const string = mutf8Decoder.decode(data);
240
+ invariant(string.length === utf16Size, 'String length mismatch. Expected: %s, actual: %s', utf16Size, string.length);
241
+ return string;
242
+ });
243
+ const createSkipToThenStringsParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
244
+ sizeOffset,
245
+ itemParser: stringDataItemStringParser,
246
+ byteAlign4: false,
247
+ isoOffset: isoOffsetToStringDataItem,
248
+ parserName: 'skipToThenStringsParser',
249
+ });
250
+ const dalvikExecutableTypeItemParser = promiseCompose(cloneParser(ushortParser), index => isoIndexIntoTypeIds.wrap(index));
251
+ const isoDalvikExecutableTypeList = getIsoTypedNumberArray();
252
+ const dalvikExecutableTypeListParser = parserCreatorCompose(() => createTupleParser([
253
+ byteAlign4Parser,
254
+ uintParser,
255
+ ]), ([_, size]) => promiseCompose(createQuantifierParser(dalvikExecutableTypeItemParser, size), typeItems => isoDalvikExecutableTypeList.wrap(typeItems)))();
256
+ const createSkipToThenTypeListByOffsetParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
257
+ sizeOffset,
258
+ itemParser: dalvikExecutableTypeListParser,
259
+ byteAlign4: true,
260
+ isoOffset: isoOffsetToTypeList,
261
+ parserName: 'skipToThenTypeListByOffsetParser',
262
+ });
263
+ const fieldAnnotationParser = promiseCompose(createTupleParser([
264
+ uintParser,
265
+ uintParser,
266
+ ]), ([fieldIndex, annotationsOffset,]) => ({
267
+ fieldIndex: isoIndexIntoFieldIds.wrap(fieldIndex),
268
+ annotationsOffset: isoOffsetToAnnotationSetItem.wrap(annotationsOffset),
269
+ }));
270
+ const createFieldAnnotationsParser = (fieldsSize) => createQuantifierParser(fieldAnnotationParser, fieldsSize);
271
+ const methodAnnotationParser = promiseCompose(createTupleParser([
272
+ uintParser,
273
+ uintParser,
274
+ ]), ([methodIndex, annotationsOffset,]) => ({
275
+ methodIndex: isoIndexIntoMethodIds.wrap(methodIndex),
276
+ annotationsOffset: isoOffsetToAnnotationSetItem.wrap(annotationsOffset),
277
+ }));
278
+ const createMethodAnnotationsParser = (methodsSize) => createQuantifierParser(methodAnnotationParser, methodsSize);
279
+ const parameterAnnotationParser = promiseCompose(createTupleParser([
280
+ uintParser,
281
+ uintParser,
282
+ ]), ([methodIndex, annotationsOffset,]) => ({
283
+ methodIndex: isoIndexIntoMethodIds.wrap(methodIndex),
284
+ annotationsOffset: isoOffsetToAnnotationSetRefListItem.wrap(annotationsOffset),
285
+ }));
286
+ const createParameterAnnotationsParser = (parametersSize) => createQuantifierParser(parameterAnnotationParser, parametersSize);
287
+ const annotationsDirectoryItemParser = parserCreatorCompose(() => createTupleParser([
288
+ byteAlign4Parser,
289
+ uintParser,
290
+ uintParser,
291
+ uintParser,
292
+ uintParser,
293
+ ]), ([_, classAnnotationsOffset, fieldsSize, annotatedMethodsSize, annotatedParametersSize,]) => promiseCompose(createTupleParser([
294
+ () => isoOffsetToAnnotationSetItem.wrap(classAnnotationsOffset),
295
+ createFieldAnnotationsParser(fieldsSize),
296
+ createMethodAnnotationsParser(annotatedMethodsSize),
297
+ createParameterAnnotationsParser(annotatedParametersSize),
298
+ ]), ([classAnnotationsOffset, fieldAnnotations, methodAnnotations, parameterAnnotations,]) => ({
299
+ classAnnotationsOffset,
300
+ fieldAnnotations,
301
+ methodAnnotations,
302
+ parameterAnnotations,
303
+ })))();
304
+ const createSkipToThenAnnotationsDirectoryItemsParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
305
+ sizeOffset,
306
+ itemParser: annotationsDirectoryItemParser,
307
+ byteAlign4: true,
308
+ isoOffset: isoOffsetToAnnotationsDirectoryItem,
309
+ parserName: 'skipToThenAnnotationsDirectoryItemsParser',
310
+ });
311
+ const encodedFieldParser = promiseCompose(createTupleParser([
312
+ uleb128NumberParser,
313
+ uleb128FieldAccessFlagsParser,
314
+ ]), ([fieldIndexDiff, accessFlags]) => ({ fieldIndexDiff, accessFlags }));
315
+ const createEncodedFieldsParser = (fieldsSize) => promiseCompose(createQuantifierParser(encodedFieldParser, fieldsSize), encodedFields => {
316
+ let previousFieldIndex = 0;
317
+ return encodedFields.map(({ fieldIndexDiff, accessFlags }) => {
318
+ previousFieldIndex += fieldIndexDiff;
319
+ return {
320
+ fieldIndex: isoIndexIntoFieldIds.wrap(previousFieldIndex),
321
+ accessFlags,
322
+ };
323
+ });
324
+ });
325
+ const encodedMethodParser = promiseCompose(createTupleParser([
326
+ uleb128NumberParser,
327
+ uleb128MethodAccessFlagsParser,
328
+ uleb128NumberParser,
329
+ ]), ([methodIndexDiff, accessFlags, codeOffset,]) => ({
330
+ methodIndexDiff,
331
+ accessFlags,
332
+ codeOffset: isoOffsetToCodeItem.wrap(codeOffset),
333
+ }));
334
+ const createEncodedMethodsParser = (methodsSize) => promiseCompose(createQuantifierParser(encodedMethodParser, methodsSize), encodedMethods => {
335
+ let previousMethodIndex = 0;
336
+ return encodedMethods.map(({ methodIndexDiff, accessFlags, codeOffset }) => {
337
+ previousMethodIndex += methodIndexDiff;
338
+ return {
339
+ methodIndex: isoIndexIntoMethodIds.wrap(previousMethodIndex),
340
+ accessFlags,
341
+ codeOffset,
342
+ };
343
+ });
344
+ });
345
+ const classDataItemParser = parserCreatorCompose(() => createTupleParser([
346
+ uleb128NumberParser,
347
+ uleb128NumberParser,
348
+ uleb128NumberParser,
349
+ uleb128NumberParser,
350
+ ]), ([staticFieldsSize, instanceFieldsSize, directMethodsSize, virtualMethodsSize,]) => promiseCompose(createTupleParser([
351
+ createEncodedFieldsParser(staticFieldsSize),
352
+ createEncodedFieldsParser(instanceFieldsSize),
353
+ createEncodedMethodsParser(directMethodsSize),
354
+ createEncodedMethodsParser(virtualMethodsSize),
355
+ ]), ([staticFields, instanceFields, directMethods, virtualMethods,]) => ({
356
+ staticFields,
357
+ instanceFields,
358
+ directMethods,
359
+ virtualMethods,
360
+ })))();
361
+ const createSkipToThenClassDataItemsParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
362
+ sizeOffset,
363
+ itemParser: classDataItemParser,
364
+ byteAlign4: false,
365
+ isoOffset: isoOffsetToClassDataItem,
366
+ parserName: 'skipToThenClassDataItemsParser',
367
+ });
368
+ const createByteWith5LeastSignificantBitsEqualParser = (leastSignificant5) => {
369
+ const byteWith5LeastSignificantBitsEqualParser = async (parserContext) => {
370
+ const byte = await parserContext.read(0);
371
+ parserContext.invariant((byte & 0b0001_1111) === leastSignificant5, 'Expected byte with 5 least significant bits equal to %s, but got %s', leastSignificant5.toString(2).padStart(8, '0'), byte.toString(2).padStart(8, '0'));
372
+ return byte;
373
+ };
374
+ setParserName(byteWith5LeastSignificantBitsEqualParser, `createByteWith5LeastSignificantBitsEqualParser(${leastSignificant5.toString(2).padStart(5, '0')})`);
375
+ return byteWith5LeastSignificantBitsEqualParser;
376
+ };
377
+ const createEncodedValueArgParser = (valueType) => promiseCompose(createByteWith5LeastSignificantBitsEqualParser(valueType), byte => byte >> 5);
378
+ const encodedValueByteParser = promiseCompose(createTupleParser([
379
+ createExactElementParser(0),
380
+ byteParser,
381
+ ]), ([_, value]) => ({ type: 'byte', value }));
382
+ setParserName(encodedValueByteParser, 'encodedValueByteParser');
383
+ const encodedValueShortParser = parserCreatorCompose(() => createEncodedValueArgParser(0x02), sizeSubOne => {
384
+ const size = sizeSubOne + 1;
385
+ if (size === 1) {
386
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
387
+ const buffer = Buffer.from(uint8Array);
388
+ return { type: 'short', value: buffer.readInt8(0) };
389
+ });
390
+ }
391
+ invariant(size === 2, '(encodedValueShortParser) Unexpected size: %s', size);
392
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
393
+ const buffer = Buffer.from(uint8Array);
394
+ return { type: 'short', value: buffer.readInt16LE(0) };
395
+ });
396
+ })();
397
+ setParserName(encodedValueShortParser, 'encodedValueShortParser');
398
+ const encodedValueCharParser = parserCreatorCompose(() => createEncodedValueArgParser(0x03), sizeSubOne => {
399
+ const size = sizeSubOne + 1;
400
+ if (size == 1) {
401
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
402
+ const buffer = Buffer.from([...uint8Array, 0]);
403
+ return { type: 'char', value: buffer.readUInt16LE(0) };
404
+ });
405
+ }
406
+ invariant(size === 2, '(encodedValueCharParser) Unexpected size: %s', size);
407
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
408
+ const buffer = Buffer.from(uint8Array);
409
+ return { type: 'char', value: buffer.readUInt16LE(0) };
410
+ });
411
+ })();
412
+ setParserName(encodedValueCharParser, 'encodedValueCharParser');
413
+ const encodedValueIntParser = parserCreatorCompose(() => createEncodedValueArgParser(0x04), sizeSubOne => {
414
+ const size = sizeSubOne + 1;
415
+ if (size === 1) {
416
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
417
+ const buffer = Buffer.from(uint8Array);
418
+ return { type: 'int', value: buffer.readInt8(0) };
419
+ });
420
+ }
421
+ if (size === 2) {
422
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
423
+ const buffer = Buffer.from(uint8Array);
424
+ return { type: 'int', value: buffer.readInt16LE(0) };
425
+ });
426
+ }
427
+ if (size === 3) {
428
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
429
+ const lastByte = uint8Array[uint8Array.length - 1];
430
+ const signBit = (lastByte & 0b1000_0000) >> 7;
431
+ const extensionByte = signBit === 1 ? 0xFF : 0x00;
432
+ const buffer = Buffer.from([...uint8Array, extensionByte]);
433
+ return { type: 'int', value: buffer.readInt32LE(0) };
434
+ });
435
+ }
436
+ invariant(size === 4, '(encodedValueIntParser) Unexpected size: %s', size);
437
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
438
+ const buffer = Buffer.from(uint8Array);
439
+ return { type: 'int', value: buffer.readInt32LE(0) };
440
+ });
441
+ })();
442
+ setParserName(encodedValueIntParser, 'encodedValueIntParser');
443
+ const encodedValueLongParser = parserCreatorCompose(() => createEncodedValueArgParser(0x06), sizeSubOne => {
444
+ const size = sizeSubOne + 1;
445
+ if (size === 1) {
446
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
447
+ const buffer = Buffer.from(uint8Array);
448
+ return { type: 'long', value: BigInt(buffer.readInt8(0)) };
449
+ });
450
+ }
451
+ if (size === 2) {
452
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
453
+ const buffer = Buffer.from(uint8Array);
454
+ return { type: 'long', value: BigInt(buffer.readInt16LE(0)) };
455
+ });
456
+ }
457
+ if (size === 3) {
458
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
459
+ const lastByte = uint8Array[size - 1];
460
+ const firstBit = (lastByte & 0b1000_0000) >> 7;
461
+ const extensionByte = firstBit === 1 ? 0xFF : 0x00;
462
+ const buffer = Buffer.from([...uint8Array, extensionByte]);
463
+ return { type: 'long', value: BigInt(buffer.readInt32LE(0)) };
464
+ });
465
+ }
466
+ if (size === 4) {
467
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
468
+ const buffer = Buffer.from(uint8Array);
469
+ return { type: 'long', value: BigInt(buffer.readInt32LE(0)) };
470
+ });
471
+ }
472
+ if (size === 5) {
473
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
474
+ const lastByte = uint8Array[size - 1];
475
+ const firstBit = (lastByte & 0b1000_0000) >> 7;
476
+ const extensionByte = firstBit === 1 ? 0xFF : 0x00;
477
+ const buffer = Buffer.from([...uint8Array, extensionByte, extensionByte, extensionByte]);
478
+ return { type: 'long', value: BigInt(buffer.readBigInt64LE(0)) };
479
+ });
480
+ }
481
+ if (size === 6) {
482
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
483
+ const lastByte = uint8Array[size - 1];
484
+ const firstBit = (lastByte & 0b1000_0000) >> 7;
485
+ const extensionByte = firstBit === 1 ? 0xFF : 0x00;
486
+ const buffer = Buffer.from([...uint8Array, extensionByte, extensionByte]);
487
+ return { type: 'long', value: BigInt(buffer.readBigInt64LE(0)) };
488
+ });
489
+ }
490
+ if (size === 7) {
491
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
492
+ const lastByte = uint8Array[size - 1];
493
+ const firstBit = (lastByte & 0b1000_0000) >> 7;
494
+ const extensionByte = firstBit === 1 ? 0xFF : 0x00;
495
+ const buffer = Buffer.from([...uint8Array, extensionByte]);
496
+ return { type: 'long', value: BigInt(buffer.readBigInt64LE(0)) };
497
+ });
498
+ }
499
+ invariant(size === 8, '(encodedValueLongParser) Unexpected size: %s', size);
500
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
501
+ const buffer = Buffer.from(uint8Array);
502
+ return { type: 'long', value: buffer.readBigInt64LE(0) };
503
+ });
504
+ })();
505
+ setParserName(encodedValueLongParser, 'encodedValueLongParser');
506
+ const encodedValueFloatParser = parserCreatorCompose(() => createEncodedValueArgParser(0x10), sizeSubOne => {
507
+ const size = sizeSubOne + 1;
508
+ if (size === 1) {
509
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
510
+ const buffer = Buffer.from([0, 0, 0, ...uint8Array]);
511
+ return { type: 'float', value: buffer.readFloatLE(0) };
512
+ });
513
+ }
514
+ if (size === 2) {
515
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
516
+ const buffer = Buffer.from([0, 0, ...uint8Array]);
517
+ return { type: 'float', value: buffer.readFloatLE(0) };
518
+ });
519
+ }
520
+ if (size === 3) {
521
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
522
+ const buffer = Buffer.from([0, ...uint8Array]);
523
+ return { type: 'float', value: buffer.readFloatLE(0) };
524
+ });
525
+ }
526
+ invariant(size === 4, '(encodedValueFloatParser) Unexpected size: %s', size);
527
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
528
+ const buffer = Buffer.from(uint8Array);
529
+ return { type: 'float', value: buffer.readFloatLE(0) };
530
+ });
531
+ })();
532
+ setParserName(encodedValueFloatParser, 'encodedValueFloatParser');
533
+ const encodedValueDoubleParser = parserCreatorCompose(() => createEncodedValueArgParser(0x11), sizeSubOne => {
534
+ const size = sizeSubOne + 1;
535
+ if (size === 1) {
536
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
537
+ const buffer = Buffer.from([0, 0, 0, 0, 0, 0, 0, ...uint8Array]);
538
+ return { type: 'double', value: buffer.readDoubleLE(0) };
539
+ });
540
+ }
541
+ if (size === 2) {
542
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
543
+ const buffer = Buffer.from([0, 0, 0, 0, 0, 0, ...uint8Array]);
544
+ return { type: 'double', value: buffer.readDoubleLE(0) };
545
+ });
546
+ }
547
+ if (size === 3) {
548
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
549
+ const buffer = Buffer.from([0, 0, 0, 0, 0, ...uint8Array]);
550
+ return { type: 'double', value: buffer.readDoubleLE(0) };
551
+ });
552
+ }
553
+ if (size === 4) {
554
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
555
+ const buffer = Buffer.from([0, 0, 0, 0, ...uint8Array]);
556
+ return { type: 'double', value: buffer.readDoubleLE(0) };
557
+ });
558
+ }
559
+ if (size === 5) {
560
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
561
+ const buffer = Buffer.from([0, 0, 0, ...uint8Array]);
562
+ return { type: 'double', value: buffer.readDoubleLE(0) };
563
+ });
564
+ }
565
+ if (size === 6) {
566
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
567
+ const buffer = Buffer.from([0, 0, ...uint8Array]);
568
+ return { type: 'double', value: buffer.readDoubleLE(0) };
569
+ });
570
+ }
571
+ if (size === 7) {
572
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
573
+ const buffer = Buffer.from([0, ...uint8Array]);
574
+ return { type: 'double', value: buffer.readDoubleLE(0) };
575
+ });
576
+ }
577
+ invariant(size === 8, '(encodedValueDoubleParser) Unexpected size: %s', size);
578
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
579
+ const buffer = Buffer.from(uint8Array);
580
+ return { type: 'double', value: buffer.readDoubleLE(0) };
581
+ });
582
+ })();
583
+ setParserName(encodedValueDoubleParser, 'encodedValueDoubleParser');
584
+ const encodedValueMethodTypeParser = parserCreatorCompose(() => createEncodedValueArgParser(0x15), sizeSubOne => {
585
+ const size = sizeSubOne + 1;
586
+ if (size === 1) {
587
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
588
+ const buffer = Buffer.from(uint8Array);
589
+ return { type: 'methodType', value: isoIndexIntoPrototypeIds.wrap(buffer.readUint8(0)) };
590
+ });
591
+ }
592
+ if (size === 2) {
593
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
594
+ const buffer = Buffer.from(uint8Array);
595
+ return { type: 'methodType', value: isoIndexIntoPrototypeIds.wrap(buffer.readUInt16LE(0)) };
596
+ });
597
+ }
598
+ invariant(size === 4, '(encodedValueMethodTypeParser) Unexpected size: %s', size);
599
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
600
+ const buffer = Buffer.from(uint8Array);
601
+ return { type: 'methodType', value: isoIndexIntoPrototypeIds.wrap(buffer.readUInt32LE(0)) };
602
+ });
603
+ })();
604
+ setParserName(encodedValueMethodTypeParser, 'encodedValueMethodTypeParser');
605
+ const encodedValueMethodHandleParser = parserCreatorCompose(() => createEncodedValueArgParser(0x16), sizeSubOne => {
606
+ const size = sizeSubOne + 1;
607
+ if (size === 1) {
608
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
609
+ const buffer = Buffer.from(uint8Array);
610
+ return { type: 'methodHandle', value: buffer.readUInt8(0) };
611
+ });
612
+ }
613
+ if (size === 2) {
614
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
615
+ const buffer = Buffer.from(uint8Array);
616
+ return { type: 'methodHandle', value: buffer.readUInt16LE(0) };
617
+ });
618
+ }
619
+ invariant(size === 4, '(encodedValueMethodHandleParser) Unexpected size: %s', size);
620
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
621
+ const buffer = Buffer.from(uint8Array);
622
+ return { type: 'methodHandle', value: buffer.readUInt32LE(0) };
623
+ });
624
+ })();
625
+ setParserName(encodedValueMethodHandleParser, 'encodedValueMethodHandleParser');
626
+ const encodedValueStringParser = parserCreatorCompose(() => createEncodedValueArgParser(0x17), sizeSubOne => {
627
+ const size = sizeSubOne + 1;
628
+ if (size === 1) {
629
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
630
+ const buffer = Buffer.from(uint8Array);
631
+ return { type: 'string', value: isoIndexIntoStringIds.wrap(buffer.readUInt8(0)) };
632
+ });
633
+ }
634
+ if (size === 2) {
635
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
636
+ const buffer = Buffer.from(uint8Array);
637
+ return { type: 'string', value: isoIndexIntoStringIds.wrap(buffer.readUInt16LE(0)) };
638
+ });
639
+ }
640
+ invariant(size === 4, '(encodedValueStringParser) Unexpected size: %s', size);
641
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
642
+ const buffer = Buffer.from(uint8Array);
643
+ return { type: 'string', value: isoIndexIntoStringIds.wrap(buffer.readUInt32LE(0)) };
644
+ });
645
+ })();
646
+ setParserName(encodedValueStringParser, 'encodedValueStringParser');
647
+ const encodedValueTypeParser = parserCreatorCompose(() => createEncodedValueArgParser(0x18), sizeSubOne => {
648
+ const size = sizeSubOne + 1;
649
+ if (size === 1) {
650
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
651
+ const buffer = Buffer.from(uint8Array);
652
+ return { type: 'type', value: isoIndexIntoTypeIds.wrap(buffer.readUInt8(0)) };
653
+ });
654
+ }
655
+ if (size === 2) {
656
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
657
+ const buffer = Buffer.from(uint8Array);
658
+ return { type: 'type', value: isoIndexIntoTypeIds.wrap(buffer.readUInt16LE(0)) };
659
+ });
660
+ }
661
+ invariant(size === 4, '(encodedValueTypeParser) Unexpected size: %s', size);
662
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
663
+ const buffer = Buffer.from(uint8Array);
664
+ return { type: 'type', value: isoIndexIntoTypeIds.wrap(buffer.readUInt32LE(0)) };
665
+ });
666
+ })();
667
+ setParserName(encodedValueTypeParser, 'encodedValueTypeParser');
668
+ const encodedValueFieldParser = parserCreatorCompose(() => createEncodedValueArgParser(0x19), sizeSubOne => {
669
+ const size = sizeSubOne + 1;
670
+ if (size === 1) {
671
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
672
+ const buffer = Buffer.from(uint8Array);
673
+ return { type: 'field', value: isoIndexIntoFieldIds.wrap(buffer.readUInt8(0)) };
674
+ });
675
+ }
676
+ if (size === 2) {
677
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
678
+ const buffer = Buffer.from(uint8Array);
679
+ return { type: 'field', value: isoIndexIntoFieldIds.wrap(buffer.readUInt16LE(0)) };
680
+ });
681
+ }
682
+ invariant(size === 4, '(encodedValueFieldParser) Unexpected size: %s', size);
683
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
684
+ const buffer = Buffer.from(uint8Array);
685
+ return { type: 'field', value: isoIndexIntoFieldIds.wrap(buffer.readUInt32LE(0)) };
686
+ });
687
+ })();
688
+ setParserName(encodedValueFieldParser, 'encodedValueFieldParser');
689
+ const encodedValueMethodParser = parserCreatorCompose(() => createEncodedValueArgParser(0x1A), sizeSubOne => {
690
+ const size = sizeSubOne + 1;
691
+ if (size === 1) {
692
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
693
+ const buffer = Buffer.from(uint8Array);
694
+ return { type: 'method', value: isoIndexIntoMethodIds.wrap(buffer.readUInt8(0)) };
695
+ });
696
+ }
697
+ if (size === 2) {
698
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
699
+ const buffer = Buffer.from(uint8Array);
700
+ return { type: 'method', value: isoIndexIntoMethodIds.wrap(buffer.readUInt16LE(0)) };
701
+ });
702
+ }
703
+ invariant(size === 4, '(encodedValueMethodParser) Unexpected size: %s', size);
704
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
705
+ const buffer = Buffer.from(uint8Array);
706
+ return { type: 'method', value: isoIndexIntoMethodIds.wrap(buffer.readUInt32LE(0)) };
707
+ });
708
+ })();
709
+ setParserName(encodedValueMethodParser, 'encodedValueMethodParser');
710
+ const encodedValueEnumParser = parserCreatorCompose(() => createEncodedValueArgParser(0x1B), sizeSubOne => {
711
+ const size = sizeSubOne + 1;
712
+ if (size === 1) {
713
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
714
+ const buffer = Buffer.from(uint8Array);
715
+ return { type: 'enum', value: isoIndexIntoFieldIds.wrap(buffer.readUInt8(0)) };
716
+ });
717
+ }
718
+ if (size === 2) {
719
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
720
+ const buffer = Buffer.from(uint8Array);
721
+ return { type: 'enum', value: isoIndexIntoFieldIds.wrap(buffer.readUInt16LE(0)) };
722
+ });
723
+ }
724
+ invariant(size === 4, '(encodedValueEnumParser) Unexpected size: %s', size);
725
+ return promiseCompose(createFixedLengthSequenceParser(size), uint8Array => {
726
+ const buffer = Buffer.from(uint8Array);
727
+ return { type: 'enum', value: isoIndexIntoFieldIds.wrap(buffer.readUInt32LE(0)) };
728
+ });
729
+ })();
730
+ setParserName(encodedValueEnumParser, 'encodedValueEnumParser');
731
+ const encodedArrayParser = parserCreatorCompose(() => uleb128NumberParser, size => createQuantifierParser(encodedValueParser, size))();
732
+ setParserName(encodedArrayParser, 'encodedArrayParser');
733
+ const encodedValueArrayParser = promiseCompose(createTupleParser([
734
+ parserCreatorCompose(() => createEncodedValueArgParser(0x1C), valueArg => parserContext => {
735
+ parserContext.invariant(valueArg === 0, '(encodedValueArrayParser) valueArg: %s', valueArg);
736
+ })(),
737
+ encodedArrayParser,
738
+ ]), ([_, array]) => ({ type: 'array', value: array }));
739
+ setParserName(encodedValueArrayParser, 'encodedValueArrayParser');
740
+ const annotationElementParser = promiseCompose(createTupleParser([
741
+ uleb128NumberParser,
742
+ createParserAccessorParser(() => encodedValueParser),
743
+ ]), ([nameIndex, value,]) => ({
744
+ nameIndex: isoIndexIntoStringIds.wrap(nameIndex),
745
+ value,
746
+ }));
747
+ setParserName(annotationElementParser, 'annotationElementParser');
748
+ const encodedAnnotationParser = promiseCompose(parserCreatorCompose(() => createTupleParser([
749
+ uleb128NumberParser,
750
+ uleb128NumberParser,
751
+ ]), ([typeIndex, size,]) => createTupleParser([
752
+ () => typeIndex,
753
+ createQuantifierParser(annotationElementParser, size),
754
+ ]))(), ([typeIndex, elements,]) => ({
755
+ typeIndex: isoIndexIntoTypeIds.wrap(typeIndex),
756
+ elements,
757
+ }));
758
+ setParserName(encodedAnnotationParser, 'encodedAnnotationParser');
759
+ const encodedValueAnnotationParser = promiseCompose(createTupleParser([
760
+ parserCreatorCompose(() => createEncodedValueArgParser(0x1D), valueArg => parserContext => {
761
+ parserContext.invariant(valueArg === 0, '(encodedValueAnnotationParser) valueArg: %s', valueArg);
762
+ })(),
763
+ encodedAnnotationParser,
764
+ ]), ([_, annotation]) => ({ type: 'annotation', value: annotation }));
765
+ setParserName(encodedValueAnnotationParser, 'encodedValueAnnotationParser');
766
+ const encodedValueNullParser = parserCreatorCompose(() => createEncodedValueArgParser(0x1E), valueArg => parserContext => {
767
+ parserContext.invariant(valueArg === 0, '(encodedValueNullParser) valueArg: %s', valueArg);
768
+ return ({ type: 'null', value: null });
769
+ })();
770
+ setParserName(encodedValueNullParser, 'encodedValueNullParser');
771
+ const encodedValueBooleanParser = promiseCompose(createEncodedValueArgParser(0x1F), valueArg => ({ type: 'boolean', value: Boolean(valueArg) }));
772
+ setParserName(encodedValueBooleanParser, 'encodedValueBooleanParser');
773
+ const encodedValueParser = createDisjunctionParser([
774
+ encodedValueByteParser,
775
+ encodedValueShortParser,
776
+ encodedValueCharParser,
777
+ encodedValueIntParser,
778
+ encodedValueLongParser,
779
+ encodedValueFloatParser,
780
+ encodedValueDoubleParser,
781
+ encodedValueMethodTypeParser,
782
+ encodedValueMethodHandleParser,
783
+ encodedValueStringParser,
784
+ encodedValueTypeParser,
785
+ encodedValueFieldParser,
786
+ encodedValueMethodParser,
787
+ encodedValueEnumParser,
788
+ encodedValueArrayParser,
789
+ encodedValueAnnotationParser,
790
+ encodedValueNullParser,
791
+ encodedValueBooleanParser,
792
+ ]);
793
+ setParserName(encodedValueParser, 'encodedValueParser');
794
+ const tryItemParser = promiseCompose(createTupleParser([
795
+ uintParser,
796
+ ushortParser,
797
+ ushortParser,
798
+ ]), ([startAddress, instructionCount, handlerOffset,]) => ({
799
+ startAddress,
800
+ instructionCount,
801
+ handlerOffset: isoOffsetFromEncodedCatchHandlerListToEncodedCatchHandler.wrap(handlerOffset),
802
+ }));
803
+ setParserName(tryItemParser, 'tryItemParser');
804
+ const encodedTypeAddressPairParser = promiseCompose(createTupleParser([
805
+ uleb128NumberParser,
806
+ uleb128NumberParser,
807
+ ]), ([typeIndex, address,]) => ({
808
+ typeIndex: isoIndexIntoTypeIds.wrap(typeIndex),
809
+ address,
810
+ }));
811
+ const encodedCatchHandlerParser = parserCreatorCompose(() => sleb128NumberParser, size => promiseCompose(createTupleParser([
812
+ createQuantifierParser(encodedTypeAddressPairParser, Math.abs(size)),
813
+ size <= 0 ? uleb128NumberParser : () => undefined,
814
+ ]), ([handlers, catchAllAddress,]) => ({
815
+ size,
816
+ handlers,
817
+ catchAllAddress,
818
+ })))();
819
+ setParserName(encodedCatchHandlerParser, 'encodedCatchHandlerParser');
820
+ const encodedCatchHandlerListParser = async (parserContext) => {
821
+ const listOffset = parserContext.position;
822
+ const handlers = new Map();
823
+ const size = await uleb128NumberParser(parserContext);
824
+ for (let i = 0; i < size; i += 1) {
825
+ const handlerRelativeOffset = isoOffsetFromEncodedCatchHandlerListToEncodedCatchHandler.wrap(parserContext.position - listOffset);
826
+ const handler = await encodedCatchHandlerParser(parserContext);
827
+ handlers.set(handlerRelativeOffset, handler);
828
+ }
829
+ return handlers;
830
+ };
831
+ setParserName(encodedCatchHandlerListParser, 'encodedCatchHandlerListParser');
832
+ const createDalvikExecutableCodeItemParser = ({ createInstructionsParser, }) => {
833
+ const dalvikExecutableCodeItemParser = parserCreatorCompose(() => createTupleParser([
834
+ byteAlign4Parser,
835
+ ushortParser,
836
+ ushortParser,
837
+ ushortParser,
838
+ ushortParser,
839
+ uintParser,
840
+ uintParser,
841
+ ]), ([_, registersSize, insSize, outsSize, triesSize, debugInfoOffset, instructionsSize,]) => promiseCompose(createTupleParser([
842
+ createInstructionsParser(instructionsSize * 2),
843
+ ((triesSize !== 0
844
+ && instructionsSize % 2 === 1)
845
+ ? byteAlign4Parser
846
+ : () => undefined),
847
+ (triesSize === 0
848
+ ? () => []
849
+ : createQuantifierParser(tryItemParser, triesSize)),
850
+ (triesSize === 0
851
+ ? () => new Map()
852
+ : encodedCatchHandlerListParser),
853
+ ]), ([instructions, _padding, tryItems, handlers,]) => ({
854
+ registersSize,
855
+ insSize,
856
+ outsSize,
857
+ triesSize,
858
+ debugInfoOffset: isoOffsetToDebugInfoItem.wrap(debugInfoOffset),
859
+ instructions,
860
+ tryItems,
861
+ handlers,
862
+ })))();
863
+ setParserName(dalvikExecutableCodeItemParser, 'dalvikExecutableCodeItemParser');
864
+ return dalvikExecutableCodeItemParser;
865
+ };
866
+ const createSkipToThenCodeItemsParser = ({ sizeOffset, createInstructionsParser, }) => createSkipToThenItemByOffsetParser({
867
+ sizeOffset,
868
+ itemParser: createDalvikExecutableCodeItemParser({
869
+ createInstructionsParser,
870
+ }),
871
+ byteAlign4: true,
872
+ isoOffset: isoOffsetToCodeItem,
873
+ parserName: 'skipToThenCodeItemsParser',
874
+ });
875
+ const dalvikExecutableDebugByteCodeValueParser = parserCreatorCompose(() => ubyteParser, (value) => {
876
+ switch (value) {
877
+ case 0x01: {
878
+ return promiseCompose(uleb128NumberParser, addressDiff => ({ type: 'advancePc', addressDiff }));
879
+ }
880
+ case 0x02: {
881
+ return promiseCompose(sleb128NumberParser, lineDiff => ({ type: 'advanceLine', lineDiff }));
882
+ }
883
+ case 0x03: {
884
+ return promiseCompose(createTupleParser([
885
+ uleb128NumberParser,
886
+ uleb128p1NumberParser,
887
+ uleb128p1NumberParser,
888
+ ]), ([registerNumber, nameIndex, typeIndex]) => ({
889
+ type: 'startLocal',
890
+ registerNum: registerNumber,
891
+ nameIndex: nameIndex === -1 ? undefined : isoIndexIntoStringIds.wrap(nameIndex),
892
+ typeIndex: typeIndex === -1 ? undefined : isoIndexIntoTypeIds.wrap(typeIndex),
893
+ }));
894
+ }
895
+ case 0x04: {
896
+ return promiseCompose(createTupleParser([
897
+ uleb128NumberParser,
898
+ uleb128p1NumberParser,
899
+ uleb128p1NumberParser,
900
+ uleb128p1NumberParser,
901
+ ]), ([registerNumber, nameIndex, typeIndex, signatureIndex]) => ({
902
+ type: 'startLocalExtended',
903
+ registerNum: registerNumber,
904
+ nameIndex: nameIndex === -1 ? undefined : isoIndexIntoStringIds.wrap(nameIndex),
905
+ typeIndex: typeIndex === -1 ? undefined : isoIndexIntoTypeIds.wrap(typeIndex),
906
+ signatureIndex: signatureIndex === -1 ? undefined : isoIndexIntoStringIds.wrap(signatureIndex),
907
+ }));
908
+ }
909
+ case 0x05: {
910
+ return promiseCompose(uleb128NumberParser, registerNumber => ({ type: 'endLocal', registerNum: registerNumber }));
911
+ }
912
+ case 0x06: {
913
+ return promiseCompose(uleb128NumberParser, registerNumber => ({ type: 'restartLocal', registerNum: registerNumber }));
914
+ }
915
+ case 0x07: {
916
+ return () => ({ type: 'setPrologueEnd' });
917
+ }
918
+ case 0x08: {
919
+ return () => ({ type: 'setEpilogueBegin' });
920
+ }
921
+ case 0x09: {
922
+ return promiseCompose(uleb128p1NumberParser, nameIndex => ({ type: 'setFile', nameIndex: nameIndex === -1 ? undefined : isoIndexIntoStringIds.wrap(nameIndex) }));
923
+ }
924
+ default: {
925
+ return parserContext => {
926
+ parserContext.invariant(value >= 0x0A, 'Unexpected special value: %s', value);
927
+ return { type: 'special', value };
928
+ };
929
+ }
930
+ }
931
+ })();
932
+ setParserName(dalvikExecutableDebugByteCodeValueParser, 'dalvikExecutableDebugByteCodeValueParser');
933
+ const debugByteCodeParser = createElementTerminatedArrayParserUnsafe(dalvikExecutableDebugByteCodeValueParser, 0);
934
+ setParserName(debugByteCodeParser, 'debugByteCodeParser');
935
+ const DEX_DEBUG_INFO_ITEM_PARAMETER_NAME_NO_INDEX = -1;
936
+ const debugInfoItemParser = parserCreatorCompose(() => createTupleParser([
937
+ uleb128NumberParser,
938
+ uleb128NumberParser,
939
+ ]), ([lineStart, parametersSize,]) => promiseCompose(createTupleParser([
940
+ createQuantifierParser(uleb128p1NumberParser, parametersSize),
941
+ debugByteCodeParser,
942
+ ]), ([parameterNames, bytecode]) => ({
943
+ lineStart,
944
+ parameterNames: parameterNames.map(parameterName => parameterName === DEX_DEBUG_INFO_ITEM_PARAMETER_NAME_NO_INDEX ? undefined : isoIndexIntoStringIds.wrap(parameterName)),
945
+ bytecode,
946
+ })))();
947
+ setParserName(debugInfoItemParser, 'debugInfoItemParser');
948
+ const createSkipToThenDebugInfoItemsParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
949
+ sizeOffset,
950
+ itemParser: debugInfoItemParser,
951
+ byteAlign4: false,
952
+ isoOffset: isoOffsetToDebugInfoItem,
953
+ parserName: 'skipToThenDebugInfoItemsParser',
954
+ });
955
+ const dalvikExecutableAnnotationItemVisibilityParser = promiseCompose(ubyteParser, visibility => {
956
+ switch (visibility) {
957
+ case 0x00: {
958
+ return 'build';
959
+ }
960
+ case 0x01: {
961
+ return 'runtime';
962
+ }
963
+ case 0x02: {
964
+ return 'system';
965
+ }
966
+ default: {
967
+ invariant(false, 'Unexpected visibility: %s', visibility);
968
+ }
969
+ }
970
+ });
971
+ setParserName(dalvikExecutableAnnotationItemVisibilityParser, 'dalvikExecutableAnnotationItemVisibilityParser');
972
+ const dalvikExecutableAnnotationItemParser = promiseCompose(createTupleParser([
973
+ dalvikExecutableAnnotationItemVisibilityParser,
974
+ encodedAnnotationParser,
975
+ ]), ([visibility, encodedAnnotation]) => ({ visibility, encodedAnnotation }));
976
+ setParserName(dalvikExecutableAnnotationItemParser, 'dalvikExecutableAnnotationItemParser');
977
+ const createSkipToThenAnnotationItemsParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
978
+ sizeOffset,
979
+ itemParser: dalvikExecutableAnnotationItemParser,
980
+ byteAlign4: false,
981
+ isoOffset: isoOffsetToAnnotationItem,
982
+ parserName: 'skipToThenAnnotationItemsParser',
983
+ });
984
+ const dalvikExecutableHeaderAndMapParser = parserCreatorCompose(() => dalvikExecutableHeaderItemParser, headerItem => promiseCompose(createLookaheadParser(createDalvikExecutableMapListParser(headerItem.mapOffset)), mapList => ({ headerItem, mapList })))();
985
+ const dalvikExecutableAnnotationOffsetItemParser = promiseCompose(uintParser, annotationOffset => ({
986
+ annotationOffset: isoOffsetToAnnotationItem.wrap(annotationOffset),
987
+ }));
988
+ const dalvikExecutableAnnotationSetItemParser = parserCreatorCompose(() => createTupleParser([
989
+ byteAlign4Parser,
990
+ uintParser,
991
+ ]), ([_, size]) => promiseCompose(createQuantifierParser(dalvikExecutableAnnotationOffsetItemParser, size), entries => ({ entries })))();
992
+ const createSkipToThenAnnotationSetItemsParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
993
+ sizeOffset,
994
+ itemParser: dalvikExecutableAnnotationSetItemParser,
995
+ byteAlign4: true,
996
+ isoOffset: isoOffsetToAnnotationSetItem,
997
+ parserName: 'skipToThenAnnotationSetItemsParser',
998
+ });
999
+ const dalvikExecutableAnnotationSetRefItemParser = promiseCompose(uintParser, annotationsOffset => isoOffsetToAnnotationSetItem.wrap(annotationsOffset));
1000
+ const dalvikExecutableAnnotationSetRefListParser = parserCreatorCompose(() => createTupleParser([
1001
+ byteAlign4Parser,
1002
+ uintParser,
1003
+ ]), ([_, size]) => promiseCompose(createQuantifierParser(dalvikExecutableAnnotationSetRefItemParser, size), list => ({ list })))();
1004
+ const createSkipToThenAnnotationSetRefListsParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
1005
+ sizeOffset,
1006
+ itemParser: dalvikExecutableAnnotationSetRefListParser,
1007
+ byteAlign4: true,
1008
+ isoOffset: isoOffsetToAnnotationSetRefListItem,
1009
+ parserName: 'skipToThenAnnotationSetRefListsParser',
1010
+ });
1011
+ const dalvikExecutableMapItemTypeParser = promiseCompose(ushortParser, type => {
1012
+ switch (type) {
1013
+ case 0x00_00: {
1014
+ return 'headerItem';
1015
+ }
1016
+ case 0x00_01: {
1017
+ return 'stringIdItem';
1018
+ }
1019
+ case 0x00_02: {
1020
+ return 'typeIdItem';
1021
+ }
1022
+ case 0x00_03: {
1023
+ return 'prototypeIdItem';
1024
+ }
1025
+ case 0x00_04: {
1026
+ return 'fieldIdItem';
1027
+ }
1028
+ case 0x00_05: {
1029
+ return 'methodIdItem';
1030
+ }
1031
+ case 0x00_06: {
1032
+ return 'classDefinitionItem';
1033
+ }
1034
+ case 0x00_07: {
1035
+ return 'callSiteIdItem';
1036
+ }
1037
+ case 0x00_08: {
1038
+ return 'methodHandleItem';
1039
+ }
1040
+ case 0x10_00: {
1041
+ return 'mapList';
1042
+ }
1043
+ case 0x10_01: {
1044
+ return 'typeList';
1045
+ }
1046
+ case 0x10_02: {
1047
+ return 'annotationSetRefList';
1048
+ }
1049
+ case 0x10_03: {
1050
+ return 'annotationSetItem';
1051
+ }
1052
+ case 0x20_00: {
1053
+ return 'classDataItem';
1054
+ }
1055
+ case 0x20_01: {
1056
+ return 'codeItem';
1057
+ }
1058
+ case 0x20_02: {
1059
+ return 'stringDataItem';
1060
+ }
1061
+ case 0x20_03: {
1062
+ return 'debugInfoItem';
1063
+ }
1064
+ case 0x20_04: {
1065
+ return 'annotationItem';
1066
+ }
1067
+ case 0x20_05: {
1068
+ return 'encodedArrayItem';
1069
+ }
1070
+ case 0x20_06: {
1071
+ return 'annotationsDirectoryItem';
1072
+ }
1073
+ case 0xF0_00: {
1074
+ return 'hiddenApiClassDataItem';
1075
+ }
1076
+ default: {
1077
+ invariant(false, 'Unexpected map item type: %s', type);
1078
+ }
1079
+ }
1080
+ });
1081
+ const dalvikExecutableMapItemParser = promiseCompose(createTupleParser([
1082
+ dalvikExecutableMapItemTypeParser,
1083
+ ushortParser,
1084
+ uintParser,
1085
+ uintParser,
1086
+ ]), ([type, _unused, size, offset]) => ({ type, size, offset }));
1087
+ const dalvikExecutableMapListParser = parserCreatorCompose(() => uintParser, size => createQuantifierParser(dalvikExecutableMapItemParser, size))();
1088
+ setParserName(dalvikExecutableMapListParser, 'dalvikExecutableMapListParser');
1089
+ const createDalvikExecutableMapListParser = (mapOffset) => {
1090
+ const dalvikExecutableMapParser = promiseCompose(createTupleParser([
1091
+ createSkipToParser(mapOffset),
1092
+ dalvikExecutableMapListParser,
1093
+ ]), ([_, map]) => map);
1094
+ setParserName(dalvikExecutableMapParser, 'dalvikExecutableMapParser');
1095
+ return dalvikExecutableMapParser;
1096
+ };
1097
+ const createSkipToThenEncodedArrayItemsParser = (sizeOffset) => createSkipToThenItemByOffsetParser({
1098
+ sizeOffset,
1099
+ itemParser: encodedArrayParser,
1100
+ byteAlign4: false,
1101
+ isoOffset: isoOffsetToEncodedArrayItem,
1102
+ parserName: 'skipToThenEncodedArrayItemsParser',
1103
+ });
1104
+ const createDalvikExecutableDataParser = ({ headerItem, mapList, createInstructionsParser, }) => {
1105
+ const dalvikExecutableDataParser = async (parserContext) => {
1106
+ let stringIdItems = isoDalvikExecutableStringIdItems.wrap([]);
1107
+ let typeIdItems = isoDalvikExecutableTypeIdItems.wrap([]);
1108
+ let prototypeIdItems = isoDalvikExecutablePrototypeIdItems.wrap([]);
1109
+ let fieldIdItems = isoDalvikExecutableFieldIdItems.wrap([]);
1110
+ let methodIdItems = isoDalvikExecutableMethodIdItems.wrap([]);
1111
+ let classDefinitionItems = [];
1112
+ const callSiteIdItems = [];
1113
+ const methodHandleItems = [];
1114
+ let typeListByOffset = new Map();
1115
+ let annotationSetRefListItemByOffset = new Map();
1116
+ let annotationSetItemByOffset = new Map();
1117
+ let classDataItemByOffset = new Map();
1118
+ let codeItemByOffset = new Map();
1119
+ let stringDataItemStringByOffset = new Map();
1120
+ let debugInfoItemByOffset = new Map();
1121
+ let annotationItemByOffset = new Map();
1122
+ let encodedArrayItemByOffset = new Map();
1123
+ let annotationsDirectoryItemByOffset = new Map();
1124
+ const hiddenApiClassDataItems = [];
1125
+ // Track if link has been parsed
1126
+ let link = undefined;
1127
+ let linkParsed = false;
1128
+ for (const dexMapItem of mapList) {
1129
+ // Parse link data before any map item that comes after it in the file
1130
+ // Link data is not included in the map items, but is referenced in the header
1131
+ if (!linkParsed && headerItem.link.size > 0 && headerItem.link.offset < dexMapItem.offset) {
1132
+ link = await createRawDataParser(headerItem.link)(parserContext);
1133
+ linkParsed = true;
1134
+ }
1135
+ if (dexMapItem.type === 'headerItem') {
1136
+ continue;
1137
+ }
1138
+ if (dexMapItem.type === 'stringIdItem') {
1139
+ stringIdItems = await createSkipToThenStringIdItemsParser(dexMapItem)(parserContext);
1140
+ continue;
1141
+ }
1142
+ if (dexMapItem.type === 'typeIdItem') {
1143
+ typeIdItems = await createSkipToThenTypeIdItemsParser(dexMapItem)(parserContext);
1144
+ continue;
1145
+ }
1146
+ if (dexMapItem.type === 'prototypeIdItem') {
1147
+ prototypeIdItems = await createSkipToThenPrototypeIdItemsParser(dexMapItem)(parserContext);
1148
+ continue;
1149
+ }
1150
+ if (dexMapItem.type === 'fieldIdItem') {
1151
+ fieldIdItems = await createSkipToThenFieldIdItemsParser(dexMapItem)(parserContext);
1152
+ continue;
1153
+ }
1154
+ if (dexMapItem.type === 'methodIdItem') {
1155
+ methodIdItems = await createSkipToThenMethodIdItemsParser(dexMapItem)(parserContext);
1156
+ continue;
1157
+ }
1158
+ if (dexMapItem.type === 'classDefinitionItem') {
1159
+ classDefinitionItems = await createSkipToThenClassDefinitionItemsParser(dexMapItem)(parserContext);
1160
+ continue;
1161
+ }
1162
+ if (dexMapItem.type === 'callSiteIdItem') {
1163
+ // TODO
1164
+ }
1165
+ if (dexMapItem.type === 'methodHandleItem') {
1166
+ // TODO
1167
+ }
1168
+ if (dexMapItem.type === 'mapList') {
1169
+ // Re-parse the map itself to consume it from the input
1170
+ await createDalvikExecutableMapListParser(dexMapItem.offset)(parserContext);
1171
+ continue;
1172
+ }
1173
+ if (dexMapItem.type === 'typeList') {
1174
+ typeListByOffset = await createSkipToThenTypeListByOffsetParser(dexMapItem)(parserContext);
1175
+ continue;
1176
+ }
1177
+ if (dexMapItem.type === 'annotationSetRefList') {
1178
+ annotationSetRefListItemByOffset = await createSkipToThenAnnotationSetRefListsParser(dexMapItem)(parserContext);
1179
+ continue;
1180
+ }
1181
+ if (dexMapItem.type === 'annotationSetItem') {
1182
+ annotationSetItemByOffset = await createSkipToThenAnnotationSetItemsParser(dexMapItem)(parserContext);
1183
+ continue;
1184
+ }
1185
+ if (dexMapItem.type === 'classDataItem') {
1186
+ classDataItemByOffset = await createSkipToThenClassDataItemsParser(dexMapItem)(parserContext);
1187
+ continue;
1188
+ }
1189
+ if (dexMapItem.type === 'codeItem') {
1190
+ codeItemByOffset = await createSkipToThenCodeItemsParser({
1191
+ sizeOffset: dexMapItem,
1192
+ createInstructionsParser,
1193
+ })(parserContext);
1194
+ continue;
1195
+ }
1196
+ if (dexMapItem.type === 'stringDataItem') {
1197
+ stringDataItemStringByOffset = await createSkipToThenStringsParser(dexMapItem)(parserContext);
1198
+ continue;
1199
+ }
1200
+ if (dexMapItem.type === 'debugInfoItem') {
1201
+ debugInfoItemByOffset = await createSkipToThenDebugInfoItemsParser(dexMapItem)(parserContext);
1202
+ continue;
1203
+ }
1204
+ if (dexMapItem.type === 'annotationItem') {
1205
+ annotationItemByOffset = await createSkipToThenAnnotationItemsParser(dexMapItem)(parserContext);
1206
+ continue;
1207
+ }
1208
+ if (dexMapItem.type === 'encodedArrayItem') {
1209
+ encodedArrayItemByOffset = await createSkipToThenEncodedArrayItemsParser(dexMapItem)(parserContext);
1210
+ continue;
1211
+ }
1212
+ if (dexMapItem.type === 'annotationsDirectoryItem') {
1213
+ annotationsDirectoryItemByOffset = await createSkipToThenAnnotationsDirectoryItemsParser(dexMapItem)(parserContext);
1214
+ continue;
1215
+ }
1216
+ if (dexMapItem.type === 'hiddenApiClassDataItem') {
1217
+ // TODO
1218
+ }
1219
+ invariant(false, 'Unexpected map item type: %s', dexMapItem.type);
1220
+ }
1221
+ // Parse link data after the loop if it hasn't been parsed yet
1222
+ // This handles the case where link comes after all map items
1223
+ if (!linkParsed && headerItem.link.size > 0) {
1224
+ link = await createRawDataParser(headerItem.link)(parserContext);
1225
+ }
1226
+ return {
1227
+ headerItem,
1228
+ stringIdItems,
1229
+ typeIdItems,
1230
+ prototypeIdItems,
1231
+ fieldIdItems,
1232
+ methodIdItems,
1233
+ classDefinitionItems,
1234
+ callSiteIdItems,
1235
+ methodHandleItems,
1236
+ mapList,
1237
+ typeListByOffset,
1238
+ annotationSetRefListItemByOffset,
1239
+ annotationSetItemByOffset,
1240
+ classDataItemByOffset,
1241
+ codeItemByOffset,
1242
+ stringDataItemStringByOffset,
1243
+ debugInfoItemByOffset,
1244
+ annotationItemByOffset,
1245
+ encodedArrayItemByOffset,
1246
+ annotationsDirectoryItemByOffset,
1247
+ hiddenApiClassDataItems,
1248
+ link,
1249
+ };
1250
+ };
1251
+ setParserName(dalvikExecutableDataParser, 'dalvikExecutableDataParser');
1252
+ return dalvikExecutableDataParser;
1253
+ };
1254
+ const createDalvikExecutableParser = ({ createInstructionsParser, }) => parserCreatorCompose(() => dalvikExecutableHeaderAndMapParser, ({ headerItem, mapList, }) => promiseCompose(createDalvikExecutableDataParser({
1255
+ headerItem,
1256
+ mapList,
1257
+ createInstructionsParser,
1258
+ }), async ({ headerItem: _headerItem, stringIdItems, typeIdItems, prototypeIdItems, fieldIdItems, methodIdItems, classDefinitionItems,
1259
+ // CallSiteIdItems,
1260
+ // methodHandleItems,
1261
+ mapList: _mapList, typeListByOffset, annotationSetRefListItemByOffset, annotationSetItemByOffset, classDataItemByOffset, codeItemByOffset, stringDataItemStringByOffset, debugInfoItemByOffset, annotationItemByOffset, encodedArrayItemByOffset, annotationsDirectoryItemByOffset,
1262
+ // HiddenApiClassDataItems,
1263
+ link, }) => {
1264
+ const strings = stringIdItems.map(stringId => {
1265
+ const stringOffset = stringId;
1266
+ const string = stringDataItemStringByOffset.get(stringOffset);
1267
+ invariant(string !== undefined, 'String must be there. String offset: %s', stringOffset);
1268
+ return string;
1269
+ });
1270
+ const types = typeIdItems.map(typeId => {
1271
+ const type = strings.at(typeId);
1272
+ invariant(type, 'Type string must be there. Type id: %s', typeId);
1273
+ return type;
1274
+ });
1275
+ const resolvedTypeListByOffset = new Map([
1276
+ [isoOffsetToTypeList.wrap(0), []],
1277
+ ]);
1278
+ for (const [offset, typeIndexes] of typeListByOffset) {
1279
+ const typeNames = isoDalvikExecutableTypeList.unwrap(typeIndexes).map(typeIndex => {
1280
+ const type = types.at(typeIndex);
1281
+ invariant(type, 'Type must be there. Type id: %s', typeIndex);
1282
+ return type;
1283
+ });
1284
+ resolvedTypeListByOffset.set(offset, typeNames);
1285
+ }
1286
+ const prototypes = prototypeIdItems.map(prototypeId => {
1287
+ const shorty = strings.at(prototypeId.shortyIndex);
1288
+ invariant(shorty, 'Shorty must be there. Shorty id: %s', prototypeId.shortyIndex);
1289
+ const returnType = types.at(prototypeId.returnTypeIndex);
1290
+ invariant(returnType, 'Return type must be there. Return type id: %s', prototypeId.returnTypeIndex);
1291
+ const parameters = resolvedTypeListByOffset.get(prototypeId.parametersOffset);
1292
+ invariant(parameters !== undefined, 'Parameters must be there. Parameters offset: %s', prototypeId.parametersOffset);
1293
+ return { shorty, returnType, parameters };
1294
+ });
1295
+ const fields = fieldIdItems.map(fieldId => {
1296
+ const class_ = types.at(fieldId.classIndex);
1297
+ invariant(class_, 'Class must be there. Class id: %s', fieldId.classIndex);
1298
+ const type = types.at(fieldId.typeIndex);
1299
+ invariant(type, 'Type must be there. Type id: %s', fieldId.typeIndex);
1300
+ const name = strings.at(fieldId.nameIndex);
1301
+ invariant(name, 'Name string must be there. String offset: %s', fieldId.nameIndex);
1302
+ return { class: class_, type, name };
1303
+ });
1304
+ const methods = methodIdItems.map(methodId => {
1305
+ const class_ = types.at(methodId.classIndex);
1306
+ invariant(class_, 'Class must be there. Class id: %s', methodId.classIndex);
1307
+ const prototype = prototypes.at(methodId.prototypeIndex);
1308
+ invariant(prototype, 'Prototype must be there. Prototype id: %s', methodId.prototypeIndex);
1309
+ const name = strings.at(methodId.nameIndex);
1310
+ invariant(name, 'Name string must be there. String offset: %s', methodId.nameIndex);
1311
+ return { class: class_, prototype, name };
1312
+ });
1313
+ const debugInfoByOffset = new Map([
1314
+ [isoOffsetToDebugInfoItem.wrap(0), undefined],
1315
+ ]);
1316
+ for (const [offset, debugInfoItem] of debugInfoItemByOffset) {
1317
+ debugInfoByOffset.set(offset, {
1318
+ lineStart: debugInfoItem.lineStart,
1319
+ parameterNames: debugInfoItem.parameterNames.map(index => {
1320
+ if (index === undefined) {
1321
+ return undefined;
1322
+ }
1323
+ const string = strings.at(index);
1324
+ invariant(string !== undefined, 'String must be there. String id: %s', index);
1325
+ return string;
1326
+ }),
1327
+ bytecode: debugInfoItem.bytecode.map(value => {
1328
+ switch (value.type) {
1329
+ case 'startLocal': {
1330
+ return {
1331
+ type: 'startLocal',
1332
+ registerNum: value.registerNum,
1333
+ name: value.nameIndex === undefined ? undefined : strings.at(value.nameIndex),
1334
+ type_: value.typeIndex === undefined ? undefined : types.at(value.typeIndex),
1335
+ };
1336
+ }
1337
+ case 'startLocalExtended': {
1338
+ return {
1339
+ type: 'startLocalExtended',
1340
+ registerNum: value.registerNum,
1341
+ name: value.nameIndex === undefined ? undefined : strings.at(value.nameIndex),
1342
+ type_: value.typeIndex === undefined ? undefined : types.at(value.typeIndex),
1343
+ signature: value.signatureIndex === undefined ? undefined : strings.at(value.signatureIndex),
1344
+ };
1345
+ }
1346
+ case 'setFile': {
1347
+ return { type: 'setFile', name: value.nameIndex === undefined ? undefined : strings.at(value.nameIndex) };
1348
+ }
1349
+ default: {
1350
+ return value;
1351
+ }
1352
+ }
1353
+ }),
1354
+ });
1355
+ }
1356
+ const codeByOffset = new Map([
1357
+ [isoOffsetToCodeItem.wrap(0), undefined],
1358
+ ]);
1359
+ for (const [offset, codeItem] of codeItemByOffset) {
1360
+ const debugInfo = debugInfoByOffset.get(codeItem.debugInfoOffset);
1361
+ codeByOffset.set(offset, {
1362
+ registersSize: codeItem.registersSize,
1363
+ insSize: codeItem.insSize,
1364
+ outsSize: codeItem.outsSize,
1365
+ debugInfo,
1366
+ instructions: codeItem.instructions,
1367
+ tries: codeItem.tryItems.map(tryItem => {
1368
+ const handler_ = codeItem.handlers.get(tryItem.handlerOffset);
1369
+ invariant(handler_, 'Handler must be there. Handler offset: %s', tryItem.handlerOffset);
1370
+ const handler = {
1371
+ handlers: handler_.handlers.map(encodedHandler => {
1372
+ const type = types.at(encodedHandler.typeIndex);
1373
+ invariant(type, 'Type must be there. Type id: %s', encodedHandler.typeIndex);
1374
+ return {
1375
+ type,
1376
+ address: encodedHandler.address,
1377
+ };
1378
+ }),
1379
+ catchAllAddress: handler_.catchAllAddress,
1380
+ };
1381
+ return {
1382
+ startAddress: tryItem.startAddress,
1383
+ instructionCount: tryItem.instructionCount,
1384
+ handler,
1385
+ };
1386
+ }),
1387
+ });
1388
+ }
1389
+ const classDataByOffset = new Map([
1390
+ [isoOffsetToClassDataItem.wrap(0), undefined],
1391
+ ]);
1392
+ const resolvers = {
1393
+ resolveIndexIntoStringIds(indexIntoStringIds) {
1394
+ const string = strings.at(indexIntoStringIds);
1395
+ invariant(string !== undefined, 'String must be there. String id: %s', indexIntoStringIds);
1396
+ return string;
1397
+ },
1398
+ resolveIndexIntoTypeIds(indexIntoTypeIds) {
1399
+ const type = types.at(indexIntoTypeIds);
1400
+ invariant(type !== undefined, 'Type must be there. Type id: %s', indexIntoTypeIds);
1401
+ return type;
1402
+ },
1403
+ resolveIndexIntoMethodIds(indexIntoMethodIds) {
1404
+ const method = methods.at(indexIntoMethodIds);
1405
+ invariant(method !== undefined, 'Method must be there. Method id: %s', indexIntoMethodIds);
1406
+ return method;
1407
+ },
1408
+ resolveIndexIntoFieldIds(indexIntoFieldIds) {
1409
+ const field = fields.at(indexIntoFieldIds);
1410
+ invariant(field !== undefined, 'Field must be there. Field id: %s', indexIntoFieldIds);
1411
+ return field;
1412
+ },
1413
+ };
1414
+ function resolveCode(code) {
1415
+ if (!code) {
1416
+ return code;
1417
+ }
1418
+ const { instructions, ...rest } = code;
1419
+ if (!Array.isArray(instructions)) {
1420
+ return code;
1421
+ }
1422
+ return {
1423
+ ...rest,
1424
+ instructions: instructions.map((instruction) => resolveDalvikBytecodeOperation(instruction, resolvers)),
1425
+ };
1426
+ }
1427
+ for (const [offset, classDataItem] of classDataItemByOffset) {
1428
+ classDataByOffset.set(offset, {
1429
+ staticFields: classDataItem.staticFields.map(encodedField => {
1430
+ const field = fields.at(encodedField.fieldIndex);
1431
+ invariant(field, 'Field must be there. Field id: %s', encodedField.fieldIndex);
1432
+ return {
1433
+ field,
1434
+ accessFlags: encodedField.accessFlags,
1435
+ };
1436
+ }),
1437
+ instanceFields: classDataItem.instanceFields.map(encodedField => {
1438
+ const field = fields.at(encodedField.fieldIndex);
1439
+ invariant(field, 'Field must be there. Field id: %s', encodedField.fieldIndex);
1440
+ return {
1441
+ field,
1442
+ accessFlags: encodedField.accessFlags,
1443
+ };
1444
+ }),
1445
+ directMethods: classDataItem.directMethods.map(method => {
1446
+ const method_ = methods.at(method.methodIndex);
1447
+ invariant(method_, 'Method must be there. Method id: %s', method.methodIndex);
1448
+ const code = codeByOffset.get(method.codeOffset);
1449
+ invariant(!method.codeOffset || code, 'Code must be there. Code offset: %s', method.codeOffset);
1450
+ return {
1451
+ method: method_,
1452
+ accessFlags: method.accessFlags,
1453
+ code: resolveCode(code),
1454
+ };
1455
+ }),
1456
+ virtualMethods: classDataItem.virtualMethods.map(method => {
1457
+ const method_ = methods.at(method.methodIndex);
1458
+ invariant(method_, 'Method must be there. Method id: %s', method.methodIndex);
1459
+ const code = codeByOffset.get(method.codeOffset);
1460
+ invariant(!method.codeOffset || code, 'Code must be there. Code offset: %s', method.codeOffset);
1461
+ return {
1462
+ method: method_,
1463
+ accessFlags: method.accessFlags,
1464
+ code: resolveCode(code),
1465
+ };
1466
+ }),
1467
+ });
1468
+ }
1469
+ // Resolve TaggedEncodedValue to DalvikExecutableEncodedValue for static values
1470
+ // Resolves internal index types to actual values while preserving type tags
1471
+ function resolveTaggedEncodedValueForStaticValues(taggedValue) {
1472
+ const { type, value } = taggedValue;
1473
+ // For primitive types, keep the type tag and value
1474
+ if (type === 'byte'
1475
+ || type === 'short'
1476
+ || type === 'char'
1477
+ || type === 'int'
1478
+ || type === 'float'
1479
+ || type === 'double'
1480
+ || type === 'long'
1481
+ || type === 'boolean'
1482
+ || type === 'null'
1483
+ || type === 'methodHandle') {
1484
+ return { type, value };
1485
+ }
1486
+ // For types that reference the pool, resolve the index to the actual value
1487
+ if (type === 'methodType') {
1488
+ const prototype = prototypes.at(value);
1489
+ invariant(prototype, 'Prototype must be there. Prototype id: %s', isoIndexIntoPrototypeIds.unwrap(value));
1490
+ return { type, value: prototype };
1491
+ }
1492
+ if (type === 'string') {
1493
+ const string = strings.at(value);
1494
+ invariant(string !== undefined, 'String must be there. String id: %s', isoIndexIntoStringIds.unwrap(value));
1495
+ return { type, value: string };
1496
+ }
1497
+ if (type === 'type') {
1498
+ const typeString = types.at(value);
1499
+ invariant(typeString !== undefined, 'Type must be there. Type id: %s', isoIndexIntoTypeIds.unwrap(value));
1500
+ return { type, value: typeString };
1501
+ }
1502
+ if (type === 'field' || type === 'enum') {
1503
+ const field = fields.at(value);
1504
+ invariant(field, 'Field must be there. Field id: %s', isoIndexIntoFieldIds.unwrap(value));
1505
+ return { type, value: field };
1506
+ }
1507
+ if (type === 'method') {
1508
+ const method = methods.at(value);
1509
+ invariant(method, 'Method must be there. Method id: %s', isoIndexIntoMethodIds.unwrap(value));
1510
+ return { type, value: method };
1511
+ }
1512
+ if (type === 'array') {
1513
+ return { type, value: value.map(resolveTaggedEncodedValueForStaticValues) };
1514
+ }
1515
+ if (type === 'annotation') {
1516
+ // Resolve the encoded annotation
1517
+ const annotationType = types.at(value.typeIndex);
1518
+ invariant(annotationType, 'Type must be there. Type id: %s', isoIndexIntoTypeIds.unwrap(value.typeIndex));
1519
+ const resolvedElements = value.elements.map(element => {
1520
+ const name = strings.at(element.nameIndex);
1521
+ invariant(name, 'Name string must be there. String offset: %s', element.nameIndex);
1522
+ return {
1523
+ name,
1524
+ value: resolveTaggedEncodedValueForAnnotations(element.value),
1525
+ };
1526
+ });
1527
+ const annotation = {
1528
+ visibility: 'build', // Default visibility for embedded annotations
1529
+ type: annotationType,
1530
+ elements: resolvedElements,
1531
+ };
1532
+ return { type, value: annotation };
1533
+ }
1534
+ // This should never happen
1535
+ throw new Error(`Unknown encoded value type: ${type}`);
1536
+ }
1537
+ // Resolve TaggedEncodedValue to DalvikExecutableEncodedValue for annotation elements
1538
+ // Resolves internal index types to actual values while preserving type tags
1539
+ function resolveTaggedEncodedValueForAnnotations(taggedValue) {
1540
+ const { type, value } = taggedValue;
1541
+ // For primitive types, keep the type tag and value
1542
+ if (type === 'byte'
1543
+ || type === 'short'
1544
+ || type === 'char'
1545
+ || type === 'int'
1546
+ || type === 'float'
1547
+ || type === 'double'
1548
+ || type === 'long'
1549
+ || type === 'boolean'
1550
+ || type === 'null'
1551
+ || type === 'methodHandle') {
1552
+ return { type, value };
1553
+ }
1554
+ // For types that reference the pool, resolve the index to the actual value
1555
+ if (type === 'methodType') {
1556
+ const prototype = prototypes.at(value);
1557
+ invariant(prototype, 'Prototype must be there. Prototype id: %s', isoIndexIntoPrototypeIds.unwrap(value));
1558
+ return { type, value: prototype };
1559
+ }
1560
+ if (type === 'string') {
1561
+ const string = strings.at(value);
1562
+ invariant(string !== undefined, 'String must be there. String id: %s', isoIndexIntoStringIds.unwrap(value));
1563
+ return { type, value: string };
1564
+ }
1565
+ if (type === 'type') {
1566
+ const typeString = types.at(value);
1567
+ invariant(typeString !== undefined, 'Type must be there. Type id: %s', isoIndexIntoTypeIds.unwrap(value));
1568
+ return { type, value: typeString };
1569
+ }
1570
+ if (type === 'field' || type === 'enum') {
1571
+ const field = fields.at(value);
1572
+ invariant(field, 'Field must be there. Field id: %s', isoIndexIntoFieldIds.unwrap(value));
1573
+ return { type, value: field };
1574
+ }
1575
+ if (type === 'method') {
1576
+ const method = methods.at(value);
1577
+ invariant(method, 'Method must be there. Method id: %s', isoIndexIntoMethodIds.unwrap(value));
1578
+ return { type, value: method };
1579
+ }
1580
+ // For arrays, recursively resolve elements
1581
+ if (type === 'array') {
1582
+ return { type, value: value.map(resolveTaggedEncodedValueForAnnotations) };
1583
+ }
1584
+ // For annotations
1585
+ if (type === 'annotation') {
1586
+ // Resolve the encoded annotation (subannotation)
1587
+ const annotationType = types.at(value.typeIndex);
1588
+ invariant(annotationType, 'Type must be there. Type id: %s', isoIndexIntoTypeIds.unwrap(value.typeIndex));
1589
+ const resolvedElements = value.elements.map(element => {
1590
+ const name = strings.at(element.nameIndex);
1591
+ invariant(name, 'Name string must be there. String offset: %s', element.nameIndex);
1592
+ return {
1593
+ name,
1594
+ value: resolveTaggedEncodedValueForAnnotations(element.value),
1595
+ };
1596
+ });
1597
+ const annotation = {
1598
+ visibility: 'build', // Default visibility for embedded annotations
1599
+ type: annotationType,
1600
+ elements: resolvedElements,
1601
+ };
1602
+ return { type, value: annotation };
1603
+ }
1604
+ // This should never happen
1605
+ throw new Error(`Unknown encoded value type: ${type}`);
1606
+ }
1607
+ function resolveAnnotationOffsetItem({ annotationOffset }) {
1608
+ const annotationItem = annotationItemByOffset.get(annotationOffset);
1609
+ invariant(annotationItem, 'Annotation must be there. Annotation offset: %s', annotationOffset);
1610
+ const type = types.at(annotationItem.encodedAnnotation.typeIndex);
1611
+ invariant(type, 'Type must be there. Type id: %s', annotationItem.encodedAnnotation.typeIndex);
1612
+ const elements = annotationItem.encodedAnnotation.elements.map(element => {
1613
+ const name = strings.at(element.nameIndex);
1614
+ invariant(name, 'Name string must be there. String offset: %s', element.nameIndex);
1615
+ return {
1616
+ name,
1617
+ value: resolveTaggedEncodedValueForAnnotations(element.value),
1618
+ };
1619
+ });
1620
+ return {
1621
+ visibility: annotationItem.visibility,
1622
+ type,
1623
+ elements,
1624
+ };
1625
+ }
1626
+ function resolveAnnotationSetItem(annotationSetItem) {
1627
+ if (!annotationSetItem) {
1628
+ return undefined;
1629
+ }
1630
+ const annotationSet = annotationSetItem.entries.map(resolveAnnotationOffsetItem);
1631
+ if (!annotationSet.length) {
1632
+ return [];
1633
+ }
1634
+ return annotationSet;
1635
+ }
1636
+ const classDefinitions = classDefinitionItems.map(classDefinitionItem => {
1637
+ const class_ = types.at(classDefinitionItem.classIndex);
1638
+ invariant(class_, 'Class must be there. Class id: %s', classDefinitionItem.classIndex);
1639
+ const superclass = types.at(classDefinitionItem.superclassIndex);
1640
+ invariant(superclass, 'Superclass must be there. Superclass id: %s', classDefinitionItem.superclassIndex);
1641
+ const interfaces = resolvedTypeListByOffset.get(classDefinitionItem.interfacesOffset);
1642
+ invariant(interfaces !== undefined, 'Interfaces must be there. Interfaces offset: %s', classDefinitionItem.interfacesOffset);
1643
+ const sourceFile = classDefinitionItem.sourceFileIndex === undefined ? undefined : strings.at(classDefinitionItem.sourceFileIndex);
1644
+ const annotationsDirectoryItem = annotationsDirectoryItemByOffset.get(classDefinitionItem.annotationsOffset);
1645
+ invariant(isoOffsetToAnnotationsDirectoryItem.unwrap(classDefinitionItem.annotationsOffset) === 0 || annotationsDirectoryItem, 'Annotations directory item must be there. Annotations offset: %s', classDefinitionItem.annotationsOffset);
1646
+ const annotations = (() => {
1647
+ if (!annotationsDirectoryItem) {
1648
+ return undefined;
1649
+ }
1650
+ const classAnnotationSetItem = annotationSetItemByOffset.get(annotationsDirectoryItem.classAnnotationsOffset);
1651
+ invariant(isoOffsetToAnnotationSetItem.unwrap(annotationsDirectoryItem.classAnnotationsOffset) === 0 || classAnnotationSetItem, 'Class annotations must be there. Class annotations offset: %s', annotationsDirectoryItem.classAnnotationsOffset);
1652
+ const classAnnotations = (classAnnotationSetItem
1653
+ ? resolveAnnotationSetItem(classAnnotationSetItem)
1654
+ : undefined) ?? [];
1655
+ const fieldAnnotations = annotationsDirectoryItem.fieldAnnotations.flatMap(fieldAnnotation => {
1656
+ const field = fields.at(fieldAnnotation.fieldIndex);
1657
+ invariant(field, 'Field must be there. Field id: %s', fieldAnnotation.fieldIndex);
1658
+ const annotationSetItem = annotationSetItemByOffset.get(fieldAnnotation.annotationsOffset);
1659
+ invariant(isoOffsetToAnnotationSetItem.unwrap(fieldAnnotation.annotationsOffset) === 0 || annotationSetItem, 'Annotations must be there. Annotations offset: %s', fieldAnnotation.annotationsOffset);
1660
+ const annotations = resolveAnnotationSetItem(annotationSetItem);
1661
+ // Skip fields with no annotations (undefined or empty array)
1662
+ if (!annotations || annotations.length === 0) {
1663
+ return [];
1664
+ }
1665
+ return [{
1666
+ field,
1667
+ annotations,
1668
+ }];
1669
+ });
1670
+ const methodAnnotations = annotationsDirectoryItem.methodAnnotations.flatMap(methodAnnotation => {
1671
+ const method = methods.at(methodAnnotation.methodIndex);
1672
+ invariant(method, 'Method must be there. Method id: %s', methodAnnotation.methodIndex);
1673
+ const annotationSetItem = annotationSetItemByOffset.get(methodAnnotation.annotationsOffset);
1674
+ invariant(isoOffsetToAnnotationSetItem.unwrap(methodAnnotation.annotationsOffset) === 0 || annotationSetItem, 'Annotations must be there. Annotations offset: %s', methodAnnotation.annotationsOffset);
1675
+ const annotations = resolveAnnotationSetItem(annotationSetItem) ?? [];
1676
+ // Skip methods with no annotations
1677
+ if (annotations.length === 0) {
1678
+ return [];
1679
+ }
1680
+ return [{
1681
+ method,
1682
+ annotations,
1683
+ }];
1684
+ });
1685
+ const parameterAnnotations = annotationsDirectoryItem.parameterAnnotations.flatMap(parameterAnnotation => {
1686
+ const method = methods.at(parameterAnnotation.methodIndex);
1687
+ invariant(method, 'Method must be there. Method id: %s', parameterAnnotation.methodIndex);
1688
+ const annotationSetRefList = annotationSetRefListItemByOffset.get(parameterAnnotation.annotationsOffset);
1689
+ invariant(isoOffsetToAnnotationSetRefListItem.unwrap(parameterAnnotation.annotationsOffset) === 0 || annotationSetRefList, 'Annotations must be there. Annotations offset: %s', parameterAnnotation.annotationsOffset);
1690
+ const annotations = annotationSetRefList?.list.map(annotationSetRefItem => {
1691
+ const annotationSetItem = annotationSetItemByOffset.get(annotationSetRefItem);
1692
+ invariant(isoOffsetToAnnotationSetItem.unwrap(annotationSetRefItem) === 0 || annotationSetItem, 'Annotations must be there. Annotations offset: %s', annotationSetRefItem);
1693
+ const annotationSet = resolveAnnotationSetItem(annotationSetItem);
1694
+ return annotationSet ?? [];
1695
+ }) ?? [];
1696
+ return { method, annotations };
1697
+ });
1698
+ return {
1699
+ classAnnotations,
1700
+ fieldAnnotations,
1701
+ methodAnnotations,
1702
+ parameterAnnotations,
1703
+ };
1704
+ })();
1705
+ const classData = classDataByOffset.get(classDefinitionItem.classDataOffset);
1706
+ const staticValuesTagged = isoOffsetToEncodedArrayItem.unwrap(classDefinitionItem.staticValuesOffset) === 0 ? [] : encodedArrayItemByOffset.get(classDefinitionItem.staticValuesOffset);
1707
+ invariant(staticValuesTagged, 'Static values must be there. Static values offset: %s', classDefinitionItem.staticValuesOffset);
1708
+ const staticValues = staticValuesTagged.map(resolveTaggedEncodedValueForStaticValues);
1709
+ const allMembers = [
1710
+ ...classData?.staticFields ?? [],
1711
+ ...classData?.instanceFields ?? [],
1712
+ ...classData?.directMethods ?? [],
1713
+ // ...classData?.virtualMethods ?? [], // TODO?
1714
+ ];
1715
+ const allMembersAreSynthetic = (allMembers.every(member => member.accessFlags.synthetic)
1716
+ && allMembers.length > 0);
1717
+ const accessFlags = {
1718
+ ...classDefinitionItem.accessFlags,
1719
+ // Use the synthetic flag from the class definition, or compute it from members if not set
1720
+ synthetic: classDefinitionItem.accessFlags.synthetic || allMembersAreSynthetic,
1721
+ };
1722
+ return {
1723
+ class: class_,
1724
+ accessFlags,
1725
+ superclass,
1726
+ interfaces,
1727
+ sourceFile,
1728
+ annotations,
1729
+ classData,
1730
+ staticValues,
1731
+ };
1732
+ });
1733
+ // Sort parameter annotations in each class by method index in classData
1734
+ for (const classDef of classDefinitions) {
1735
+ if (classDef.annotations?.parameterAnnotations && classDef.classData) {
1736
+ const allMethods = [...(classDef.classData.directMethods ?? []), ...(classDef.classData.virtualMethods ?? [])];
1737
+ classDef.annotations.parameterAnnotations.sort((a, b) => {
1738
+ const indexA = allMethods.findIndex(m => m.method.name === a.method.name &&
1739
+ m.method.prototype.shorty === a.method.prototype.shorty);
1740
+ const indexB = allMethods.findIndex(m => m.method.name === b.method.name &&
1741
+ m.method.prototype.shorty === b.method.prototype.shorty);
1742
+ return indexA - indexB;
1743
+ });
1744
+ }
1745
+ }
1746
+ return {
1747
+ classDefinitions,
1748
+ link,
1749
+ };
1750
+ }))();
1751
+ export const dalvikExecutableParser = createDalvikExecutableParser({
1752
+ createInstructionsParser: createDalvikBytecodeParser,
1753
+ });
1754
+ setParserName(dalvikExecutableParser, 'dalvikExecutableParser');
1755
+ export const dalvikExecutableWithRawInstructionsParser = createDalvikExecutableParser({
1756
+ createInstructionsParser: createFixedLengthSequenceParser,
1757
+ });