@futpib/parser 1.0.2 → 1.0.4

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 (311) 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 +1 -1
  7. package/build/allSettledStream.test.js +2 -2
  8. package/build/androidPackageParser.d.ts +1 -1
  9. package/build/androidPackageParser.js +5 -3
  10. package/build/androidPackageParser.test.js +7 -7
  11. package/build/androidPackageUnparser.d.ts +2 -2
  12. package/build/androidPackageUnparser.js +18 -14
  13. package/build/androidPackageUnparser.test.js +7 -7
  14. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  15. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  16. package/build/arbitraryDalvikBytecode.js +640 -0
  17. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  18. package/build/arbitraryDalvikExecutable.js +282 -0
  19. package/build/arbitraryDosDateTime.js +1 -0
  20. package/build/arbitraryZipStream.js +1 -1
  21. package/build/arrayParser.js +2 -2
  22. package/build/arrayUnparser.d.ts +1 -1
  23. package/build/backsmali.d.ts +3 -1
  24. package/build/backsmali.js +31 -3
  25. package/build/bash.d.ts +84 -0
  26. package/build/bash.js +1 -0
  27. package/build/bashParser.d.ts +6 -0
  28. package/build/bashParser.js +294 -0
  29. package/build/bashParser.test.d.ts +1 -0
  30. package/build/bashParser.test.js +181 -0
  31. package/build/customInvariant.d.ts +2 -1
  32. package/build/customInvariant.js +4 -6
  33. package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
  34. package/build/dalvikBytecodeParser/formatParsers.js +146 -11
  35. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  36. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  37. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  38. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  39. package/build/dalvikBytecodeParser.d.ts +1105 -5
  40. package/build/dalvikBytecodeParser.js +658 -205
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  42. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  43. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  44. package/build/dalvikBytecodeUnparser.js +642 -0
  45. package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
  46. package/build/dalvikBytecodeUnparser.test.js +25 -0
  47. package/build/dalvikExecutable.d.ts +65 -8
  48. package/build/dalvikExecutable.js +36 -0
  49. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
  50. package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
  51. package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
  52. package/build/dalvikExecutableParser/typeParsers.js +16 -11
  53. package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
  54. package/build/dalvikExecutableParser/typedNumbers.js +0 -1
  55. package/build/dalvikExecutableParser.d.ts +2 -2
  56. package/build/dalvikExecutableParser.js +655 -337
  57. package/build/dalvikExecutableParser.test.js +24 -22
  58. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
  59. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  60. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  61. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  62. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  63. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  64. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  65. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  66. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  67. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  68. package/build/dalvikExecutableUnparser/utils.js +108 -0
  69. package/build/dalvikExecutableUnparser.d.ts +4 -0
  70. package/build/dalvikExecutableUnparser.js +406 -0
  71. package/build/dalvikExecutableUnparser.test.d.ts +1 -0
  72. package/build/dalvikExecutableUnparser.test.js +31 -0
  73. package/build/debugLogInputParser.js +1 -1
  74. package/build/disjunctionParser.d.ts +2 -2
  75. package/build/disjunctionParser.js +2 -2
  76. package/build/elementTerminatedArrayParser.d.ts +2 -2
  77. package/build/elementTerminatedArrayParser.js +1 -1
  78. package/build/elementTerminatedArrayParser.test.js +5 -5
  79. package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
  80. package/build/elementTerminatedSequenceArrayParser.js +1 -1
  81. package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
  82. package/build/elementTerminatedSequenceParser.d.ts +2 -2
  83. package/build/elementTerminatedSequenceParser.js +1 -1
  84. package/build/elementTerminatedSequenceParser.test.js +2 -2
  85. package/build/endOfInputParser.d.ts +1 -1
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/fetchCid.js +2 -6
  89. package/build/fetchCid.test.d.ts +1 -0
  90. package/build/fetchCid.test.js +16 -0
  91. package/build/fixedLengthSequenceParser.test.js +2 -2
  92. package/build/hasExecutable.js +2 -2
  93. package/build/highResolutionTimer.js +1 -1
  94. package/build/index.d.ts +24 -2
  95. package/build/index.js +22 -1
  96. package/build/inputReader.d.ts +1 -1
  97. package/build/inputReader.test.js +33 -45
  98. package/build/javaKeyStoreParser.test.js +6 -6
  99. package/build/jsonParser.js +8 -8
  100. package/build/lazyMessageError.d.ts +48 -0
  101. package/build/lazyMessageError.js +53 -0
  102. package/build/lazyMessageError.test.d.ts +1 -0
  103. package/build/lazyMessageError.test.js +15 -0
  104. package/build/leb128Parser.d.ts +1 -1
  105. package/build/leb128Parser.js +10 -10
  106. package/build/leb128Parser.test.js +7 -7
  107. package/build/negativeLookaheadParser.js +2 -2
  108. package/build/negativeLookaheadParser.test.js +4 -4
  109. package/build/noStackCaptureOverheadError.d.ts +4 -0
  110. package/build/noStackCaptureOverheadError.js +9 -0
  111. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  112. package/build/noStackCaptureOverheadError.test.js +15 -0
  113. package/build/nonEmptyArrayParser.js +2 -2
  114. package/build/nonEmptyArrayParser.test.js +2 -1
  115. package/build/optionalParser.js +2 -2
  116. package/build/parser.d.ts +2 -1
  117. package/build/parser.js +23 -8
  118. package/build/parser.test.js +78 -29
  119. package/build/parserConsumedSequenceParser.d.ts +1 -1
  120. package/build/parserConsumedSequenceParser.js +2 -2
  121. package/build/parserContext.d.ts +8 -6
  122. package/build/parserContext.js +60 -33
  123. package/build/parserContext.test.js +7 -3
  124. package/build/parserError.d.ts +603 -44
  125. package/build/parserError.js +98 -53
  126. package/build/parserImplementationInvariant.d.ts +1 -1
  127. package/build/parserImplementationInvariant.js +2 -2
  128. package/build/parserInputCompanion.js +2 -2
  129. package/build/promiseCompose.js +1 -2
  130. package/build/regexpParser.d.ts +2 -0
  131. package/build/regexpParser.js +71 -0
  132. package/build/regexpParser.test.d.ts +1 -0
  133. package/build/regexpParser.test.js +83 -0
  134. package/build/regularExpression.d.ts +63 -0
  135. package/build/regularExpression.js +1 -0
  136. package/build/regularExpressionParser.d.ts +3 -0
  137. package/build/regularExpressionParser.js +580 -0
  138. package/build/regularExpressionParser.test.d.ts +1 -0
  139. package/build/regularExpressionParser.test.js +89 -0
  140. package/build/separatedArrayParser.js +2 -2
  141. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  142. package/build/separatedNonEmptyArrayParser.js +40 -0
  143. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  144. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  145. package/build/sequenceBuffer.js +1 -1
  146. package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
  147. package/build/sequenceTerminatedSequenceParser.js +3 -3
  148. package/build/sequenceTerminatedSequenceParser.test.js +1 -1
  149. package/build/sequenceUnparser.d.ts +1 -1
  150. package/build/skipToParser.d.ts +1 -1
  151. package/build/skipToParser.js +2 -2
  152. package/build/sliceBoundedParser.test.js +4 -9
  153. package/build/smali.d.ts +1 -1
  154. package/build/smali.js +6 -2
  155. package/build/smaliParser.d.ts +62 -6
  156. package/build/smaliParser.js +1721 -296
  157. package/build/smaliParser.test.js +338 -43
  158. package/build/stringFromAsyncIterable.d.ts +1 -0
  159. package/build/stringFromAsyncIterable.js +7 -0
  160. package/build/terminatedArrayParser.js +4 -4
  161. package/build/terminatedArrayParser.test.js +7 -7
  162. package/build/toAsyncIterator.js +4 -4
  163. package/build/unionParser.d.ts +1 -1
  164. package/build/unionParser.js +2 -2
  165. package/build/unionParser.test.js +3 -3
  166. package/build/unparser.d.ts +3 -3
  167. package/build/unparser.js +6 -4
  168. package/build/unparser.test.js +7 -19
  169. package/build/unparserContext.d.ts +2 -2
  170. package/build/unparserContext.js +2 -3
  171. package/build/unparserError.d.ts +2 -1
  172. package/build/unparserError.js +2 -1
  173. package/build/unparserImplementationInvariant.d.ts +1 -1
  174. package/build/unparserOutputCompanion.d.ts +1 -1
  175. package/build/unparserOutputCompanion.js +1 -1
  176. package/build/zipParser.js +1 -1
  177. package/build/zipUnparser.d.ts +3 -3
  178. package/build/zipUnparser.js +9 -19
  179. package/build/zipUnparser.test.js +1 -1
  180. package/package.json +20 -26
  181. package/src/allSettledStream.test.ts +2 -2
  182. package/src/allSettledStream.ts +3 -3
  183. package/src/androidPackageParser.test.ts +17 -19
  184. package/src/androidPackageParser.ts +129 -171
  185. package/src/androidPackageUnparser.test.ts +19 -21
  186. package/src/androidPackageUnparser.ts +23 -17
  187. package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
  188. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  189. package/src/arbitraryDalvikBytecode.ts +992 -0
  190. package/src/arbitraryDalvikExecutable.ts +434 -0
  191. package/src/arbitraryDosDateTime.ts +1 -0
  192. package/src/arbitraryZipStream.ts +1 -1
  193. package/src/arrayParser.ts +2 -2
  194. package/src/arrayUnparser.ts +2 -2
  195. package/src/backsmali.ts +48 -4
  196. package/src/bash.ts +120 -0
  197. package/src/bashParser.test.ts +332 -0
  198. package/src/bashParser.ts +461 -0
  199. package/src/bsonParser.test.ts +12 -14
  200. package/src/customInvariant.ts +8 -12
  201. package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
  202. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  203. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  204. package/src/dalvikBytecodeParser.ts +1042 -243
  205. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  206. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  207. package/src/dalvikBytecodeUnparser.ts +758 -0
  208. package/src/dalvikExecutable.ts +110 -48
  209. package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
  210. package/src/dalvikExecutableParser/typeParsers.ts +23 -14
  211. package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
  212. package/src/dalvikExecutableParser.test.ts +60 -60
  213. package/src/dalvikExecutableParser.test.ts.md +6 -6
  214. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  215. package/src/dalvikExecutableParser.ts +911 -434
  216. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
  217. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  218. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  219. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  220. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  221. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  222. package/src/dalvikExecutableUnparser.test.ts +57 -0
  223. package/src/dalvikExecutableUnparser.ts +581 -0
  224. package/src/debugLogInputParser.ts +1 -1
  225. package/src/disjunctionParser.ts +5 -5
  226. package/src/elementTerminatedArrayParser.test.ts +8 -8
  227. package/src/elementTerminatedArrayParser.ts +2 -2
  228. package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
  229. package/src/elementTerminatedSequenceArrayParser.ts +2 -2
  230. package/src/elementTerminatedSequenceParser.test.ts +4 -6
  231. package/src/elementTerminatedSequenceParser.ts +2 -2
  232. package/src/endOfInputParser.ts +1 -1
  233. package/src/exactElementSwitchParser.ts +41 -0
  234. package/src/fetchCid.test.ts +20 -0
  235. package/src/fetchCid.ts +3 -7
  236. package/src/fixedLengthSequenceParser.test.ts +10 -12
  237. package/src/hasExecutable.ts +2 -2
  238. package/src/highResolutionTimer.ts +1 -1
  239. package/src/index.ts +113 -2
  240. package/src/inputReader.test.ts +39 -52
  241. package/src/inputReader.ts +2 -4
  242. package/src/inputReaderState.ts +1 -1
  243. package/src/inspect.ts +1 -1
  244. package/src/javaKeyStoreParser.test.ts +12 -14
  245. package/src/javaKeyStoreParser.ts +2 -6
  246. package/src/jsonParser.test.ts +2 -4
  247. package/src/jsonParser.ts +34 -38
  248. package/src/lazyMessageError.test.ts +21 -0
  249. package/src/lazyMessageError.ts +88 -0
  250. package/src/leb128Parser.test.ts +25 -23
  251. package/src/leb128Parser.ts +19 -19
  252. package/src/negativeLookaheadParser.test.ts +7 -11
  253. package/src/negativeLookaheadParser.ts +2 -2
  254. package/src/noStackCaptureOverheadError.test.ts +17 -0
  255. package/src/noStackCaptureOverheadError.ts +12 -0
  256. package/src/nonEmptyArrayParser.test.ts +3 -2
  257. package/src/nonEmptyArrayParser.ts +2 -2
  258. package/src/optionalParser.ts +2 -2
  259. package/src/parser.test.ts +96 -43
  260. package/src/parser.test.ts.md +13 -6
  261. package/src/parser.test.ts.snap +0 -0
  262. package/src/parser.ts +35 -12
  263. package/src/parserAccessorParser.ts +1 -1
  264. package/src/parserConsumedSequenceParser.ts +3 -3
  265. package/src/parserContext.test.ts +7 -3
  266. package/src/parserContext.ts +82 -48
  267. package/src/parserError.ts +143 -63
  268. package/src/parserImplementationInvariant.ts +3 -3
  269. package/src/parserInputCompanion.ts +2 -2
  270. package/src/promiseCompose.ts +2 -2
  271. package/src/regexpParser.test.ts +186 -0
  272. package/src/regexpParser.ts +94 -0
  273. package/src/regularExpression.ts +24 -0
  274. package/src/regularExpressionParser.test.ts +102 -0
  275. package/src/regularExpressionParser.ts +921 -0
  276. package/src/separatedArrayParser.ts +3 -3
  277. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  278. package/src/separatedNonEmptyArrayParser.ts +61 -0
  279. package/src/sequenceBuffer.test.ts +9 -9
  280. package/src/sequenceBuffer.ts +4 -4
  281. package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
  282. package/src/sequenceTerminatedSequenceParser.ts +4 -4
  283. package/src/sequenceUnparser.ts +2 -2
  284. package/src/skipToParser.ts +2 -2
  285. package/src/sliceBoundedParser.test.ts +4 -12
  286. package/src/sliceBoundedParser.ts +2 -2
  287. package/src/smali.ts +8 -3
  288. package/src/smaliParser.test.ts +377 -66
  289. package/src/smaliParser.test.ts.md +1635 -48
  290. package/src/smaliParser.test.ts.snap +0 -0
  291. package/src/smaliParser.ts +2751 -569
  292. package/src/stringFromAsyncIterable.ts +9 -0
  293. package/src/terminatedArrayParser.test.ts +11 -11
  294. package/src/terminatedArrayParser.ts +5 -7
  295. package/src/toAsyncIterator.ts +8 -8
  296. package/src/uint8Array.ts +2 -3
  297. package/src/unionParser.test.ts +22 -23
  298. package/src/unionParser.ts +6 -8
  299. package/src/unparser.test.ts +18 -34
  300. package/src/unparser.ts +13 -9
  301. package/src/unparserContext.ts +9 -13
  302. package/src/unparserError.ts +2 -1
  303. package/src/unparserImplementationInvariant.ts +1 -1
  304. package/src/unparserOutputCompanion.ts +1 -1
  305. package/src/zip.ts +2 -6
  306. package/src/zipParser.ts +10 -18
  307. package/src/zipUnparser.test.ts +1 -1
  308. package/src/zipUnparser.ts +52 -64
  309. package/tsconfig.json +7 -1
  310. package/xo.config.ts +15 -0
  311. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
@@ -1,25 +1,61 @@
1
- import { createArrayParser } from "./arrayParser.js";
2
- import { createDalvikBytecodeFormat21cParser, createDalvikBytecodeFormat21sParser, createDalvikBytecodeFormat21tParser, createDalvikBytecodeFormat22bParser, createDalvikBytecodeFormat22cParser, createDalvikBytecodeFormat22sParser, createDalvikBytecodeFormat22tParser, dalvikBytecodeFormat23xParser, dalvikBytecodeFormat31iParser, createDalvikBytecodeFormat35cParser, createDalvikBytecodeFormat3rcParser, dalvikBytecodeFormat10tParser, dalvikBytecodeFormat10xParser, dalvikBytecodeFormat11xParser, dalvikBytecodeFormat12xParser, dalvikBytecodeFormat20tParser, dalvikBytecodeFormat22xParser, nibblesParser, dalvikBytecodeFormat32xParser } from "./dalvikBytecodeParser/formatParsers.js";
3
- import { DalvikExecutableField, DalvikExecutableMethod } from "./dalvikExecutable.js";
4
- import { IndexIntoFieldIds, IndexIntoMethodIds, IndexIntoStringIds, IndexIntoTypeIds, isoIndexIntoFieldIds, isoIndexIntoMethodIds, isoIndexIntoStringIds, isoIndexIntoTypeIds } from "./dalvikExecutableParser/typedNumbers.js";
5
- import { createExactElementParser } from "./exactElementParser.js";
6
- import { Parser, setParserName } from "./parser.js";
7
- import { promiseCompose } from "./promiseCompose.js";
8
- import { createSliceBoundedParser } from "./sliceBoundedParser.js";
9
- import { createTupleParser } from "./tupleParser.js";
10
- import { createUnionParser } from "./unionParser.js";
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';
11
47
 
12
48
  // https://source.android.com/docs/core/runtime/dalvik-bytecode
13
49
 
14
- const dalvikBytecodeOperationUnusedParser: Parser<void, Uint8Array> = async (parserContext) => {
50
+ const dalvikBytecodeOperationUnusedParser: Parser<void, Uint8Array> = async parserContext => {
15
51
  const opcode = await parserContext.read(0);
16
52
 
17
53
  parserContext.invariant(
18
54
  (
19
- (opcode >= 0x3e && opcode <= 0x43)
20
- || (opcode === 0x73)
21
- || (opcode >= 0x79 && opcode <= 0x7a)
22
- || (opcode >= 0xe3 && opcode <= 0xf9)
55
+ (opcode >= 0x3E && opcode <= 0x43)
56
+ || (opcode === 0x73)
57
+ || (opcode >= 0x79 && opcode <= 0x7A)
58
+ || (opcode >= 0xE3 && opcode <= 0xF9)
23
59
  ),
24
60
  'Expected unused opcode',
25
61
  );
@@ -30,13 +66,13 @@ const dalvikBytecodeOperationUnusedParser: Parser<void, Uint8Array> = async (par
30
66
  setParserName(dalvikBytecodeOperationUnusedParser, 'dalvikBytecodeOperationUnusedParser');
31
67
 
32
68
  type DalvikBytecodeOperationNoOperation = {
33
- operation: 'no-operation';
69
+ operation: 'nop';
34
70
  };
35
71
 
36
72
  const dalvikBytecodeOperationNoOperationParser: Parser<DalvikBytecodeOperationNoOperation, Uint8Array> = promiseCompose(
37
- createExactElementParser(0x00),
73
+ createExactUshortParser(0x00_00), // nop is 2 bytes: 0x00 0x00
38
74
  () => ({
39
- operation: 'no-operation',
75
+ operation: 'nop',
40
76
  }),
41
77
  );
42
78
 
@@ -55,7 +91,7 @@ const createDalvikBytecodeOperationInvoke = <T extends string>(operation: T, opc
55
91
  ]),
56
92
  ([
57
93
  _opcode,
58
- { index, registers }
94
+ { index, registers },
59
95
  ]) => ({
60
96
  operation,
61
97
  methodIndex: index,
@@ -63,11 +99,11 @@ const createDalvikBytecodeOperationInvoke = <T extends string>(operation: T, opc
63
99
  }),
64
100
  );
65
101
 
66
- const dalvikBytecodeOperationInvokeVirtualParser = createDalvikBytecodeOperationInvoke('invoke-virtual', 0x6e);
102
+ const dalvikBytecodeOperationInvokeVirtualParser = createDalvikBytecodeOperationInvoke('invoke-virtual', 0x6E);
67
103
 
68
104
  type DalvikBytecodeOperationInvokeVirtual = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeVirtualParser>>;
69
105
 
70
- const dalvikBytecodeOperationInvokeSuperParser = createDalvikBytecodeOperationInvoke('invoke-super', 0x6f);
106
+ const dalvikBytecodeOperationInvokeSuperParser = createDalvikBytecodeOperationInvoke('invoke-super', 0x6F);
71
107
 
72
108
  type DalvikBytecodeOperationInvokeSuper = Awaited<ReturnType<typeof dalvikBytecodeOperationInvokeSuperParser>>;
73
109
 
@@ -91,7 +127,7 @@ type DalvikBytecodeOperationInvoke =
91
127
  | DalvikBytecodeOperationInvokeInterface
92
128
  ;
93
129
 
94
- const dalvikBytecodeOperationInvokeParser: Parser<DalvikBytecodeOperationInvoke, Uint8Array> = createUnionParser([
130
+ const dalvikBytecodeOperationInvokeParser: Parser<DalvikBytecodeOperationInvoke, Uint8Array> = createDisjunctionParser([
95
131
  dalvikBytecodeOperationInvokeVirtualParser,
96
132
  dalvikBytecodeOperationInvokeSuperParser,
97
133
  dalvikBytecodeOperationInvokeDirectParser,
@@ -114,7 +150,7 @@ const createDalvikBytecodeOperationInvokeRange = <T extends string>(operation: T
114
150
  ]),
115
151
  ([
116
152
  _opcode,
117
- { index, registers }
153
+ { index, registers },
118
154
  ]) => ({
119
155
  operation,
120
156
  methodIndex: index,
@@ -150,7 +186,7 @@ type DalvikBytecodeOperationInvokeRange =
150
186
  | DalvikBytecodeOperationInvokeInterfaceRange
151
187
  ;
152
188
 
153
- const dalvikBytecodeOperationInvokeRangeParser: Parser<DalvikBytecodeOperationInvokeRange, Uint8Array> = createUnionParser([
189
+ const dalvikBytecodeOperationInvokeRangeParser: Parser<DalvikBytecodeOperationInvokeRange, Uint8Array> = createDisjunctionParser([
154
190
  dalvikBytecodeOperationInvokeVirtualRangeParser,
155
191
  dalvikBytecodeOperationInvokeSuperRangeParser,
156
192
  dalvikBytecodeOperationInvokeDirectRangeParser,
@@ -160,6 +196,63 @@ const dalvikBytecodeOperationInvokeRangeParser: Parser<DalvikBytecodeOperationIn
160
196
 
161
197
  setParserName(dalvikBytecodeOperationInvokeRangeParser, 'dalvikBytecodeOperationInvokeRangeParser');
162
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
+
163
256
  type DalvikBytecodeOperationGoto = {
164
257
  operation: 'goto';
165
258
  branchOffset: number;
@@ -192,6 +285,172 @@ const dalvikBytecodeOperationGoto16Parser: Parser<DalvikBytecodeOperationGoto16,
192
285
  }),
193
286
  );
194
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
+
195
454
  type DalvikBytecodeOperationInstanceOf = {
196
455
  operation: 'instance-of';
197
456
  registers: number[];
@@ -252,27 +511,27 @@ const dalvikBytecodeOperationArrayElementGetCharParser = createDalvikBytecodeOpe
252
511
 
253
512
  type DalvikBytecodeOperationArrayElementGetChar = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetCharParser>>;
254
513
 
255
- const dalvikBytecodeOperationArrayElementGetShortParser = createDalvikBytecodeOperationArrayElement('aget-short', 0x4a);
514
+ const dalvikBytecodeOperationArrayElementGetShortParser = createDalvikBytecodeOperationArrayElement('aget-short', 0x4A);
256
515
 
257
516
  type DalvikBytecodeOperationArrayElementGetShort = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementGetShortParser>>;
258
517
 
259
- const dalvikBytecodeOperationArrayElementPutParser = createDalvikBytecodeOperationArrayElement('aput', 0x4b);
518
+ const dalvikBytecodeOperationArrayElementPutParser = createDalvikBytecodeOperationArrayElement('aput', 0x4B);
260
519
 
261
520
  type DalvikBytecodeOperationArrayElementPut = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutParser>>;
262
521
 
263
- const dalvikBytecodeOperationArrayElementPutWideParser = createDalvikBytecodeOperationArrayElement('aput-wide', 0x4c);
522
+ const dalvikBytecodeOperationArrayElementPutWideParser = createDalvikBytecodeOperationArrayElement('aput-wide', 0x4C);
264
523
 
265
524
  type DalvikBytecodeOperationArrayElementPutWide = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutWideParser>>;
266
525
 
267
- const dalvikBytecodeOperationArrayElementPutObjectParser = createDalvikBytecodeOperationArrayElement('aput-object', 0x4d);
526
+ const dalvikBytecodeOperationArrayElementPutObjectParser = createDalvikBytecodeOperationArrayElement('aput-object', 0x4D);
268
527
 
269
528
  type DalvikBytecodeOperationArrayElementPutObject = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutObjectParser>>;
270
529
 
271
- const dalvikBytecodeOperationArrayElementPutBooleanParser = createDalvikBytecodeOperationArrayElement('aput-boolean', 0x4e);
530
+ const dalvikBytecodeOperationArrayElementPutBooleanParser = createDalvikBytecodeOperationArrayElement('aput-boolean', 0x4E);
272
531
 
273
532
  type DalvikBytecodeOperationArrayElementPutBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutBooleanParser>>;
274
533
 
275
- const dalvikBytecodeOperationArrayElementPutByteParser = createDalvikBytecodeOperationArrayElement('aput-byte', 0x4f);
534
+ const dalvikBytecodeOperationArrayElementPutByteParser = createDalvikBytecodeOperationArrayElement('aput-byte', 0x4F);
276
535
 
277
536
  type DalvikBytecodeOperationArrayElementPutByte = Awaited<ReturnType<typeof dalvikBytecodeOperationArrayElementPutByteParser>>;
278
537
 
@@ -301,7 +560,7 @@ type DalvikBytecodeOperationArrayElement =
301
560
  | DalvikBytecodeOperationArrayElementPutShort
302
561
  ;
303
562
 
304
- const dalvikBytecodeOperationArrayElementParser: Parser<DalvikBytecodeOperationArrayElement, Uint8Array> = createUnionParser([
563
+ const dalvikBytecodeOperationArrayElementParser: Parser<DalvikBytecodeOperationArrayElement, Uint8Array> = createDisjunctionParser([
305
564
  dalvikBytecodeOperationArrayElementGetParser,
306
565
  dalvikBytecodeOperationArrayElementGetWideParser,
307
566
  dalvikBytecodeOperationArrayElementGetObjectParser,
@@ -370,27 +629,27 @@ const dalvikBytecodeOperationInstanceFieldPutParser = createDalvikBytecodeOperat
370
629
 
371
630
  type DalvikBytecodeOperationInstanceFieldPut = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutParser>>;
372
631
 
373
- const dalvikBytecodeOperationInstanceFieldPutWideParser = createDalvikBytecodeOperationInstanceField('iput-wide', 0x5a);
632
+ const dalvikBytecodeOperationInstanceFieldPutWideParser = createDalvikBytecodeOperationInstanceField('iput-wide', 0x5A);
374
633
 
375
634
  type DalvikBytecodeOperationInstanceFieldPutWide = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutWideParser>>;
376
635
 
377
- const dalvikBytecodeOperationInstanceFieldPutObjectParser = createDalvikBytecodeOperationInstanceField('iput-object', 0x5b);
636
+ const dalvikBytecodeOperationInstanceFieldPutObjectParser = createDalvikBytecodeOperationInstanceField('iput-object', 0x5B);
378
637
 
379
638
  type DalvikBytecodeOperationInstanceFieldPutObject = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutObjectParser>>;
380
639
 
381
- const dalvikBytecodeOperationInstanceFieldPutBooleanParser = createDalvikBytecodeOperationInstanceField('iput-boolean', 0x5c);
640
+ const dalvikBytecodeOperationInstanceFieldPutBooleanParser = createDalvikBytecodeOperationInstanceField('iput-boolean', 0x5C);
382
641
 
383
642
  type DalvikBytecodeOperationInstanceFieldPutBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutBooleanParser>>;
384
643
 
385
- const dalvikBytecodeOperationInstanceFieldPutByteParser = createDalvikBytecodeOperationInstanceField('iput-byte', 0x5d);
644
+ const dalvikBytecodeOperationInstanceFieldPutByteParser = createDalvikBytecodeOperationInstanceField('iput-byte', 0x5D);
386
645
 
387
646
  type DalvikBytecodeOperationInstanceFieldPutByte = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutByteParser>>;
388
647
 
389
- const dalvikBytecodeOperationInstanceFieldPutCharParser = createDalvikBytecodeOperationInstanceField('iput-char', 0x5e);
648
+ const dalvikBytecodeOperationInstanceFieldPutCharParser = createDalvikBytecodeOperationInstanceField('iput-char', 0x5E);
390
649
 
391
650
  type DalvikBytecodeOperationInstanceFieldPutChar = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutCharParser>>;
392
651
 
393
- const dalvikBytecodeOperationInstanceFieldPutShortParser = createDalvikBytecodeOperationInstanceField('iput-short', 0x5f);
652
+ const dalvikBytecodeOperationInstanceFieldPutShortParser = createDalvikBytecodeOperationInstanceField('iput-short', 0x5F);
394
653
 
395
654
  type DalvikBytecodeOperationInstanceFieldPutShort = Awaited<ReturnType<typeof dalvikBytecodeOperationInstanceFieldPutShortParser>>;
396
655
 
@@ -411,7 +670,7 @@ type DalvikBytecodeOperationInstanceField =
411
670
  | DalvikBytecodeOperationInstanceFieldPutShort
412
671
  ;
413
672
 
414
- const dalvikBytecodeOperationInstanceFieldParser: Parser<DalvikBytecodeOperationInstanceField, Uint8Array> = createUnionParser([
673
+ const dalvikBytecodeOperationInstanceFieldParser: Parser<DalvikBytecodeOperationInstanceField, Uint8Array> = createDisjunctionParser([
415
674
  dalvikBytecodeOperationInstanceFieldGetParser,
416
675
  dalvikBytecodeOperationInstanceFieldGetWideParser,
417
676
  dalvikBytecodeOperationInstanceFieldGetObjectParser,
@@ -488,19 +747,19 @@ const dalvikBytecodeOperationStaticFieldPutObjectParser = createDalvikBytecodeOp
488
747
 
489
748
  type DalvikBytecodeOperationStaticFieldPutObject = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutObjectParser>>;
490
749
 
491
- const dalvikBytecodeOperationStaticFieldPutBooleanParser = createDalvikBytecodeOperationStaticField('sput-boolean', 0x6a);
750
+ const dalvikBytecodeOperationStaticFieldPutBooleanParser = createDalvikBytecodeOperationStaticField('sput-boolean', 0x6A);
492
751
 
493
752
  type DalvikBytecodeOperationStaticFieldPutBoolean = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutBooleanParser>>;
494
753
 
495
- const dalvikBytecodeOperationStaticFieldPutByteParser = createDalvikBytecodeOperationStaticField('sput-byte', 0x6b);
754
+ const dalvikBytecodeOperationStaticFieldPutByteParser = createDalvikBytecodeOperationStaticField('sput-byte', 0x6B);
496
755
 
497
756
  type DalvikBytecodeOperationStaticFieldPutByte = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutByteParser>>;
498
757
 
499
- const dalvikBytecodeOperationStaticFieldPutCharParser = createDalvikBytecodeOperationStaticField('sput-char', 0x6c);
758
+ const dalvikBytecodeOperationStaticFieldPutCharParser = createDalvikBytecodeOperationStaticField('sput-char', 0x6C);
500
759
 
501
760
  type DalvikBytecodeOperationStaticFieldPutChar = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutCharParser>>;
502
761
 
503
- const dalvikBytecodeOperationStaticFieldPutShortParser = createDalvikBytecodeOperationStaticField('sput-short', 0x6d);
762
+ const dalvikBytecodeOperationStaticFieldPutShortParser = createDalvikBytecodeOperationStaticField('sput-short', 0x6D);
504
763
 
505
764
  type DalvikBytecodeOperationStaticFieldPutShort = Awaited<ReturnType<typeof dalvikBytecodeOperationStaticFieldPutShortParser>>;
506
765
 
@@ -521,7 +780,7 @@ type DalvikBytecodeOperationStaticField =
521
780
  | DalvikBytecodeOperationStaticFieldPutShort
522
781
  ;
523
782
 
524
- const dalvikBytecodeOperationStaticFieldParser: Parser<DalvikBytecodeOperationStaticField, Uint8Array> = createUnionParser([
783
+ const dalvikBytecodeOperationStaticFieldParser: Parser<DalvikBytecodeOperationStaticField, Uint8Array> = createDisjunctionParser([
525
784
  dalvikBytecodeOperationStaticFieldGetParser,
526
785
  dalvikBytecodeOperationStaticFieldGetWideParser,
527
786
  dalvikBytecodeOperationStaticFieldGetObjectParser,
@@ -556,47 +815,47 @@ const createDalvikBytecodeOperationBinaryOperationLiteral8 = <T extends string>(
556
815
  }),
557
816
  );
558
817
 
559
- const dalvikBytecodeOperationAddIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('add-int/lit8', 0xd8);
818
+ const dalvikBytecodeOperationAddIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('add-int/lit8', 0xD8);
560
819
 
561
820
  type DalvikBytecodeOperationAddIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationAddIntLiteral8Parser>>;
562
821
 
563
- const dalvikBytecodeOperationReverseSubtractIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rsub-int/lit8', 0xd9);
822
+ const dalvikBytecodeOperationReverseSubtractIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rsub-int/lit8', 0xD9);
564
823
 
565
824
  type DalvikBytecodeOperationReverseSubtractIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationReverseSubtractIntLiteral8Parser>>;
566
825
 
567
- const dalvikBytecodeOperationMultiplyIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('mul-int/lit8', 0xda);
826
+ const dalvikBytecodeOperationMultiplyIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('mul-int/lit8', 0xDA);
568
827
 
569
828
  type DalvikBytecodeOperationMultiplyIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyIntLiteral8Parser>>;
570
829
 
571
- const dalvikBytecodeOperationDivideIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('div-int/lit8', 0xdb);
830
+ const dalvikBytecodeOperationDivideIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('div-int/lit8', 0xDB);
572
831
 
573
832
  type DalvikBytecodeOperationDivideIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideIntLiteral8Parser>>;
574
833
 
575
- const dalvikBytecodeOperationRemainderIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rem-int/lit8', 0xdc);
834
+ const dalvikBytecodeOperationRemainderIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rem-int/lit8', 0xDC);
576
835
 
577
836
  type DalvikBytecodeOperationRemainderIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderIntLiteral8Parser>>;
578
837
 
579
- const dalvikBytecodeOperationAndIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('and-int/lit8', 0xdd);
838
+ const dalvikBytecodeOperationAndIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('and-int/lit8', 0xDD);
580
839
 
581
840
  type DalvikBytecodeOperationAndIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationAndIntLiteral8Parser>>;
582
841
 
583
- const dalvikBytecodeOperationOrIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('or-int/lit8', 0xde);
842
+ const dalvikBytecodeOperationOrIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('or-int/lit8', 0xDE);
584
843
 
585
844
  type DalvikBytecodeOperationOrIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationOrIntLiteral8Parser>>;
586
845
 
587
- const dalvikBytecodeOperationXorIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('xor-int/lit8', 0xdf);
846
+ const dalvikBytecodeOperationXorIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('xor-int/lit8', 0xDF);
588
847
 
589
848
  type DalvikBytecodeOperationXorIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationXorIntLiteral8Parser>>;
590
849
 
591
- const dalvikBytecodeOperationShiftLeftIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shl-int/lit8', 0xe0);
850
+ const dalvikBytecodeOperationShiftLeftIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shl-int/lit8', 0xE0);
592
851
 
593
852
  type DalvikBytecodeOperationShiftLeftIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftIntLiteral8Parser>>;
594
853
 
595
- const dalvikBytecodeOperationShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shr-int/lit8', 0xe1);
854
+ const dalvikBytecodeOperationShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shr-int/lit8', 0xE1);
596
855
 
597
856
  type DalvikBytecodeOperationShiftRightIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightIntLiteral8Parser>>;
598
857
 
599
- const dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('ushr-int/lit8', 0xe2);
858
+ const dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('ushr-int/lit8', 0xE2);
600
859
 
601
860
  type DalvikBytecodeOperationUnsignedShiftRightIntLiteral8 = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser>>;
602
861
 
@@ -614,7 +873,7 @@ type DalvikBytecodeOperationBinaryOperationLiteral8 =
614
873
  | DalvikBytecodeOperationUnsignedShiftRightIntLiteral8
615
874
  ;
616
875
 
617
- const dalvikBytecodeOperationBinaryOperationLiteral8Parser: Parser<DalvikBytecodeOperationBinaryOperationLiteral8, Uint8Array> = createUnionParser([
876
+ const dalvikBytecodeOperationBinaryOperationLiteral8Parser: Parser<DalvikBytecodeOperationBinaryOperationLiteral8, Uint8Array> = createDisjunctionParser([
618
877
  dalvikBytecodeOperationAddIntLiteral8Parser,
619
878
  dalvikBytecodeOperationReverseSubtractIntLiteral8Parser,
620
879
  dalvikBytecodeOperationMultiplyIntLiteral8Parser,
@@ -646,35 +905,35 @@ const createDalvikBytecodeOperationBinaryOperationLiteral16 = <T extends string>
646
905
  }),
647
906
  );
648
907
 
649
- const dalvikBytecodeOperationAddIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('add-int/lit16', 0xd0);
908
+ const dalvikBytecodeOperationAddIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('add-int/lit16', 0xD0);
650
909
 
651
910
  type DalvikBytecodeOperationAddIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationAddIntLiteral16Parser>>;
652
911
 
653
- const dalvikBytecodeOperationReverseSubtractIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rsub-int/lit16', 0xd1);
912
+ const dalvikBytecodeOperationReverseSubtractIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rsub-int', 0xD1);
654
913
 
655
914
  type DalvikBytecodeOperationReverseSubtractIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationReverseSubtractIntLiteral16Parser>>;
656
915
 
657
- const dalvikBytecodeOperationMultiplyIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('mul-int/lit16', 0xd2);
916
+ const dalvikBytecodeOperationMultiplyIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('mul-int/lit16', 0xD2);
658
917
 
659
918
  type DalvikBytecodeOperationMultiplyIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyIntLiteral16Parser>>;
660
919
 
661
- const dalvikBytecodeOperationDivideIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('div-int/lit16', 0xd3);
920
+ const dalvikBytecodeOperationDivideIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('div-int/lit16', 0xD3);
662
921
 
663
922
  type DalvikBytecodeOperationDivideIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideIntLiteral16Parser>>;
664
923
 
665
- const dalvikBytecodeOperationRemainderIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rem-int/lit16', 0xd4);
924
+ const dalvikBytecodeOperationRemainderIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rem-int/lit16', 0xD4);
666
925
 
667
926
  type DalvikBytecodeOperationRemainderIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderIntLiteral16Parser>>;
668
927
 
669
- const dalvikBytecodeOperationAndIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('and-int/lit16', 0xd5);
928
+ const dalvikBytecodeOperationAndIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('and-int/lit16', 0xD5);
670
929
 
671
930
  type DalvikBytecodeOperationAndIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationAndIntLiteral16Parser>>;
672
931
 
673
- const dalvikBytecodeOperationOrIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('or-int/lit16', 0xd6);
932
+ const dalvikBytecodeOperationOrIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('or-int/lit16', 0xD6);
674
933
 
675
934
  type DalvikBytecodeOperationOrIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationOrIntLiteral16Parser>>;
676
935
 
677
- const dalvikBytecodeOperationXorIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('xor-int/lit16', 0xd7);
936
+ const dalvikBytecodeOperationXorIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('xor-int/lit16', 0xD7);
678
937
 
679
938
  type DalvikBytecodeOperationXorIntLiteral16 = Awaited<ReturnType<typeof dalvikBytecodeOperationXorIntLiteral16Parser>>;
680
939
 
@@ -689,7 +948,7 @@ type DalvikBytecodeOperationBinaryOperationLiteral16 =
689
948
  | DalvikBytecodeOperationXorIntLiteral16
690
949
  ;
691
950
 
692
- const dalvikBytecodeOperationBinaryOperationLiteral16Parser: Parser<DalvikBytecodeOperationBinaryOperationLiteral16, Uint8Array> = createUnionParser([
951
+ const dalvikBytecodeOperationBinaryOperationLiteral16Parser: Parser<DalvikBytecodeOperationBinaryOperationLiteral16, Uint8Array> = createDisjunctionParser([
693
952
  dalvikBytecodeOperationAddIntLiteral16Parser,
694
953
  dalvikBytecodeOperationReverseSubtractIntLiteral16Parser,
695
954
  dalvikBytecodeOperationMultiplyIntLiteral16Parser,
@@ -716,127 +975,131 @@ const createDalvikBytecodeOperationBinaryOperationInPlace = <T extends string>(o
716
975
  }),
717
976
  );
718
977
 
719
- const dalvikBytecodeOperationAddIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-int/2addr', 0xb0);
978
+ const dalvikBytecodeOperationAddIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-int/2addr', 0xB0);
720
979
 
721
980
  type DalvikBytecodeOperationAddIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAddIntInPlaceParser>>;
722
981
 
723
- const dalvikBytecodeOperationReverseSubtractIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rsub-int', 0xb1);
982
+ const dalvikBytecodeOperationReverseSubtractIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-int/2addr', 0xB1);
724
983
 
725
984
  type DalvikBytecodeOperationReverseSubtractIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationReverseSubtractIntInPlaceParser>>;
726
985
 
727
- const dalvikBytecodeOperationMultiplyIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-int/2addr', 0xb2);
986
+ const dalvikBytecodeOperationMultiplyIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-int/2addr', 0xB2);
728
987
 
729
988
  type DalvikBytecodeOperationMultiplyIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyIntInPlaceParser>>;
730
989
 
731
- const dalvikBytecodeOperationDivideIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-int/2addr', 0xb3);
990
+ const dalvikBytecodeOperationDivideIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-int/2addr', 0xB3);
732
991
 
733
992
  type DalvikBytecodeOperationDivideIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideIntInPlaceParser>>;
734
993
 
735
- const dalvikBytecodeOperationRemainderIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-int/2addr', 0xb4);
994
+ const dalvikBytecodeOperationRemainderIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-int/2addr', 0xB4);
736
995
 
737
996
  type DalvikBytecodeOperationRemainderIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderIntInPlaceParser>>;
738
997
 
739
- const dalvikBytecodeOperationAndIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-int/2addr', 0xb5);
998
+ const dalvikBytecodeOperationAndIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-int/2addr', 0xB5);
740
999
 
741
1000
  type DalvikBytecodeOperationAndIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAndIntInPlaceParser>>;
742
1001
 
743
- const dalvikBytecodeOperationOrIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-int/2addr', 0xb6);
1002
+ const dalvikBytecodeOperationOrIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-int/2addr', 0xB6);
744
1003
 
745
1004
  type DalvikBytecodeOperationOrIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationOrIntInPlaceParser>>;
746
1005
 
747
- const dalvikBytecodeOperationXorIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-int/2addr', 0xb7);
1006
+ const dalvikBytecodeOperationXorIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-int/2addr', 0xB7);
748
1007
 
749
1008
  type DalvikBytecodeOperationXorIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationXorIntInPlaceParser>>;
750
1009
 
751
- const dalvikBytecodeOperationShiftLeftIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-int/2addr', 0xb8);
1010
+ const dalvikBytecodeOperationShiftLeftIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-int/2addr', 0xB8);
752
1011
 
753
1012
  type DalvikBytecodeOperationShiftLeftIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftIntInPlaceParser>>;
754
1013
 
755
- const dalvikBytecodeOperationShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-int/2addr', 0xb9);
1014
+ const dalvikBytecodeOperationShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-int/2addr', 0xB9);
756
1015
 
757
1016
  type DalvikBytecodeOperationShiftRightIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightIntInPlaceParser>>;
758
1017
 
759
- const dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-int/2addr', 0xba);
1018
+ const dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-int/2addr', 0xBA);
760
1019
 
761
1020
  type DalvikBytecodeOperationUnsignedShiftRightIntInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser>>;
762
1021
 
763
- const dalvikBytecodeOperationAddLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-long/2addr', 0xbb);
1022
+ const dalvikBytecodeOperationAddLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-long/2addr', 0xBB);
764
1023
 
765
1024
  type DalvikBytecodeOperationAddLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAddLongInPlaceParser>>;
766
1025
 
767
- const dalvikBytecodeOperationReverseSubtractLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rsub-long', 0xbc);
1026
+ const dalvikBytecodeOperationSubtractLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-long/2addr', 0xBC);
768
1027
 
769
- type DalvikBytecodeOperationReverseSubtractLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationReverseSubtractLongInPlaceParser>>;
1028
+ type DalvikBytecodeOperationSubtractLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractLongInPlaceParser>>;
770
1029
 
771
- const dalvikBytecodeOperationMultiplyLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-long/2addr', 0xbd);
1030
+ const dalvikBytecodeOperationMultiplyLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-long/2addr', 0xBD);
772
1031
 
773
1032
  type DalvikBytecodeOperationMultiplyLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyLongInPlaceParser>>;
774
1033
 
775
- const dalvikBytecodeOperationDivideLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-long/2addr', 0xbe);
1034
+ const dalvikBytecodeOperationDivideLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-long/2addr', 0xBE);
776
1035
 
777
1036
  type DalvikBytecodeOperationDivideLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideLongInPlaceParser>>;
778
1037
 
779
- const dalvikBytecodeOperationRemainderLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-long/2addr', 0xbf);
1038
+ const dalvikBytecodeOperationRemainderLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-long/2addr', 0xBF);
780
1039
 
781
1040
  type DalvikBytecodeOperationRemainderLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderLongInPlaceParser>>;
782
1041
 
783
- const dalvikBytecodeOperationAndLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-long/2addr', 0xc0);
1042
+ const dalvikBytecodeOperationAndLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-long/2addr', 0xC0);
784
1043
 
785
1044
  type DalvikBytecodeOperationAndLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAndLongInPlaceParser>>;
786
1045
 
787
- const dalvikBytecodeOperationOrLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-long/2addr', 0xc1);
1046
+ const dalvikBytecodeOperationOrLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-long/2addr', 0xC1);
788
1047
 
789
1048
  type DalvikBytecodeOperationOrLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationOrLongInPlaceParser>>;
790
1049
 
791
- const dalvikBytecodeOperationXorLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-long/2addr', 0xc2);
1050
+ const dalvikBytecodeOperationXorLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-long/2addr', 0xC2);
792
1051
 
793
1052
  type DalvikBytecodeOperationXorLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationXorLongInPlaceParser>>;
794
1053
 
795
- const dalvikBytecodeOperationShiftLeftLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-long/2addr', 0xc3);
1054
+ const dalvikBytecodeOperationShiftLeftLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-long/2addr', 0xC3);
796
1055
 
797
1056
  type DalvikBytecodeOperationShiftLeftLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftLongInPlaceParser>>;
798
1057
 
799
- const dalvikBytecodeOperationShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-long/2addr', 0xc4);
1058
+ const dalvikBytecodeOperationShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-long/2addr', 0xC4);
800
1059
 
801
1060
  type DalvikBytecodeOperationShiftRightLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightLongInPlaceParser>>;
802
1061
 
803
- const dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-long/2addr', 0xc5);
1062
+ const dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-long/2addr', 0xC5);
804
1063
 
805
1064
  type DalvikBytecodeOperationUnsignedShiftRightLongInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser>>;
806
1065
 
807
- const dalvikBytecodeOperationAddFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-float/2addr', 0xc6);
1066
+ const dalvikBytecodeOperationAddFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-float/2addr', 0xC6);
808
1067
 
809
1068
  type DalvikBytecodeOperationAddFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAddFloatInPlaceParser>>;
810
1069
 
811
- const dalvikBytecodeOperationSubtractFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-float/2addr', 0xc7);
1070
+ const dalvikBytecodeOperationSubtractFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-float/2addr', 0xC7);
812
1071
 
813
1072
  type DalvikBytecodeOperationSubtractFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractFloatInPlaceParser>>;
814
1073
 
815
- const dalvikBytecodeOperationMultiplyFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-float/2addr', 0xc8);
1074
+ const dalvikBytecodeOperationMultiplyFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-float/2addr', 0xC8);
816
1075
 
817
1076
  type DalvikBytecodeOperationMultiplyFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyFloatInPlaceParser>>;
818
1077
 
819
- const dalvikBytecodeOperationDivideFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-float/2addr', 0xc9);
1078
+ const dalvikBytecodeOperationDivideFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-float/2addr', 0xC9);
820
1079
 
821
1080
  type DalvikBytecodeOperationDivideFloatInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideFloatInPlaceParser>>;
822
1081
 
823
- const dalvikBytecodeOperationAddDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-double/2addr', 0xca);
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);
824
1087
 
825
1088
  type DalvikBytecodeOperationAddDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationAddDoubleInPlaceParser>>;
826
1089
 
827
- const dalvikBytecodeOperationSubtractDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-double/2addr', 0xcb);
1090
+ const dalvikBytecodeOperationSubtractDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-double/2addr', 0xCC);
828
1091
 
829
1092
  type DalvikBytecodeOperationSubtractDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractDoubleInPlaceParser>>;
830
1093
 
831
- const dalvikBytecodeOperationMultiplyDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-double/2addr', 0xcc);
1094
+ const dalvikBytecodeOperationMultiplyDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-double/2addr', 0xCD);
832
1095
 
833
1096
  type DalvikBytecodeOperationMultiplyDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyDoubleInPlaceParser>>;
834
1097
 
835
- const dalvikBytecodeOperationDivideDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-double/2addr', 0xcd);
1098
+ const dalvikBytecodeOperationDivideDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-double/2addr', 0xCE);
836
1099
 
837
1100
  type DalvikBytecodeOperationDivideDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideDoubleInPlaceParser>>;
838
1101
 
839
- const dalvikBytecodeOperationRemainderDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-double/2addr', 0xce);
1102
+ const dalvikBytecodeOperationRemainderDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-double/2addr', 0xCF);
840
1103
 
841
1104
  type DalvikBytecodeOperationRemainderDoubleInPlace = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderDoubleInPlaceParser>>;
842
1105
 
@@ -853,7 +1116,7 @@ type DalvikBytecodeOperationBinaryOperationInPlace =
853
1116
  | DalvikBytecodeOperationShiftRightIntInPlace
854
1117
  | DalvikBytecodeOperationUnsignedShiftRightIntInPlace
855
1118
  | DalvikBytecodeOperationAddLongInPlace
856
- | DalvikBytecodeOperationReverseSubtractLongInPlace
1119
+ | DalvikBytecodeOperationSubtractLongInPlace
857
1120
  | DalvikBytecodeOperationMultiplyLongInPlace
858
1121
  | DalvikBytecodeOperationDivideLongInPlace
859
1122
  | DalvikBytecodeOperationRemainderLongInPlace
@@ -867,6 +1130,7 @@ type DalvikBytecodeOperationBinaryOperationInPlace =
867
1130
  | DalvikBytecodeOperationSubtractFloatInPlace
868
1131
  | DalvikBytecodeOperationMultiplyFloatInPlace
869
1132
  | DalvikBytecodeOperationDivideFloatInPlace
1133
+ | DalvikBytecodeOperationRemainderFloatInPlace
870
1134
  | DalvikBytecodeOperationAddDoubleInPlace
871
1135
  | DalvikBytecodeOperationSubtractDoubleInPlace
872
1136
  | DalvikBytecodeOperationMultiplyDoubleInPlace
@@ -874,7 +1138,7 @@ type DalvikBytecodeOperationBinaryOperationInPlace =
874
1138
  | DalvikBytecodeOperationRemainderDoubleInPlace
875
1139
  ;
876
1140
 
877
- const dalvikBytecodeOperationBinaryOperationInPlaceParser: Parser<DalvikBytecodeOperationBinaryOperationInPlace, Uint8Array> = createUnionParser([
1141
+ const dalvikBytecodeOperationBinaryOperationInPlaceParser: Parser<DalvikBytecodeOperationBinaryOperationInPlace, Uint8Array> = createDisjunctionParser([
878
1142
  dalvikBytecodeOperationAddIntInPlaceParser,
879
1143
  dalvikBytecodeOperationReverseSubtractIntInPlaceParser,
880
1144
  dalvikBytecodeOperationMultiplyIntInPlaceParser,
@@ -887,7 +1151,7 @@ const dalvikBytecodeOperationBinaryOperationInPlaceParser: Parser<DalvikBytecode
887
1151
  dalvikBytecodeOperationShiftRightIntInPlaceParser,
888
1152
  dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser,
889
1153
  dalvikBytecodeOperationAddLongInPlaceParser,
890
- dalvikBytecodeOperationReverseSubtractLongInPlaceParser,
1154
+ dalvikBytecodeOperationSubtractLongInPlaceParser,
891
1155
  dalvikBytecodeOperationMultiplyLongInPlaceParser,
892
1156
  dalvikBytecodeOperationDivideLongInPlaceParser,
893
1157
  dalvikBytecodeOperationRemainderLongInPlaceParser,
@@ -901,6 +1165,7 @@ const dalvikBytecodeOperationBinaryOperationInPlaceParser: Parser<DalvikBytecode
901
1165
  dalvikBytecodeOperationSubtractFloatInPlaceParser,
902
1166
  dalvikBytecodeOperationMultiplyFloatInPlaceParser,
903
1167
  dalvikBytecodeOperationDivideFloatInPlaceParser,
1168
+ dalvikBytecodeOperationRemainderFloatInPlaceParser,
904
1169
  dalvikBytecodeOperationAddDoubleInPlaceParser,
905
1170
  dalvikBytecodeOperationSubtractDoubleInPlaceParser,
906
1171
  dalvikBytecodeOperationMultiplyDoubleInPlaceParser,
@@ -964,87 +1229,87 @@ const dalvikBytecodeOperationShiftRightIntParser = createDalvikBytecodeOperation
964
1229
 
965
1230
  type DalvikBytecodeOperationShiftRightInt = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightIntParser>>;
966
1231
 
967
- const dalvikBytecodeOperationUnsignedShiftRightIntParser = createDalvikBytecodeOperationBinaryOperation('ushr-int', 0x9a);
1232
+ const dalvikBytecodeOperationUnsignedShiftRightIntParser = createDalvikBytecodeOperationBinaryOperation('ushr-int', 0x9A);
968
1233
 
969
1234
  type DalvikBytecodeOperationUnsignedShiftRightInt = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightIntParser>>;
970
1235
 
971
- const dalvikBytecodeOperationAddLongParser = createDalvikBytecodeOperationBinaryOperation('add-long', 0x9b);
1236
+ const dalvikBytecodeOperationAddLongParser = createDalvikBytecodeOperationBinaryOperation('add-long', 0x9B);
972
1237
 
973
1238
  type DalvikBytecodeOperationAddLong = Awaited<ReturnType<typeof dalvikBytecodeOperationAddLongParser>>;
974
1239
 
975
- const dalvikBytecodeOperationSubtractLongParser = createDalvikBytecodeOperationBinaryOperation('sub-long', 0x9c);
1240
+ const dalvikBytecodeOperationSubtractLongParser = createDalvikBytecodeOperationBinaryOperation('sub-long', 0x9C);
976
1241
 
977
1242
  type DalvikBytecodeOperationSubtractLong = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractLongParser>>;
978
1243
 
979
- const dalvikBytecodeOperationMultiplyLongParser = createDalvikBytecodeOperationBinaryOperation('mul-long', 0x9d);
1244
+ const dalvikBytecodeOperationMultiplyLongParser = createDalvikBytecodeOperationBinaryOperation('mul-long', 0x9D);
980
1245
 
981
1246
  type DalvikBytecodeOperationMultiplyLong = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyLongParser>>;
982
1247
 
983
- const dalvikBytecodeOperationDivideLongParser = createDalvikBytecodeOperationBinaryOperation('div-long', 0x9e);
1248
+ const dalvikBytecodeOperationDivideLongParser = createDalvikBytecodeOperationBinaryOperation('div-long', 0x9E);
984
1249
 
985
1250
  type DalvikBytecodeOperationDivideLong = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideLongParser>>;
986
1251
 
987
- const dalvikBytecodeOperationRemainderLongParser = createDalvikBytecodeOperationBinaryOperation('rem-long', 0x9f);
1252
+ const dalvikBytecodeOperationRemainderLongParser = createDalvikBytecodeOperationBinaryOperation('rem-long', 0x9F);
988
1253
 
989
1254
  type DalvikBytecodeOperationRemainderLong = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderLongParser>>;
990
1255
 
991
- const dalvikBytecodeOperationAndLongParser = createDalvikBytecodeOperationBinaryOperation('and-long', 0xa0);
1256
+ const dalvikBytecodeOperationAndLongParser = createDalvikBytecodeOperationBinaryOperation('and-long', 0xA0);
992
1257
 
993
1258
  type DalvikBytecodeOperationAndLong = Awaited<ReturnType<typeof dalvikBytecodeOperationAndLongParser>>;
994
1259
 
995
- const dalvikBytecodeOperationOrLongParser = createDalvikBytecodeOperationBinaryOperation('or-long', 0xa1);
1260
+ const dalvikBytecodeOperationOrLongParser = createDalvikBytecodeOperationBinaryOperation('or-long', 0xA1);
996
1261
 
997
1262
  type DalvikBytecodeOperationOrLong = Awaited<ReturnType<typeof dalvikBytecodeOperationOrLongParser>>;
998
1263
 
999
- const dalvikBytecodeOperationXorLongParser = createDalvikBytecodeOperationBinaryOperation('xor-long', 0xa2);
1264
+ const dalvikBytecodeOperationXorLongParser = createDalvikBytecodeOperationBinaryOperation('xor-long', 0xA2);
1000
1265
 
1001
1266
  type DalvikBytecodeOperationXorLong = Awaited<ReturnType<typeof dalvikBytecodeOperationXorLongParser>>;
1002
1267
 
1003
- const dalvikBytecodeOperationShiftLeftLongParser = createDalvikBytecodeOperationBinaryOperation('shl-long', 0xa3);
1268
+ const dalvikBytecodeOperationShiftLeftLongParser = createDalvikBytecodeOperationBinaryOperation('shl-long', 0xA3);
1004
1269
 
1005
1270
  type DalvikBytecodeOperationShiftLeftLong = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftLeftLongParser>>;
1006
1271
 
1007
- const dalvikBytecodeOperationShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('shr-long', 0xa4);
1272
+ const dalvikBytecodeOperationShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('shr-long', 0xA4);
1008
1273
 
1009
1274
  type DalvikBytecodeOperationShiftRightLong = Awaited<ReturnType<typeof dalvikBytecodeOperationShiftRightLongParser>>;
1010
1275
 
1011
- const dalvikBytecodeOperationUnsignedShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('ushr-long', 0xa5);
1276
+ const dalvikBytecodeOperationUnsignedShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('ushr-long', 0xA5);
1012
1277
 
1013
1278
  type DalvikBytecodeOperationUnsignedShiftRightLong = Awaited<ReturnType<typeof dalvikBytecodeOperationUnsignedShiftRightLongParser>>;
1014
1279
 
1015
- const dalvikBytecodeOperationAddFloatParser = createDalvikBytecodeOperationBinaryOperation('add-float', 0xa6);
1280
+ const dalvikBytecodeOperationAddFloatParser = createDalvikBytecodeOperationBinaryOperation('add-float', 0xA6);
1016
1281
 
1017
1282
  type DalvikBytecodeOperationAddFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationAddFloatParser>>;
1018
1283
 
1019
- const dalvikBytecodeOperationSubtractFloatParser = createDalvikBytecodeOperationBinaryOperation('sub-float', 0xa7);
1284
+ const dalvikBytecodeOperationSubtractFloatParser = createDalvikBytecodeOperationBinaryOperation('sub-float', 0xA7);
1020
1285
 
1021
1286
  type DalvikBytecodeOperationSubtractFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractFloatParser>>;
1022
1287
 
1023
- const dalvikBytecodeOperationMultiplyFloatParser = createDalvikBytecodeOperationBinaryOperation('mul-float', 0xa8);
1288
+ const dalvikBytecodeOperationMultiplyFloatParser = createDalvikBytecodeOperationBinaryOperation('mul-float', 0xA8);
1024
1289
 
1025
1290
  type DalvikBytecodeOperationMultiplyFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyFloatParser>>;
1026
1291
 
1027
- const dalvikBytecodeOperationDivideFloatParser = createDalvikBytecodeOperationBinaryOperation('div-float', 0xa9);
1292
+ const dalvikBytecodeOperationDivideFloatParser = createDalvikBytecodeOperationBinaryOperation('div-float', 0xA9);
1028
1293
 
1029
1294
  type DalvikBytecodeOperationDivideFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideFloatParser>>;
1030
1295
 
1031
- const dalvikBytecodeOperationAddDoubleParser = createDalvikBytecodeOperationBinaryOperation('add-double', 0xaa);
1296
+ const dalvikBytecodeOperationAddDoubleParser = createDalvikBytecodeOperationBinaryOperation('add-double', 0xAB);
1032
1297
 
1033
1298
  type DalvikBytecodeOperationAddDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationAddDoubleParser>>;
1034
1299
 
1035
- const dalvikBytecodeOperationSubtractDoubleParser = createDalvikBytecodeOperationBinaryOperation('sub-double', 0xab);
1300
+ const dalvikBytecodeOperationSubtractDoubleParser = createDalvikBytecodeOperationBinaryOperation('sub-double', 0xAC);
1036
1301
 
1037
1302
  type DalvikBytecodeOperationSubtractDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationSubtractDoubleParser>>;
1038
1303
 
1039
- const dalvikBytecodeOperationMultiplyDoubleParser = createDalvikBytecodeOperationBinaryOperation('mul-double', 0xac);
1304
+ const dalvikBytecodeOperationMultiplyDoubleParser = createDalvikBytecodeOperationBinaryOperation('mul-double', 0xAD);
1040
1305
 
1041
1306
  type DalvikBytecodeOperationMultiplyDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationMultiplyDoubleParser>>;
1042
1307
 
1043
- const dalvikBytecodeOperationDivideDoubleParser = createDalvikBytecodeOperationBinaryOperation('div-double', 0xad);
1308
+ const dalvikBytecodeOperationDivideDoubleParser = createDalvikBytecodeOperationBinaryOperation('div-double', 0xAE);
1044
1309
 
1045
1310
  type DalvikBytecodeOperationDivideDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationDivideDoubleParser>>;
1046
1311
 
1047
- const dalvikBytecodeOperationRemainderDoubleParser = createDalvikBytecodeOperationBinaryOperation('rem-double', 0xae);
1312
+ const dalvikBytecodeOperationRemainderDoubleParser = createDalvikBytecodeOperationBinaryOperation('rem-double', 0xAF);
1048
1313
 
1049
1314
  type DalvikBytecodeOperationRemainderDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationRemainderDoubleParser>>;
1050
1315
 
@@ -1082,7 +1347,7 @@ type DalvikBytecodeOperationBinaryOperation =
1082
1347
  | DalvikBytecodeOperationRemainderDouble
1083
1348
  ;
1084
1349
 
1085
- const dalvikBytecodeOperationBinaryOperationParser: Parser<DalvikBytecodeOperationBinaryOperation, Uint8Array> = createUnionParser([
1350
+ const dalvikBytecodeOperationBinaryOperationParser: Parser<DalvikBytecodeOperationBinaryOperation, Uint8Array> = createDisjunctionParser([
1086
1351
  dalvikBytecodeOperationAddIntParser,
1087
1352
  dalvikBytecodeOperationSubtractIntParser,
1088
1353
  dalvikBytecodeOperationMultiplyIntParser,
@@ -1132,23 +1397,23 @@ const createDalvikBytecodeOperationUnaryOperation = <T extends string>(operation
1132
1397
  }),
1133
1398
  );
1134
1399
 
1135
- const dalvikBytecodeOperationNegateIntParser = createDalvikBytecodeOperationUnaryOperation('neg-int', 0x7b);
1400
+ const dalvikBytecodeOperationNegateIntParser = createDalvikBytecodeOperationUnaryOperation('neg-int', 0x7B);
1136
1401
 
1137
1402
  type DalvikBytecodeOperationNegateInt = Awaited<ReturnType<typeof dalvikBytecodeOperationNegateIntParser>>;
1138
1403
 
1139
- const dalvikBytecodeOperationNotIntParser = createDalvikBytecodeOperationUnaryOperation('not-int', 0x7c);
1404
+ const dalvikBytecodeOperationNotIntParser = createDalvikBytecodeOperationUnaryOperation('not-int', 0x7C);
1140
1405
 
1141
1406
  type DalvikBytecodeOperationNotInt = Awaited<ReturnType<typeof dalvikBytecodeOperationNotIntParser>>;
1142
1407
 
1143
- const dalvikBytecodeOperationNegateLongParser = createDalvikBytecodeOperationUnaryOperation('neg-long', 0x7d);
1408
+ const dalvikBytecodeOperationNegateLongParser = createDalvikBytecodeOperationUnaryOperation('neg-long', 0x7D);
1144
1409
 
1145
1410
  type DalvikBytecodeOperationNegateLong = Awaited<ReturnType<typeof dalvikBytecodeOperationNegateLongParser>>;
1146
1411
 
1147
- const dalvikBytecodeOperationNotLongParser = createDalvikBytecodeOperationUnaryOperation('not-long', 0x7e);
1412
+ const dalvikBytecodeOperationNotLongParser = createDalvikBytecodeOperationUnaryOperation('not-long', 0x7E);
1148
1413
 
1149
1414
  type DalvikBytecodeOperationNotLong = Awaited<ReturnType<typeof dalvikBytecodeOperationNotLongParser>>;
1150
1415
 
1151
- const dalvikBytecodeOperationNegateFloatParser = createDalvikBytecodeOperationUnaryOperation('neg-float', 0x7f);
1416
+ const dalvikBytecodeOperationNegateFloatParser = createDalvikBytecodeOperationUnaryOperation('neg-float', 0x7F);
1152
1417
 
1153
1418
  type DalvikBytecodeOperationNegateFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationNegateFloatParser>>;
1154
1419
 
@@ -1192,27 +1457,27 @@ const dalvikBytecodeOperationFloatToDoubleParser = createDalvikBytecodeOperation
1192
1457
 
1193
1458
  type DalvikBytecodeOperationFloatToDouble = Awaited<ReturnType<typeof dalvikBytecodeOperationFloatToDoubleParser>>;
1194
1459
 
1195
- const dalvikBytecodeOperationDoubleToIntParser = createDalvikBytecodeOperationUnaryOperation('double-to-int', 0x8a);
1460
+ const dalvikBytecodeOperationDoubleToIntParser = createDalvikBytecodeOperationUnaryOperation('double-to-int', 0x8A);
1196
1461
 
1197
1462
  type DalvikBytecodeOperationDoubleToInt = Awaited<ReturnType<typeof dalvikBytecodeOperationDoubleToIntParser>>;
1198
1463
 
1199
- const dalvikBytecodeOperationDoubleToLongParser = createDalvikBytecodeOperationUnaryOperation('double-to-long', 0x8b);
1464
+ const dalvikBytecodeOperationDoubleToLongParser = createDalvikBytecodeOperationUnaryOperation('double-to-long', 0x8B);
1200
1465
 
1201
1466
  type DalvikBytecodeOperationDoubleToLong = Awaited<ReturnType<typeof dalvikBytecodeOperationDoubleToLongParser>>;
1202
1467
 
1203
- const dalvikBytecodeOperationDoubleToFloatParser = createDalvikBytecodeOperationUnaryOperation('double-to-float', 0x8c);
1468
+ const dalvikBytecodeOperationDoubleToFloatParser = createDalvikBytecodeOperationUnaryOperation('double-to-float', 0x8C);
1204
1469
 
1205
1470
  type DalvikBytecodeOperationDoubleToFloat = Awaited<ReturnType<typeof dalvikBytecodeOperationDoubleToFloatParser>>;
1206
1471
 
1207
- const dalvikBytecodeOperationIntToByteParser = createDalvikBytecodeOperationUnaryOperation('int-to-byte', 0x8d);
1472
+ const dalvikBytecodeOperationIntToByteParser = createDalvikBytecodeOperationUnaryOperation('int-to-byte', 0x8D);
1208
1473
 
1209
1474
  type DalvikBytecodeOperationIntToByte = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToByteParser>>;
1210
1475
 
1211
- const dalvikBytecodeOperationIntToCharParser = createDalvikBytecodeOperationUnaryOperation('int-to-char', 0x8e);
1476
+ const dalvikBytecodeOperationIntToCharParser = createDalvikBytecodeOperationUnaryOperation('int-to-char', 0x8E);
1212
1477
 
1213
1478
  type DalvikBytecodeOperationIntToChar = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToCharParser>>;
1214
1479
 
1215
- const dalvikBytecodeOperationIntToShortParser = createDalvikBytecodeOperationUnaryOperation('int-to-short', 0x8f);
1480
+ const dalvikBytecodeOperationIntToShortParser = createDalvikBytecodeOperationUnaryOperation('int-to-short', 0x8F);
1216
1481
 
1217
1482
  type DalvikBytecodeOperationIntToShort = Awaited<ReturnType<typeof dalvikBytecodeOperationIntToShortParser>>;
1218
1483
 
@@ -1240,7 +1505,7 @@ type DalvikBytecodeOperationUnaryOperation =
1240
1505
  | DalvikBytecodeOperationIntToShort
1241
1506
  ;
1242
1507
 
1243
- const dalvikBytecodeOperationUnaryOperationParser: Parser<DalvikBytecodeOperationUnaryOperation, Uint8Array> = createUnionParser([
1508
+ const dalvikBytecodeOperationUnaryOperationParser: Parser<DalvikBytecodeOperationUnaryOperation, Uint8Array> = createDisjunctionParser([
1244
1509
  dalvikBytecodeOperationNegateIntParser,
1245
1510
  dalvikBytecodeOperationNotIntParser,
1246
1511
  dalvikBytecodeOperationNegateLongParser,
@@ -1266,6 +1531,24 @@ const dalvikBytecodeOperationUnaryOperationParser: Parser<DalvikBytecodeOperatio
1266
1531
 
1267
1532
  setParserName(dalvikBytecodeOperationUnaryOperationParser, 'dalvikBytecodeOperationUnaryOperationParser');
1268
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
1269
1552
  const createDalvikBytecodeOperationIfTest = <T extends string>(operation: T, opcode: number): Parser<{
1270
1553
  operation: T;
1271
1554
  registers: number[];
@@ -1277,16 +1560,16 @@ const createDalvikBytecodeOperationIfTest = <T extends string>(operation: T, opc
1277
1560
  ]),
1278
1561
  ([ _opcode, { registers, branchOffset } ]) => ({
1279
1562
  operation,
1280
- registers,
1563
+ registers: registers.reverse(),
1281
1564
  branchOffset,
1282
1565
  }),
1283
1566
  );
1284
1567
 
1285
- const dalvikBytecodeIfEqualParser = createDalvikBytecodeOperationIfTest('if-eq', 0x32);
1568
+ const dalvikBytecodeIfEqualParser = createDalvikBytecodeOperationIfTestCommutative('if-eq', 0x32);
1286
1569
 
1287
1570
  type DalvikBytecodeOperationIfEqual = Awaited<ReturnType<typeof dalvikBytecodeIfEqualParser>>;
1288
1571
 
1289
- const dalvikBytecodeIfNotEqualParser = createDalvikBytecodeOperationIfTest('if-neq', 0x33);
1572
+ const dalvikBytecodeIfNotEqualParser = createDalvikBytecodeOperationIfTestCommutative('if-ne', 0x33);
1290
1573
 
1291
1574
  type DalvikBytecodeOperationIfNotEqual = Awaited<ReturnType<typeof dalvikBytecodeIfNotEqualParser>>;
1292
1575
 
@@ -1315,7 +1598,7 @@ type DalvikBytecodeOperationIfTest =
1315
1598
  | DalvikBytecodeOperationIfLessThanOrEqualTo
1316
1599
  ;
1317
1600
 
1318
- const dalvikBytecodeOperationIfTestParser: Parser<DalvikBytecodeOperationIfTest, Uint8Array> = createUnionParser([
1601
+ const dalvikBytecodeOperationIfTestParser: Parser<DalvikBytecodeOperationIfTest, Uint8Array> = createDisjunctionParser([
1319
1602
  dalvikBytecodeIfEqualParser,
1320
1603
  dalvikBytecodeIfNotEqualParser,
1321
1604
  dalvikBytecodeIfLessThanParser,
@@ -1350,19 +1633,19 @@ const dalvikBytecodeIfNotEqualZeroParser = createDalvikBytecodeOperationIfTestZe
1350
1633
 
1351
1634
  type DalvikBytecodeOperationIfNotEqualZero = Awaited<ReturnType<typeof dalvikBytecodeIfNotEqualZeroParser>>;
1352
1635
 
1353
- const dalvikBytecodeIfLessThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-ltz', 0x3a);
1636
+ const dalvikBytecodeIfLessThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-ltz', 0x3A);
1354
1637
 
1355
1638
  type DalvikBytecodeOperationIfLessThanZero = Awaited<ReturnType<typeof dalvikBytecodeIfLessThanZeroParser>>;
1356
1639
 
1357
- const dalvikBytecodeIfGreaterThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-gez', 0x3b);
1640
+ const dalvikBytecodeIfGreaterThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-gez', 0x3B);
1358
1641
 
1359
1642
  type DalvikBytecodeOperationIfGreaterThanOrEqualToZero = Awaited<ReturnType<typeof dalvikBytecodeIfGreaterThanOrEqualToZeroParser>>;
1360
1643
 
1361
- const dalvikBytecodeIfGreaterThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-gtz', 0x3c);
1644
+ const dalvikBytecodeIfGreaterThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-gtz', 0x3C);
1362
1645
 
1363
1646
  type DalvikBytecodeOperationIfGreaterThanZero = Awaited<ReturnType<typeof dalvikBytecodeIfGreaterThanZeroParser>>;
1364
1647
 
1365
- const dalvikBytecodeIfLessThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-lez', 0x3d);
1648
+ const dalvikBytecodeIfLessThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-lez', 0x3D);
1366
1649
 
1367
1650
  type DalvikBytecodeOperationIfLessThanOrEqualToZero = Awaited<ReturnType<typeof dalvikBytecodeIfLessThanOrEqualToZeroParser>>;
1368
1651
 
@@ -1375,7 +1658,7 @@ type DalvikBytecodeOperationIfTestZero =
1375
1658
  | DalvikBytecodeOperationIfLessThanOrEqualToZero
1376
1659
  ;
1377
1660
 
1378
- const dalvikBytecodeOperationIfTestZeroParser: Parser<DalvikBytecodeOperationIfTestZero, Uint8Array> = createUnionParser([
1661
+ const dalvikBytecodeOperationIfTestZeroParser: Parser<DalvikBytecodeOperationIfTestZero, Uint8Array> = createDisjunctionParser([
1379
1662
  dalvikBytecodeIfEqualZeroParser,
1380
1663
  dalvikBytecodeIfNotEqualZeroParser,
1381
1664
  dalvikBytecodeIfLessThanZeroParser,
@@ -1394,7 +1677,7 @@ type DalvikBytecodeOperationConstString = {
1394
1677
 
1395
1678
  const dalvikBytecodeOperationConstStringParser: Parser<DalvikBytecodeOperationConstString, Uint8Array> = promiseCompose(
1396
1679
  createTupleParser([
1397
- createExactElementParser(0x1a),
1680
+ createExactElementParser(0x1A),
1398
1681
  createDalvikBytecodeFormat21cParser({
1399
1682
  isoIndex: isoIndexIntoStringIds,
1400
1683
  }),
@@ -1408,6 +1691,28 @@ const dalvikBytecodeOperationConstStringParser: Parser<DalvikBytecodeOperationCo
1408
1691
 
1409
1692
  setParserName(dalvikBytecodeOperationConstStringParser, 'dalvikBytecodeOperationConstStringParser');
1410
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
+
1411
1716
  type DalvikBytecodeOperationConstMethodHandle = {
1412
1717
  operation: 'const-method-handle';
1413
1718
  methodIndex: IndexIntoMethodIds;
@@ -1416,7 +1721,7 @@ type DalvikBytecodeOperationConstMethodHandle = {
1416
1721
 
1417
1722
  const dalvikBytecodeOperationConstMethodHandleParser: Parser<DalvikBytecodeOperationConstMethodHandle, Uint8Array> = promiseCompose(
1418
1723
  createTupleParser([
1419
- createExactElementParser(0xfe),
1724
+ createExactElementParser(0xFE),
1420
1725
  createDalvikBytecodeFormat21cParser({
1421
1726
  isoIndex: isoIndexIntoMethodIds,
1422
1727
  }),
@@ -1474,6 +1779,70 @@ const dalvikBytecodeOperationNewArrayParser: Parser<DalvikBytecodeOperationNewAr
1474
1779
 
1475
1780
  setParserName(dalvikBytecodeOperationNewArrayParser, 'dalvikBytecodeOperationNewArrayParser');
1476
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
+
1477
1846
  type DalvikBytecodeOperationCheckCast = {
1478
1847
  operation: 'check-cast';
1479
1848
  typeIndex: IndexIntoTypeIds;
@@ -1482,7 +1851,7 @@ type DalvikBytecodeOperationCheckCast = {
1482
1851
 
1483
1852
  const dalvikBytecodeOperationCheckCastParser: Parser<DalvikBytecodeOperationCheckCast, Uint8Array> = promiseCompose(
1484
1853
  createTupleParser([
1485
- createExactElementParser(0x1f),
1854
+ createExactElementParser(0x1F),
1486
1855
  createDalvikBytecodeFormat21cParser({
1487
1856
  isoIndex: isoIndexIntoTypeIds,
1488
1857
  }),
@@ -1496,6 +1865,24 @@ const dalvikBytecodeOperationCheckCastParser: Parser<DalvikBytecodeOperationChec
1496
1865
 
1497
1866
  setParserName(dalvikBytecodeOperationCheckCastParser, 'dalvikBytecodeOperationCheckCastParser');
1498
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
+
1499
1886
  type DalvikBytecodeOperationConstClass = {
1500
1887
  operation: 'const-class';
1501
1888
  typeIndex: IndexIntoTypeIds;
@@ -1504,7 +1891,7 @@ type DalvikBytecodeOperationConstClass = {
1504
1891
 
1505
1892
  const dalvikBytecodeOperationConstClassParser: Parser<DalvikBytecodeOperationConstClass, Uint8Array> = promiseCompose(
1506
1893
  createTupleParser([
1507
- createExactElementParser(0x1c),
1894
+ createExactElementParser(0x1C),
1508
1895
  createDalvikBytecodeFormat21cParser({
1509
1896
  isoIndex: isoIndexIntoTypeIds,
1510
1897
  }),
@@ -1518,13 +1905,49 @@ const dalvikBytecodeOperationConstClassParser: Parser<DalvikBytecodeOperationCon
1518
1905
 
1519
1906
  setParserName(dalvikBytecodeOperationConstClassParser, 'dalvikBytecodeOperationConstClassParser');
1520
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
+
1521
1944
  type DalvikBytecodeOperationReturnVoid = {
1522
1945
  operation: 'return-void';
1523
1946
  };
1524
1947
 
1525
1948
  const dalvikBytecodeOperationReturnVoidParser: Parser<DalvikBytecodeOperationReturnVoid, Uint8Array> = promiseCompose(
1526
1949
  createTupleParser([
1527
- createExactElementParser(0x0e),
1950
+ createExactElementParser(0x0E),
1528
1951
  dalvikBytecodeFormat10xParser,
1529
1952
  ]),
1530
1953
  () => ({
@@ -1548,19 +1971,19 @@ const createDalvikBytecodeMoveResult1Parser = <T extends string>(operation: T, o
1548
1971
  }),
1549
1972
  );
1550
1973
 
1551
- const dalvikBytecodeMoveResultParser = createDalvikBytecodeMoveResult1Parser('move-result', 0x0a);
1974
+ const dalvikBytecodeMoveResultParser = createDalvikBytecodeMoveResult1Parser('move-result', 0x0A);
1552
1975
 
1553
1976
  type DalvikBytecodeOperationMoveResult = Awaited<ReturnType<typeof dalvikBytecodeMoveResultParser>>;
1554
1977
 
1555
- const dalvikBytecodeMoveResultWideParser = createDalvikBytecodeMoveResult1Parser('move-result-wide', 0x0b);
1978
+ const dalvikBytecodeMoveResultWideParser = createDalvikBytecodeMoveResult1Parser('move-result-wide', 0x0B);
1556
1979
 
1557
1980
  type DalvikBytecodeOperationMoveResultWide = Awaited<ReturnType<typeof dalvikBytecodeMoveResultWideParser>>;
1558
1981
 
1559
- const dalvikBytecodeMoveResultObjectParser = createDalvikBytecodeMoveResult1Parser('move-result-object', 0x0c);
1982
+ const dalvikBytecodeMoveResultObjectParser = createDalvikBytecodeMoveResult1Parser('move-result-object', 0x0C);
1560
1983
 
1561
1984
  type DalvikBytecodeOperationMoveResultObject = Awaited<ReturnType<typeof dalvikBytecodeMoveResultObjectParser>>;
1562
1985
 
1563
- const dalvikBytecodeMoveExceptionParser = createDalvikBytecodeMoveResult1Parser('move-exception', 0x0d);
1986
+ const dalvikBytecodeMoveExceptionParser = createDalvikBytecodeMoveResult1Parser('move-exception', 0x0D);
1564
1987
 
1565
1988
  type DalvikBytecodeOperationMoveException = Awaited<ReturnType<typeof dalvikBytecodeMoveExceptionParser>>;
1566
1989
 
@@ -1571,7 +1994,7 @@ type DalvikBytecodeOperationMoveResult1 =
1571
1994
  | DalvikBytecodeOperationMoveException
1572
1995
  ;
1573
1996
 
1574
- const dalvikBytecodeOperationMoveResult1Parser: Parser<DalvikBytecodeOperationMoveResult1, Uint8Array> = createUnionParser([
1997
+ const dalvikBytecodeOperationMoveResult1Parser: Parser<DalvikBytecodeOperationMoveResult1, Uint8Array> = createDisjunctionParser([
1575
1998
  dalvikBytecodeMoveResultParser,
1576
1999
  dalvikBytecodeMoveResultWideParser,
1577
2000
  dalvikBytecodeMoveResultObjectParser,
@@ -1702,7 +2125,7 @@ setParserName(dalvikBytecodeOperationMoveWide16Parser, 'dalvikBytecodeOperationM
1702
2125
 
1703
2126
  const createDalvikBytecodeOperationReturn1Parser = createDalvikBytecodeMoveResult1Parser;
1704
2127
 
1705
- const dalvikBytecodeOperationReturnParser = createDalvikBytecodeOperationReturn1Parser('return', 0x0f);
2128
+ const dalvikBytecodeOperationReturnParser = createDalvikBytecodeOperationReturn1Parser('return', 0x0F);
1706
2129
 
1707
2130
  type DalvikBytecodeOperationReturn = Awaited<ReturnType<typeof dalvikBytecodeOperationReturnParser>>;
1708
2131
 
@@ -1720,7 +2143,7 @@ type DalvikBytecodeOperationReturn1 =
1720
2143
  | DalvikBytecodeOperationReturnObject
1721
2144
  ;
1722
2145
 
1723
- const dalvikBytecodeOperationReturn1Parser: Parser<DalvikBytecodeOperationReturn1, Uint8Array> = createUnionParser([
2146
+ const dalvikBytecodeOperationReturn1Parser: Parser<DalvikBytecodeOperationReturn1, Uint8Array> = createDisjunctionParser([
1724
2147
  dalvikBytecodeOperationReturnParser,
1725
2148
  dalvikBytecodeOperationReturnWideParser,
1726
2149
  dalvikBytecodeOperationReturnObjectParser,
@@ -1737,20 +2160,15 @@ type DalvikBytecodeOperationConst4 = {
1737
2160
  const dalvikBytecodeOperationConst4Parser: Parser<DalvikBytecodeOperationConst4, Uint8Array> = promiseCompose(
1738
2161
  createTupleParser([
1739
2162
  createExactElementParser(0x12),
1740
- nibblesParser,
2163
+ dalvikBytecodeFormat11nParser,
1741
2164
  ]),
1742
2165
  ([
1743
2166
  _opcode,
1744
- [
1745
- register0,
1746
- value,
1747
- ],
2167
+ { value, registers },
1748
2168
  ]) => ({
1749
2169
  operation: 'const/4',
1750
- registers: [
1751
- register0,
1752
- ],
1753
- value: value << 28 >> 28,
2170
+ registers,
2171
+ value,
1754
2172
  }),
1755
2173
  );
1756
2174
 
@@ -1816,6 +2234,66 @@ const dalvikBytecodeOperationConstWide16Parser: Parser<DalvikBytecodeOperationCo
1816
2234
 
1817
2235
  setParserName(dalvikBytecodeOperationConstWide16Parser, 'dalvikBytecodeOperationConstWide16Parser');
1818
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
+
1819
2297
  type DalvikBytecodeOperationConst = {
1820
2298
  operation: 'const';
1821
2299
  registers: number[];
@@ -1868,15 +2346,15 @@ const createDalvikBytecodeOperationCompare = <T extends string>(operation: T, op
1868
2346
  }),
1869
2347
  );
1870
2348
 
1871
- const dalvikBytecodeOperationCompareFloatWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-float', 0x2d);
2349
+ const dalvikBytecodeOperationCompareFloatWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-float', 0x2D);
1872
2350
 
1873
2351
  type DalvikBytecodeOperationCompareFloatWithLessThanBias = Awaited<ReturnType<typeof dalvikBytecodeOperationCompareFloatWithLessThanBiasParser>>;
1874
2352
 
1875
- const dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser = createDalvikBytecodeOperationCompare('cmpg-float', 0x2e);
2353
+ const dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser = createDalvikBytecodeOperationCompare('cmpg-float', 0x2E);
1876
2354
 
1877
2355
  type DalvikBytecodeOperationCompareFloatWithGreaterThanBias = Awaited<ReturnType<typeof dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser>>;
1878
2356
 
1879
- const dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-double', 0x2f);
2357
+ const dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-double', 0x2F);
1880
2358
 
1881
2359
  type DalvikBytecodeOperationCompareDoubleWithLessThanBias = Awaited<ReturnType<typeof dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser>>;
1882
2360
 
@@ -1896,7 +2374,7 @@ type DalvikBytecodeOperationCompare =
1896
2374
  | DalvikBytecodeOperationCompareLong
1897
2375
  ;
1898
2376
 
1899
- const dalvikBytecodeOperationCompareParser: Parser<DalvikBytecodeOperationCompare, Uint8Array> = createUnionParser([
2377
+ const dalvikBytecodeOperationCompareParser: Parser<DalvikBytecodeOperationCompare, Uint8Array> = createDisjunctionParser([
1900
2378
  dalvikBytecodeOperationCompareFloatWithLessThanBiasParser,
1901
2379
  dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser,
1902
2380
  dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser,
@@ -1909,16 +2387,76 @@ setParserName(dalvikBytecodeOperationCompareParser, 'dalvikBytecodeOperationComp
1909
2387
  export type DalvikBytecodeOperation =
1910
2388
  | DalvikBytecodeOperationNoOperation
1911
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
+
1912
2421
  | DalvikBytecodeOperationInvoke
2422
+ | DalvikBytecodeOperationInvokeRange
2423
+ | DalvikBytecodeOperationInvokePolymorphic
2424
+ | DalvikBytecodeOperationInvokePolymorphicRange
2425
+
1913
2426
  | DalvikBytecodeOperationNewInstance
2427
+
2428
+ | DalvikBytecodeOperationFillArrayData
1914
2429
  | DalvikBytecodeOperationCheckCast
1915
2430
  | DalvikBytecodeOperationInstanceOf
2431
+ | DalvikBytecodeOperationArrayLength
1916
2432
 
1917
- | DalvikBytecodeOperationReturnVoid
2433
+ | DalvikBytecodeOperationArrayElement
2434
+ | DalvikBytecodeOperationInstanceField
2435
+ | DalvikBytecodeOperationStaticField
1918
2436
 
1919
- | DalvikBytecodeOperationMoveResult1
1920
- ;
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
1921
2453
 
2454
+ | DalvikBytecodeOperationThrow
2455
+
2456
+ | DalvikBytecodeOperationCompare
2457
+
2458
+ | DalvikBytecodeOperationReturnVoid
2459
+ | DalvikBytecodeOperationReturn1;
1922
2460
  export const dalvikBytecodeOperationCompanion = {
1923
2461
  getRegisters(operation: DalvikBytecodeOperation): number[] {
1924
2462
  if (operation && typeof operation === 'object' && 'registers' in operation) {
@@ -1929,73 +2467,336 @@ export const dalvikBytecodeOperationCompanion = {
1929
2467
  },
1930
2468
  };
1931
2469
 
1932
- const dalvikBytecodeOperationParser: Parser<DalvikBytecodeOperation | undefined, Uint8Array> = promiseCompose(
1933
- createTupleParser([
1934
- () => {},
1935
- //createDebugLogInputParser(),
1936
- createUnionParser<DalvikBytecodeOperation, Uint8Array>([
1937
- dalvikBytecodeOperationUnusedParser,
1938
-
1939
- dalvikBytecodeOperationNoOperationParser,
1940
-
1941
- dalvikBytecodeOperationInvokeParser,
1942
- dalvikBytecodeOperationInvokeRangeParser,
1943
-
1944
- dalvikBytecodeOperationNewInstanceParser,
1945
- dalvikBytecodeOperationNewArrayParser,
1946
- dalvikBytecodeOperationCheckCastParser,
1947
- dalvikBytecodeOperationInstanceOfParser,
1948
-
1949
- dalvikBytecodeOperationArrayElementParser,
1950
- dalvikBytecodeOperationInstanceFieldParser,
1951
- dalvikBytecodeOperationStaticFieldParser,
1952
-
1953
- dalvikBytecodeOperationConstStringParser,
1954
- dalvikBytecodeOperationConstMethodHandleParser,
1955
- dalvikBytecodeOperationConstClassParser,
1956
-
1957
- dalvikBytecodeOperationReturnVoidParser,
1958
- dalvikBytecodeOperationReturn1Parser,
1959
-
1960
- dalvikBytecodeOperationThrowParser,
1961
-
1962
- dalvikBytecodeOperationGotoParser,
1963
- dalvikBytecodeOperationGoto16Parser,
1964
-
1965
- dalvikBytecodeOperationMoveResult1Parser,
1966
- dalvikBytecodeOperationMoveParser,
1967
- dalvikBytecodeOperationMoveWideParser,
1968
- dalvikBytecodeOperationMoveObjectParser,
1969
- dalvikBytecodeOperationMoveFrom16Parser,
1970
- dalvikBytecodeOperationMoveWideFrom16Parser,
1971
- dalvikBytecodeOperationMoveObjectFrom16Parser,
1972
- dalvikBytecodeOperationMoveWide16Parser,
1973
-
1974
- dalvikBytecodeOperationConst4Parser,
1975
- dalvikBytecodeOperationConst16Parser,
1976
- dalvikBytecodeOperationConstHigh16Parser,
1977
- dalvikBytecodeOperationConstWide16Parser,
1978
- dalvikBytecodeOperationConstParser,
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
+ ]);
1979
2774
 
1980
- dalvikBytecodeOperationCompareParser,
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
+ ]);
1981
2782
 
1982
- dalvikBytecodeOperationIfTestParser,
1983
- dalvikBytecodeOperationIfTestZeroParser,
2783
+ setParserName(dalvikBytecodeOperationMultiByteParser, 'dalvikBytecodeOperationMultiByteParser');
1984
2784
 
1985
- dalvikBytecodeOperationBinaryOperationParser,
1986
- dalvikBytecodeOperationBinaryOperationLiteral8Parser,
1987
- dalvikBytecodeOperationBinaryOperationLiteral16Parser,
1988
- dalvikBytecodeOperationBinaryOperationInPlaceParser,
1989
- dalvikBytecodeOperationUnaryOperationParser,
1990
- ]),
2785
+ const dalvikBytecodeOperationParser: Parser<DalvikBytecodeOperation | undefined, Uint8Array> = promiseCompose(
2786
+ createTupleParser([
2787
+ () => {},
2788
+ // CreateDebugLogInputParser(),
2789
+ createElementSwitchParser<DalvikBytecodeOperation, Uint8Array>(
2790
+ dalvikBytecodeOperationOpcodeMap,
2791
+ dalvikBytecodeOperationMultiByteParser,
2792
+ ),
1991
2793
  ]),
1992
2794
  ([
1993
2795
  _debug,
1994
2796
  operation,
1995
- ]) => {
1996
- // console.log(operation);
1997
- return operation;
1998
- },
2797
+ ]) =>
2798
+ // Console.log(operation);
2799
+ operation,
1999
2800
  );
2000
2801
 
2001
2802
  setParserName(dalvikBytecodeOperationParser, 'dalvikBytecodeOperationParser');
@@ -2003,9 +2804,7 @@ setParserName(dalvikBytecodeOperationParser, 'dalvikBytecodeOperationParser');
2003
2804
  export type DalvikBytecode = DalvikBytecodeOperation[];
2004
2805
 
2005
2806
  const dalvikBytecodeParser: Parser<DalvikBytecode, Uint8Array> = promiseCompose(
2006
- createArrayParser(
2007
- dalvikBytecodeOperationParser,
2008
- ),
2807
+ createArrayParser(dalvikBytecodeOperationParser),
2009
2808
  operations => operations.filter((operation): operation is DalvikBytecodeOperation => operation !== undefined),
2010
2809
  );
2011
2810
 
@@ -2014,12 +2813,12 @@ export const createDalvikBytecodeParser = (size: number): Parser<DalvikBytecode,
2014
2813
  type ResolvedDalvikBytecodeOperation<T extends DalvikBytecodeOperation> = T extends { stringIndex: IndexIntoFieldIds }
2015
2814
  ? Omit<T, 'stringIndex'> & { string: string }
2016
2815
  : T extends { typeIndex: IndexIntoTypeIds }
2017
- ? Omit<T, 'typeIndex'> & { type: string }
2018
- : T extends { methodIndex: IndexIntoMethodIds }
2019
- ? Omit<T, 'methodIndex'> & { method: DalvikExecutableMethod }
2020
- : T extends { fieldIndex: IndexIntoFieldIds }
2021
- ? Omit<T, 'fieldIndex'> & { field: DalvikExecutableField }
2022
- : T;
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;
2023
2822
 
2024
2823
  export type DalvikBytecodeOperationResolvers = {
2025
2824
  resolveIndexIntoStringIds: (index: IndexIntoStringIds) => string;
@@ -2039,7 +2838,7 @@ export function resolveDalvikBytecodeOperation<T extends DalvikBytecodeOperation
2039
2838
 
2040
2839
  return {
2041
2840
  ...rest,
2042
- string: resolveIndexIntoStringIds(stringIndex as IndexIntoStringIds),
2841
+ string: resolveIndexIntoStringIds(stringIndex),
2043
2842
  } as ResolvedDalvikBytecodeOperation<T>;
2044
2843
  }
2045
2844
 
@@ -2048,7 +2847,7 @@ export function resolveDalvikBytecodeOperation<T extends DalvikBytecodeOperation
2048
2847
 
2049
2848
  return {
2050
2849
  ...rest,
2051
- type: resolveIndexIntoTypeIds(typeIndex as IndexIntoTypeIds),
2850
+ type: resolveIndexIntoTypeIds(typeIndex),
2052
2851
  } as ResolvedDalvikBytecodeOperation<T>;
2053
2852
  }
2054
2853
 
@@ -2057,7 +2856,7 @@ export function resolveDalvikBytecodeOperation<T extends DalvikBytecodeOperation
2057
2856
 
2058
2857
  return {
2059
2858
  ...rest,
2060
- method: resolveIndexIntoMethodIds(methodIndex as IndexIntoMethodIds),
2859
+ method: resolveIndexIntoMethodIds(methodIndex),
2061
2860
  } as ResolvedDalvikBytecodeOperation<T>;
2062
2861
  }
2063
2862
 
@@ -2066,7 +2865,7 @@ export function resolveDalvikBytecodeOperation<T extends DalvikBytecodeOperation
2066
2865
 
2067
2866
  return {
2068
2867
  ...rest,
2069
- field: resolveIndexIntoFieldIds(fieldIndex as IndexIntoFieldIds),
2868
+ field: resolveIndexIntoFieldIds(fieldIndex),
2070
2869
  } as ResolvedDalvikBytecodeOperation<T>;
2071
2870
  }
2072
2871