@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,2873 @@
1
+ import { createArrayParser } from './arrayParser.js';
2
+ import {
3
+ createDalvikBytecodeFormat21cParser,
4
+ createDalvikBytecodeFormat21sParser,
5
+ createDalvikBytecodeFormat21tParser,
6
+ createDalvikBytecodeFormat22bParser,
7
+ createDalvikBytecodeFormat22cParser,
8
+ createDalvikBytecodeFormat22sParser,
9
+ createDalvikBytecodeFormat22tParser,
10
+ dalvikBytecodeFormat23xParser,
11
+ createDalvikBytecodeFormat31cParser,
12
+ dalvikBytecodeFormat31iParser,
13
+ dalvikBytecodeFormat31tParser,
14
+ createDalvikBytecodeFormat35cParser,
15
+ createDalvikBytecodeFormat3rcParser,
16
+ dalvikBytecodeFormat10tParser,
17
+ dalvikBytecodeFormat10xParser,
18
+ dalvikBytecodeFormat11xParser,
19
+ dalvikBytecodeFormat11nParser,
20
+ dalvikBytecodeFormat12xParser,
21
+ dalvikBytecodeFormat20tParser,
22
+ dalvikBytecodeFormat22xParser,
23
+ dalvikBytecodeFormat32xParser,
24
+ dalvikBytecodeFormat30tParser,
25
+ dalvikBytecodeFormat51lParser,
26
+ createDalvikBytecodeFormat45ccParser,
27
+ createDalvikBytecodeFormat4rccParser,
28
+ } from './dalvikBytecodeParser/formatParsers.js';
29
+ import {
30
+ ubyteParser, ushortParser, intParser, uintParser, createExactUshortParser,
31
+ } from './dalvikExecutableParser/typeParsers.js';
32
+ import { type DalvikExecutableField, type DalvikExecutableMethod } from './dalvikExecutable.js';
33
+ import {
34
+ type IndexIntoFieldIds, type IndexIntoMethodIds, type IndexIntoPrototypeIds, type IndexIntoStringIds, type IndexIntoTypeIds, isoIndexIntoFieldIds, isoIndexIntoMethodIds, isoIndexIntoPrototypeIds, isoIndexIntoStringIds, isoIndexIntoTypeIds,
35
+ } from './dalvikExecutableParser/typedNumbers.js';
36
+ import { createExactElementParser } from './exactElementParser.js';
37
+ import { createElementSwitchParser } from './exactElementSwitchParser.js';
38
+ import { type Parser, setParserName } from './parser.js';
39
+ import { promiseCompose } from './promiseCompose.js';
40
+ import { createSliceBoundedParser } from './sliceBoundedParser.js';
41
+ import { createDisjunctionParser } from './disjunctionParser.js';
42
+ import { parserCreatorCompose } from './parserCreatorCompose.js';
43
+ import { createQuantifierParser } from './quantifierParser.js';
44
+ import { createDebugLogInputParser } from './debugLogInputParser.js';
45
+ import { createNegativeLookaheadParser } from './negativeLookaheadParser.js';
46
+ import { createTupleParser } from './tupleParser.js';
47
+
48
+ // https://source.android.com/docs/core/runtime/dalvik-bytecode
49
+
50
+ const dalvikBytecodeOperationUnusedParser: Parser<void, Uint8Array> = async parserContext => {
51
+ const opcode = await parserContext.read(0);
52
+
53
+ parserContext.invariant(
54
+ (
55
+ (opcode >= 0x3E && opcode <= 0x43)
56
+ || (opcode === 0x73)
57
+ || (opcode >= 0x79 && opcode <= 0x7A)
58
+ || (opcode >= 0xE3 && opcode <= 0xF9)
59
+ ),
60
+ 'Expected unused opcode',
61
+ );
62
+
63
+ parserContext.skip(1);
64
+ };
65
+
66
+ setParserName(dalvikBytecodeOperationUnusedParser, 'dalvikBytecodeOperationUnusedParser');
67
+
68
+ type DalvikBytecodeOperationNoOperation = {
69
+ operation: 'nop';
70
+ };
71
+
72
+ const dalvikBytecodeOperationNoOperationParser: Parser<DalvikBytecodeOperationNoOperation, Uint8Array> = promiseCompose(
73
+ createExactUshortParser(0x00_00), // nop is 2 bytes: 0x00 0x00
74
+ () => ({
75
+ operation: 'nop',
76
+ }),
77
+ );
78
+
79
+ setParserName(dalvikBytecodeOperationNoOperationParser, 'dalvikBytecodeOperationNoOperationParser');
80
+
81
+ const createDalvikBytecodeOperationInvoke = <T extends string>(operation: T, opcode: number): Parser<{
82
+ operation: T;
83
+ methodIndex: IndexIntoMethodIds;
84
+ registers: number[];
85
+ }, Uint8Array> => promiseCompose(
86
+ createTupleParser([
87
+ createExactElementParser(opcode),
88
+ createDalvikBytecodeFormat35cParser({
89
+ isoIndex: isoIndexIntoMethodIds,
90
+ }),
91
+ ]),
92
+ ([
93
+ _opcode,
94
+ { index, registers },
95
+ ]) => ({
96
+ operation,
97
+ methodIndex: index,
98
+ registers,
99
+ }),
100
+ );
101
+
102
+ const dalvikBytecodeOperationInvokeVirtualParser = createDalvikBytecodeOperationInvoke('invoke-virtual', 0x6E);
103
+
104
+ type DalvikBytecodeOperationInvokeVirtual = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeVirtualParser>>;
105
+
106
+ const dalvikBytecodeOperationInvokeSuperParser = createDalvikBytecodeOperationInvoke('invoke-super', 0x6F);
107
+
108
+ type DalvikBytecodeOperationInvokeSuper = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeSuperParser>>;
109
+
110
+ const dalvikBytecodeOperationInvokeDirectParser = createDalvikBytecodeOperationInvoke('invoke-direct', 0x70);
111
+
112
+ type DalvikBytecodeOperationInvokeDirect = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeDirectParser>>;
113
+
114
+ const dalvikBytecodeOperationInvokeStaticParser = createDalvikBytecodeOperationInvoke('invoke-static', 0x71);
115
+
116
+ type DalvikBytecodeOperationInvokeStatic = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeStaticParser>>;
117
+
118
+ const dalvikBytecodeOperationInvokeInterfaceParser = createDalvikBytecodeOperationInvoke('invoke-interface', 0x72);
119
+
120
+ type DalvikBytecodeOperationInvokeInterface = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeInterfaceParser>>;
121
+
122
+ type DalvikBytecodeOperationInvoke =
123
+ | DalvikBytecodeOperationInvokeVirtual
124
+ | DalvikBytecodeOperationInvokeSuper
125
+ | DalvikBytecodeOperationInvokeDirect
126
+ | DalvikBytecodeOperationInvokeStatic
127
+ | DalvikBytecodeOperationInvokeInterface
128
+ ;
129
+
130
+ const dalvikBytecodeOperationInvokeParser: Parser<DalvikBytecodeOperationInvoke, Uint8Array> = createDisjunctionParser([
131
+ dalvikBytecodeOperationInvokeVirtualParser,
132
+ dalvikBytecodeOperationInvokeSuperParser,
133
+ dalvikBytecodeOperationInvokeDirectParser,
134
+ dalvikBytecodeOperationInvokeStaticParser,
135
+ dalvikBytecodeOperationInvokeInterfaceParser,
136
+ ]);
137
+
138
+ setParserName(dalvikBytecodeOperationInvokeParser, 'dalvikBytecodeOperationInvokeParser');
139
+
140
+ const createDalvikBytecodeOperationInvokeRange = <T extends string>(operation: T, opcode: number): Parser<{
141
+ operation: T;
142
+ methodIndex: IndexIntoMethodIds;
143
+ registers: number[];
144
+ }, Uint8Array> => promiseCompose(
145
+ createTupleParser([
146
+ createExactElementParser(opcode),
147
+ createDalvikBytecodeFormat3rcParser({
148
+ isoIndex: isoIndexIntoMethodIds,
149
+ }),
150
+ ]),
151
+ ([
152
+ _opcode,
153
+ { index, registers },
154
+ ]) => ({
155
+ operation,
156
+ methodIndex: index,
157
+ registers,
158
+ }),
159
+ );
160
+
161
+ const dalvikBytecodeOperationInvokeVirtualRangeParser = createDalvikBytecodeOperationInvokeRange('invoke-virtual/range', 0x74);
162
+
163
+ type DalvikBytecodeOperationInvokeVirtualRange = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeVirtualRangeParser>>;
164
+
165
+ const dalvikBytecodeOperationInvokeSuperRangeParser = createDalvikBytecodeOperationInvokeRange('invoke-super/range', 0x75);
166
+
167
+ type DalvikBytecodeOperationInvokeSuperRange = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeSuperRangeParser>>;
168
+
169
+ const dalvikBytecodeOperationInvokeDirectRangeParser = createDalvikBytecodeOperationInvokeRange('invoke-direct/range', 0x76);
170
+
171
+ type DalvikBytecodeOperationInvokeDirectRange = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeDirectRangeParser>>;
172
+
173
+ const dalvikBytecodeOperationInvokeStaticRangeParser = createDalvikBytecodeOperationInvokeRange('invoke-static/range', 0x77);
174
+
175
+ type DalvikBytecodeOperationInvokeStaticRange = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeStaticRangeParser>>;
176
+
177
+ const dalvikBytecodeOperationInvokeInterfaceRangeParser = createDalvikBytecodeOperationInvokeRange('invoke-interface/range', 0x78);
178
+
179
+ type DalvikBytecodeOperationInvokeInterfaceRange = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeInterfaceRangeParser>>;
180
+
181
+ type DalvikBytecodeOperationInvokeRange =
182
+ | DalvikBytecodeOperationInvokeVirtualRange
183
+ | DalvikBytecodeOperationInvokeSuperRange
184
+ | DalvikBytecodeOperationInvokeDirectRange
185
+ | DalvikBytecodeOperationInvokeStaticRange
186
+ | DalvikBytecodeOperationInvokeInterfaceRange
187
+ ;
188
+
189
+ const dalvikBytecodeOperationInvokeRangeParser: Parser<DalvikBytecodeOperationInvokeRange, Uint8Array> = createDisjunctionParser([
190
+ dalvikBytecodeOperationInvokeVirtualRangeParser,
191
+ dalvikBytecodeOperationInvokeSuperRangeParser,
192
+ dalvikBytecodeOperationInvokeDirectRangeParser,
193
+ dalvikBytecodeOperationInvokeStaticRangeParser,
194
+ dalvikBytecodeOperationInvokeInterfaceRangeParser,
195
+ ]);
196
+
197
+ setParserName(dalvikBytecodeOperationInvokeRangeParser, 'dalvikBytecodeOperationInvokeRangeParser');
198
+
199
+ // Invoke-polymorphic and invoke-polymorphic/range (Android 8.0+)
200
+ type DalvikBytecodeOperationInvokePolymorphic = {
201
+ operation: 'invoke-polymorphic';
202
+ methodIndex: IndexIntoMethodIds;
203
+ protoIndex: IndexIntoPrototypeIds;
204
+ registers: number[];
205
+ };
206
+
207
+ const dalvikBytecodeOperationInvokePolymorphicParser: Parser<DalvikBytecodeOperationInvokePolymorphic, Uint8Array> = promiseCompose(
208
+ createTupleParser([
209
+ createExactElementParser(0xFA),
210
+ createDalvikBytecodeFormat45ccParser({
211
+ isoMethodIndex: isoIndexIntoMethodIds,
212
+ isoProtoIndex: isoIndexIntoPrototypeIds,
213
+ }),
214
+ ]),
215
+ ([
216
+ _opcode,
217
+ { methodIndex, protoIndex, registers },
218
+ ]) => ({
219
+ operation: 'invoke-polymorphic',
220
+ methodIndex,
221
+ protoIndex,
222
+ registers,
223
+ }),
224
+ );
225
+
226
+ setParserName(dalvikBytecodeOperationInvokePolymorphicParser, 'dalvikBytecodeOperationInvokePolymorphicParser');
227
+
228
+ type DalvikBytecodeOperationInvokePolymorphicRange = {
229
+ operation: 'invoke-polymorphic/range';
230
+ methodIndex: IndexIntoMethodIds;
231
+ protoIndex: IndexIntoPrototypeIds;
232
+ registers: number[];
233
+ };
234
+
235
+ const dalvikBytecodeOperationInvokePolymorphicRangeParser: Parser<DalvikBytecodeOperationInvokePolymorphicRange, Uint8Array> = promiseCompose(
236
+ createTupleParser([
237
+ createExactElementParser(0xFB),
238
+ createDalvikBytecodeFormat4rccParser({
239
+ isoMethodIndex: isoIndexIntoMethodIds,
240
+ isoProtoIndex: isoIndexIntoPrototypeIds,
241
+ }),
242
+ ]),
243
+ ([
244
+ _opcode,
245
+ { methodIndex, protoIndex, registers },
246
+ ]) => ({
247
+ operation: 'invoke-polymorphic/range',
248
+ methodIndex,
249
+ protoIndex,
250
+ registers,
251
+ }),
252
+ );
253
+
254
+ setParserName(dalvikBytecodeOperationInvokePolymorphicRangeParser, 'dalvikBytecodeOperationInvokePolymorphicRangeParser');
255
+
256
+ type DalvikBytecodeOperationGoto = {
257
+ operation: 'goto';
258
+ branchOffset: number;
259
+ };
260
+
261
+ const dalvikBytecodeOperationGotoParser: Parser<DalvikBytecodeOperationGoto, Uint8Array> = promiseCompose(
262
+ createTupleParser([
263
+ createExactElementParser(0x28),
264
+ dalvikBytecodeFormat10tParser,
265
+ ]),
266
+ ([ _opcode, { branchOffset } ]) => ({
267
+ operation: 'goto',
268
+ branchOffset,
269
+ }),
270
+ );
271
+
272
+ type DalvikBytecodeOperationGoto16 = {
273
+ operation: 'goto/16';
274
+ branchOffset: number;
275
+ };
276
+
277
+ const dalvikBytecodeOperationGoto16Parser: Parser<DalvikBytecodeOperationGoto16, Uint8Array> = promiseCompose(
278
+ createTupleParser([
279
+ createExactElementParser(0x29),
280
+ dalvikBytecodeFormat20tParser,
281
+ ]),
282
+ ([ _opcode, { branchOffset } ]) => ({
283
+ operation: 'goto/16',
284
+ branchOffset,
285
+ }),
286
+ );
287
+
288
+ type DalvikBytecodeOperationGoto32 = {
289
+ operation: 'goto/32';
290
+ branchOffset: number;
291
+ };
292
+
293
+ const dalvikBytecodeOperationGoto32Parser: Parser<DalvikBytecodeOperationGoto32, Uint8Array> = promiseCompose(
294
+ createTupleParser([
295
+ createExactElementParser(0x2A),
296
+ dalvikBytecodeFormat30tParser,
297
+ ]),
298
+ ([ _opcode, { branchOffset } ]) => ({
299
+ operation: 'goto/32',
300
+ branchOffset,
301
+ }),
302
+ );
303
+
304
+ type DalvikBytecodeOperationPackedSwitch = {
305
+ operation: 'packed-switch';
306
+ branchOffset: number;
307
+ registers: number[];
308
+ };
309
+
310
+ const dalvikBytecodeOperationPackedSwitchParser: Parser<DalvikBytecodeOperationPackedSwitch, Uint8Array> = promiseCompose(
311
+ createTupleParser([
312
+ createExactElementParser(0x2B),
313
+ dalvikBytecodeFormat31tParser,
314
+ ]),
315
+ ([ _opcode, { branchOffset, registers } ]) => ({
316
+ operation: 'packed-switch',
317
+ branchOffset,
318
+ registers,
319
+ }),
320
+ );
321
+
322
+ setParserName(dalvikBytecodeOperationPackedSwitchParser, 'dalvikBytecodeOperationPackedSwitchParser');
323
+
324
+ type DalvikBytecodeOperationPackedSwitchPayload = {
325
+ operation: 'packed-switch-payload';
326
+ value: number;
327
+ branchOffsets: number[];
328
+ };
329
+
330
+ const dalvikBytecodeOperationPackedSwitchPayloadParser: Parser<DalvikBytecodeOperationPackedSwitchPayload, Uint8Array> = parserCreatorCompose(
331
+ () => promiseCompose(
332
+ createTupleParser([
333
+ createExactUshortParser(0x01_00),
334
+ ushortParser,
335
+ intParser,
336
+ ]),
337
+ ([ _ident, size, value ]) => ({
338
+ size,
339
+ value,
340
+ }),
341
+ ),
342
+ ({ size, value }) => promiseCompose(
343
+ createQuantifierParser(
344
+ intParser,
345
+ size,
346
+ ),
347
+ branchOffsets => ({
348
+ operation: 'packed-switch-payload' as const,
349
+ value,
350
+ branchOffsets,
351
+ }),
352
+ ),
353
+ )();
354
+
355
+ setParserName(dalvikBytecodeOperationPackedSwitchPayloadParser, 'dalvikBytecodeOperationPackedSwitchPayloadParser');
356
+
357
+ type DalvikBytecodeOperationSparseSwitch = {
358
+ operation: 'sparse-switch';
359
+ branchOffset: number;
360
+ registers: number[];
361
+ };
362
+
363
+ const dalvikBytecodeOperationSparseSwitchParser: Parser<DalvikBytecodeOperationSparseSwitch, Uint8Array> = promiseCompose(
364
+ createTupleParser([
365
+ createExactElementParser(0x2C),
366
+ dalvikBytecodeFormat31tParser,
367
+ ]),
368
+ ([ _opcode, { branchOffset, registers } ]) => ({
369
+ operation: 'sparse-switch',
370
+ branchOffset,
371
+ registers,
372
+ }),
373
+ );
374
+
375
+ setParserName(dalvikBytecodeOperationSparseSwitchParser, 'dalvikBytecodeOperationSparseSwitchParser');
376
+
377
+ type DalvikBytecodeOperationSparseSwitchPayload = {
378
+ operation: 'sparse-switch-payload';
379
+ keys: number[];
380
+ branchOffsets: number[];
381
+ };
382
+
383
+ const dalvikBytecodeOperationSparseSwitchPayloadParser: Parser<DalvikBytecodeOperationSparseSwitchPayload, Uint8Array> = parserCreatorCompose(
384
+ () => promiseCompose(
385
+ createTupleParser([
386
+ createExactUshortParser(0x02_00),
387
+ ushortParser,
388
+ ]),
389
+ ([ _ident, size ]) => ({
390
+ size,
391
+ }),
392
+ ),
393
+ ({ size }) => promiseCompose(
394
+ createTupleParser([
395
+ createQuantifierParser(
396
+ intParser,
397
+ size,
398
+ ),
399
+ createQuantifierParser(
400
+ intParser,
401
+ size,
402
+ ),
403
+ ]),
404
+ ([ keys, branchOffsets ]) => ({
405
+ operation: 'sparse-switch-payload' as const,
406
+ keys,
407
+ branchOffsets,
408
+ }),
409
+ ),
410
+ )();
411
+
412
+ setParserName(dalvikBytecodeOperationSparseSwitchPayloadParser, 'dalvikBytecodeOperationSparseSwitchPayloadParser');
413
+
414
+ type DalvikBytecodeOperationFillArrayDataPayload = {
415
+ operation: 'fill-array-data-payload';
416
+ elementWidth: number;
417
+ data: number[];
418
+ };
419
+
420
+ const dalvikBytecodeOperationFillArrayDataPayloadParser: Parser<DalvikBytecodeOperationFillArrayDataPayload, Uint8Array> = parserCreatorCompose(
421
+ () => promiseCompose(
422
+ createTupleParser([
423
+ createExactUshortParser(0x03_00),
424
+ ushortParser,
425
+ uintParser,
426
+ ]),
427
+ ([ _ident, elementWidth, size ]): { elementWidth: number; size: number } => ({
428
+ elementWidth,
429
+ size,
430
+ }),
431
+ ),
432
+ ({ elementWidth, size }: { elementWidth: number; size: number }) => {
433
+ const dataSize = size * elementWidth;
434
+ const paddingSize = dataSize % 2; // 1 if odd, 0 if even
435
+ return promiseCompose(
436
+ createTupleParser([
437
+ createQuantifierParser(
438
+ ubyteParser,
439
+ dataSize,
440
+ ),
441
+ paddingSize > 0 ? createQuantifierParser(ubyteParser, paddingSize) : () => [],
442
+ ]),
443
+ ([ data, _padding ]) => ({
444
+ operation: 'fill-array-data-payload' as const,
445
+ elementWidth,
446
+ data,
447
+ }),
448
+ );
449
+ },
450
+ )();
451
+
452
+ setParserName(dalvikBytecodeOperationFillArrayDataPayloadParser, 'dalvikBytecodeOperationFillArrayDataPayloadParser');
453
+
454
+ type DalvikBytecodeOperationInstanceOf = {
455
+ operation: 'instance-of';
456
+ registers: number[];
457
+ typeIndex: IndexIntoTypeIds;
458
+ };
459
+
460
+ const dalvikBytecodeOperationInstanceOfParser: Parser<DalvikBytecodeOperationInstanceOf, Uint8Array> = promiseCompose(
461
+ createTupleParser([
462
+ createExactElementParser(0x20),
463
+ createDalvikBytecodeFormat22cParser({
464
+ isoIndex: isoIndexIntoTypeIds,
465
+ }),
466
+ ]),
467
+ ([ _opcode, { registers, index } ]) => ({
468
+ operation: 'instance-of',
469
+ registers,
470
+ typeIndex: index,
471
+ }),
472
+ );
473
+
474
+ setParserName(dalvikBytecodeOperationInstanceOfParser, 'dalvikBytecodeOperationInstanceOfParser');
475
+
476
+ const createDalvikBytecodeOperationArrayElement = <T extends string>(operation: T, opcode: number): Parser<{
477
+ operation: T;
478
+ registers: number[];
479
+ }, Uint8Array> => promiseCompose(
480
+ createTupleParser([
481
+ createExactElementParser(opcode),
482
+ dalvikBytecodeFormat23xParser,
483
+ ]),
484
+ ([ _opcode, { registers } ]) => ({
485
+ operation,
486
+ registers,
487
+ }),
488
+ );
489
+
490
+ const dalvikBytecodeOperationArrayElementGetParser = createDalvikBytecodeOperationArrayElement('aget', 0x44);
491
+
492
+ type DalvikBytecodeOperationArrayElementGet = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetParser>>;
493
+
494
+ const dalvikBytecodeOperationArrayElementGetWideParser = createDalvikBytecodeOperationArrayElement('aget-wide', 0x45);
495
+
496
+ type DalvikBytecodeOperationArrayElementGetWide = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetWideParser>>;
497
+
498
+ const dalvikBytecodeOperationArrayElementGetObjectParser = createDalvikBytecodeOperationArrayElement('aget-object', 0x46);
499
+
500
+ type DalvikBytecodeOperationArrayElementGetObject = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetObjectParser>>;
501
+
502
+ const dalvikBytecodeOperationArrayElementGetBooleanParser = createDalvikBytecodeOperationArrayElement('aget-boolean', 0x47);
503
+
504
+ type DalvikBytecodeOperationArrayElementGetBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetBooleanParser>>;
505
+
506
+ const dalvikBytecodeOperationArrayElementGetByteParser = createDalvikBytecodeOperationArrayElement('aget-byte', 0x48);
507
+
508
+ type DalvikBytecodeOperationArrayElementGetByte = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetByteParser>>;
509
+
510
+ const dalvikBytecodeOperationArrayElementGetCharParser = createDalvikBytecodeOperationArrayElement('aget-char', 0x49);
511
+
512
+ type DalvikBytecodeOperationArrayElementGetChar = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetCharParser>>;
513
+
514
+ const dalvikBytecodeOperationArrayElementGetShortParser = createDalvikBytecodeOperationArrayElement('aget-short', 0x4A);
515
+
516
+ type DalvikBytecodeOperationArrayElementGetShort = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetShortParser>>;
517
+
518
+ const dalvikBytecodeOperationArrayElementPutParser = createDalvikBytecodeOperationArrayElement('aput', 0x4B);
519
+
520
+ type DalvikBytecodeOperationArrayElementPut = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutParser>>;
521
+
522
+ const dalvikBytecodeOperationArrayElementPutWideParser = createDalvikBytecodeOperationArrayElement('aput-wide', 0x4C);
523
+
524
+ type DalvikBytecodeOperationArrayElementPutWide = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutWideParser>>;
525
+
526
+ const dalvikBytecodeOperationArrayElementPutObjectParser = createDalvikBytecodeOperationArrayElement('aput-object', 0x4D);
527
+
528
+ type DalvikBytecodeOperationArrayElementPutObject = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutObjectParser>>;
529
+
530
+ const dalvikBytecodeOperationArrayElementPutBooleanParser = createDalvikBytecodeOperationArrayElement('aput-boolean', 0x4E);
531
+
532
+ type DalvikBytecodeOperationArrayElementPutBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutBooleanParser>>;
533
+
534
+ const dalvikBytecodeOperationArrayElementPutByteParser = createDalvikBytecodeOperationArrayElement('aput-byte', 0x4F);
535
+
536
+ type DalvikBytecodeOperationArrayElementPutByte = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutByteParser>>;
537
+
538
+ const dalvikBytecodeOperationArrayElementPutCharParser = createDalvikBytecodeOperationArrayElement('aput-char', 0x50);
539
+
540
+ type DalvikBytecodeOperationArrayElementPutChar = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutCharParser>>;
541
+
542
+ const dalvikBytecodeOperationArrayElementPutShortParser = createDalvikBytecodeOperationArrayElement('aput-short', 0x51);
543
+
544
+ type DalvikBytecodeOperationArrayElementPutShort = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutShortParser>>;
545
+
546
+ type DalvikBytecodeOperationArrayElement =
547
+ | DalvikBytecodeOperationArrayElementGet
548
+ | DalvikBytecodeOperationArrayElementGetWide
549
+ | DalvikBytecodeOperationArrayElementGetObject
550
+ | DalvikBytecodeOperationArrayElementGetBoolean
551
+ | DalvikBytecodeOperationArrayElementGetByte
552
+ | DalvikBytecodeOperationArrayElementGetChar
553
+ | DalvikBytecodeOperationArrayElementGetShort
554
+ | DalvikBytecodeOperationArrayElementPut
555
+ | DalvikBytecodeOperationArrayElementPutWide
556
+ | DalvikBytecodeOperationArrayElementPutObject
557
+ | DalvikBytecodeOperationArrayElementPutBoolean
558
+ | DalvikBytecodeOperationArrayElementPutByte
559
+ | DalvikBytecodeOperationArrayElementPutChar
560
+ | DalvikBytecodeOperationArrayElementPutShort
561
+ ;
562
+
563
+ const dalvikBytecodeOperationArrayElementParser: Parser<DalvikBytecodeOperationArrayElement, Uint8Array> = createDisjunctionParser([
564
+ dalvikBytecodeOperationArrayElementGetParser,
565
+ dalvikBytecodeOperationArrayElementGetWideParser,
566
+ dalvikBytecodeOperationArrayElementGetObjectParser,
567
+ dalvikBytecodeOperationArrayElementGetBooleanParser,
568
+ dalvikBytecodeOperationArrayElementGetByteParser,
569
+ dalvikBytecodeOperationArrayElementGetCharParser,
570
+ dalvikBytecodeOperationArrayElementGetShortParser,
571
+ dalvikBytecodeOperationArrayElementPutParser,
572
+ dalvikBytecodeOperationArrayElementPutWideParser,
573
+ dalvikBytecodeOperationArrayElementPutObjectParser,
574
+ dalvikBytecodeOperationArrayElementPutBooleanParser,
575
+ dalvikBytecodeOperationArrayElementPutByteParser,
576
+ dalvikBytecodeOperationArrayElementPutCharParser,
577
+ dalvikBytecodeOperationArrayElementPutShortParser,
578
+ ]);
579
+
580
+ setParserName(dalvikBytecodeOperationArrayElementParser, 'dalvikBytecodeOperationArrayElementParser');
581
+
582
+ const createDalvikBytecodeOperationInstanceField = <T extends string>(operation: T, opcode: number): Parser<{
583
+ operation: T;
584
+ registers: number[];
585
+ fieldIndex: IndexIntoFieldIds;
586
+ }, Uint8Array> => promiseCompose(
587
+ createTupleParser([
588
+ createExactElementParser(opcode),
589
+ createDalvikBytecodeFormat22cParser({
590
+ isoIndex: isoIndexIntoFieldIds,
591
+ }),
592
+ ]),
593
+ ([ _opcode, { registers, index } ]) => ({
594
+ operation,
595
+ registers,
596
+ fieldIndex: index,
597
+ }),
598
+ );
599
+
600
+ const dalvikBytecodeOperationInstanceFieldGetParser = createDalvikBytecodeOperationInstanceField('iget', 0x52);
601
+
602
+ type DalvikBytecodeOperationInstanceFieldGet = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldGetParser>>;
603
+
604
+ const dalvikBytecodeOperationInstanceFieldGetWideParser = createDalvikBytecodeOperationInstanceField('iget-wide', 0x53);
605
+
606
+ type DalvikBytecodeOperationInstanceFieldGetWide = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldGetWideParser>>;
607
+
608
+ const dalvikBytecodeOperationInstanceFieldGetObjectParser = createDalvikBytecodeOperationInstanceField('iget-object', 0x54);
609
+
610
+ type DalvikBytecodeOperationInstanceFieldGetObject = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldGetObjectParser>>;
611
+
612
+ const dalvikBytecodeOperationInstanceFieldGetBooleanParser = createDalvikBytecodeOperationInstanceField('iget-boolean', 0x55);
613
+
614
+ type DalvikBytecodeOperationInstanceFieldGetBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldGetBooleanParser>>;
615
+
616
+ const dalvikBytecodeOperationInstanceFieldGetByteParser = createDalvikBytecodeOperationInstanceField('iget-byte', 0x56);
617
+
618
+ type DalvikBytecodeOperationInstanceFieldGetByte = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldGetByteParser>>;
619
+
620
+ const dalvikBytecodeOperationInstanceFieldGetCharParser = createDalvikBytecodeOperationInstanceField('iget-char', 0x57);
621
+
622
+ type DalvikBytecodeOperationInstanceFieldGetChar = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldGetCharParser>>;
623
+
624
+ const dalvikBytecodeOperationInstanceFieldGetShortParser = createDalvikBytecodeOperationInstanceField('iget-short', 0x58);
625
+
626
+ type DalvikBytecodeOperationInstanceFieldGetShort = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldGetShortParser>>;
627
+
628
+ const dalvikBytecodeOperationInstanceFieldPutParser = createDalvikBytecodeOperationInstanceField('iput', 0x59);
629
+
630
+ type DalvikBytecodeOperationInstanceFieldPut = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutParser>>;
631
+
632
+ const dalvikBytecodeOperationInstanceFieldPutWideParser = createDalvikBytecodeOperationInstanceField('iput-wide', 0x5A);
633
+
634
+ type DalvikBytecodeOperationInstanceFieldPutWide = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutWideParser>>;
635
+
636
+ const dalvikBytecodeOperationInstanceFieldPutObjectParser = createDalvikBytecodeOperationInstanceField('iput-object', 0x5B);
637
+
638
+ type DalvikBytecodeOperationInstanceFieldPutObject = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutObjectParser>>;
639
+
640
+ const dalvikBytecodeOperationInstanceFieldPutBooleanParser = createDalvikBytecodeOperationInstanceField('iput-boolean', 0x5C);
641
+
642
+ type DalvikBytecodeOperationInstanceFieldPutBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutBooleanParser>>;
643
+
644
+ const dalvikBytecodeOperationInstanceFieldPutByteParser = createDalvikBytecodeOperationInstanceField('iput-byte', 0x5D);
645
+
646
+ type DalvikBytecodeOperationInstanceFieldPutByte = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutByteParser>>;
647
+
648
+ const dalvikBytecodeOperationInstanceFieldPutCharParser = createDalvikBytecodeOperationInstanceField('iput-char', 0x5E);
649
+
650
+ type DalvikBytecodeOperationInstanceFieldPutChar = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutCharParser>>;
651
+
652
+ const dalvikBytecodeOperationInstanceFieldPutShortParser = createDalvikBytecodeOperationInstanceField('iput-short', 0x5F);
653
+
654
+ type DalvikBytecodeOperationInstanceFieldPutShort = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutShortParser>>;
655
+
656
+ type DalvikBytecodeOperationInstanceField =
657
+ | DalvikBytecodeOperationInstanceFieldGet
658
+ | DalvikBytecodeOperationInstanceFieldGetWide
659
+ | DalvikBytecodeOperationInstanceFieldGetObject
660
+ | DalvikBytecodeOperationInstanceFieldGetBoolean
661
+ | DalvikBytecodeOperationInstanceFieldGetByte
662
+ | DalvikBytecodeOperationInstanceFieldGetChar
663
+ | DalvikBytecodeOperationInstanceFieldGetShort
664
+ | DalvikBytecodeOperationInstanceFieldPut
665
+ | DalvikBytecodeOperationInstanceFieldPutWide
666
+ | DalvikBytecodeOperationInstanceFieldPutObject
667
+ | DalvikBytecodeOperationInstanceFieldPutBoolean
668
+ | DalvikBytecodeOperationInstanceFieldPutByte
669
+ | DalvikBytecodeOperationInstanceFieldPutChar
670
+ | DalvikBytecodeOperationInstanceFieldPutShort
671
+ ;
672
+
673
+ const dalvikBytecodeOperationInstanceFieldParser: Parser<DalvikBytecodeOperationInstanceField, Uint8Array> = createDisjunctionParser([
674
+ dalvikBytecodeOperationInstanceFieldGetParser,
675
+ dalvikBytecodeOperationInstanceFieldGetWideParser,
676
+ dalvikBytecodeOperationInstanceFieldGetObjectParser,
677
+ dalvikBytecodeOperationInstanceFieldGetBooleanParser,
678
+ dalvikBytecodeOperationInstanceFieldGetByteParser,
679
+ dalvikBytecodeOperationInstanceFieldGetCharParser,
680
+ dalvikBytecodeOperationInstanceFieldGetShortParser,
681
+ dalvikBytecodeOperationInstanceFieldPutParser,
682
+ dalvikBytecodeOperationInstanceFieldPutWideParser,
683
+ dalvikBytecodeOperationInstanceFieldPutObjectParser,
684
+ dalvikBytecodeOperationInstanceFieldPutBooleanParser,
685
+ dalvikBytecodeOperationInstanceFieldPutByteParser,
686
+ dalvikBytecodeOperationInstanceFieldPutCharParser,
687
+ dalvikBytecodeOperationInstanceFieldPutShortParser,
688
+ ]);
689
+
690
+ setParserName(dalvikBytecodeOperationInstanceFieldParser, 'dalvikBytecodeOperationInstanceFieldParser');
691
+
692
+ const createDalvikBytecodeOperationStaticField = <T extends string>(operation: T, opcode: number): Parser<{
693
+ operation: T;
694
+ registers: number[];
695
+ fieldIndex: IndexIntoFieldIds;
696
+ }, Uint8Array> => promiseCompose(
697
+ createTupleParser([
698
+ createExactElementParser(opcode),
699
+ createDalvikBytecodeFormat21cParser({
700
+ isoIndex: isoIndexIntoFieldIds,
701
+ }),
702
+ ]),
703
+ ([ _opcode, { registers, index } ]) => ({
704
+ operation,
705
+ registers,
706
+ fieldIndex: index,
707
+ }),
708
+ );
709
+
710
+ const dalvikBytecodeOperationStaticFieldGetParser = createDalvikBytecodeOperationStaticField('sget', 0x60);
711
+
712
+ type DalvikBytecodeOperationStaticFieldGet = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldGetParser>>;
713
+
714
+ const dalvikBytecodeOperationStaticFieldGetWideParser = createDalvikBytecodeOperationStaticField('sget-wide', 0x61);
715
+
716
+ type DalvikBytecodeOperationStaticFieldGetWide = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldGetWideParser>>;
717
+
718
+ const dalvikBytecodeOperationStaticFieldGetObjectParser = createDalvikBytecodeOperationStaticField('sget-object', 0x62);
719
+
720
+ type DalvikBytecodeOperationStaticFieldGetObject = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldGetObjectParser>>;
721
+
722
+ const dalvikBytecodeOperationStaticFieldGetBooleanParser = createDalvikBytecodeOperationStaticField('sget-boolean', 0x63);
723
+
724
+ type DalvikBytecodeOperationStaticFieldGetBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldGetBooleanParser>>;
725
+
726
+ const dalvikBytecodeOperationStaticFieldGetByteParser = createDalvikBytecodeOperationStaticField('sget-byte', 0x64);
727
+
728
+ type DalvikBytecodeOperationStaticFieldGetByte = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldGetByteParser>>;
729
+
730
+ const dalvikBytecodeOperationStaticFieldGetCharParser = createDalvikBytecodeOperationStaticField('sget-char', 0x65);
731
+
732
+ type DalvikBytecodeOperationStaticFieldGetChar = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldGetCharParser>>;
733
+
734
+ const dalvikBytecodeOperationStaticFieldGetShortParser = createDalvikBytecodeOperationStaticField('sget-short', 0x66);
735
+
736
+ type DalvikBytecodeOperationStaticFieldGetShort = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldGetShortParser>>;
737
+
738
+ const dalvikBytecodeOperationStaticFieldPutParser = createDalvikBytecodeOperationStaticField('sput', 0x67);
739
+
740
+ type DalvikBytecodeOperationStaticFieldPut = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutParser>>;
741
+
742
+ const dalvikBytecodeOperationStaticFieldPutWideParser = createDalvikBytecodeOperationStaticField('sput-wide', 0x68);
743
+
744
+ type DalvikBytecodeOperationStaticFieldPutWide = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutWideParser>>;
745
+
746
+ const dalvikBytecodeOperationStaticFieldPutObjectParser = createDalvikBytecodeOperationStaticField('sput-object', 0x69);
747
+
748
+ type DalvikBytecodeOperationStaticFieldPutObject = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutObjectParser>>;
749
+
750
+ const dalvikBytecodeOperationStaticFieldPutBooleanParser = createDalvikBytecodeOperationStaticField('sput-boolean', 0x6A);
751
+
752
+ type DalvikBytecodeOperationStaticFieldPutBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutBooleanParser>>;
753
+
754
+ const dalvikBytecodeOperationStaticFieldPutByteParser = createDalvikBytecodeOperationStaticField('sput-byte', 0x6B);
755
+
756
+ type DalvikBytecodeOperationStaticFieldPutByte = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutByteParser>>;
757
+
758
+ const dalvikBytecodeOperationStaticFieldPutCharParser = createDalvikBytecodeOperationStaticField('sput-char', 0x6C);
759
+
760
+ type DalvikBytecodeOperationStaticFieldPutChar = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutCharParser>>;
761
+
762
+ const dalvikBytecodeOperationStaticFieldPutShortParser = createDalvikBytecodeOperationStaticField('sput-short', 0x6D);
763
+
764
+ type DalvikBytecodeOperationStaticFieldPutShort = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutShortParser>>;
765
+
766
+ type DalvikBytecodeOperationStaticField =
767
+ | DalvikBytecodeOperationStaticFieldGet
768
+ | DalvikBytecodeOperationStaticFieldGetWide
769
+ | DalvikBytecodeOperationStaticFieldGetObject
770
+ | DalvikBytecodeOperationStaticFieldGetBoolean
771
+ | DalvikBytecodeOperationStaticFieldGetByte
772
+ | DalvikBytecodeOperationStaticFieldGetChar
773
+ | DalvikBytecodeOperationStaticFieldGetShort
774
+ | DalvikBytecodeOperationStaticFieldPut
775
+ | DalvikBytecodeOperationStaticFieldPutWide
776
+ | DalvikBytecodeOperationStaticFieldPutObject
777
+ | DalvikBytecodeOperationStaticFieldPutBoolean
778
+ | DalvikBytecodeOperationStaticFieldPutByte
779
+ | DalvikBytecodeOperationStaticFieldPutChar
780
+ | DalvikBytecodeOperationStaticFieldPutShort
781
+ ;
782
+
783
+ const dalvikBytecodeOperationStaticFieldParser: Parser<DalvikBytecodeOperationStaticField, Uint8Array> = createDisjunctionParser([
784
+ dalvikBytecodeOperationStaticFieldGetParser,
785
+ dalvikBytecodeOperationStaticFieldGetWideParser,
786
+ dalvikBytecodeOperationStaticFieldGetObjectParser,
787
+ dalvikBytecodeOperationStaticFieldGetBooleanParser,
788
+ dalvikBytecodeOperationStaticFieldGetByteParser,
789
+ dalvikBytecodeOperationStaticFieldGetCharParser,
790
+ dalvikBytecodeOperationStaticFieldGetShortParser,
791
+ dalvikBytecodeOperationStaticFieldPutParser,
792
+ dalvikBytecodeOperationStaticFieldPutWideParser,
793
+ dalvikBytecodeOperationStaticFieldPutObjectParser,
794
+ dalvikBytecodeOperationStaticFieldPutBooleanParser,
795
+ dalvikBytecodeOperationStaticFieldPutByteParser,
796
+ dalvikBytecodeOperationStaticFieldPutCharParser,
797
+ dalvikBytecodeOperationStaticFieldPutShortParser,
798
+ ]);
799
+
800
+ setParserName(dalvikBytecodeOperationStaticFieldParser, 'dalvikBytecodeOperationStaticFieldParser');
801
+
802
+ const createDalvikBytecodeOperationBinaryOperationLiteral8 = <T extends string>(operation: T, opcode: number): Parser<{
803
+ operation: T;
804
+ registers: number[];
805
+ value: number;
806
+ }, Uint8Array> => promiseCompose(
807
+ createTupleParser([
808
+ createExactElementParser(opcode),
809
+ createDalvikBytecodeFormat22bParser(),
810
+ ]),
811
+ ([ _opcode, { registers, value } ]) => ({
812
+ operation,
813
+ registers,
814
+ value,
815
+ }),
816
+ );
817
+
818
+ const dalvikBytecodeOperationAddIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('add-int/lit8', 0xD8);
819
+
820
+ type DalvikBytecodeOperationAddIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationAddIntLiteral8Parser>>;
821
+
822
+ const dalvikBytecodeOperationReverseSubtractIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rsub-int/lit8', 0xD9);
823
+
824
+ type DalvikBytecodeOperationReverseSubtractIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationReverseSubtractIntLiteral8Parser>>;
825
+
826
+ const dalvikBytecodeOperationMultiplyIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('mul-int/lit8', 0xDA);
827
+
828
+ type DalvikBytecodeOperationMultiplyIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyIntLiteral8Parser>>;
829
+
830
+ const dalvikBytecodeOperationDivideIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('div-int/lit8', 0xDB);
831
+
832
+ type DalvikBytecodeOperationDivideIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideIntLiteral8Parser>>;
833
+
834
+ const dalvikBytecodeOperationRemainderIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rem-int/lit8', 0xDC);
835
+
836
+ type DalvikBytecodeOperationRemainderIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderIntLiteral8Parser>>;
837
+
838
+ const dalvikBytecodeOperationAndIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('and-int/lit8', 0xDD);
839
+
840
+ type DalvikBytecodeOperationAndIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationAndIntLiteral8Parser>>;
841
+
842
+ const dalvikBytecodeOperationOrIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('or-int/lit8', 0xDE);
843
+
844
+ type DalvikBytecodeOperationOrIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationOrIntLiteral8Parser>>;
845
+
846
+ const dalvikBytecodeOperationXorIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('xor-int/lit8', 0xDF);
847
+
848
+ type DalvikBytecodeOperationXorIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationXorIntLiteral8Parser>>;
849
+
850
+ const dalvikBytecodeOperationShiftLeftIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shl-int/lit8', 0xE0);
851
+
852
+ type DalvikBytecodeOperationShiftLeftIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftIntLiteral8Parser>>;
853
+
854
+ const dalvikBytecodeOperationShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shr-int/lit8', 0xE1);
855
+
856
+ type DalvikBytecodeOperationShiftRightIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightIntLiteral8Parser>>;
857
+
858
+ const dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('ushr-int/lit8', 0xE2);
859
+
860
+ type DalvikBytecodeOperationUnsignedShiftRightIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser>>;
861
+
862
+ type DalvikBytecodeOperationBinaryOperationLiteral8 =
863
+ | DalvikBytecodeOperationAddIntLiteral8
864
+ | DalvikBytecodeOperationReverseSubtractIntLiteral8
865
+ | DalvikBytecodeOperationMultiplyIntLiteral8
866
+ | DalvikBytecodeOperationDivideIntLiteral8
867
+ | DalvikBytecodeOperationRemainderIntLiteral8
868
+ | DalvikBytecodeOperationAndIntLiteral8
869
+ | DalvikBytecodeOperationOrIntLiteral8
870
+ | DalvikBytecodeOperationXorIntLiteral8
871
+ | DalvikBytecodeOperationShiftLeftIntLiteral8
872
+ | DalvikBytecodeOperationShiftRightIntLiteral8
873
+ | DalvikBytecodeOperationUnsignedShiftRightIntLiteral8
874
+ ;
875
+
876
+ const dalvikBytecodeOperationBinaryOperationLiteral8Parser: Parser<DalvikBytecodeOperationBinaryOperationLiteral8, Uint8Array> = createDisjunctionParser([
877
+ dalvikBytecodeOperationAddIntLiteral8Parser,
878
+ dalvikBytecodeOperationReverseSubtractIntLiteral8Parser,
879
+ dalvikBytecodeOperationMultiplyIntLiteral8Parser,
880
+ dalvikBytecodeOperationDivideIntLiteral8Parser,
881
+ dalvikBytecodeOperationRemainderIntLiteral8Parser,
882
+ dalvikBytecodeOperationAndIntLiteral8Parser,
883
+ dalvikBytecodeOperationOrIntLiteral8Parser,
884
+ dalvikBytecodeOperationXorIntLiteral8Parser,
885
+ dalvikBytecodeOperationShiftLeftIntLiteral8Parser,
886
+ dalvikBytecodeOperationShiftRightIntLiteral8Parser,
887
+ dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser,
888
+ ]);
889
+
890
+ setParserName(dalvikBytecodeOperationBinaryOperationLiteral8Parser, 'dalvikBytecodeOperationBinaryOperationLiteral8Parser');
891
+
892
+ const createDalvikBytecodeOperationBinaryOperationLiteral16 = <T extends string>(operation: T, opcode: number): Parser<{
893
+ operation: T;
894
+ registers: number[];
895
+ value: number;
896
+ }, Uint8Array> => promiseCompose(
897
+ createTupleParser([
898
+ createExactElementParser(opcode),
899
+ createDalvikBytecodeFormat22sParser(),
900
+ ]),
901
+ ([ _opcode, { registers, value } ]) => ({
902
+ operation,
903
+ registers,
904
+ value,
905
+ }),
906
+ );
907
+
908
+ const dalvikBytecodeOperationAddIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('add-int/lit16', 0xD0);
909
+
910
+ type DalvikBytecodeOperationAddIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationAddIntLiteral16Parser>>;
911
+
912
+ const dalvikBytecodeOperationReverseSubtractIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rsub-int', 0xD1);
913
+
914
+ type DalvikBytecodeOperationReverseSubtractIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationReverseSubtractIntLiteral16Parser>>;
915
+
916
+ const dalvikBytecodeOperationMultiplyIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('mul-int/lit16', 0xD2);
917
+
918
+ type DalvikBytecodeOperationMultiplyIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyIntLiteral16Parser>>;
919
+
920
+ const dalvikBytecodeOperationDivideIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('div-int/lit16', 0xD3);
921
+
922
+ type DalvikBytecodeOperationDivideIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideIntLiteral16Parser>>;
923
+
924
+ const dalvikBytecodeOperationRemainderIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rem-int/lit16', 0xD4);
925
+
926
+ type DalvikBytecodeOperationRemainderIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderIntLiteral16Parser>>;
927
+
928
+ const dalvikBytecodeOperationAndIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('and-int/lit16', 0xD5);
929
+
930
+ type DalvikBytecodeOperationAndIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationAndIntLiteral16Parser>>;
931
+
932
+ const dalvikBytecodeOperationOrIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('or-int/lit16', 0xD6);
933
+
934
+ type DalvikBytecodeOperationOrIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationOrIntLiteral16Parser>>;
935
+
936
+ const dalvikBytecodeOperationXorIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('xor-int/lit16', 0xD7);
937
+
938
+ type DalvikBytecodeOperationXorIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationXorIntLiteral16Parser>>;
939
+
940
+ type DalvikBytecodeOperationBinaryOperationLiteral16 =
941
+ | DalvikBytecodeOperationAddIntLiteral16
942
+ | DalvikBytecodeOperationReverseSubtractIntLiteral16
943
+ | DalvikBytecodeOperationMultiplyIntLiteral16
944
+ | DalvikBytecodeOperationDivideIntLiteral16
945
+ | DalvikBytecodeOperationRemainderIntLiteral16
946
+ | DalvikBytecodeOperationAndIntLiteral16
947
+ | DalvikBytecodeOperationOrIntLiteral16
948
+ | DalvikBytecodeOperationXorIntLiteral16
949
+ ;
950
+
951
+ const dalvikBytecodeOperationBinaryOperationLiteral16Parser: Parser<DalvikBytecodeOperationBinaryOperationLiteral16, Uint8Array> = createDisjunctionParser([
952
+ dalvikBytecodeOperationAddIntLiteral16Parser,
953
+ dalvikBytecodeOperationReverseSubtractIntLiteral16Parser,
954
+ dalvikBytecodeOperationMultiplyIntLiteral16Parser,
955
+ dalvikBytecodeOperationDivideIntLiteral16Parser,
956
+ dalvikBytecodeOperationRemainderIntLiteral16Parser,
957
+ dalvikBytecodeOperationAndIntLiteral16Parser,
958
+ dalvikBytecodeOperationOrIntLiteral16Parser,
959
+ dalvikBytecodeOperationXorIntLiteral16Parser,
960
+ ]);
961
+
962
+ setParserName(dalvikBytecodeOperationBinaryOperationLiteral16Parser, 'dalvikBytecodeOperationBinaryOperationLiteral16Parser');
963
+
964
+ const createDalvikBytecodeOperationBinaryOperationInPlace = <T extends string>(operation: T, opcode: number): Parser<{
965
+ operation: T;
966
+ registers: number[];
967
+ }, Uint8Array> => promiseCompose(
968
+ createTupleParser([
969
+ createExactElementParser(opcode),
970
+ dalvikBytecodeFormat12xParser,
971
+ ]),
972
+ ([ _opcode, { registers } ]) => ({
973
+ operation,
974
+ registers,
975
+ }),
976
+ );
977
+
978
+ const dalvikBytecodeOperationAddIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-int/2addr', 0xB0);
979
+
980
+ type DalvikBytecodeOperationAddIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAddIntInPlaceParser>>;
981
+
982
+ const dalvikBytecodeOperationReverseSubtractIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-int/2addr', 0xB1);
983
+
984
+ type DalvikBytecodeOperationReverseSubtractIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationReverseSubtractIntInPlaceParser>>;
985
+
986
+ const dalvikBytecodeOperationMultiplyIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-int/2addr', 0xB2);
987
+
988
+ type DalvikBytecodeOperationMultiplyIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyIntInPlaceParser>>;
989
+
990
+ const dalvikBytecodeOperationDivideIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-int/2addr', 0xB3);
991
+
992
+ type DalvikBytecodeOperationDivideIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideIntInPlaceParser>>;
993
+
994
+ const dalvikBytecodeOperationRemainderIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-int/2addr', 0xB4);
995
+
996
+ type DalvikBytecodeOperationRemainderIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderIntInPlaceParser>>;
997
+
998
+ const dalvikBytecodeOperationAndIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-int/2addr', 0xB5);
999
+
1000
+ type DalvikBytecodeOperationAndIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAndIntInPlaceParser>>;
1001
+
1002
+ const dalvikBytecodeOperationOrIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-int/2addr', 0xB6);
1003
+
1004
+ type DalvikBytecodeOperationOrIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationOrIntInPlaceParser>>;
1005
+
1006
+ const dalvikBytecodeOperationXorIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-int/2addr', 0xB7);
1007
+
1008
+ type DalvikBytecodeOperationXorIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationXorIntInPlaceParser>>;
1009
+
1010
+ const dalvikBytecodeOperationShiftLeftIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-int/2addr', 0xB8);
1011
+
1012
+ type DalvikBytecodeOperationShiftLeftIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftIntInPlaceParser>>;
1013
+
1014
+ const dalvikBytecodeOperationShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-int/2addr', 0xB9);
1015
+
1016
+ type DalvikBytecodeOperationShiftRightIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightIntInPlaceParser>>;
1017
+
1018
+ const dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-int/2addr', 0xBA);
1019
+
1020
+ type DalvikBytecodeOperationUnsignedShiftRightIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser>>;
1021
+
1022
+ const dalvikBytecodeOperationAddLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-long/2addr', 0xBB);
1023
+
1024
+ type DalvikBytecodeOperationAddLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAddLongInPlaceParser>>;
1025
+
1026
+ const dalvikBytecodeOperationSubtractLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-long/2addr', 0xBC);
1027
+
1028
+ type DalvikBytecodeOperationSubtractLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractLongInPlaceParser>>;
1029
+
1030
+ const dalvikBytecodeOperationMultiplyLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-long/2addr', 0xBD);
1031
+
1032
+ type DalvikBytecodeOperationMultiplyLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyLongInPlaceParser>>;
1033
+
1034
+ const dalvikBytecodeOperationDivideLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-long/2addr', 0xBE);
1035
+
1036
+ type DalvikBytecodeOperationDivideLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideLongInPlaceParser>>;
1037
+
1038
+ const dalvikBytecodeOperationRemainderLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-long/2addr', 0xBF);
1039
+
1040
+ type DalvikBytecodeOperationRemainderLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderLongInPlaceParser>>;
1041
+
1042
+ const dalvikBytecodeOperationAndLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-long/2addr', 0xC0);
1043
+
1044
+ type DalvikBytecodeOperationAndLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAndLongInPlaceParser>>;
1045
+
1046
+ const dalvikBytecodeOperationOrLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-long/2addr', 0xC1);
1047
+
1048
+ type DalvikBytecodeOperationOrLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationOrLongInPlaceParser>>;
1049
+
1050
+ const dalvikBytecodeOperationXorLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-long/2addr', 0xC2);
1051
+
1052
+ type DalvikBytecodeOperationXorLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationXorLongInPlaceParser>>;
1053
+
1054
+ const dalvikBytecodeOperationShiftLeftLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-long/2addr', 0xC3);
1055
+
1056
+ type DalvikBytecodeOperationShiftLeftLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftLongInPlaceParser>>;
1057
+
1058
+ const dalvikBytecodeOperationShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-long/2addr', 0xC4);
1059
+
1060
+ type DalvikBytecodeOperationShiftRightLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightLongInPlaceParser>>;
1061
+
1062
+ const dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-long/2addr', 0xC5);
1063
+
1064
+ type DalvikBytecodeOperationUnsignedShiftRightLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser>>;
1065
+
1066
+ const dalvikBytecodeOperationAddFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-float/2addr', 0xC6);
1067
+
1068
+ type DalvikBytecodeOperationAddFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAddFloatInPlaceParser>>;
1069
+
1070
+ const dalvikBytecodeOperationSubtractFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-float/2addr', 0xC7);
1071
+
1072
+ type DalvikBytecodeOperationSubtractFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractFloatInPlaceParser>>;
1073
+
1074
+ const dalvikBytecodeOperationMultiplyFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-float/2addr', 0xC8);
1075
+
1076
+ type DalvikBytecodeOperationMultiplyFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyFloatInPlaceParser>>;
1077
+
1078
+ const dalvikBytecodeOperationDivideFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-float/2addr', 0xC9);
1079
+
1080
+ type DalvikBytecodeOperationDivideFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideFloatInPlaceParser>>;
1081
+
1082
+ const dalvikBytecodeOperationRemainderFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-float/2addr', 0xCA);
1083
+
1084
+ type DalvikBytecodeOperationRemainderFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderFloatInPlaceParser>>;
1085
+
1086
+ const dalvikBytecodeOperationAddDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-double/2addr', 0xCB);
1087
+
1088
+ type DalvikBytecodeOperationAddDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAddDoubleInPlaceParser>>;
1089
+
1090
+ const dalvikBytecodeOperationSubtractDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-double/2addr', 0xCC);
1091
+
1092
+ type DalvikBytecodeOperationSubtractDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractDoubleInPlaceParser>>;
1093
+
1094
+ const dalvikBytecodeOperationMultiplyDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-double/2addr', 0xCD);
1095
+
1096
+ type DalvikBytecodeOperationMultiplyDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyDoubleInPlaceParser>>;
1097
+
1098
+ const dalvikBytecodeOperationDivideDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-double/2addr', 0xCE);
1099
+
1100
+ type DalvikBytecodeOperationDivideDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideDoubleInPlaceParser>>;
1101
+
1102
+ const dalvikBytecodeOperationRemainderDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-double/2addr', 0xCF);
1103
+
1104
+ type DalvikBytecodeOperationRemainderDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderDoubleInPlaceParser>>;
1105
+
1106
+ type DalvikBytecodeOperationBinaryOperationInPlace =
1107
+ | DalvikBytecodeOperationAddIntInPlace
1108
+ | DalvikBytecodeOperationReverseSubtractIntInPlace
1109
+ | DalvikBytecodeOperationMultiplyIntInPlace
1110
+ | DalvikBytecodeOperationDivideIntInPlace
1111
+ | DalvikBytecodeOperationRemainderIntInPlace
1112
+ | DalvikBytecodeOperationAndIntInPlace
1113
+ | DalvikBytecodeOperationOrIntInPlace
1114
+ | DalvikBytecodeOperationXorIntInPlace
1115
+ | DalvikBytecodeOperationShiftLeftIntInPlace
1116
+ | DalvikBytecodeOperationShiftRightIntInPlace
1117
+ | DalvikBytecodeOperationUnsignedShiftRightIntInPlace
1118
+ | DalvikBytecodeOperationAddLongInPlace
1119
+ | DalvikBytecodeOperationSubtractLongInPlace
1120
+ | DalvikBytecodeOperationMultiplyLongInPlace
1121
+ | DalvikBytecodeOperationDivideLongInPlace
1122
+ | DalvikBytecodeOperationRemainderLongInPlace
1123
+ | DalvikBytecodeOperationAndLongInPlace
1124
+ | DalvikBytecodeOperationOrLongInPlace
1125
+ | DalvikBytecodeOperationXorLongInPlace
1126
+ | DalvikBytecodeOperationShiftLeftLongInPlace
1127
+ | DalvikBytecodeOperationShiftRightLongInPlace
1128
+ | DalvikBytecodeOperationUnsignedShiftRightLongInPlace
1129
+ | DalvikBytecodeOperationAddFloatInPlace
1130
+ | DalvikBytecodeOperationSubtractFloatInPlace
1131
+ | DalvikBytecodeOperationMultiplyFloatInPlace
1132
+ | DalvikBytecodeOperationDivideFloatInPlace
1133
+ | DalvikBytecodeOperationRemainderFloatInPlace
1134
+ | DalvikBytecodeOperationAddDoubleInPlace
1135
+ | DalvikBytecodeOperationSubtractDoubleInPlace
1136
+ | DalvikBytecodeOperationMultiplyDoubleInPlace
1137
+ | DalvikBytecodeOperationDivideDoubleInPlace
1138
+ | DalvikBytecodeOperationRemainderDoubleInPlace
1139
+ ;
1140
+
1141
+ const dalvikBytecodeOperationBinaryOperationInPlaceParser: Parser<DalvikBytecodeOperationBinaryOperationInPlace, Uint8Array> = createDisjunctionParser([
1142
+ dalvikBytecodeOperationAddIntInPlaceParser,
1143
+ dalvikBytecodeOperationReverseSubtractIntInPlaceParser,
1144
+ dalvikBytecodeOperationMultiplyIntInPlaceParser,
1145
+ dalvikBytecodeOperationDivideIntInPlaceParser,
1146
+ dalvikBytecodeOperationRemainderIntInPlaceParser,
1147
+ dalvikBytecodeOperationAndIntInPlaceParser,
1148
+ dalvikBytecodeOperationOrIntInPlaceParser,
1149
+ dalvikBytecodeOperationXorIntInPlaceParser,
1150
+ dalvikBytecodeOperationShiftLeftIntInPlaceParser,
1151
+ dalvikBytecodeOperationShiftRightIntInPlaceParser,
1152
+ dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser,
1153
+ dalvikBytecodeOperationAddLongInPlaceParser,
1154
+ dalvikBytecodeOperationSubtractLongInPlaceParser,
1155
+ dalvikBytecodeOperationMultiplyLongInPlaceParser,
1156
+ dalvikBytecodeOperationDivideLongInPlaceParser,
1157
+ dalvikBytecodeOperationRemainderLongInPlaceParser,
1158
+ dalvikBytecodeOperationAndLongInPlaceParser,
1159
+ dalvikBytecodeOperationOrLongInPlaceParser,
1160
+ dalvikBytecodeOperationXorLongInPlaceParser,
1161
+ dalvikBytecodeOperationShiftLeftLongInPlaceParser,
1162
+ dalvikBytecodeOperationShiftRightLongInPlaceParser,
1163
+ dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser,
1164
+ dalvikBytecodeOperationAddFloatInPlaceParser,
1165
+ dalvikBytecodeOperationSubtractFloatInPlaceParser,
1166
+ dalvikBytecodeOperationMultiplyFloatInPlaceParser,
1167
+ dalvikBytecodeOperationDivideFloatInPlaceParser,
1168
+ dalvikBytecodeOperationRemainderFloatInPlaceParser,
1169
+ dalvikBytecodeOperationAddDoubleInPlaceParser,
1170
+ dalvikBytecodeOperationSubtractDoubleInPlaceParser,
1171
+ dalvikBytecodeOperationMultiplyDoubleInPlaceParser,
1172
+ dalvikBytecodeOperationDivideDoubleInPlaceParser,
1173
+ dalvikBytecodeOperationRemainderDoubleInPlaceParser,
1174
+ ]);
1175
+
1176
+ setParserName(dalvikBytecodeOperationBinaryOperationInPlaceParser, 'dalvikBytecodeOperationBinaryOperationInPlaceParser');
1177
+
1178
+ const createDalvikBytecodeOperationBinaryOperation = <T extends string>(operation: T, opcode: number): Parser<{
1179
+ operation: T;
1180
+ registers: number[];
1181
+ }, Uint8Array> => promiseCompose(
1182
+ createTupleParser([
1183
+ createExactElementParser(opcode),
1184
+ dalvikBytecodeFormat23xParser,
1185
+ ]),
1186
+ ([ _opcode, { registers } ]) => ({
1187
+ operation,
1188
+ registers,
1189
+ }),
1190
+ );
1191
+
1192
+ const dalvikBytecodeOperationAddIntParser = createDalvikBytecodeOperationBinaryOperation('add-int', 0x90);
1193
+
1194
+ type DalvikBytecodeOperationAddInt = Awaited<ReturnType<typeof dalvikBytecodeOperationAddIntParser>>;
1195
+
1196
+ const dalvikBytecodeOperationSubtractIntParser = createDalvikBytecodeOperationBinaryOperation('sub-int', 0x91);
1197
+
1198
+ type DalvikBytecodeOperationSubtractInt = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractIntParser>>;
1199
+
1200
+ const dalvikBytecodeOperationMultiplyIntParser = createDalvikBytecodeOperationBinaryOperation('mul-int', 0x92);
1201
+
1202
+ type DalvikBytecodeOperationMultiplyInt = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyIntParser>>;
1203
+
1204
+ const dalvikBytecodeOperationDivideIntParser = createDalvikBytecodeOperationBinaryOperation('div-int', 0x93);
1205
+
1206
+ type DalvikBytecodeOperationDivideInt = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideIntParser>>;
1207
+
1208
+ const dalvikBytecodeOperationRemainderIntParser = createDalvikBytecodeOperationBinaryOperation('rem-int', 0x94);
1209
+
1210
+ type DalvikBytecodeOperationRemainderInt = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderIntParser>>;
1211
+
1212
+ const dalvikBytecodeOperationAndIntParser = createDalvikBytecodeOperationBinaryOperation('and-int', 0x95);
1213
+
1214
+ type DalvikBytecodeOperationAndInt = Awaited<ReturnType<typeof dalvikBytecodeOperationAndIntParser>>;
1215
+
1216
+ const dalvikBytecodeOperationOrIntParser = createDalvikBytecodeOperationBinaryOperation('or-int', 0x96);
1217
+
1218
+ type DalvikBytecodeOperationOrInt = Awaited<ReturnType<typeof dalvikBytecodeOperationOrIntParser>>;
1219
+
1220
+ const dalvikBytecodeOperationXorIntParser = createDalvikBytecodeOperationBinaryOperation('xor-int', 0x97);
1221
+
1222
+ type DalvikBytecodeOperationXorInt = Awaited<ReturnType<typeof dalvikBytecodeOperationXorIntParser>>;
1223
+
1224
+ const dalvikBytecodeOperationShiftLeftIntParser = createDalvikBytecodeOperationBinaryOperation('shl-int', 0x98);
1225
+
1226
+ type DalvikBytecodeOperationShiftLeftInt = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftIntParser>>;
1227
+
1228
+ const dalvikBytecodeOperationShiftRightIntParser = createDalvikBytecodeOperationBinaryOperation('shr-int', 0x99);
1229
+
1230
+ type DalvikBytecodeOperationShiftRightInt = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightIntParser>>;
1231
+
1232
+ const dalvikBytecodeOperationUnsignedShiftRightIntParser = createDalvikBytecodeOperationBinaryOperation('ushr-int', 0x9A);
1233
+
1234
+ type DalvikBytecodeOperationUnsignedShiftRightInt = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightIntParser>>;
1235
+
1236
+ const dalvikBytecodeOperationAddLongParser = createDalvikBytecodeOperationBinaryOperation('add-long', 0x9B);
1237
+
1238
+ type DalvikBytecodeOperationAddLong = Awaited<ReturnType<typeof dalvikBytecodeOperationAddLongParser>>;
1239
+
1240
+ const dalvikBytecodeOperationSubtractLongParser = createDalvikBytecodeOperationBinaryOperation('sub-long', 0x9C);
1241
+
1242
+ type DalvikBytecodeOperationSubtractLong = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractLongParser>>;
1243
+
1244
+ const dalvikBytecodeOperationMultiplyLongParser = createDalvikBytecodeOperationBinaryOperation('mul-long', 0x9D);
1245
+
1246
+ type DalvikBytecodeOperationMultiplyLong = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyLongParser>>;
1247
+
1248
+ const dalvikBytecodeOperationDivideLongParser = createDalvikBytecodeOperationBinaryOperation('div-long', 0x9E);
1249
+
1250
+ type DalvikBytecodeOperationDivideLong = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideLongParser>>;
1251
+
1252
+ const dalvikBytecodeOperationRemainderLongParser = createDalvikBytecodeOperationBinaryOperation('rem-long', 0x9F);
1253
+
1254
+ type DalvikBytecodeOperationRemainderLong = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderLongParser>>;
1255
+
1256
+ const dalvikBytecodeOperationAndLongParser = createDalvikBytecodeOperationBinaryOperation('and-long', 0xA0);
1257
+
1258
+ type DalvikBytecodeOperationAndLong = Awaited<ReturnType<typeof dalvikBytecodeOperationAndLongParser>>;
1259
+
1260
+ const dalvikBytecodeOperationOrLongParser = createDalvikBytecodeOperationBinaryOperation('or-long', 0xA1);
1261
+
1262
+ type DalvikBytecodeOperationOrLong = Awaited<ReturnType<typeof dalvikBytecodeOperationOrLongParser>>;
1263
+
1264
+ const dalvikBytecodeOperationXorLongParser = createDalvikBytecodeOperationBinaryOperation('xor-long', 0xA2);
1265
+
1266
+ type DalvikBytecodeOperationXorLong = Awaited<ReturnType<typeof dalvikBytecodeOperationXorLongParser>>;
1267
+
1268
+ const dalvikBytecodeOperationShiftLeftLongParser = createDalvikBytecodeOperationBinaryOperation('shl-long', 0xA3);
1269
+
1270
+ type DalvikBytecodeOperationShiftLeftLong = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftLongParser>>;
1271
+
1272
+ const dalvikBytecodeOperationShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('shr-long', 0xA4);
1273
+
1274
+ type DalvikBytecodeOperationShiftRightLong = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightLongParser>>;
1275
+
1276
+ const dalvikBytecodeOperationUnsignedShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('ushr-long', 0xA5);
1277
+
1278
+ type DalvikBytecodeOperationUnsignedShiftRightLong = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightLongParser>>;
1279
+
1280
+ const dalvikBytecodeOperationAddFloatParser = createDalvikBytecodeOperationBinaryOperation('add-float', 0xA6);
1281
+
1282
+ type DalvikBytecodeOperationAddFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationAddFloatParser>>;
1283
+
1284
+ const dalvikBytecodeOperationSubtractFloatParser = createDalvikBytecodeOperationBinaryOperation('sub-float', 0xA7);
1285
+
1286
+ type DalvikBytecodeOperationSubtractFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractFloatParser>>;
1287
+
1288
+ const dalvikBytecodeOperationMultiplyFloatParser = createDalvikBytecodeOperationBinaryOperation('mul-float', 0xA8);
1289
+
1290
+ type DalvikBytecodeOperationMultiplyFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyFloatParser>>;
1291
+
1292
+ const dalvikBytecodeOperationDivideFloatParser = createDalvikBytecodeOperationBinaryOperation('div-float', 0xA9);
1293
+
1294
+ type DalvikBytecodeOperationDivideFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideFloatParser>>;
1295
+
1296
+ const dalvikBytecodeOperationAddDoubleParser = createDalvikBytecodeOperationBinaryOperation('add-double', 0xAB);
1297
+
1298
+ type DalvikBytecodeOperationAddDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationAddDoubleParser>>;
1299
+
1300
+ const dalvikBytecodeOperationSubtractDoubleParser = createDalvikBytecodeOperationBinaryOperation('sub-double', 0xAC);
1301
+
1302
+ type DalvikBytecodeOperationSubtractDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractDoubleParser>>;
1303
+
1304
+ const dalvikBytecodeOperationMultiplyDoubleParser = createDalvikBytecodeOperationBinaryOperation('mul-double', 0xAD);
1305
+
1306
+ type DalvikBytecodeOperationMultiplyDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyDoubleParser>>;
1307
+
1308
+ const dalvikBytecodeOperationDivideDoubleParser = createDalvikBytecodeOperationBinaryOperation('div-double', 0xAE);
1309
+
1310
+ type DalvikBytecodeOperationDivideDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideDoubleParser>>;
1311
+
1312
+ const dalvikBytecodeOperationRemainderDoubleParser = createDalvikBytecodeOperationBinaryOperation('rem-double', 0xAF);
1313
+
1314
+ type DalvikBytecodeOperationRemainderDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderDoubleParser>>;
1315
+
1316
+ type DalvikBytecodeOperationBinaryOperation =
1317
+ | DalvikBytecodeOperationAddInt
1318
+ | DalvikBytecodeOperationSubtractInt
1319
+ | DalvikBytecodeOperationMultiplyInt
1320
+ | DalvikBytecodeOperationDivideInt
1321
+ | DalvikBytecodeOperationRemainderInt
1322
+ | DalvikBytecodeOperationAndInt
1323
+ | DalvikBytecodeOperationOrInt
1324
+ | DalvikBytecodeOperationXorInt
1325
+ | DalvikBytecodeOperationShiftLeftInt
1326
+ | DalvikBytecodeOperationShiftRightInt
1327
+ | DalvikBytecodeOperationUnsignedShiftRightInt
1328
+ | DalvikBytecodeOperationAddLong
1329
+ | DalvikBytecodeOperationSubtractLong
1330
+ | DalvikBytecodeOperationMultiplyLong
1331
+ | DalvikBytecodeOperationDivideLong
1332
+ | DalvikBytecodeOperationRemainderLong
1333
+ | DalvikBytecodeOperationAndLong
1334
+ | DalvikBytecodeOperationOrLong
1335
+ | DalvikBytecodeOperationXorLong
1336
+ | DalvikBytecodeOperationShiftLeftLong
1337
+ | DalvikBytecodeOperationShiftRightLong
1338
+ | DalvikBytecodeOperationUnsignedShiftRightLong
1339
+ | DalvikBytecodeOperationAddFloat
1340
+ | DalvikBytecodeOperationSubtractFloat
1341
+ | DalvikBytecodeOperationMultiplyFloat
1342
+ | DalvikBytecodeOperationDivideFloat
1343
+ | DalvikBytecodeOperationAddDouble
1344
+ | DalvikBytecodeOperationSubtractDouble
1345
+ | DalvikBytecodeOperationMultiplyDouble
1346
+ | DalvikBytecodeOperationDivideDouble
1347
+ | DalvikBytecodeOperationRemainderDouble
1348
+ ;
1349
+
1350
+ const dalvikBytecodeOperationBinaryOperationParser: Parser<DalvikBytecodeOperationBinaryOperation, Uint8Array> = createDisjunctionParser([
1351
+ dalvikBytecodeOperationAddIntParser,
1352
+ dalvikBytecodeOperationSubtractIntParser,
1353
+ dalvikBytecodeOperationMultiplyIntParser,
1354
+ dalvikBytecodeOperationDivideIntParser,
1355
+ dalvikBytecodeOperationRemainderIntParser,
1356
+ dalvikBytecodeOperationAndIntParser,
1357
+ dalvikBytecodeOperationOrIntParser,
1358
+ dalvikBytecodeOperationXorIntParser,
1359
+ dalvikBytecodeOperationShiftLeftIntParser,
1360
+ dalvikBytecodeOperationShiftRightIntParser,
1361
+ dalvikBytecodeOperationUnsignedShiftRightIntParser,
1362
+ dalvikBytecodeOperationAddLongParser,
1363
+ dalvikBytecodeOperationSubtractLongParser,
1364
+ dalvikBytecodeOperationMultiplyLongParser,
1365
+ dalvikBytecodeOperationDivideLongParser,
1366
+ dalvikBytecodeOperationRemainderLongParser,
1367
+ dalvikBytecodeOperationAndLongParser,
1368
+ dalvikBytecodeOperationOrLongParser,
1369
+ dalvikBytecodeOperationXorLongParser,
1370
+ dalvikBytecodeOperationShiftLeftLongParser,
1371
+ dalvikBytecodeOperationShiftRightLongParser,
1372
+ dalvikBytecodeOperationUnsignedShiftRightLongParser,
1373
+ dalvikBytecodeOperationAddFloatParser,
1374
+ dalvikBytecodeOperationSubtractFloatParser,
1375
+ dalvikBytecodeOperationMultiplyFloatParser,
1376
+ dalvikBytecodeOperationDivideFloatParser,
1377
+ dalvikBytecodeOperationAddDoubleParser,
1378
+ dalvikBytecodeOperationSubtractDoubleParser,
1379
+ dalvikBytecodeOperationMultiplyDoubleParser,
1380
+ dalvikBytecodeOperationDivideDoubleParser,
1381
+ dalvikBytecodeOperationRemainderDoubleParser,
1382
+ ]);
1383
+
1384
+ setParserName(dalvikBytecodeOperationBinaryOperationParser, 'dalvikBytecodeOperationBinaryOperationParser');
1385
+
1386
+ const createDalvikBytecodeOperationUnaryOperation = <T extends string>(operation: T, opcode: number): Parser<{
1387
+ operation: T;
1388
+ registers: number[];
1389
+ }, Uint8Array> => promiseCompose(
1390
+ createTupleParser([
1391
+ createExactElementParser(opcode),
1392
+ dalvikBytecodeFormat12xParser,
1393
+ ]),
1394
+ ([ _opcode, { registers } ]) => ({
1395
+ operation,
1396
+ registers,
1397
+ }),
1398
+ );
1399
+
1400
+ const dalvikBytecodeOperationNegateIntParser = createDalvikBytecodeOperationUnaryOperation('neg-int', 0x7B);
1401
+
1402
+ type DalvikBytecodeOperationNegateInt = Awaited<ReturnType<typeof dalvikBytecodeOperationNegateIntParser>>;
1403
+
1404
+ const dalvikBytecodeOperationNotIntParser = createDalvikBytecodeOperationUnaryOperation('not-int', 0x7C);
1405
+
1406
+ type DalvikBytecodeOperationNotInt = Awaited<ReturnType<typeof dalvikBytecodeOperationNotIntParser>>;
1407
+
1408
+ const dalvikBytecodeOperationNegateLongParser = createDalvikBytecodeOperationUnaryOperation('neg-long', 0x7D);
1409
+
1410
+ type DalvikBytecodeOperationNegateLong = Awaited<ReturnType<typeof dalvikBytecodeOperationNegateLongParser>>;
1411
+
1412
+ const dalvikBytecodeOperationNotLongParser = createDalvikBytecodeOperationUnaryOperation('not-long', 0x7E);
1413
+
1414
+ type DalvikBytecodeOperationNotLong = Awaited<ReturnType<typeof dalvikBytecodeOperationNotLongParser>>;
1415
+
1416
+ const dalvikBytecodeOperationNegateFloatParser = createDalvikBytecodeOperationUnaryOperation('neg-float', 0x7F);
1417
+
1418
+ type DalvikBytecodeOperationNegateFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationNegateFloatParser>>;
1419
+
1420
+ const dalvikBytecodeOperationNegateDoubleParser = createDalvikBytecodeOperationUnaryOperation('neg-double', 0x80);
1421
+
1422
+ type DalvikBytecodeOperationNegateDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationNegateDoubleParser>>;
1423
+
1424
+ const dalvikBytecodeOperationIntToLongParser = createDalvikBytecodeOperationUnaryOperation('int-to-long', 0x81);
1425
+
1426
+ type DalvikBytecodeOperationIntToLong = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToLongParser>>;
1427
+
1428
+ const dalvikBytecodeOperationIntToFloatParser = createDalvikBytecodeOperationUnaryOperation('int-to-float', 0x82);
1429
+
1430
+ type DalvikBytecodeOperationIntToFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToFloatParser>>;
1431
+
1432
+ const dalvikBytecodeOperationIntToDoubleParser = createDalvikBytecodeOperationUnaryOperation('int-to-double', 0x83);
1433
+
1434
+ type DalvikBytecodeOperationIntToDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToDoubleParser>>;
1435
+
1436
+ const dalvikBytecodeOperationLongToIntParser = createDalvikBytecodeOperationUnaryOperation('long-to-int', 0x84);
1437
+
1438
+ type DalvikBytecodeOperationLongToInt = Awaited<ReturnType<typeof dalvikBytecodeOperationLongToIntParser>>;
1439
+
1440
+ const dalvikBytecodeOperationLongToFloatParser = createDalvikBytecodeOperationUnaryOperation('long-to-float', 0x85);
1441
+
1442
+ type DalvikBytecodeOperationLongToFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationLongToFloatParser>>;
1443
+
1444
+ const dalvikBytecodeOperationLongToDoubleParser = createDalvikBytecodeOperationUnaryOperation('long-to-double', 0x86);
1445
+
1446
+ type DalvikBytecodeOperationLongToDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationLongToDoubleParser>>;
1447
+
1448
+ const dalvikBytecodeOperationFloatToIntParser = createDalvikBytecodeOperationUnaryOperation('float-to-int', 0x87);
1449
+
1450
+ type DalvikBytecodeOperationFloatToInt = Awaited<ReturnType<typeof dalvikBytecodeOperationFloatToIntParser>>;
1451
+
1452
+ const dalvikBytecodeOperationFloatToLongParser = createDalvikBytecodeOperationUnaryOperation('float-to-long', 0x88);
1453
+
1454
+ type DalvikBytecodeOperationFloatToLong = Awaited<ReturnType<typeof dalvikBytecodeOperationFloatToLongParser>>;
1455
+
1456
+ const dalvikBytecodeOperationFloatToDoubleParser = createDalvikBytecodeOperationUnaryOperation('float-to-double', 0x89);
1457
+
1458
+ type DalvikBytecodeOperationFloatToDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationFloatToDoubleParser>>;
1459
+
1460
+ const dalvikBytecodeOperationDoubleToIntParser = createDalvikBytecodeOperationUnaryOperation('double-to-int', 0x8A);
1461
+
1462
+ type DalvikBytecodeOperationDoubleToInt = Awaited<ReturnType<typeof dalvikBytecodeOperationDoubleToIntParser>>;
1463
+
1464
+ const dalvikBytecodeOperationDoubleToLongParser = createDalvikBytecodeOperationUnaryOperation('double-to-long', 0x8B);
1465
+
1466
+ type DalvikBytecodeOperationDoubleToLong = Awaited<ReturnType<typeof dalvikBytecodeOperationDoubleToLongParser>>;
1467
+
1468
+ const dalvikBytecodeOperationDoubleToFloatParser = createDalvikBytecodeOperationUnaryOperation('double-to-float', 0x8C);
1469
+
1470
+ type DalvikBytecodeOperationDoubleToFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationDoubleToFloatParser>>;
1471
+
1472
+ const dalvikBytecodeOperationIntToByteParser = createDalvikBytecodeOperationUnaryOperation('int-to-byte', 0x8D);
1473
+
1474
+ type DalvikBytecodeOperationIntToByte = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToByteParser>>;
1475
+
1476
+ const dalvikBytecodeOperationIntToCharParser = createDalvikBytecodeOperationUnaryOperation('int-to-char', 0x8E);
1477
+
1478
+ type DalvikBytecodeOperationIntToChar = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToCharParser>>;
1479
+
1480
+ const dalvikBytecodeOperationIntToShortParser = createDalvikBytecodeOperationUnaryOperation('int-to-short', 0x8F);
1481
+
1482
+ type DalvikBytecodeOperationIntToShort = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToShortParser>>;
1483
+
1484
+ type DalvikBytecodeOperationUnaryOperation =
1485
+ | DalvikBytecodeOperationNegateInt
1486
+ | DalvikBytecodeOperationNotInt
1487
+ | DalvikBytecodeOperationNegateLong
1488
+ | DalvikBytecodeOperationNotLong
1489
+ | DalvikBytecodeOperationNegateFloat
1490
+ | DalvikBytecodeOperationNegateDouble
1491
+ | DalvikBytecodeOperationIntToLong
1492
+ | DalvikBytecodeOperationIntToFloat
1493
+ | DalvikBytecodeOperationIntToDouble
1494
+ | DalvikBytecodeOperationLongToInt
1495
+ | DalvikBytecodeOperationLongToFloat
1496
+ | DalvikBytecodeOperationLongToDouble
1497
+ | DalvikBytecodeOperationFloatToInt
1498
+ | DalvikBytecodeOperationFloatToLong
1499
+ | DalvikBytecodeOperationFloatToDouble
1500
+ | DalvikBytecodeOperationDoubleToInt
1501
+ | DalvikBytecodeOperationDoubleToLong
1502
+ | DalvikBytecodeOperationDoubleToFloat
1503
+ | DalvikBytecodeOperationIntToByte
1504
+ | DalvikBytecodeOperationIntToChar
1505
+ | DalvikBytecodeOperationIntToShort
1506
+ ;
1507
+
1508
+ const dalvikBytecodeOperationUnaryOperationParser: Parser<DalvikBytecodeOperationUnaryOperation, Uint8Array> = createDisjunctionParser([
1509
+ dalvikBytecodeOperationNegateIntParser,
1510
+ dalvikBytecodeOperationNotIntParser,
1511
+ dalvikBytecodeOperationNegateLongParser,
1512
+ dalvikBytecodeOperationNotLongParser,
1513
+ dalvikBytecodeOperationNegateFloatParser,
1514
+ dalvikBytecodeOperationNegateDoubleParser,
1515
+ dalvikBytecodeOperationIntToLongParser,
1516
+ dalvikBytecodeOperationIntToFloatParser,
1517
+ dalvikBytecodeOperationIntToDoubleParser,
1518
+ dalvikBytecodeOperationLongToIntParser,
1519
+ dalvikBytecodeOperationLongToFloatParser,
1520
+ dalvikBytecodeOperationLongToDoubleParser,
1521
+ dalvikBytecodeOperationFloatToIntParser,
1522
+ dalvikBytecodeOperationFloatToLongParser,
1523
+ dalvikBytecodeOperationFloatToDoubleParser,
1524
+ dalvikBytecodeOperationDoubleToIntParser,
1525
+ dalvikBytecodeOperationDoubleToLongParser,
1526
+ dalvikBytecodeOperationDoubleToFloatParser,
1527
+ dalvikBytecodeOperationIntToByteParser,
1528
+ dalvikBytecodeOperationIntToCharParser,
1529
+ dalvikBytecodeOperationIntToShortParser,
1530
+ ]);
1531
+
1532
+ setParserName(dalvikBytecodeOperationUnaryOperationParser, 'dalvikBytecodeOperationUnaryOperationParser');
1533
+
1534
+ // For commutative comparison operations (if-eq, if-ne), sort registers to match baksmali's canonical output
1535
+ const createDalvikBytecodeOperationIfTestCommutative = <T extends string>(operation: T, opcode: number): Parser<{
1536
+ operation: T;
1537
+ registers: number[];
1538
+ branchOffset: number;
1539
+ }, Uint8Array> => promiseCompose(
1540
+ createTupleParser([
1541
+ createExactElementParser(opcode),
1542
+ createDalvikBytecodeFormat22tParser(),
1543
+ ]),
1544
+ ([ _opcode, { registers, branchOffset } ]) => ({
1545
+ operation,
1546
+ registers: registers.sort((a, b) => a - b),
1547
+ branchOffset,
1548
+ }),
1549
+ );
1550
+
1551
+ // For non-commutative comparison operations (if-lt, if-ge, if-gt, if-le), reverse to get correct semantic order
1552
+ const createDalvikBytecodeOperationIfTest = <T extends string>(operation: T, opcode: number): Parser<{
1553
+ operation: T;
1554
+ registers: number[];
1555
+ branchOffset: number;
1556
+ }, Uint8Array> => promiseCompose(
1557
+ createTupleParser([
1558
+ createExactElementParser(opcode),
1559
+ createDalvikBytecodeFormat22tParser(),
1560
+ ]),
1561
+ ([ _opcode, { registers, branchOffset } ]) => ({
1562
+ operation,
1563
+ registers: registers.reverse(),
1564
+ branchOffset,
1565
+ }),
1566
+ );
1567
+
1568
+ const dalvikBytecodeIfEqualParser = createDalvikBytecodeOperationIfTestCommutative('if-eq', 0x32);
1569
+
1570
+ type DalvikBytecodeOperationIfEqual = Awaited<ReturnType<typeof dalvikBytecodeIfEqualParser>>;
1571
+
1572
+ const dalvikBytecodeIfNotEqualParser = createDalvikBytecodeOperationIfTestCommutative('if-ne', 0x33);
1573
+
1574
+ type DalvikBytecodeOperationIfNotEqual = Awaited<ReturnType<typeof dalvikBytecodeIfNotEqualParser>>;
1575
+
1576
+ const dalvikBytecodeIfLessThanParser = createDalvikBytecodeOperationIfTest('if-lt', 0x34);
1577
+
1578
+ type DalvikBytecodeOperationIfLessThan = Awaited<ReturnType<typeof dalvikBytecodeIfLessThanParser>>;
1579
+
1580
+ const dalvikBytecodeIfGreaterThanOrEqualToParser = createDalvikBytecodeOperationIfTest('if-ge', 0x35);
1581
+
1582
+ type DalvikBytecodeOperationIfGreaterThanOrEqualTo = Awaited<ReturnType<typeof dalvikBytecodeIfGreaterThanOrEqualToParser>>;
1583
+
1584
+ const dalvikBytecodeIfGreaterThanParser = createDalvikBytecodeOperationIfTest('if-gt', 0x36);
1585
+
1586
+ type DalvikBytecodeOperationIfGreaterThan = Awaited<ReturnType<typeof dalvikBytecodeIfGreaterThanParser>>;
1587
+
1588
+ const dalvikBytecodeIfLessThanOrEqualToParser = createDalvikBytecodeOperationIfTest('if-le', 0x37);
1589
+
1590
+ type DalvikBytecodeOperationIfLessThanOrEqualTo = Awaited<ReturnType<typeof dalvikBytecodeIfLessThanOrEqualToParser>>;
1591
+
1592
+ type DalvikBytecodeOperationIfTest =
1593
+ | DalvikBytecodeOperationIfEqual
1594
+ | DalvikBytecodeOperationIfNotEqual
1595
+ | DalvikBytecodeOperationIfLessThan
1596
+ | DalvikBytecodeOperationIfGreaterThanOrEqualTo
1597
+ | DalvikBytecodeOperationIfGreaterThan
1598
+ | DalvikBytecodeOperationIfLessThanOrEqualTo
1599
+ ;
1600
+
1601
+ const dalvikBytecodeOperationIfTestParser: Parser<DalvikBytecodeOperationIfTest, Uint8Array> = createDisjunctionParser([
1602
+ dalvikBytecodeIfEqualParser,
1603
+ dalvikBytecodeIfNotEqualParser,
1604
+ dalvikBytecodeIfLessThanParser,
1605
+ dalvikBytecodeIfGreaterThanOrEqualToParser,
1606
+ dalvikBytecodeIfGreaterThanParser,
1607
+ dalvikBytecodeIfLessThanOrEqualToParser,
1608
+ ]);
1609
+
1610
+ setParserName(dalvikBytecodeOperationIfTestParser, 'dalvikBytecodeOperationIfTestParser');
1611
+
1612
+ const createDalvikBytecodeOperationIfTestZero = <T extends string>(operation: T, opcode: number): Parser<{
1613
+ operation: T;
1614
+ registers: number[];
1615
+ branchOffset: number;
1616
+ }, Uint8Array> => promiseCompose(
1617
+ createTupleParser([
1618
+ createExactElementParser(opcode),
1619
+ createDalvikBytecodeFormat21tParser(),
1620
+ ]),
1621
+ ([ _opcode, { registers, branchOffset } ]) => ({
1622
+ operation,
1623
+ registers,
1624
+ branchOffset,
1625
+ }),
1626
+ );
1627
+
1628
+ const dalvikBytecodeIfEqualZeroParser = createDalvikBytecodeOperationIfTestZero('if-eqz', 0x38);
1629
+
1630
+ type DalvikBytecodeOperationIfEqualZero = Awaited<ReturnType<typeof dalvikBytecodeIfEqualZeroParser>>;
1631
+
1632
+ const dalvikBytecodeIfNotEqualZeroParser = createDalvikBytecodeOperationIfTestZero('if-nez', 0x39);
1633
+
1634
+ type DalvikBytecodeOperationIfNotEqualZero = Awaited<ReturnType<typeof dalvikBytecodeIfNotEqualZeroParser>>;
1635
+
1636
+ const dalvikBytecodeIfLessThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-ltz', 0x3A);
1637
+
1638
+ type DalvikBytecodeOperationIfLessThanZero = Awaited<ReturnType<typeof dalvikBytecodeIfLessThanZeroParser>>;
1639
+
1640
+ const dalvikBytecodeIfGreaterThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-gez', 0x3B);
1641
+
1642
+ type DalvikBytecodeOperationIfGreaterThanOrEqualToZero = Awaited<ReturnType<typeof dalvikBytecodeIfGreaterThanOrEqualToZeroParser>>;
1643
+
1644
+ const dalvikBytecodeIfGreaterThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-gtz', 0x3C);
1645
+
1646
+ type DalvikBytecodeOperationIfGreaterThanZero = Awaited<ReturnType<typeof dalvikBytecodeIfGreaterThanZeroParser>>;
1647
+
1648
+ const dalvikBytecodeIfLessThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-lez', 0x3D);
1649
+
1650
+ type DalvikBytecodeOperationIfLessThanOrEqualToZero = Awaited<ReturnType<typeof dalvikBytecodeIfLessThanOrEqualToZeroParser>>;
1651
+
1652
+ type DalvikBytecodeOperationIfTestZero =
1653
+ | DalvikBytecodeOperationIfEqualZero
1654
+ | DalvikBytecodeOperationIfNotEqualZero
1655
+ | DalvikBytecodeOperationIfLessThanZero
1656
+ | DalvikBytecodeOperationIfGreaterThanOrEqualToZero
1657
+ | DalvikBytecodeOperationIfGreaterThanZero
1658
+ | DalvikBytecodeOperationIfLessThanOrEqualToZero
1659
+ ;
1660
+
1661
+ const dalvikBytecodeOperationIfTestZeroParser: Parser<DalvikBytecodeOperationIfTestZero, Uint8Array> = createDisjunctionParser([
1662
+ dalvikBytecodeIfEqualZeroParser,
1663
+ dalvikBytecodeIfNotEqualZeroParser,
1664
+ dalvikBytecodeIfLessThanZeroParser,
1665
+ dalvikBytecodeIfGreaterThanOrEqualToZeroParser,
1666
+ dalvikBytecodeIfGreaterThanZeroParser,
1667
+ dalvikBytecodeIfLessThanOrEqualToZeroParser,
1668
+ ]);
1669
+
1670
+ setParserName(dalvikBytecodeOperationIfTestZeroParser, 'dalvikBytecodeOperationIfTestZeroParser');
1671
+
1672
+ type DalvikBytecodeOperationConstString = {
1673
+ operation: 'const-string';
1674
+ stringIndex: IndexIntoStringIds;
1675
+ registers: number[];
1676
+ };
1677
+
1678
+ const dalvikBytecodeOperationConstStringParser: Parser<DalvikBytecodeOperationConstString, Uint8Array> = promiseCompose(
1679
+ createTupleParser([
1680
+ createExactElementParser(0x1A),
1681
+ createDalvikBytecodeFormat21cParser({
1682
+ isoIndex: isoIndexIntoStringIds,
1683
+ }),
1684
+ ]),
1685
+ ([ _opcode, { index, registers } ]) => ({
1686
+ operation: 'const-string',
1687
+ stringIndex: index,
1688
+ registers,
1689
+ }),
1690
+ );
1691
+
1692
+ setParserName(dalvikBytecodeOperationConstStringParser, 'dalvikBytecodeOperationConstStringParser');
1693
+
1694
+ type DalvikBytecodeOperationConstStringJumbo = {
1695
+ operation: 'const-string/jumbo';
1696
+ stringIndex: IndexIntoStringIds;
1697
+ registers: number[];
1698
+ };
1699
+
1700
+ const dalvikBytecodeOperationConstStringJumboParser: Parser<DalvikBytecodeOperationConstStringJumbo, Uint8Array> = promiseCompose(
1701
+ createTupleParser([
1702
+ createExactElementParser(0x1B),
1703
+ createDalvikBytecodeFormat31cParser({
1704
+ isoIndex: isoIndexIntoStringIds,
1705
+ }),
1706
+ ]),
1707
+ ([ _opcode, { index, registers } ]) => ({
1708
+ operation: 'const-string/jumbo',
1709
+ stringIndex: index,
1710
+ registers,
1711
+ }),
1712
+ );
1713
+
1714
+ setParserName(dalvikBytecodeOperationConstStringJumboParser, 'dalvikBytecodeOperationConstStringJumboParser');
1715
+
1716
+ type DalvikBytecodeOperationConstMethodHandle = {
1717
+ operation: 'const-method-handle';
1718
+ methodIndex: IndexIntoMethodIds;
1719
+ registers: number[];
1720
+ };
1721
+
1722
+ const dalvikBytecodeOperationConstMethodHandleParser: Parser<DalvikBytecodeOperationConstMethodHandle, Uint8Array> = promiseCompose(
1723
+ createTupleParser([
1724
+ createExactElementParser(0xFE),
1725
+ createDalvikBytecodeFormat21cParser({
1726
+ isoIndex: isoIndexIntoMethodIds,
1727
+ }),
1728
+ ]),
1729
+ ([ _opcode, { index, registers } ]) => ({
1730
+ operation: 'const-method-handle',
1731
+ methodIndex: index,
1732
+ registers,
1733
+ }),
1734
+ );
1735
+
1736
+ setParserName(dalvikBytecodeOperationConstMethodHandleParser, 'dalvikBytecodeOperationConstMethodHandleParser');
1737
+
1738
+ type DalvikBytecodeOperationNewInstance = {
1739
+ operation: 'new-instance';
1740
+ typeIndex: IndexIntoTypeIds;
1741
+ registers: number[];
1742
+ };
1743
+
1744
+ const dalvikBytecodeOperationNewInstanceParser: Parser<DalvikBytecodeOperationNewInstance, Uint8Array> = promiseCompose(
1745
+ createTupleParser([
1746
+ createExactElementParser(0x22),
1747
+ createDalvikBytecodeFormat21cParser({
1748
+ isoIndex: isoIndexIntoTypeIds,
1749
+ }),
1750
+ ]),
1751
+ ([ _opcode, { index, registers } ]) => ({
1752
+ operation: 'new-instance',
1753
+ typeIndex: index,
1754
+ registers,
1755
+ }),
1756
+ );
1757
+
1758
+ setParserName(dalvikBytecodeOperationNewInstanceParser, 'dalvikBytecodeOperationNewInstanceParser');
1759
+
1760
+ type DalvikBytecodeOperationNewArray = {
1761
+ operation: 'new-array';
1762
+ typeIndex: IndexIntoTypeIds;
1763
+ registers: number[];
1764
+ };
1765
+
1766
+ const dalvikBytecodeOperationNewArrayParser: Parser<DalvikBytecodeOperationNewArray, Uint8Array> = promiseCompose(
1767
+ createTupleParser([
1768
+ createExactElementParser(0x23),
1769
+ createDalvikBytecodeFormat22cParser({
1770
+ isoIndex: isoIndexIntoTypeIds,
1771
+ }),
1772
+ ]),
1773
+ ([ _opcode, { index, registers } ]) => ({
1774
+ operation: 'new-array',
1775
+ typeIndex: index,
1776
+ registers,
1777
+ }),
1778
+ );
1779
+
1780
+ setParserName(dalvikBytecodeOperationNewArrayParser, 'dalvikBytecodeOperationNewArrayParser');
1781
+
1782
+ type DalvikBytecodeOperationFilledNewArray = {
1783
+ operation: 'filled-new-array';
1784
+ typeIndex: IndexIntoTypeIds;
1785
+ registers: number[];
1786
+ };
1787
+
1788
+ const dalvikBytecodeOperationFilledNewArrayParser: Parser<DalvikBytecodeOperationFilledNewArray, Uint8Array> = promiseCompose(
1789
+ createTupleParser([
1790
+ createExactElementParser(0x24),
1791
+ createDalvikBytecodeFormat35cParser({
1792
+ isoIndex: isoIndexIntoTypeIds,
1793
+ }),
1794
+ ]),
1795
+ ([ _opcode, { index, registers } ]) => ({
1796
+ operation: 'filled-new-array',
1797
+ typeIndex: index,
1798
+ registers,
1799
+ }),
1800
+ );
1801
+
1802
+ setParserName(dalvikBytecodeOperationFilledNewArrayParser, 'dalvikBytecodeOperationFilledNewArrayParser');
1803
+
1804
+ type DalvikBytecodeOperationFilledNewArrayRange = {
1805
+ operation: 'filled-new-array/range';
1806
+ typeIndex: IndexIntoTypeIds;
1807
+ registers: number[];
1808
+ };
1809
+
1810
+ const dalvikBytecodeOperationFilledNewArrayRangeParser: Parser<DalvikBytecodeOperationFilledNewArrayRange, Uint8Array> = promiseCompose(
1811
+ createTupleParser([
1812
+ createExactElementParser(0x25),
1813
+ createDalvikBytecodeFormat3rcParser({
1814
+ isoIndex: isoIndexIntoTypeIds,
1815
+ }),
1816
+ ]),
1817
+ ([ _opcode, { index, registers } ]) => ({
1818
+ operation: 'filled-new-array/range',
1819
+ typeIndex: index,
1820
+ registers,
1821
+ }),
1822
+ );
1823
+
1824
+ setParserName(dalvikBytecodeOperationFilledNewArrayRangeParser, 'dalvikBytecodeOperationFilledNewArrayRangeParser');
1825
+
1826
+ type DalvikBytecodeOperationFillArrayData = {
1827
+ operation: 'fill-array-data';
1828
+ branchOffset: number;
1829
+ registers: number[];
1830
+ };
1831
+
1832
+ const dalvikBytecodeOperationFillArrayDataParser: Parser<DalvikBytecodeOperationFillArrayData, Uint8Array> = promiseCompose(
1833
+ createTupleParser([
1834
+ createExactElementParser(0x26),
1835
+ dalvikBytecodeFormat31tParser,
1836
+ ]),
1837
+ ([ _opcode, { branchOffset, registers } ]) => ({
1838
+ operation: 'fill-array-data',
1839
+ branchOffset,
1840
+ registers,
1841
+ }),
1842
+ );
1843
+
1844
+ setParserName(dalvikBytecodeOperationFillArrayDataParser, 'dalvikBytecodeOperationFillArrayDataParser');
1845
+
1846
+ type DalvikBytecodeOperationCheckCast = {
1847
+ operation: 'check-cast';
1848
+ typeIndex: IndexIntoTypeIds;
1849
+ registers: number[];
1850
+ };
1851
+
1852
+ const dalvikBytecodeOperationCheckCastParser: Parser<DalvikBytecodeOperationCheckCast, Uint8Array> = promiseCompose(
1853
+ createTupleParser([
1854
+ createExactElementParser(0x1F),
1855
+ createDalvikBytecodeFormat21cParser({
1856
+ isoIndex: isoIndexIntoTypeIds,
1857
+ }),
1858
+ ]),
1859
+ ([ _opcode, { index, registers } ]) => ({
1860
+ operation: 'check-cast',
1861
+ typeIndex: index,
1862
+ registers,
1863
+ }),
1864
+ );
1865
+
1866
+ setParserName(dalvikBytecodeOperationCheckCastParser, 'dalvikBytecodeOperationCheckCastParser');
1867
+
1868
+ type DalvikBytecodeOperationArrayLength = {
1869
+ operation: 'array-length';
1870
+ registers: number[];
1871
+ };
1872
+
1873
+ const dalvikBytecodeOperationArrayLengthParser: Parser<DalvikBytecodeOperationArrayLength, Uint8Array> = promiseCompose(
1874
+ createTupleParser([
1875
+ createExactElementParser(0x21),
1876
+ dalvikBytecodeFormat12xParser,
1877
+ ]),
1878
+ ([ _opcode, { registers } ]) => ({
1879
+ operation: 'array-length',
1880
+ registers: registers.reverse(),
1881
+ }),
1882
+ );
1883
+
1884
+ setParserName(dalvikBytecodeOperationArrayLengthParser, 'dalvikBytecodeOperationArrayLengthParser');
1885
+
1886
+ type DalvikBytecodeOperationConstClass = {
1887
+ operation: 'const-class';
1888
+ typeIndex: IndexIntoTypeIds;
1889
+ registers: number[];
1890
+ };
1891
+
1892
+ const dalvikBytecodeOperationConstClassParser: Parser<DalvikBytecodeOperationConstClass, Uint8Array> = promiseCompose(
1893
+ createTupleParser([
1894
+ createExactElementParser(0x1C),
1895
+ createDalvikBytecodeFormat21cParser({
1896
+ isoIndex: isoIndexIntoTypeIds,
1897
+ }),
1898
+ ]),
1899
+ ([ _opcode, { index, registers } ]) => ({
1900
+ operation: 'const-class',
1901
+ typeIndex: index,
1902
+ registers,
1903
+ }),
1904
+ );
1905
+
1906
+ setParserName(dalvikBytecodeOperationConstClassParser, 'dalvikBytecodeOperationConstClassParser');
1907
+
1908
+ type DalvikBytecodeOperationMonitorEnter = {
1909
+ operation: 'monitor-enter';
1910
+ registers: number[];
1911
+ };
1912
+
1913
+ const dalvikBytecodeOperationMonitorEnterParser: Parser<DalvikBytecodeOperationMonitorEnter, Uint8Array> = promiseCompose(
1914
+ createTupleParser([
1915
+ createExactElementParser(0x1D),
1916
+ dalvikBytecodeFormat11xParser,
1917
+ ]),
1918
+ ([ _opcode, { registers } ]) => ({
1919
+ operation: 'monitor-enter',
1920
+ registers,
1921
+ }),
1922
+ );
1923
+
1924
+ setParserName(dalvikBytecodeOperationMonitorEnterParser, 'dalvikBytecodeOperationMonitorEnterParser');
1925
+
1926
+ type DalvikBytecodeOperationMonitorExit = {
1927
+ operation: 'monitor-exit';
1928
+ registers: number[];
1929
+ };
1930
+
1931
+ const dalvikBytecodeOperationMonitorExitParser: Parser<DalvikBytecodeOperationMonitorExit, Uint8Array> = promiseCompose(
1932
+ createTupleParser([
1933
+ createExactElementParser(0x1E),
1934
+ dalvikBytecodeFormat11xParser,
1935
+ ]),
1936
+ ([ _opcode, { registers } ]) => ({
1937
+ operation: 'monitor-exit',
1938
+ registers,
1939
+ }),
1940
+ );
1941
+
1942
+ setParserName(dalvikBytecodeOperationMonitorExitParser, 'dalvikBytecodeOperationMonitorExitParser');
1943
+
1944
+ type DalvikBytecodeOperationReturnVoid = {
1945
+ operation: 'return-void';
1946
+ };
1947
+
1948
+ const dalvikBytecodeOperationReturnVoidParser: Parser<DalvikBytecodeOperationReturnVoid, Uint8Array> = promiseCompose(
1949
+ createTupleParser([
1950
+ createExactElementParser(0x0E),
1951
+ dalvikBytecodeFormat10xParser,
1952
+ ]),
1953
+ () => ({
1954
+ operation: 'return-void',
1955
+ }),
1956
+ );
1957
+
1958
+ setParserName(dalvikBytecodeOperationReturnVoidParser, 'dalvikBytecodeOperationReturnVoidParser');
1959
+
1960
+ const createDalvikBytecodeMoveResult1Parser = <T extends string>(operation: T, opcode: number): Parser<{
1961
+ operation: T;
1962
+ registers: number[];
1963
+ }, Uint8Array> => promiseCompose(
1964
+ createTupleParser([
1965
+ createExactElementParser(opcode),
1966
+ dalvikBytecodeFormat11xParser,
1967
+ ]),
1968
+ ([ _opcode, { registers } ]) => ({
1969
+ operation,
1970
+ registers,
1971
+ }),
1972
+ );
1973
+
1974
+ const dalvikBytecodeMoveResultParser = createDalvikBytecodeMoveResult1Parser('move-result', 0x0A);
1975
+
1976
+ type DalvikBytecodeOperationMoveResult = Awaited<ReturnType<typeof dalvikBytecodeMoveResultParser>>;
1977
+
1978
+ const dalvikBytecodeMoveResultWideParser = createDalvikBytecodeMoveResult1Parser('move-result-wide', 0x0B);
1979
+
1980
+ type DalvikBytecodeOperationMoveResultWide = Awaited<ReturnType<typeof dalvikBytecodeMoveResultWideParser>>;
1981
+
1982
+ const dalvikBytecodeMoveResultObjectParser = createDalvikBytecodeMoveResult1Parser('move-result-object', 0x0C);
1983
+
1984
+ type DalvikBytecodeOperationMoveResultObject = Awaited<ReturnType<typeof dalvikBytecodeMoveResultObjectParser>>;
1985
+
1986
+ const dalvikBytecodeMoveExceptionParser = createDalvikBytecodeMoveResult1Parser('move-exception', 0x0D);
1987
+
1988
+ type DalvikBytecodeOperationMoveException = Awaited<ReturnType<typeof dalvikBytecodeMoveExceptionParser>>;
1989
+
1990
+ type DalvikBytecodeOperationMoveResult1 =
1991
+ | DalvikBytecodeOperationMoveResult
1992
+ | DalvikBytecodeOperationMoveResultWide
1993
+ | DalvikBytecodeOperationMoveResultObject
1994
+ | DalvikBytecodeOperationMoveException
1995
+ ;
1996
+
1997
+ const dalvikBytecodeOperationMoveResult1Parser: Parser<DalvikBytecodeOperationMoveResult1, Uint8Array> = createDisjunctionParser([
1998
+ dalvikBytecodeMoveResultParser,
1999
+ dalvikBytecodeMoveResultWideParser,
2000
+ dalvikBytecodeMoveResultObjectParser,
2001
+ dalvikBytecodeMoveExceptionParser,
2002
+ ]);
2003
+
2004
+ setParserName(dalvikBytecodeOperationMoveResult1Parser, 'dalvikBytecodeOperationMoveResult1Parser');
2005
+
2006
+ type DalvikBytecodeOperationMove = {
2007
+ operation: 'move';
2008
+ registers: number[];
2009
+ };
2010
+
2011
+ const dalvikBytecodeOperationMoveParser: Parser<DalvikBytecodeOperationMove, Uint8Array> = promiseCompose(
2012
+ createTupleParser([
2013
+ createExactElementParser(0x01),
2014
+ dalvikBytecodeFormat12xParser,
2015
+ ]),
2016
+ ([ _opcode, { registers } ]) => ({
2017
+ operation: 'move',
2018
+ registers,
2019
+ }),
2020
+ );
2021
+
2022
+ type DalvikBytecodeOperationMoveWide = {
2023
+ operation: 'move-wide';
2024
+ registers: number[];
2025
+ };
2026
+
2027
+ const dalvikBytecodeOperationMoveWideParser: Parser<DalvikBytecodeOperationMoveWide, Uint8Array> = promiseCompose(
2028
+ createTupleParser([
2029
+ createExactElementParser(0x04),
2030
+ dalvikBytecodeFormat12xParser,
2031
+ ]),
2032
+ ([ _opcode, { registers } ]) => ({
2033
+ operation: 'move-wide',
2034
+ registers,
2035
+ }),
2036
+ );
2037
+
2038
+ type DalvikBytecodeOperationMoveObject = {
2039
+ operation: 'move-object';
2040
+ registers: number[];
2041
+ };
2042
+
2043
+ const dalvikBytecodeOperationMoveObjectParser: Parser<DalvikBytecodeOperationMoveObject, Uint8Array> = promiseCompose(
2044
+ createTupleParser([
2045
+ createExactElementParser(0x07),
2046
+ dalvikBytecodeFormat12xParser,
2047
+ ]),
2048
+ ([ _opcode, { registers } ]) => ({
2049
+ operation: 'move-object',
2050
+ registers,
2051
+ }),
2052
+ );
2053
+
2054
+ type DalvikBytecodeOperationMoveFrom16 = {
2055
+ operation: 'move/from16';
2056
+ registers: number[];
2057
+ };
2058
+
2059
+ const dalvikBytecodeOperationMoveFrom16Parser: Parser<DalvikBytecodeOperationMoveFrom16, Uint8Array> = promiseCompose(
2060
+ createTupleParser([
2061
+ createExactElementParser(0x02),
2062
+ dalvikBytecodeFormat22xParser,
2063
+ ]),
2064
+ ([ _opcode, { registers } ]) => ({
2065
+ operation: 'move/from16',
2066
+ registers,
2067
+ }),
2068
+ );
2069
+
2070
+ setParserName(dalvikBytecodeOperationMoveFrom16Parser, 'dalvikBytecodeOperationMoveFrom16Parser');
2071
+
2072
+ type DalvikBytecodeOperationMoveWideFrom16 = {
2073
+ operation: 'move-wide/from16';
2074
+ registers: number[];
2075
+ };
2076
+
2077
+ const dalvikBytecodeOperationMoveWideFrom16Parser: Parser<DalvikBytecodeOperationMoveWideFrom16, Uint8Array> = promiseCompose(
2078
+ createTupleParser([
2079
+ createExactElementParser(0x05),
2080
+ dalvikBytecodeFormat22xParser,
2081
+ ]),
2082
+ ([ _opcode, { registers } ]) => ({
2083
+ operation: 'move-wide/from16',
2084
+ registers,
2085
+ }),
2086
+ );
2087
+
2088
+ setParserName(dalvikBytecodeOperationMoveWideFrom16Parser, 'dalvikBytecodeOperationMoveWideFrom16Parser');
2089
+
2090
+ type DalvikBytecodeOperationMoveObjectFrom16 = {
2091
+ operation: 'move-object/from16';
2092
+ registers: number[];
2093
+ };
2094
+
2095
+ const dalvikBytecodeOperationMoveObjectFrom16Parser: Parser<DalvikBytecodeOperationMoveObjectFrom16, Uint8Array> = promiseCompose(
2096
+ createTupleParser([
2097
+ createExactElementParser(0x08),
2098
+ dalvikBytecodeFormat22xParser,
2099
+ ]),
2100
+ ([ _opcode, { registers } ]) => ({
2101
+ operation: 'move-object/from16',
2102
+ registers,
2103
+ }),
2104
+ );
2105
+
2106
+ setParserName(dalvikBytecodeOperationMoveObjectFrom16Parser, 'dalvikBytecodeOperationMoveObjectFrom16Parser');
2107
+
2108
+ type DalvikBytecodeOperationMoveWide16 = {
2109
+ operation: 'move-wide/16';
2110
+ registers: number[];
2111
+ };
2112
+
2113
+ const dalvikBytecodeOperationMoveWide16Parser: Parser<DalvikBytecodeOperationMoveWide16, Uint8Array> = promiseCompose(
2114
+ createTupleParser([
2115
+ createExactElementParser(0x06),
2116
+ dalvikBytecodeFormat32xParser,
2117
+ ]),
2118
+ ([ _opcode, { registers } ]) => ({
2119
+ operation: 'move-wide/16',
2120
+ registers,
2121
+ }),
2122
+ );
2123
+
2124
+ setParserName(dalvikBytecodeOperationMoveWide16Parser, 'dalvikBytecodeOperationMoveWide16Parser');
2125
+
2126
+ const createDalvikBytecodeOperationReturn1Parser = createDalvikBytecodeMoveResult1Parser;
2127
+
2128
+ const dalvikBytecodeOperationReturnParser = createDalvikBytecodeOperationReturn1Parser('return', 0x0F);
2129
+
2130
+ type DalvikBytecodeOperationReturn = Awaited<ReturnType<typeof dalvikBytecodeOperationReturnParser>>;
2131
+
2132
+ const dalvikBytecodeOperationReturnWideParser = createDalvikBytecodeOperationReturn1Parser('return-wide', 0x10);
2133
+
2134
+ type DalvikBytecodeOperationReturnWide = Awaited<ReturnType<typeof dalvikBytecodeOperationReturnWideParser>>;
2135
+
2136
+ const dalvikBytecodeOperationReturnObjectParser = createDalvikBytecodeOperationReturn1Parser('return-object', 0x11);
2137
+
2138
+ type DalvikBytecodeOperationReturnObject = Awaited<ReturnType<typeof dalvikBytecodeOperationReturnObjectParser>>;
2139
+
2140
+ type DalvikBytecodeOperationReturn1 =
2141
+ | DalvikBytecodeOperationReturn
2142
+ | DalvikBytecodeOperationReturnWide
2143
+ | DalvikBytecodeOperationReturnObject
2144
+ ;
2145
+
2146
+ const dalvikBytecodeOperationReturn1Parser: Parser<DalvikBytecodeOperationReturn1, Uint8Array> = createDisjunctionParser([
2147
+ dalvikBytecodeOperationReturnParser,
2148
+ dalvikBytecodeOperationReturnWideParser,
2149
+ dalvikBytecodeOperationReturnObjectParser,
2150
+ ]);
2151
+
2152
+ setParserName(dalvikBytecodeOperationReturn1Parser, 'dalvikBytecodeOperationReturn1Parser');
2153
+
2154
+ type DalvikBytecodeOperationConst4 = {
2155
+ operation: 'const/4';
2156
+ registers: number[];
2157
+ value: number;
2158
+ };
2159
+
2160
+ const dalvikBytecodeOperationConst4Parser: Parser<DalvikBytecodeOperationConst4, Uint8Array> = promiseCompose(
2161
+ createTupleParser([
2162
+ createExactElementParser(0x12),
2163
+ dalvikBytecodeFormat11nParser,
2164
+ ]),
2165
+ ([
2166
+ _opcode,
2167
+ { value, registers },
2168
+ ]) => ({
2169
+ operation: 'const/4',
2170
+ registers,
2171
+ value,
2172
+ }),
2173
+ );
2174
+
2175
+ setParserName(dalvikBytecodeOperationConst4Parser, 'dalvikBytecodeOperationConst4Parser');
2176
+
2177
+ type DalvikBytecodeOperationConst16 = {
2178
+ operation: 'const/16';
2179
+ registers: number[];
2180
+ value: number;
2181
+ };
2182
+
2183
+ const dalvikBytecodeOperationConst16Parser: Parser<DalvikBytecodeOperationConst16, Uint8Array> = promiseCompose(
2184
+ createTupleParser([
2185
+ createExactElementParser(0x13),
2186
+ createDalvikBytecodeFormat21sParser(),
2187
+ ]),
2188
+ ([ _opcode, { registers, value } ]) => ({
2189
+ operation: 'const/16',
2190
+ registers,
2191
+ value: value << 16 >> 16,
2192
+ }),
2193
+ );
2194
+
2195
+ setParserName(dalvikBytecodeOperationConst16Parser, 'dalvikBytecodeOperationConst16Parser');
2196
+
2197
+ type DalvikBytecodeOperationConstHigh16 = {
2198
+ operation: 'const/high16';
2199
+ registers: number[];
2200
+ value: number;
2201
+ };
2202
+
2203
+ const dalvikBytecodeOperationConstHigh16Parser: Parser<DalvikBytecodeOperationConstHigh16, Uint8Array> = promiseCompose(
2204
+ createTupleParser([
2205
+ createExactElementParser(0x15),
2206
+ createDalvikBytecodeFormat21sParser(),
2207
+ ]),
2208
+ ([ _opcode, { registers, value } ]) => ({
2209
+ operation: 'const/high16',
2210
+ registers,
2211
+ value: value << 16,
2212
+ }),
2213
+ );
2214
+
2215
+ setParserName(dalvikBytecodeOperationConstHigh16Parser, 'dalvikBytecodeOperationConstHigh16Parser');
2216
+
2217
+ type DalvikBytecodeOperationConstWide16 = {
2218
+ operation: 'const-wide/16';
2219
+ registers: number[];
2220
+ value: bigint;
2221
+ };
2222
+
2223
+ const dalvikBytecodeOperationConstWide16Parser: Parser<DalvikBytecodeOperationConstWide16, Uint8Array> = promiseCompose(
2224
+ createTupleParser([
2225
+ createExactElementParser(0x16),
2226
+ createDalvikBytecodeFormat21sParser(),
2227
+ ]),
2228
+ ([ _opcode, { registers, value } ]) => ({
2229
+ operation: 'const-wide/16',
2230
+ registers,
2231
+ value: BigInt(value) << 48n >> 48n,
2232
+ }),
2233
+ );
2234
+
2235
+ setParserName(dalvikBytecodeOperationConstWide16Parser, 'dalvikBytecodeOperationConstWide16Parser');
2236
+
2237
+ type DalvikBytecodeOperationConstWide32 = {
2238
+ operation: 'const-wide/32';
2239
+ registers: number[];
2240
+ value: bigint;
2241
+ };
2242
+
2243
+ const dalvikBytecodeOperationConstWide32Parser: Parser<DalvikBytecodeOperationConstWide32, Uint8Array> = promiseCompose(
2244
+ createTupleParser([
2245
+ createExactElementParser(0x17),
2246
+ dalvikBytecodeFormat31iParser,
2247
+ ]),
2248
+ ([ _opcode, { registers, value } ]) => ({
2249
+ operation: 'const-wide/32',
2250
+ registers,
2251
+ value: BigInt(value) << 32n >> 32n,
2252
+ }),
2253
+ );
2254
+
2255
+ setParserName(dalvikBytecodeOperationConstWide32Parser, 'dalvikBytecodeOperationConstWide32Parser');
2256
+
2257
+ type DalvikBytecodeOperationConstWide = {
2258
+ operation: 'const-wide';
2259
+ registers: number[];
2260
+ value: bigint;
2261
+ };
2262
+
2263
+ const dalvikBytecodeOperationConstWideParser: Parser<DalvikBytecodeOperationConstWide, Uint8Array> = promiseCompose(
2264
+ createTupleParser([
2265
+ createExactElementParser(0x18),
2266
+ dalvikBytecodeFormat51lParser,
2267
+ ]),
2268
+ ([ _opcode, { registers, value } ]) => ({
2269
+ operation: 'const-wide',
2270
+ registers,
2271
+ value,
2272
+ }),
2273
+ );
2274
+
2275
+ setParserName(dalvikBytecodeOperationConstWideParser, 'dalvikBytecodeOperationConstWideParser');
2276
+
2277
+ type DalvikBytecodeOperationConstWideHigh16 = {
2278
+ operation: 'const-wide/high16';
2279
+ registers: number[];
2280
+ value: bigint;
2281
+ };
2282
+
2283
+ const dalvikBytecodeOperationConstWideHigh16Parser: Parser<DalvikBytecodeOperationConstWideHigh16, Uint8Array> = promiseCompose(
2284
+ createTupleParser([
2285
+ createExactElementParser(0x19),
2286
+ createDalvikBytecodeFormat21sParser(),
2287
+ ]),
2288
+ ([ _opcode, { registers, value } ]) => ({
2289
+ operation: 'const-wide/high16',
2290
+ registers,
2291
+ value: BigInt(value) << 48n,
2292
+ }),
2293
+ );
2294
+
2295
+ setParserName(dalvikBytecodeOperationConstWideHigh16Parser, 'dalvikBytecodeOperationConstWideHigh16Parser');
2296
+
2297
+ type DalvikBytecodeOperationConst = {
2298
+ operation: 'const';
2299
+ registers: number[];
2300
+ value: number;
2301
+ };
2302
+
2303
+ const dalvikBytecodeOperationConstParser: Parser<DalvikBytecodeOperationConst, Uint8Array> = promiseCompose(
2304
+ createTupleParser([
2305
+ createExactElementParser(0x14),
2306
+ dalvikBytecodeFormat31iParser,
2307
+ ]),
2308
+ ([ _opcode, { registers, value } ]) => ({
2309
+ operation: 'const',
2310
+ registers,
2311
+ value,
2312
+ }),
2313
+ );
2314
+
2315
+ setParserName(dalvikBytecodeOperationConstParser, 'dalvikBytecodeOperationConstParser');
2316
+
2317
+ type DalvikBytecodeOperationThrow = {
2318
+ operation: 'throw';
2319
+ registers: number[];
2320
+ };
2321
+
2322
+ const dalvikBytecodeOperationThrowParser: Parser<DalvikBytecodeOperationThrow, Uint8Array> = promiseCompose(
2323
+ createTupleParser([
2324
+ createExactElementParser(0x27),
2325
+ dalvikBytecodeFormat11xParser,
2326
+ ]),
2327
+ ([ _opcode, { registers } ]) => ({
2328
+ operation: 'throw',
2329
+ registers,
2330
+ }),
2331
+ );
2332
+
2333
+ setParserName(dalvikBytecodeOperationThrowParser, 'dalvikBytecodeOperationThrowParser');
2334
+
2335
+ const createDalvikBytecodeOperationCompare = <T extends string>(operation: T, opcode: number): Parser<{
2336
+ operation: T;
2337
+ registers: number[];
2338
+ }, Uint8Array> => promiseCompose(
2339
+ createTupleParser([
2340
+ createExactElementParser(opcode),
2341
+ dalvikBytecodeFormat23xParser,
2342
+ ]),
2343
+ ([ _opcode, { registers } ]) => ({
2344
+ operation,
2345
+ registers,
2346
+ }),
2347
+ );
2348
+
2349
+ const dalvikBytecodeOperationCompareFloatWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-float', 0x2D);
2350
+
2351
+ type DalvikBytecodeOperationCompareFloatWithLessThanBias = Awaited<ReturnType<typeof dalvikBytecodeOperationCompareFloatWithLessThanBiasParser>>;
2352
+
2353
+ const dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser = createDalvikBytecodeOperationCompare('cmpg-float', 0x2E);
2354
+
2355
+ type DalvikBytecodeOperationCompareFloatWithGreaterThanBias = Awaited<ReturnType<typeof dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser>>;
2356
+
2357
+ const dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-double', 0x2F);
2358
+
2359
+ type DalvikBytecodeOperationCompareDoubleWithLessThanBias = Awaited<ReturnType<typeof dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser>>;
2360
+
2361
+ const dalvikBytecodeOperationCompareDoubleWithGreaterThanBiasParser = createDalvikBytecodeOperationCompare('cmpg-double', 0x30);
2362
+
2363
+ type DalvikBytecodeOperationCompareDoubleWithGreaterThanBias = Awaited<ReturnType<typeof dalvikBytecodeOperationCompareDoubleWithGreaterThanBiasParser>>;
2364
+
2365
+ const dalvikBytecodeOperationCompareLongParser = createDalvikBytecodeOperationCompare('cmp-long', 0x31);
2366
+
2367
+ type DalvikBytecodeOperationCompareLong = Awaited<ReturnType<typeof dalvikBytecodeOperationCompareLongParser>>;
2368
+
2369
+ type DalvikBytecodeOperationCompare =
2370
+ | DalvikBytecodeOperationCompareFloatWithLessThanBias
2371
+ | DalvikBytecodeOperationCompareFloatWithGreaterThanBias
2372
+ | DalvikBytecodeOperationCompareDoubleWithLessThanBias
2373
+ | DalvikBytecodeOperationCompareDoubleWithGreaterThanBias
2374
+ | DalvikBytecodeOperationCompareLong
2375
+ ;
2376
+
2377
+ const dalvikBytecodeOperationCompareParser: Parser<DalvikBytecodeOperationCompare, Uint8Array> = createDisjunctionParser([
2378
+ dalvikBytecodeOperationCompareFloatWithLessThanBiasParser,
2379
+ dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser,
2380
+ dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser,
2381
+ dalvikBytecodeOperationCompareDoubleWithGreaterThanBiasParser,
2382
+ dalvikBytecodeOperationCompareLongParser,
2383
+ ]);
2384
+
2385
+ setParserName(dalvikBytecodeOperationCompareParser, 'dalvikBytecodeOperationCompareParser');
2386
+
2387
+ export type DalvikBytecodeOperation =
2388
+ | DalvikBytecodeOperationNoOperation
2389
+
2390
+ | DalvikBytecodeOperationIfTest
2391
+ | DalvikBytecodeOperationIfTestZero
2392
+
2393
+ | DalvikBytecodeOperationBinaryOperation
2394
+ | DalvikBytecodeOperationBinaryOperationLiteral8
2395
+ | DalvikBytecodeOperationBinaryOperationLiteral16
2396
+ | DalvikBytecodeOperationBinaryOperationInPlace
2397
+ | DalvikBytecodeOperationUnaryOperation
2398
+
2399
+ | DalvikBytecodeOperationGoto
2400
+ | DalvikBytecodeOperationGoto16
2401
+ | DalvikBytecodeOperationGoto32
2402
+
2403
+ | DalvikBytecodeOperationPackedSwitch
2404
+ | DalvikBytecodeOperationPackedSwitchPayload
2405
+ | DalvikBytecodeOperationSparseSwitch
2406
+ | DalvikBytecodeOperationSparseSwitchPayload
2407
+ | DalvikBytecodeOperationNewArray
2408
+ | DalvikBytecodeOperationFilledNewArray
2409
+ | DalvikBytecodeOperationFilledNewArrayRange
2410
+ | DalvikBytecodeOperationFillArrayDataPayload
2411
+
2412
+ | DalvikBytecodeOperationMoveResult1
2413
+ | DalvikBytecodeOperationMove
2414
+ | DalvikBytecodeOperationMoveWide
2415
+ | DalvikBytecodeOperationMoveObject
2416
+ | DalvikBytecodeOperationMoveFrom16
2417
+ | DalvikBytecodeOperationMoveWideFrom16
2418
+ | DalvikBytecodeOperationMoveObjectFrom16
2419
+ | DalvikBytecodeOperationMoveWide16
2420
+
2421
+ | DalvikBytecodeOperationInvoke
2422
+ | DalvikBytecodeOperationInvokeRange
2423
+ | DalvikBytecodeOperationInvokePolymorphic
2424
+ | DalvikBytecodeOperationInvokePolymorphicRange
2425
+
2426
+ | DalvikBytecodeOperationNewInstance
2427
+
2428
+ | DalvikBytecodeOperationFillArrayData
2429
+ | DalvikBytecodeOperationCheckCast
2430
+ | DalvikBytecodeOperationInstanceOf
2431
+ | DalvikBytecodeOperationArrayLength
2432
+
2433
+ | DalvikBytecodeOperationArrayElement
2434
+ | DalvikBytecodeOperationInstanceField
2435
+ | DalvikBytecodeOperationStaticField
2436
+
2437
+ | DalvikBytecodeOperationConst4
2438
+ | DalvikBytecodeOperationConst16
2439
+ | DalvikBytecodeOperationConstHigh16
2440
+ | DalvikBytecodeOperationConstWide16
2441
+ | DalvikBytecodeOperationConstWide32
2442
+ | DalvikBytecodeOperationConstWide
2443
+ | DalvikBytecodeOperationConstWideHigh16
2444
+ | DalvikBytecodeOperationConst
2445
+
2446
+ | DalvikBytecodeOperationConstString
2447
+ | DalvikBytecodeOperationConstStringJumbo
2448
+ | DalvikBytecodeOperationConstMethodHandle
2449
+ | DalvikBytecodeOperationConstClass
2450
+
2451
+ | DalvikBytecodeOperationMonitorEnter
2452
+ | DalvikBytecodeOperationMonitorExit
2453
+
2454
+ | DalvikBytecodeOperationThrow
2455
+
2456
+ | DalvikBytecodeOperationCompare
2457
+
2458
+ | DalvikBytecodeOperationReturnVoid
2459
+ | DalvikBytecodeOperationReturn1;
2460
+ export const dalvikBytecodeOperationCompanion = {
2461
+ getRegisters(operation: DalvikBytecodeOperation): number[] {
2462
+ if (operation && typeof operation === 'object' && 'registers' in operation) {
2463
+ return operation.registers;
2464
+ }
2465
+
2466
+ return [];
2467
+ },
2468
+ };
2469
+
2470
+ // Map of single-byte opcodes to their parsers for O(1) lookup
2471
+ const dalvikBytecodeOperationOpcodeMap = new Map<number, Parser<unknown, Uint8Array>>([
2472
+ // Invoke operations
2473
+ [ 0x6E, dalvikBytecodeOperationInvokeVirtualParser ],
2474
+ [ 0x6F, dalvikBytecodeOperationInvokeSuperParser ],
2475
+ [ 0x70, dalvikBytecodeOperationInvokeDirectParser ],
2476
+ [ 0x71, dalvikBytecodeOperationInvokeStaticParser ],
2477
+ [ 0x72, dalvikBytecodeOperationInvokeInterfaceParser ],
2478
+
2479
+ // Invoke range operations
2480
+ [ 0x74, dalvikBytecodeOperationInvokeVirtualRangeParser ],
2481
+ [ 0x75, dalvikBytecodeOperationInvokeSuperRangeParser ],
2482
+ [ 0x76, dalvikBytecodeOperationInvokeDirectRangeParser ],
2483
+ [ 0x77, dalvikBytecodeOperationInvokeStaticRangeParser ],
2484
+ [ 0x78, dalvikBytecodeOperationInvokeInterfaceRangeParser ],
2485
+
2486
+ // Invoke polymorphic operations
2487
+ [ 0xFA, dalvikBytecodeOperationInvokePolymorphicParser ],
2488
+ [ 0xFB, dalvikBytecodeOperationInvokePolymorphicRangeParser ],
2489
+
2490
+ // New instance/array operations
2491
+ [ 0x22, dalvikBytecodeOperationNewInstanceParser ],
2492
+ [ 0x23, dalvikBytecodeOperationNewArrayParser ],
2493
+ [ 0x24, dalvikBytecodeOperationFilledNewArrayParser ],
2494
+ [ 0x25, dalvikBytecodeOperationFilledNewArrayRangeParser ],
2495
+ [ 0x26, dalvikBytecodeOperationFillArrayDataParser ],
2496
+ [ 0x1F, dalvikBytecodeOperationCheckCastParser ],
2497
+ [ 0x20, dalvikBytecodeOperationInstanceOfParser ],
2498
+ [ 0x21, dalvikBytecodeOperationArrayLengthParser ],
2499
+
2500
+ // Array element operations (aget/aput)
2501
+ [ 0x44, dalvikBytecodeOperationArrayElementGetParser ],
2502
+ [ 0x45, dalvikBytecodeOperationArrayElementGetWideParser ],
2503
+ [ 0x46, dalvikBytecodeOperationArrayElementGetObjectParser ],
2504
+ [ 0x47, dalvikBytecodeOperationArrayElementGetBooleanParser ],
2505
+ [ 0x48, dalvikBytecodeOperationArrayElementGetByteParser ],
2506
+ [ 0x49, dalvikBytecodeOperationArrayElementGetCharParser ],
2507
+ [ 0x4A, dalvikBytecodeOperationArrayElementGetShortParser ],
2508
+ [ 0x4B, dalvikBytecodeOperationArrayElementPutParser ],
2509
+ [ 0x4C, dalvikBytecodeOperationArrayElementPutWideParser ],
2510
+ [ 0x4D, dalvikBytecodeOperationArrayElementPutObjectParser ],
2511
+ [ 0x4E, dalvikBytecodeOperationArrayElementPutBooleanParser ],
2512
+ [ 0x4F, dalvikBytecodeOperationArrayElementPutByteParser ],
2513
+ [ 0x50, dalvikBytecodeOperationArrayElementPutCharParser ],
2514
+ [ 0x51, dalvikBytecodeOperationArrayElementPutShortParser ],
2515
+
2516
+ // Instance field operations (iget/iput)
2517
+ [ 0x52, dalvikBytecodeOperationInstanceFieldGetParser ],
2518
+ [ 0x53, dalvikBytecodeOperationInstanceFieldGetWideParser ],
2519
+ [ 0x54, dalvikBytecodeOperationInstanceFieldGetObjectParser ],
2520
+ [ 0x55, dalvikBytecodeOperationInstanceFieldGetBooleanParser ],
2521
+ [ 0x56, dalvikBytecodeOperationInstanceFieldGetByteParser ],
2522
+ [ 0x57, dalvikBytecodeOperationInstanceFieldGetCharParser ],
2523
+ [ 0x58, dalvikBytecodeOperationInstanceFieldGetShortParser ],
2524
+ [ 0x59, dalvikBytecodeOperationInstanceFieldPutParser ],
2525
+ [ 0x5A, dalvikBytecodeOperationInstanceFieldPutWideParser ],
2526
+ [ 0x5B, dalvikBytecodeOperationInstanceFieldPutObjectParser ],
2527
+ [ 0x5C, dalvikBytecodeOperationInstanceFieldPutBooleanParser ],
2528
+ [ 0x5D, dalvikBytecodeOperationInstanceFieldPutByteParser ],
2529
+ [ 0x5E, dalvikBytecodeOperationInstanceFieldPutCharParser ],
2530
+ [ 0x5F, dalvikBytecodeOperationInstanceFieldPutShortParser ],
2531
+
2532
+ // Static field operations (sget/sput)
2533
+ [ 0x60, dalvikBytecodeOperationStaticFieldGetParser ],
2534
+ [ 0x61, dalvikBytecodeOperationStaticFieldGetWideParser ],
2535
+ [ 0x62, dalvikBytecodeOperationStaticFieldGetObjectParser ],
2536
+ [ 0x63, dalvikBytecodeOperationStaticFieldGetBooleanParser ],
2537
+ [ 0x64, dalvikBytecodeOperationStaticFieldGetByteParser ],
2538
+ [ 0x65, dalvikBytecodeOperationStaticFieldGetCharParser ],
2539
+ [ 0x66, dalvikBytecodeOperationStaticFieldGetShortParser ],
2540
+ [ 0x67, dalvikBytecodeOperationStaticFieldPutParser ],
2541
+ [ 0x68, dalvikBytecodeOperationStaticFieldPutWideParser ],
2542
+ [ 0x69, dalvikBytecodeOperationStaticFieldPutObjectParser ],
2543
+ [ 0x6A, dalvikBytecodeOperationStaticFieldPutBooleanParser ],
2544
+ [ 0x6B, dalvikBytecodeOperationStaticFieldPutByteParser ],
2545
+ [ 0x6C, dalvikBytecodeOperationStaticFieldPutCharParser ],
2546
+ [ 0x6D, dalvikBytecodeOperationStaticFieldPutShortParser ],
2547
+
2548
+ // Const operations
2549
+ [ 0x1A, dalvikBytecodeOperationConstStringParser ],
2550
+ [ 0x1B, dalvikBytecodeOperationConstStringJumboParser ],
2551
+ [ 0xFE, dalvikBytecodeOperationConstMethodHandleParser ],
2552
+ [ 0x1C, dalvikBytecodeOperationConstClassParser ],
2553
+
2554
+ // Monitor operations
2555
+ [ 0x1D, dalvikBytecodeOperationMonitorEnterParser ],
2556
+ [ 0x1E, dalvikBytecodeOperationMonitorExitParser ],
2557
+
2558
+ // Return operations
2559
+ [ 0x0E, dalvikBytecodeOperationReturnVoidParser ],
2560
+ [ 0x0F, dalvikBytecodeOperationReturnParser ],
2561
+ [ 0x10, dalvikBytecodeOperationReturnWideParser ],
2562
+ [ 0x11, dalvikBytecodeOperationReturnObjectParser ],
2563
+
2564
+ // Throw operation
2565
+ [ 0x27, dalvikBytecodeOperationThrowParser ],
2566
+
2567
+ // Goto operations
2568
+ [ 0x28, dalvikBytecodeOperationGotoParser ],
2569
+ [ 0x29, dalvikBytecodeOperationGoto16Parser ],
2570
+ [ 0x2A, dalvikBytecodeOperationGoto32Parser ],
2571
+ [ 0x2B, dalvikBytecodeOperationPackedSwitchParser ],
2572
+ [ 0x2C, dalvikBytecodeOperationSparseSwitchParser ],
2573
+
2574
+ // Move result operations
2575
+ [ 0x0A, dalvikBytecodeMoveResultParser ],
2576
+ [ 0x0B, dalvikBytecodeMoveResultWideParser ],
2577
+ [ 0x0C, dalvikBytecodeMoveResultObjectParser ],
2578
+ [ 0x0D, dalvikBytecodeMoveExceptionParser ],
2579
+
2580
+ // Move operations
2581
+ [ 0x01, dalvikBytecodeOperationMoveParser ],
2582
+ [ 0x04, dalvikBytecodeOperationMoveWideParser ],
2583
+ [ 0x07, dalvikBytecodeOperationMoveObjectParser ],
2584
+ [ 0x02, dalvikBytecodeOperationMoveFrom16Parser ],
2585
+ [ 0x05, dalvikBytecodeOperationMoveWideFrom16Parser ],
2586
+ [ 0x08, dalvikBytecodeOperationMoveObjectFrom16Parser ],
2587
+ [ 0x06, dalvikBytecodeOperationMoveWide16Parser ],
2588
+
2589
+ // Const value operations
2590
+ [ 0x12, dalvikBytecodeOperationConst4Parser ],
2591
+ [ 0x13, dalvikBytecodeOperationConst16Parser ],
2592
+ [ 0x15, dalvikBytecodeOperationConstHigh16Parser ],
2593
+ [ 0x16, dalvikBytecodeOperationConstWide16Parser ],
2594
+ [ 0x17, dalvikBytecodeOperationConstWide32Parser ],
2595
+ [ 0x18, dalvikBytecodeOperationConstWideParser ],
2596
+ [ 0x19, dalvikBytecodeOperationConstWideHigh16Parser ],
2597
+ [ 0x14, dalvikBytecodeOperationConstParser ],
2598
+
2599
+ // Compare operations
2600
+ [ 0x2D, dalvikBytecodeOperationCompareFloatWithLessThanBiasParser ],
2601
+ [ 0x2E, dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser ],
2602
+ [ 0x2F, dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser ],
2603
+ [ 0x30, dalvikBytecodeOperationCompareDoubleWithGreaterThanBiasParser ],
2604
+ [ 0x31, dalvikBytecodeOperationCompareLongParser ],
2605
+
2606
+ // If test operations
2607
+ [ 0x32, dalvikBytecodeIfEqualParser ],
2608
+ [ 0x33, dalvikBytecodeIfNotEqualParser ],
2609
+ [ 0x34, dalvikBytecodeIfLessThanParser ],
2610
+ [ 0x35, dalvikBytecodeIfGreaterThanOrEqualToParser ],
2611
+ [ 0x36, dalvikBytecodeIfGreaterThanParser ],
2612
+ [ 0x37, dalvikBytecodeIfLessThanOrEqualToParser ],
2613
+
2614
+ // If test zero operations
2615
+ [ 0x38, dalvikBytecodeIfEqualZeroParser ],
2616
+ [ 0x39, dalvikBytecodeIfNotEqualZeroParser ],
2617
+ [ 0x3A, dalvikBytecodeIfLessThanZeroParser ],
2618
+ [ 0x3B, dalvikBytecodeIfGreaterThanOrEqualToZeroParser ],
2619
+ [ 0x3C, dalvikBytecodeIfGreaterThanZeroParser ],
2620
+ [ 0x3D, dalvikBytecodeIfLessThanOrEqualToZeroParser ],
2621
+
2622
+ // Binary operations
2623
+ [ 0x90, dalvikBytecodeOperationAddIntParser ],
2624
+ [ 0x91, dalvikBytecodeOperationSubtractIntParser ],
2625
+ [ 0x92, dalvikBytecodeOperationMultiplyIntParser ],
2626
+ [ 0x93, dalvikBytecodeOperationDivideIntParser ],
2627
+ [ 0x94, dalvikBytecodeOperationRemainderIntParser ],
2628
+ [ 0x95, dalvikBytecodeOperationAndIntParser ],
2629
+ [ 0x96, dalvikBytecodeOperationOrIntParser ],
2630
+ [ 0x97, dalvikBytecodeOperationXorIntParser ],
2631
+ [ 0x98, dalvikBytecodeOperationShiftLeftIntParser ],
2632
+ [ 0x99, dalvikBytecodeOperationShiftRightIntParser ],
2633
+ [ 0x9A, dalvikBytecodeOperationUnsignedShiftRightIntParser ],
2634
+ [ 0x9B, dalvikBytecodeOperationAddLongParser ],
2635
+ [ 0x9C, dalvikBytecodeOperationSubtractLongParser ],
2636
+ [ 0x9D, dalvikBytecodeOperationMultiplyLongParser ],
2637
+ [ 0x9E, dalvikBytecodeOperationDivideLongParser ],
2638
+ [ 0x9F, dalvikBytecodeOperationRemainderLongParser ],
2639
+ [ 0xA0, dalvikBytecodeOperationAndLongParser ],
2640
+ [ 0xA1, dalvikBytecodeOperationOrLongParser ],
2641
+ [ 0xA2, dalvikBytecodeOperationXorLongParser ],
2642
+ [ 0xA3, dalvikBytecodeOperationShiftLeftLongParser ],
2643
+ [ 0xA4, dalvikBytecodeOperationShiftRightLongParser ],
2644
+ [ 0xA5, dalvikBytecodeOperationUnsignedShiftRightLongParser ],
2645
+ [ 0xA6, dalvikBytecodeOperationAddFloatParser ],
2646
+ [ 0xA7, dalvikBytecodeOperationSubtractFloatParser ],
2647
+ [ 0xA8, dalvikBytecodeOperationMultiplyFloatParser ],
2648
+ [ 0xA9, dalvikBytecodeOperationDivideFloatParser ],
2649
+ // Note: 0xAA (rem-float) parser is missing in codebase
2650
+ [ 0xAB, dalvikBytecodeOperationAddDoubleParser ],
2651
+ [ 0xAC, dalvikBytecodeOperationSubtractDoubleParser ],
2652
+ [ 0xAD, dalvikBytecodeOperationMultiplyDoubleParser ],
2653
+ [ 0xAE, dalvikBytecodeOperationDivideDoubleParser ],
2654
+ [ 0xAF, dalvikBytecodeOperationRemainderDoubleParser ],
2655
+
2656
+ // Binary operations in place (2addr)
2657
+ [ 0xB0, dalvikBytecodeOperationAddIntInPlaceParser ],
2658
+ [ 0xB1, dalvikBytecodeOperationReverseSubtractIntInPlaceParser ],
2659
+ [ 0xB2, dalvikBytecodeOperationMultiplyIntInPlaceParser ],
2660
+ [ 0xB3, dalvikBytecodeOperationDivideIntInPlaceParser ],
2661
+ [ 0xB4, dalvikBytecodeOperationRemainderIntInPlaceParser ],
2662
+ [ 0xB5, dalvikBytecodeOperationAndIntInPlaceParser ],
2663
+ [ 0xB6, dalvikBytecodeOperationOrIntInPlaceParser ],
2664
+ [ 0xB7, dalvikBytecodeOperationXorIntInPlaceParser ],
2665
+ [ 0xB8, dalvikBytecodeOperationShiftLeftIntInPlaceParser ],
2666
+ [ 0xB9, dalvikBytecodeOperationShiftRightIntInPlaceParser ],
2667
+ [ 0xBA, dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser ],
2668
+ [ 0xBB, dalvikBytecodeOperationAddLongInPlaceParser ],
2669
+ [ 0xBC, dalvikBytecodeOperationSubtractLongInPlaceParser ],
2670
+ [ 0xBD, dalvikBytecodeOperationMultiplyLongInPlaceParser ],
2671
+ [ 0xBE, dalvikBytecodeOperationDivideLongInPlaceParser ],
2672
+ [ 0xBF, dalvikBytecodeOperationRemainderLongInPlaceParser ],
2673
+ [ 0xC0, dalvikBytecodeOperationAndLongInPlaceParser ],
2674
+ [ 0xC1, dalvikBytecodeOperationOrLongInPlaceParser ],
2675
+ [ 0xC2, dalvikBytecodeOperationXorLongInPlaceParser ],
2676
+ [ 0xC3, dalvikBytecodeOperationShiftLeftLongInPlaceParser ],
2677
+ [ 0xC4, dalvikBytecodeOperationShiftRightLongInPlaceParser ],
2678
+ [ 0xC5, dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser ],
2679
+ [ 0xC6, dalvikBytecodeOperationAddFloatInPlaceParser ],
2680
+ [ 0xC7, dalvikBytecodeOperationSubtractFloatInPlaceParser ],
2681
+ [ 0xC8, dalvikBytecodeOperationMultiplyFloatInPlaceParser ],
2682
+ [ 0xC9, dalvikBytecodeOperationDivideFloatInPlaceParser ],
2683
+ [ 0xCA, dalvikBytecodeOperationRemainderFloatInPlaceParser ],
2684
+ [ 0xCB, dalvikBytecodeOperationAddDoubleInPlaceParser ],
2685
+ [ 0xCC, dalvikBytecodeOperationSubtractDoubleInPlaceParser ],
2686
+ [ 0xCD, dalvikBytecodeOperationMultiplyDoubleInPlaceParser ],
2687
+ [ 0xCE, dalvikBytecodeOperationDivideDoubleInPlaceParser ],
2688
+ [ 0xCF, dalvikBytecodeOperationRemainderDoubleInPlaceParser ],
2689
+
2690
+ // Binary operations with literal16
2691
+ [ 0xD0, dalvikBytecodeOperationAddIntLiteral16Parser ],
2692
+ [ 0xD1, dalvikBytecodeOperationReverseSubtractIntLiteral16Parser ],
2693
+ [ 0xD2, dalvikBytecodeOperationMultiplyIntLiteral16Parser ],
2694
+ [ 0xD3, dalvikBytecodeOperationDivideIntLiteral16Parser ],
2695
+ [ 0xD4, dalvikBytecodeOperationRemainderIntLiteral16Parser ],
2696
+ [ 0xD5, dalvikBytecodeOperationAndIntLiteral16Parser ],
2697
+ [ 0xD6, dalvikBytecodeOperationOrIntLiteral16Parser ],
2698
+ [ 0xD7, dalvikBytecodeOperationXorIntLiteral16Parser ],
2699
+
2700
+ // Binary operations with literal8
2701
+ [ 0xD8, dalvikBytecodeOperationAddIntLiteral8Parser ],
2702
+ [ 0xD9, dalvikBytecodeOperationReverseSubtractIntLiteral8Parser ],
2703
+ [ 0xDA, dalvikBytecodeOperationMultiplyIntLiteral8Parser ],
2704
+ [ 0xDB, dalvikBytecodeOperationDivideIntLiteral8Parser ],
2705
+ [ 0xDC, dalvikBytecodeOperationRemainderIntLiteral8Parser ],
2706
+ [ 0xDD, dalvikBytecodeOperationAndIntLiteral8Parser ],
2707
+ [ 0xDE, dalvikBytecodeOperationOrIntLiteral8Parser ],
2708
+ [ 0xDF, dalvikBytecodeOperationXorIntLiteral8Parser ],
2709
+ [ 0xE0, dalvikBytecodeOperationShiftLeftIntLiteral8Parser ],
2710
+ [ 0xE1, dalvikBytecodeOperationShiftRightIntLiteral8Parser ],
2711
+ [ 0xE2, dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser ],
2712
+
2713
+ // Unary operations
2714
+ [ 0x7B, dalvikBytecodeOperationNegateIntParser ],
2715
+ [ 0x7C, dalvikBytecodeOperationNotIntParser ],
2716
+ [ 0x7D, dalvikBytecodeOperationNegateLongParser ],
2717
+ [ 0x7E, dalvikBytecodeOperationNotLongParser ],
2718
+ [ 0x7F, dalvikBytecodeOperationNegateFloatParser ],
2719
+ [ 0x80, dalvikBytecodeOperationNegateDoubleParser ],
2720
+ [ 0x81, dalvikBytecodeOperationIntToLongParser ],
2721
+ [ 0x82, dalvikBytecodeOperationIntToFloatParser ],
2722
+ [ 0x83, dalvikBytecodeOperationIntToDoubleParser ],
2723
+ [ 0x84, dalvikBytecodeOperationLongToIntParser ],
2724
+ [ 0x85, dalvikBytecodeOperationLongToFloatParser ],
2725
+ [ 0x86, dalvikBytecodeOperationLongToDoubleParser ],
2726
+ [ 0x87, dalvikBytecodeOperationFloatToIntParser ],
2727
+ [ 0x88, dalvikBytecodeOperationFloatToLongParser ],
2728
+ [ 0x89, dalvikBytecodeOperationFloatToDoubleParser ],
2729
+ [ 0x8A, dalvikBytecodeOperationDoubleToIntParser ],
2730
+ [ 0x8B, dalvikBytecodeOperationDoubleToLongParser ],
2731
+ [ 0x8C, dalvikBytecodeOperationDoubleToFloatParser ],
2732
+ [ 0x8D, dalvikBytecodeOperationIntToByteParser ],
2733
+ [ 0x8E, dalvikBytecodeOperationIntToCharParser ],
2734
+ [ 0x8F, dalvikBytecodeOperationIntToShortParser ],
2735
+
2736
+ // Unused opcodes
2737
+ // Range 0x3E-0x43
2738
+ [ 0x3E, dalvikBytecodeOperationUnusedParser ],
2739
+ [ 0x3F, dalvikBytecodeOperationUnusedParser ],
2740
+ [ 0x40, dalvikBytecodeOperationUnusedParser ],
2741
+ [ 0x41, dalvikBytecodeOperationUnusedParser ],
2742
+ [ 0x42, dalvikBytecodeOperationUnusedParser ],
2743
+ [ 0x43, dalvikBytecodeOperationUnusedParser ],
2744
+ // 0x73
2745
+ [ 0x73, dalvikBytecodeOperationUnusedParser ],
2746
+ // Range 0x79-0x7A
2747
+ [ 0x79, dalvikBytecodeOperationUnusedParser ],
2748
+ [ 0x7A, dalvikBytecodeOperationUnusedParser ],
2749
+ // Range 0xE3-0xF9
2750
+ [ 0xE3, dalvikBytecodeOperationUnusedParser ],
2751
+ [ 0xE4, dalvikBytecodeOperationUnusedParser ],
2752
+ [ 0xE5, dalvikBytecodeOperationUnusedParser ],
2753
+ [ 0xE6, dalvikBytecodeOperationUnusedParser ],
2754
+ [ 0xE7, dalvikBytecodeOperationUnusedParser ],
2755
+ [ 0xE8, dalvikBytecodeOperationUnusedParser ],
2756
+ [ 0xE9, dalvikBytecodeOperationUnusedParser ],
2757
+ [ 0xEA, dalvikBytecodeOperationUnusedParser ],
2758
+ [ 0xEB, dalvikBytecodeOperationUnusedParser ],
2759
+ [ 0xEC, dalvikBytecodeOperationUnusedParser ],
2760
+ [ 0xED, dalvikBytecodeOperationUnusedParser ],
2761
+ [ 0xEE, dalvikBytecodeOperationUnusedParser ],
2762
+ [ 0xEF, dalvikBytecodeOperationUnusedParser ],
2763
+ [ 0xF0, dalvikBytecodeOperationUnusedParser ],
2764
+ [ 0xF1, dalvikBytecodeOperationUnusedParser ],
2765
+ [ 0xF2, dalvikBytecodeOperationUnusedParser ],
2766
+ [ 0xF3, dalvikBytecodeOperationUnusedParser ],
2767
+ [ 0xF4, dalvikBytecodeOperationUnusedParser ],
2768
+ [ 0xF5, dalvikBytecodeOperationUnusedParser ],
2769
+ [ 0xF6, dalvikBytecodeOperationUnusedParser ],
2770
+ [ 0xF7, dalvikBytecodeOperationUnusedParser ],
2771
+ [ 0xF8, dalvikBytecodeOperationUnusedParser ],
2772
+ [ 0xF9, dalvikBytecodeOperationUnusedParser ],
2773
+ ]);
2774
+
2775
+ // Fallback parser for multi-byte opcodes (nop and payload instructions)
2776
+ const dalvikBytecodeOperationMultiByteParser: Parser<DalvikBytecodeOperation, Uint8Array> = createDisjunctionParser([
2777
+ dalvikBytecodeOperationNoOperationParser,
2778
+ dalvikBytecodeOperationPackedSwitchPayloadParser,
2779
+ dalvikBytecodeOperationSparseSwitchPayloadParser,
2780
+ dalvikBytecodeOperationFillArrayDataPayloadParser,
2781
+ ]);
2782
+
2783
+ setParserName(dalvikBytecodeOperationMultiByteParser, 'dalvikBytecodeOperationMultiByteParser');
2784
+
2785
+ const dalvikBytecodeOperationParser: Parser<DalvikBytecodeOperation | undefined, Uint8Array> = promiseCompose(
2786
+ createTupleParser([
2787
+ () => {},
2788
+ // CreateDebugLogInputParser(),
2789
+ createElementSwitchParser<DalvikBytecodeOperation, Uint8Array>(
2790
+ dalvikBytecodeOperationOpcodeMap,
2791
+ dalvikBytecodeOperationMultiByteParser,
2792
+ ),
2793
+ ]),
2794
+ ([
2795
+ _debug,
2796
+ operation,
2797
+ ]) =>
2798
+ // Console.log(operation);
2799
+ operation,
2800
+ );
2801
+
2802
+ setParserName(dalvikBytecodeOperationParser, 'dalvikBytecodeOperationParser');
2803
+
2804
+ export type DalvikBytecode = DalvikBytecodeOperation[];
2805
+
2806
+ const dalvikBytecodeParser: Parser<DalvikBytecode, Uint8Array> = promiseCompose(
2807
+ createArrayParser(dalvikBytecodeOperationParser),
2808
+ operations => operations.filter((operation): operation is DalvikBytecodeOperation => operation !== undefined),
2809
+ );
2810
+
2811
+ export const createDalvikBytecodeParser = (size: number): Parser<DalvikBytecode, Uint8Array> => createSliceBoundedParser(dalvikBytecodeParser, size, true);
2812
+
2813
+ type ResolvedDalvikBytecodeOperation<T extends DalvikBytecodeOperation> = T extends { stringIndex: IndexIntoFieldIds }
2814
+ ? Omit<T, 'stringIndex'> & { string: string }
2815
+ : T extends { typeIndex: IndexIntoTypeIds }
2816
+ ? Omit<T, 'typeIndex'> & { type: string }
2817
+ : T extends { methodIndex: IndexIntoMethodIds }
2818
+ ? Omit<T, 'methodIndex'> & { method: DalvikExecutableMethod }
2819
+ : T extends { fieldIndex: IndexIntoFieldIds }
2820
+ ? Omit<T, 'fieldIndex'> & { field: DalvikExecutableField }
2821
+ : T;
2822
+
2823
+ export type DalvikBytecodeOperationResolvers = {
2824
+ resolveIndexIntoStringIds: (index: IndexIntoStringIds) => string;
2825
+ resolveIndexIntoTypeIds: (index: IndexIntoTypeIds) => string;
2826
+ resolveIndexIntoMethodIds: (index: IndexIntoMethodIds) => DalvikExecutableMethod;
2827
+ resolveIndexIntoFieldIds: (index: IndexIntoFieldIds) => DalvikExecutableField;
2828
+ };
2829
+
2830
+ export function resolveDalvikBytecodeOperation<T extends DalvikBytecodeOperation>(operation: T, {
2831
+ resolveIndexIntoStringIds,
2832
+ resolveIndexIntoTypeIds,
2833
+ resolveIndexIntoMethodIds,
2834
+ resolveIndexIntoFieldIds,
2835
+ }: DalvikBytecodeOperationResolvers): ResolvedDalvikBytecodeOperation<T> {
2836
+ if (operation && typeof operation === 'object' && 'stringIndex' in operation) {
2837
+ const { stringIndex, ...rest } = operation;
2838
+
2839
+ return {
2840
+ ...rest,
2841
+ string: resolveIndexIntoStringIds(stringIndex),
2842
+ } as ResolvedDalvikBytecodeOperation<T>;
2843
+ }
2844
+
2845
+ if (operation && typeof operation === 'object' && 'typeIndex' in operation) {
2846
+ const { typeIndex, ...rest } = operation;
2847
+
2848
+ return {
2849
+ ...rest,
2850
+ type: resolveIndexIntoTypeIds(typeIndex),
2851
+ } as ResolvedDalvikBytecodeOperation<T>;
2852
+ }
2853
+
2854
+ if (operation && typeof operation === 'object' && 'methodIndex' in operation) {
2855
+ const { methodIndex, ...rest } = operation;
2856
+
2857
+ return {
2858
+ ...rest,
2859
+ method: resolveIndexIntoMethodIds(methodIndex),
2860
+ } as ResolvedDalvikBytecodeOperation<T>;
2861
+ }
2862
+
2863
+ if (operation && typeof operation === 'object' && 'fieldIndex' in operation) {
2864
+ const { fieldIndex, ...rest } = operation;
2865
+
2866
+ return {
2867
+ ...rest,
2868
+ field: resolveIndexIntoFieldIds(fieldIndex),
2869
+ } as ResolvedDalvikBytecodeOperation<T>;
2870
+ }
2871
+
2872
+ return operation as ResolvedDalvikBytecodeOperation<T>;
2873
+ }