@futpib/parser 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) 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/customInvariant.d.ts +2 -1
  26. package/build/customInvariant.js +4 -6
  27. package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
  28. package/build/dalvikBytecodeParser/formatParsers.js +146 -11
  29. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  30. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  31. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  32. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  33. package/build/dalvikBytecodeParser.d.ts +1105 -5
  34. package/build/dalvikBytecodeParser.js +658 -205
  35. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  36. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  37. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  38. package/build/dalvikBytecodeUnparser.js +642 -0
  39. package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
  40. package/build/dalvikBytecodeUnparser.test.js +25 -0
  41. package/build/dalvikExecutable.d.ts +65 -8
  42. package/build/dalvikExecutable.js +36 -0
  43. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
  44. package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
  45. package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
  46. package/build/dalvikExecutableParser/typeParsers.js +16 -11
  47. package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
  48. package/build/dalvikExecutableParser/typedNumbers.js +0 -1
  49. package/build/dalvikExecutableParser.d.ts +2 -2
  50. package/build/dalvikExecutableParser.js +655 -337
  51. package/build/dalvikExecutableParser.test.js +24 -22
  52. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
  53. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  54. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  55. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  56. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  57. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  58. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  59. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  60. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  61. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  62. package/build/dalvikExecutableUnparser/utils.js +108 -0
  63. package/build/dalvikExecutableUnparser.d.ts +4 -0
  64. package/build/dalvikExecutableUnparser.js +406 -0
  65. package/build/dalvikExecutableUnparser.test.d.ts +1 -0
  66. package/build/dalvikExecutableUnparser.test.js +31 -0
  67. package/build/debugLogInputParser.js +1 -1
  68. package/build/disjunctionParser.d.ts +2 -2
  69. package/build/disjunctionParser.js +2 -2
  70. package/build/elementTerminatedArrayParser.d.ts +2 -2
  71. package/build/elementTerminatedArrayParser.js +1 -1
  72. package/build/elementTerminatedArrayParser.test.js +5 -5
  73. package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
  74. package/build/elementTerminatedSequenceArrayParser.js +1 -1
  75. package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
  76. package/build/elementTerminatedSequenceParser.d.ts +2 -2
  77. package/build/elementTerminatedSequenceParser.js +1 -1
  78. package/build/elementTerminatedSequenceParser.test.js +2 -2
  79. package/build/endOfInputParser.d.ts +1 -1
  80. package/build/exactElementSwitchParser.d.ts +3 -0
  81. package/build/exactElementSwitchParser.js +22 -0
  82. package/build/fetchCid.js +2 -6
  83. package/build/fetchCid.test.d.ts +1 -0
  84. package/build/fetchCid.test.js +16 -0
  85. package/build/fixedLengthSequenceParser.test.js +2 -2
  86. package/build/hasExecutable.js +2 -2
  87. package/build/highResolutionTimer.js +1 -1
  88. package/build/inputReader.d.ts +1 -1
  89. package/build/inputReader.test.js +33 -45
  90. package/build/javaKeyStoreParser.test.js +6 -6
  91. package/build/jsonParser.js +8 -8
  92. package/build/lazyMessageError.d.ts +48 -0
  93. package/build/lazyMessageError.js +53 -0
  94. package/build/lazyMessageError.test.d.ts +1 -0
  95. package/build/lazyMessageError.test.js +15 -0
  96. package/build/leb128Parser.d.ts +1 -1
  97. package/build/leb128Parser.js +10 -10
  98. package/build/leb128Parser.test.js +7 -7
  99. package/build/negativeLookaheadParser.js +2 -2
  100. package/build/negativeLookaheadParser.test.js +4 -4
  101. package/build/noStackCaptureOverheadError.d.ts +4 -0
  102. package/build/noStackCaptureOverheadError.js +9 -0
  103. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  104. package/build/noStackCaptureOverheadError.test.js +15 -0
  105. package/build/nonEmptyArrayParser.js +2 -2
  106. package/build/nonEmptyArrayParser.test.js +2 -1
  107. package/build/optionalParser.js +2 -2
  108. package/build/parser.d.ts +2 -1
  109. package/build/parser.js +23 -8
  110. package/build/parser.test.js +78 -29
  111. package/build/parserConsumedSequenceParser.d.ts +1 -1
  112. package/build/parserConsumedSequenceParser.js +2 -2
  113. package/build/parserContext.d.ts +8 -6
  114. package/build/parserContext.js +60 -33
  115. package/build/parserContext.test.js +7 -3
  116. package/build/parserError.d.ts +603 -44
  117. package/build/parserError.js +98 -53
  118. package/build/parserImplementationInvariant.d.ts +1 -1
  119. package/build/parserImplementationInvariant.js +2 -2
  120. package/build/parserInputCompanion.js +2 -2
  121. package/build/promiseCompose.js +1 -2
  122. package/build/separatedArrayParser.js +2 -2
  123. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  124. package/build/separatedNonEmptyArrayParser.js +40 -0
  125. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  126. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  127. package/build/sequenceBuffer.js +1 -1
  128. package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
  129. package/build/sequenceTerminatedSequenceParser.js +3 -3
  130. package/build/sequenceTerminatedSequenceParser.test.js +1 -1
  131. package/build/sequenceUnparser.d.ts +1 -1
  132. package/build/skipToParser.d.ts +1 -1
  133. package/build/skipToParser.js +2 -2
  134. package/build/sliceBoundedParser.test.js +4 -9
  135. package/build/smali.d.ts +1 -1
  136. package/build/smali.js +6 -2
  137. package/build/smaliParser.d.ts +62 -6
  138. package/build/smaliParser.js +1721 -296
  139. package/build/smaliParser.test.js +338 -43
  140. package/build/stringFromAsyncIterable.d.ts +1 -0
  141. package/build/stringFromAsyncIterable.js +7 -0
  142. package/build/terminatedArrayParser.js +4 -4
  143. package/build/terminatedArrayParser.test.js +7 -7
  144. package/build/toAsyncIterator.js +4 -4
  145. package/build/unionParser.d.ts +1 -1
  146. package/build/unionParser.js +2 -2
  147. package/build/unionParser.test.js +3 -3
  148. package/build/unparser.d.ts +3 -3
  149. package/build/unparser.js +6 -4
  150. package/build/unparser.test.js +7 -19
  151. package/build/unparserContext.d.ts +2 -2
  152. package/build/unparserContext.js +2 -3
  153. package/build/unparserError.d.ts +2 -1
  154. package/build/unparserError.js +2 -1
  155. package/build/unparserImplementationInvariant.d.ts +1 -1
  156. package/build/unparserOutputCompanion.d.ts +1 -1
  157. package/build/unparserOutputCompanion.js +1 -1
  158. package/build/zipParser.js +1 -1
  159. package/build/zipUnparser.d.ts +3 -3
  160. package/build/zipUnparser.js +9 -19
  161. package/build/zipUnparser.test.js +1 -1
  162. package/package.json +19 -26
  163. package/src/allSettledStream.test.ts +2 -2
  164. package/src/allSettledStream.ts +3 -3
  165. package/src/androidPackageParser.test.ts +17 -19
  166. package/src/androidPackageParser.ts +129 -171
  167. package/src/androidPackageUnparser.test.ts +19 -21
  168. package/src/androidPackageUnparser.ts +23 -17
  169. package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
  170. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  171. package/src/arbitraryDalvikBytecode.ts +992 -0
  172. package/src/arbitraryDalvikExecutable.ts +434 -0
  173. package/src/arbitraryDosDateTime.ts +1 -0
  174. package/src/arbitraryZipStream.ts +1 -1
  175. package/src/arrayParser.ts +2 -2
  176. package/src/arrayUnparser.ts +2 -2
  177. package/src/backsmali.ts +48 -4
  178. package/src/bsonParser.test.ts +12 -14
  179. package/src/customInvariant.ts +8 -12
  180. package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
  181. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  182. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  183. package/src/dalvikBytecodeParser.ts +1042 -243
  184. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  185. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  186. package/src/dalvikBytecodeUnparser.ts +758 -0
  187. package/src/dalvikExecutable.ts +110 -48
  188. package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
  189. package/src/dalvikExecutableParser/typeParsers.ts +23 -14
  190. package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
  191. package/src/dalvikExecutableParser.test.ts +60 -60
  192. package/src/dalvikExecutableParser.test.ts.md +6 -6
  193. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  194. package/src/dalvikExecutableParser.ts +911 -434
  195. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
  196. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  197. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  198. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  199. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  200. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  201. package/src/dalvikExecutableUnparser.test.ts +57 -0
  202. package/src/dalvikExecutableUnparser.ts +581 -0
  203. package/src/debugLogInputParser.ts +1 -1
  204. package/src/disjunctionParser.ts +5 -5
  205. package/src/elementTerminatedArrayParser.test.ts +8 -8
  206. package/src/elementTerminatedArrayParser.ts +2 -2
  207. package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
  208. package/src/elementTerminatedSequenceArrayParser.ts +2 -2
  209. package/src/elementTerminatedSequenceParser.test.ts +4 -6
  210. package/src/elementTerminatedSequenceParser.ts +2 -2
  211. package/src/endOfInputParser.ts +1 -1
  212. package/src/exactElementSwitchParser.ts +41 -0
  213. package/src/fetchCid.test.ts +20 -0
  214. package/src/fetchCid.ts +3 -7
  215. package/src/fixedLengthSequenceParser.test.ts +10 -12
  216. package/src/hasExecutable.ts +2 -2
  217. package/src/highResolutionTimer.ts +1 -1
  218. package/src/inputReader.test.ts +39 -52
  219. package/src/inputReader.ts +2 -4
  220. package/src/inputReaderState.ts +1 -1
  221. package/src/inspect.ts +1 -1
  222. package/src/javaKeyStoreParser.test.ts +12 -14
  223. package/src/javaKeyStoreParser.ts +2 -6
  224. package/src/jsonParser.test.ts +2 -4
  225. package/src/jsonParser.ts +34 -38
  226. package/src/lazyMessageError.test.ts +21 -0
  227. package/src/lazyMessageError.ts +88 -0
  228. package/src/leb128Parser.test.ts +25 -23
  229. package/src/leb128Parser.ts +19 -19
  230. package/src/negativeLookaheadParser.test.ts +7 -11
  231. package/src/negativeLookaheadParser.ts +2 -2
  232. package/src/noStackCaptureOverheadError.test.ts +17 -0
  233. package/src/noStackCaptureOverheadError.ts +12 -0
  234. package/src/nonEmptyArrayParser.test.ts +3 -2
  235. package/src/nonEmptyArrayParser.ts +2 -2
  236. package/src/optionalParser.ts +2 -2
  237. package/src/parser.test.ts +96 -43
  238. package/src/parser.test.ts.md +13 -6
  239. package/src/parser.test.ts.snap +0 -0
  240. package/src/parser.ts +35 -12
  241. package/src/parserAccessorParser.ts +1 -1
  242. package/src/parserConsumedSequenceParser.ts +3 -3
  243. package/src/parserContext.test.ts +7 -3
  244. package/src/parserContext.ts +82 -48
  245. package/src/parserError.ts +143 -63
  246. package/src/parserImplementationInvariant.ts +3 -3
  247. package/src/parserInputCompanion.ts +2 -2
  248. package/src/promiseCompose.ts +2 -2
  249. package/src/separatedArrayParser.ts +3 -3
  250. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  251. package/src/separatedNonEmptyArrayParser.ts +61 -0
  252. package/src/sequenceBuffer.test.ts +9 -9
  253. package/src/sequenceBuffer.ts +4 -4
  254. package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
  255. package/src/sequenceTerminatedSequenceParser.ts +4 -4
  256. package/src/sequenceUnparser.ts +2 -2
  257. package/src/skipToParser.ts +2 -2
  258. package/src/sliceBoundedParser.test.ts +4 -12
  259. package/src/sliceBoundedParser.ts +2 -2
  260. package/src/smali.ts +8 -3
  261. package/src/smaliParser.test.ts +377 -66
  262. package/src/smaliParser.test.ts.md +1635 -48
  263. package/src/smaliParser.test.ts.snap +0 -0
  264. package/src/smaliParser.ts +2751 -569
  265. package/src/stringFromAsyncIterable.ts +9 -0
  266. package/src/terminatedArrayParser.test.ts +11 -11
  267. package/src/terminatedArrayParser.ts +5 -7
  268. package/src/toAsyncIterator.ts +8 -8
  269. package/src/uint8Array.ts +2 -3
  270. package/src/unionParser.test.ts +22 -23
  271. package/src/unionParser.ts +6 -8
  272. package/src/unparser.test.ts +18 -34
  273. package/src/unparser.ts +13 -9
  274. package/src/unparserContext.ts +9 -13
  275. package/src/unparserError.ts +2 -1
  276. package/src/unparserImplementationInvariant.ts +1 -1
  277. package/src/unparserOutputCompanion.ts +1 -1
  278. package/src/zip.ts +2 -6
  279. package/src/zipParser.ts +10 -18
  280. package/src/zipUnparser.test.ts +1 -1
  281. package/src/zipUnparser.ts +52 -64
  282. package/tsconfig.json +7 -1
  283. package/xo.config.ts +15 -0
  284. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
@@ -1,24 +1,29 @@
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 { isoIndexIntoFieldIds, isoIndexIntoMethodIds, isoIndexIntoStringIds, isoIndexIntoTypeIds } from "./dalvikExecutableParser/typedNumbers.js";
4
- import { createExactElementParser } from "./exactElementParser.js";
5
- import { setParserName } from "./parser.js";
6
- import { promiseCompose } from "./promiseCompose.js";
7
- import { createSliceBoundedParser } from "./sliceBoundedParser.js";
8
- import { createTupleParser } from "./tupleParser.js";
9
- import { createUnionParser } from "./unionParser.js";
1
+ import { createArrayParser } from './arrayParser.js';
2
+ import { createDalvikBytecodeFormat21cParser, createDalvikBytecodeFormat21sParser, createDalvikBytecodeFormat21tParser, createDalvikBytecodeFormat22bParser, createDalvikBytecodeFormat22cParser, createDalvikBytecodeFormat22sParser, createDalvikBytecodeFormat22tParser, dalvikBytecodeFormat23xParser, createDalvikBytecodeFormat31cParser, dalvikBytecodeFormat31iParser, dalvikBytecodeFormat31tParser, createDalvikBytecodeFormat35cParser, createDalvikBytecodeFormat3rcParser, dalvikBytecodeFormat10tParser, dalvikBytecodeFormat10xParser, dalvikBytecodeFormat11xParser, dalvikBytecodeFormat11nParser, dalvikBytecodeFormat12xParser, dalvikBytecodeFormat20tParser, dalvikBytecodeFormat22xParser, dalvikBytecodeFormat32xParser, dalvikBytecodeFormat30tParser, dalvikBytecodeFormat51lParser, createDalvikBytecodeFormat45ccParser, createDalvikBytecodeFormat4rccParser, } from './dalvikBytecodeParser/formatParsers.js';
3
+ import { ubyteParser, ushortParser, intParser, uintParser, createExactUshortParser, } from './dalvikExecutableParser/typeParsers.js';
4
+ import { isoIndexIntoFieldIds, isoIndexIntoMethodIds, isoIndexIntoPrototypeIds, isoIndexIntoStringIds, isoIndexIntoTypeIds, } from './dalvikExecutableParser/typedNumbers.js';
5
+ import { createExactElementParser } from './exactElementParser.js';
6
+ import { createElementSwitchParser } from './exactElementSwitchParser.js';
7
+ import { setParserName } from './parser.js';
8
+ import { promiseCompose } from './promiseCompose.js';
9
+ import { createSliceBoundedParser } from './sliceBoundedParser.js';
10
+ import { createDisjunctionParser } from './disjunctionParser.js';
11
+ import { parserCreatorCompose } from './parserCreatorCompose.js';
12
+ import { createQuantifierParser } from './quantifierParser.js';
13
+ import { createTupleParser } from './tupleParser.js';
10
14
  // https://source.android.com/docs/core/runtime/dalvik-bytecode
11
15
  const dalvikBytecodeOperationUnusedParser = async (parserContext) => {
12
16
  const opcode = await parserContext.read(0);
13
- parserContext.invariant(((opcode >= 0x3e && opcode <= 0x43)
17
+ parserContext.invariant(((opcode >= 0x3E && opcode <= 0x43)
14
18
  || (opcode === 0x73)
15
- || (opcode >= 0x79 && opcode <= 0x7a)
16
- || (opcode >= 0xe3 && opcode <= 0xf9)), 'Expected unused opcode');
19
+ || (opcode >= 0x79 && opcode <= 0x7A)
20
+ || (opcode >= 0xE3 && opcode <= 0xF9)), 'Expected unused opcode');
17
21
  parserContext.skip(1);
18
22
  };
19
23
  setParserName(dalvikBytecodeOperationUnusedParser, 'dalvikBytecodeOperationUnusedParser');
20
- const dalvikBytecodeOperationNoOperationParser = promiseCompose(createExactElementParser(0x00), () => ({
21
- operation: 'no-operation',
24
+ const dalvikBytecodeOperationNoOperationParser = promiseCompose(createExactUshortParser(0x00_00), // nop is 2 bytes: 0x00 0x00
25
+ () => ({
26
+ operation: 'nop',
22
27
  }));
23
28
  setParserName(dalvikBytecodeOperationNoOperationParser, 'dalvikBytecodeOperationNoOperationParser');
24
29
  const createDalvikBytecodeOperationInvoke = (operation, opcode) => promiseCompose(createTupleParser([
@@ -26,17 +31,17 @@ const createDalvikBytecodeOperationInvoke = (operation, opcode) => promiseCompos
26
31
  createDalvikBytecodeFormat35cParser({
27
32
  isoIndex: isoIndexIntoMethodIds,
28
33
  }),
29
- ]), ([_opcode, { index, registers }]) => ({
34
+ ]), ([_opcode, { index, registers },]) => ({
30
35
  operation,
31
36
  methodIndex: index,
32
37
  registers,
33
38
  }));
34
- const dalvikBytecodeOperationInvokeVirtualParser = createDalvikBytecodeOperationInvoke('invoke-virtual', 0x6e);
35
- const dalvikBytecodeOperationInvokeSuperParser = createDalvikBytecodeOperationInvoke('invoke-super', 0x6f);
39
+ const dalvikBytecodeOperationInvokeVirtualParser = createDalvikBytecodeOperationInvoke('invoke-virtual', 0x6E);
40
+ const dalvikBytecodeOperationInvokeSuperParser = createDalvikBytecodeOperationInvoke('invoke-super', 0x6F);
36
41
  const dalvikBytecodeOperationInvokeDirectParser = createDalvikBytecodeOperationInvoke('invoke-direct', 0x70);
37
42
  const dalvikBytecodeOperationInvokeStaticParser = createDalvikBytecodeOperationInvoke('invoke-static', 0x71);
38
43
  const dalvikBytecodeOperationInvokeInterfaceParser = createDalvikBytecodeOperationInvoke('invoke-interface', 0x72);
39
- const dalvikBytecodeOperationInvokeParser = createUnionParser([
44
+ const dalvikBytecodeOperationInvokeParser = createDisjunctionParser([
40
45
  dalvikBytecodeOperationInvokeVirtualParser,
41
46
  dalvikBytecodeOperationInvokeSuperParser,
42
47
  dalvikBytecodeOperationInvokeDirectParser,
@@ -49,7 +54,7 @@ const createDalvikBytecodeOperationInvokeRange = (operation, opcode) => promiseC
49
54
  createDalvikBytecodeFormat3rcParser({
50
55
  isoIndex: isoIndexIntoMethodIds,
51
56
  }),
52
- ]), ([_opcode, { index, registers }]) => ({
57
+ ]), ([_opcode, { index, registers },]) => ({
53
58
  operation,
54
59
  methodIndex: index,
55
60
  registers,
@@ -59,7 +64,7 @@ const dalvikBytecodeOperationInvokeSuperRangeParser = createDalvikBytecodeOperat
59
64
  const dalvikBytecodeOperationInvokeDirectRangeParser = createDalvikBytecodeOperationInvokeRange('invoke-direct/range', 0x76);
60
65
  const dalvikBytecodeOperationInvokeStaticRangeParser = createDalvikBytecodeOperationInvokeRange('invoke-static/range', 0x77);
61
66
  const dalvikBytecodeOperationInvokeInterfaceRangeParser = createDalvikBytecodeOperationInvokeRange('invoke-interface/range', 0x78);
62
- const dalvikBytecodeOperationInvokeRangeParser = createUnionParser([
67
+ const dalvikBytecodeOperationInvokeRangeParser = createDisjunctionParser([
63
68
  dalvikBytecodeOperationInvokeVirtualRangeParser,
64
69
  dalvikBytecodeOperationInvokeSuperRangeParser,
65
70
  dalvikBytecodeOperationInvokeDirectRangeParser,
@@ -67,6 +72,32 @@ const dalvikBytecodeOperationInvokeRangeParser = createUnionParser([
67
72
  dalvikBytecodeOperationInvokeInterfaceRangeParser,
68
73
  ]);
69
74
  setParserName(dalvikBytecodeOperationInvokeRangeParser, 'dalvikBytecodeOperationInvokeRangeParser');
75
+ const dalvikBytecodeOperationInvokePolymorphicParser = promiseCompose(createTupleParser([
76
+ createExactElementParser(0xFA),
77
+ createDalvikBytecodeFormat45ccParser({
78
+ isoMethodIndex: isoIndexIntoMethodIds,
79
+ isoProtoIndex: isoIndexIntoPrototypeIds,
80
+ }),
81
+ ]), ([_opcode, { methodIndex, protoIndex, registers },]) => ({
82
+ operation: 'invoke-polymorphic',
83
+ methodIndex,
84
+ protoIndex,
85
+ registers,
86
+ }));
87
+ setParserName(dalvikBytecodeOperationInvokePolymorphicParser, 'dalvikBytecodeOperationInvokePolymorphicParser');
88
+ const dalvikBytecodeOperationInvokePolymorphicRangeParser = promiseCompose(createTupleParser([
89
+ createExactElementParser(0xFB),
90
+ createDalvikBytecodeFormat4rccParser({
91
+ isoMethodIndex: isoIndexIntoMethodIds,
92
+ isoProtoIndex: isoIndexIntoPrototypeIds,
93
+ }),
94
+ ]), ([_opcode, { methodIndex, protoIndex, registers },]) => ({
95
+ operation: 'invoke-polymorphic/range',
96
+ methodIndex,
97
+ protoIndex,
98
+ registers,
99
+ }));
100
+ setParserName(dalvikBytecodeOperationInvokePolymorphicRangeParser, 'dalvikBytecodeOperationInvokePolymorphicRangeParser');
70
101
  const dalvikBytecodeOperationGotoParser = promiseCompose(createTupleParser([
71
102
  createExactElementParser(0x28),
72
103
  dalvikBytecodeFormat10tParser,
@@ -81,6 +112,78 @@ const dalvikBytecodeOperationGoto16Parser = promiseCompose(createTupleParser([
81
112
  operation: 'goto/16',
82
113
  branchOffset,
83
114
  }));
115
+ const dalvikBytecodeOperationGoto32Parser = promiseCompose(createTupleParser([
116
+ createExactElementParser(0x2A),
117
+ dalvikBytecodeFormat30tParser,
118
+ ]), ([_opcode, { branchOffset }]) => ({
119
+ operation: 'goto/32',
120
+ branchOffset,
121
+ }));
122
+ const dalvikBytecodeOperationPackedSwitchParser = promiseCompose(createTupleParser([
123
+ createExactElementParser(0x2B),
124
+ dalvikBytecodeFormat31tParser,
125
+ ]), ([_opcode, { branchOffset, registers }]) => ({
126
+ operation: 'packed-switch',
127
+ branchOffset,
128
+ registers,
129
+ }));
130
+ setParserName(dalvikBytecodeOperationPackedSwitchParser, 'dalvikBytecodeOperationPackedSwitchParser');
131
+ const dalvikBytecodeOperationPackedSwitchPayloadParser = parserCreatorCompose(() => promiseCompose(createTupleParser([
132
+ createExactUshortParser(0x01_00),
133
+ ushortParser,
134
+ intParser,
135
+ ]), ([_ident, size, value]) => ({
136
+ size,
137
+ value,
138
+ })), ({ size, value }) => promiseCompose(createQuantifierParser(intParser, size), branchOffsets => ({
139
+ operation: 'packed-switch-payload',
140
+ value,
141
+ branchOffsets,
142
+ })))();
143
+ setParserName(dalvikBytecodeOperationPackedSwitchPayloadParser, 'dalvikBytecodeOperationPackedSwitchPayloadParser');
144
+ const dalvikBytecodeOperationSparseSwitchParser = promiseCompose(createTupleParser([
145
+ createExactElementParser(0x2C),
146
+ dalvikBytecodeFormat31tParser,
147
+ ]), ([_opcode, { branchOffset, registers }]) => ({
148
+ operation: 'sparse-switch',
149
+ branchOffset,
150
+ registers,
151
+ }));
152
+ setParserName(dalvikBytecodeOperationSparseSwitchParser, 'dalvikBytecodeOperationSparseSwitchParser');
153
+ const dalvikBytecodeOperationSparseSwitchPayloadParser = parserCreatorCompose(() => promiseCompose(createTupleParser([
154
+ createExactUshortParser(0x02_00),
155
+ ushortParser,
156
+ ]), ([_ident, size]) => ({
157
+ size,
158
+ })), ({ size }) => promiseCompose(createTupleParser([
159
+ createQuantifierParser(intParser, size),
160
+ createQuantifierParser(intParser, size),
161
+ ]), ([keys, branchOffsets]) => ({
162
+ operation: 'sparse-switch-payload',
163
+ keys,
164
+ branchOffsets,
165
+ })))();
166
+ setParserName(dalvikBytecodeOperationSparseSwitchPayloadParser, 'dalvikBytecodeOperationSparseSwitchPayloadParser');
167
+ const dalvikBytecodeOperationFillArrayDataPayloadParser = parserCreatorCompose(() => promiseCompose(createTupleParser([
168
+ createExactUshortParser(0x03_00),
169
+ ushortParser,
170
+ uintParser,
171
+ ]), ([_ident, elementWidth, size]) => ({
172
+ elementWidth,
173
+ size,
174
+ })), ({ elementWidth, size }) => {
175
+ const dataSize = size * elementWidth;
176
+ const paddingSize = dataSize % 2; // 1 if odd, 0 if even
177
+ return promiseCompose(createTupleParser([
178
+ createQuantifierParser(ubyteParser, dataSize),
179
+ paddingSize > 0 ? createQuantifierParser(ubyteParser, paddingSize) : () => [],
180
+ ]), ([data, _padding]) => ({
181
+ operation: 'fill-array-data-payload',
182
+ elementWidth,
183
+ data,
184
+ }));
185
+ })();
186
+ setParserName(dalvikBytecodeOperationFillArrayDataPayloadParser, 'dalvikBytecodeOperationFillArrayDataPayloadParser');
84
187
  const dalvikBytecodeOperationInstanceOfParser = promiseCompose(createTupleParser([
85
188
  createExactElementParser(0x20),
86
189
  createDalvikBytecodeFormat22cParser({
@@ -105,15 +208,15 @@ const dalvikBytecodeOperationArrayElementGetObjectParser = createDalvikBytecodeO
105
208
  const dalvikBytecodeOperationArrayElementGetBooleanParser = createDalvikBytecodeOperationArrayElement('aget-boolean', 0x47);
106
209
  const dalvikBytecodeOperationArrayElementGetByteParser = createDalvikBytecodeOperationArrayElement('aget-byte', 0x48);
107
210
  const dalvikBytecodeOperationArrayElementGetCharParser = createDalvikBytecodeOperationArrayElement('aget-char', 0x49);
108
- const dalvikBytecodeOperationArrayElementGetShortParser = createDalvikBytecodeOperationArrayElement('aget-short', 0x4a);
109
- const dalvikBytecodeOperationArrayElementPutParser = createDalvikBytecodeOperationArrayElement('aput', 0x4b);
110
- const dalvikBytecodeOperationArrayElementPutWideParser = createDalvikBytecodeOperationArrayElement('aput-wide', 0x4c);
111
- const dalvikBytecodeOperationArrayElementPutObjectParser = createDalvikBytecodeOperationArrayElement('aput-object', 0x4d);
112
- const dalvikBytecodeOperationArrayElementPutBooleanParser = createDalvikBytecodeOperationArrayElement('aput-boolean', 0x4e);
113
- const dalvikBytecodeOperationArrayElementPutByteParser = createDalvikBytecodeOperationArrayElement('aput-byte', 0x4f);
211
+ const dalvikBytecodeOperationArrayElementGetShortParser = createDalvikBytecodeOperationArrayElement('aget-short', 0x4A);
212
+ const dalvikBytecodeOperationArrayElementPutParser = createDalvikBytecodeOperationArrayElement('aput', 0x4B);
213
+ const dalvikBytecodeOperationArrayElementPutWideParser = createDalvikBytecodeOperationArrayElement('aput-wide', 0x4C);
214
+ const dalvikBytecodeOperationArrayElementPutObjectParser = createDalvikBytecodeOperationArrayElement('aput-object', 0x4D);
215
+ const dalvikBytecodeOperationArrayElementPutBooleanParser = createDalvikBytecodeOperationArrayElement('aput-boolean', 0x4E);
216
+ const dalvikBytecodeOperationArrayElementPutByteParser = createDalvikBytecodeOperationArrayElement('aput-byte', 0x4F);
114
217
  const dalvikBytecodeOperationArrayElementPutCharParser = createDalvikBytecodeOperationArrayElement('aput-char', 0x50);
115
218
  const dalvikBytecodeOperationArrayElementPutShortParser = createDalvikBytecodeOperationArrayElement('aput-short', 0x51);
116
- const dalvikBytecodeOperationArrayElementParser = createUnionParser([
219
+ const dalvikBytecodeOperationArrayElementParser = createDisjunctionParser([
117
220
  dalvikBytecodeOperationArrayElementGetParser,
118
221
  dalvikBytecodeOperationArrayElementGetWideParser,
119
222
  dalvikBytecodeOperationArrayElementGetObjectParser,
@@ -148,13 +251,13 @@ const dalvikBytecodeOperationInstanceFieldGetByteParser = createDalvikBytecodeOp
148
251
  const dalvikBytecodeOperationInstanceFieldGetCharParser = createDalvikBytecodeOperationInstanceField('iget-char', 0x57);
149
252
  const dalvikBytecodeOperationInstanceFieldGetShortParser = createDalvikBytecodeOperationInstanceField('iget-short', 0x58);
150
253
  const dalvikBytecodeOperationInstanceFieldPutParser = createDalvikBytecodeOperationInstanceField('iput', 0x59);
151
- const dalvikBytecodeOperationInstanceFieldPutWideParser = createDalvikBytecodeOperationInstanceField('iput-wide', 0x5a);
152
- const dalvikBytecodeOperationInstanceFieldPutObjectParser = createDalvikBytecodeOperationInstanceField('iput-object', 0x5b);
153
- const dalvikBytecodeOperationInstanceFieldPutBooleanParser = createDalvikBytecodeOperationInstanceField('iput-boolean', 0x5c);
154
- const dalvikBytecodeOperationInstanceFieldPutByteParser = createDalvikBytecodeOperationInstanceField('iput-byte', 0x5d);
155
- const dalvikBytecodeOperationInstanceFieldPutCharParser = createDalvikBytecodeOperationInstanceField('iput-char', 0x5e);
156
- const dalvikBytecodeOperationInstanceFieldPutShortParser = createDalvikBytecodeOperationInstanceField('iput-short', 0x5f);
157
- const dalvikBytecodeOperationInstanceFieldParser = createUnionParser([
254
+ const dalvikBytecodeOperationInstanceFieldPutWideParser = createDalvikBytecodeOperationInstanceField('iput-wide', 0x5A);
255
+ const dalvikBytecodeOperationInstanceFieldPutObjectParser = createDalvikBytecodeOperationInstanceField('iput-object', 0x5B);
256
+ const dalvikBytecodeOperationInstanceFieldPutBooleanParser = createDalvikBytecodeOperationInstanceField('iput-boolean', 0x5C);
257
+ const dalvikBytecodeOperationInstanceFieldPutByteParser = createDalvikBytecodeOperationInstanceField('iput-byte', 0x5D);
258
+ const dalvikBytecodeOperationInstanceFieldPutCharParser = createDalvikBytecodeOperationInstanceField('iput-char', 0x5E);
259
+ const dalvikBytecodeOperationInstanceFieldPutShortParser = createDalvikBytecodeOperationInstanceField('iput-short', 0x5F);
260
+ const dalvikBytecodeOperationInstanceFieldParser = createDisjunctionParser([
158
261
  dalvikBytecodeOperationInstanceFieldGetParser,
159
262
  dalvikBytecodeOperationInstanceFieldGetWideParser,
160
263
  dalvikBytecodeOperationInstanceFieldGetObjectParser,
@@ -191,11 +294,11 @@ const dalvikBytecodeOperationStaticFieldGetShortParser = createDalvikBytecodeOpe
191
294
  const dalvikBytecodeOperationStaticFieldPutParser = createDalvikBytecodeOperationStaticField('sput', 0x67);
192
295
  const dalvikBytecodeOperationStaticFieldPutWideParser = createDalvikBytecodeOperationStaticField('sput-wide', 0x68);
193
296
  const dalvikBytecodeOperationStaticFieldPutObjectParser = createDalvikBytecodeOperationStaticField('sput-object', 0x69);
194
- const dalvikBytecodeOperationStaticFieldPutBooleanParser = createDalvikBytecodeOperationStaticField('sput-boolean', 0x6a);
195
- const dalvikBytecodeOperationStaticFieldPutByteParser = createDalvikBytecodeOperationStaticField('sput-byte', 0x6b);
196
- const dalvikBytecodeOperationStaticFieldPutCharParser = createDalvikBytecodeOperationStaticField('sput-char', 0x6c);
197
- const dalvikBytecodeOperationStaticFieldPutShortParser = createDalvikBytecodeOperationStaticField('sput-short', 0x6d);
198
- const dalvikBytecodeOperationStaticFieldParser = createUnionParser([
297
+ const dalvikBytecodeOperationStaticFieldPutBooleanParser = createDalvikBytecodeOperationStaticField('sput-boolean', 0x6A);
298
+ const dalvikBytecodeOperationStaticFieldPutByteParser = createDalvikBytecodeOperationStaticField('sput-byte', 0x6B);
299
+ const dalvikBytecodeOperationStaticFieldPutCharParser = createDalvikBytecodeOperationStaticField('sput-char', 0x6C);
300
+ const dalvikBytecodeOperationStaticFieldPutShortParser = createDalvikBytecodeOperationStaticField('sput-short', 0x6D);
301
+ const dalvikBytecodeOperationStaticFieldParser = createDisjunctionParser([
199
302
  dalvikBytecodeOperationStaticFieldGetParser,
200
303
  dalvikBytecodeOperationStaticFieldGetWideParser,
201
304
  dalvikBytecodeOperationStaticFieldGetObjectParser,
@@ -220,18 +323,18 @@ const createDalvikBytecodeOperationBinaryOperationLiteral8 = (operation, opcode)
220
323
  registers,
221
324
  value,
222
325
  }));
223
- const dalvikBytecodeOperationAddIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('add-int/lit8', 0xd8);
224
- const dalvikBytecodeOperationReverseSubtractIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rsub-int/lit8', 0xd9);
225
- const dalvikBytecodeOperationMultiplyIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('mul-int/lit8', 0xda);
226
- const dalvikBytecodeOperationDivideIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('div-int/lit8', 0xdb);
227
- const dalvikBytecodeOperationRemainderIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rem-int/lit8', 0xdc);
228
- const dalvikBytecodeOperationAndIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('and-int/lit8', 0xdd);
229
- const dalvikBytecodeOperationOrIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('or-int/lit8', 0xde);
230
- const dalvikBytecodeOperationXorIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('xor-int/lit8', 0xdf);
231
- const dalvikBytecodeOperationShiftLeftIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shl-int/lit8', 0xe0);
232
- const dalvikBytecodeOperationShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shr-int/lit8', 0xe1);
233
- const dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('ushr-int/lit8', 0xe2);
234
- const dalvikBytecodeOperationBinaryOperationLiteral8Parser = createUnionParser([
326
+ const dalvikBytecodeOperationAddIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('add-int/lit8', 0xD8);
327
+ const dalvikBytecodeOperationReverseSubtractIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rsub-int/lit8', 0xD9);
328
+ const dalvikBytecodeOperationMultiplyIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('mul-int/lit8', 0xDA);
329
+ const dalvikBytecodeOperationDivideIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('div-int/lit8', 0xDB);
330
+ const dalvikBytecodeOperationRemainderIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('rem-int/lit8', 0xDC);
331
+ const dalvikBytecodeOperationAndIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('and-int/lit8', 0xDD);
332
+ const dalvikBytecodeOperationOrIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('or-int/lit8', 0xDE);
333
+ const dalvikBytecodeOperationXorIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('xor-int/lit8', 0xDF);
334
+ const dalvikBytecodeOperationShiftLeftIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shl-int/lit8', 0xE0);
335
+ const dalvikBytecodeOperationShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('shr-int/lit8', 0xE1);
336
+ const dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser = createDalvikBytecodeOperationBinaryOperationLiteral8('ushr-int/lit8', 0xE2);
337
+ const dalvikBytecodeOperationBinaryOperationLiteral8Parser = createDisjunctionParser([
235
338
  dalvikBytecodeOperationAddIntLiteral8Parser,
236
339
  dalvikBytecodeOperationReverseSubtractIntLiteral8Parser,
237
340
  dalvikBytecodeOperationMultiplyIntLiteral8Parser,
@@ -253,15 +356,15 @@ const createDalvikBytecodeOperationBinaryOperationLiteral16 = (operation, opcode
253
356
  registers,
254
357
  value,
255
358
  }));
256
- const dalvikBytecodeOperationAddIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('add-int/lit16', 0xd0);
257
- const dalvikBytecodeOperationReverseSubtractIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rsub-int/lit16', 0xd1);
258
- const dalvikBytecodeOperationMultiplyIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('mul-int/lit16', 0xd2);
259
- const dalvikBytecodeOperationDivideIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('div-int/lit16', 0xd3);
260
- const dalvikBytecodeOperationRemainderIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rem-int/lit16', 0xd4);
261
- const dalvikBytecodeOperationAndIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('and-int/lit16', 0xd5);
262
- const dalvikBytecodeOperationOrIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('or-int/lit16', 0xd6);
263
- const dalvikBytecodeOperationXorIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('xor-int/lit16', 0xd7);
264
- const dalvikBytecodeOperationBinaryOperationLiteral16Parser = createUnionParser([
359
+ const dalvikBytecodeOperationAddIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('add-int/lit16', 0xD0);
360
+ const dalvikBytecodeOperationReverseSubtractIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rsub-int', 0xD1);
361
+ const dalvikBytecodeOperationMultiplyIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('mul-int/lit16', 0xD2);
362
+ const dalvikBytecodeOperationDivideIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('div-int/lit16', 0xD3);
363
+ const dalvikBytecodeOperationRemainderIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('rem-int/lit16', 0xD4);
364
+ const dalvikBytecodeOperationAndIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('and-int/lit16', 0xD5);
365
+ const dalvikBytecodeOperationOrIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('or-int/lit16', 0xD6);
366
+ const dalvikBytecodeOperationXorIntLiteral16Parser = createDalvikBytecodeOperationBinaryOperationLiteral16('xor-int/lit16', 0xD7);
367
+ const dalvikBytecodeOperationBinaryOperationLiteral16Parser = createDisjunctionParser([
265
368
  dalvikBytecodeOperationAddIntLiteral16Parser,
266
369
  dalvikBytecodeOperationReverseSubtractIntLiteral16Parser,
267
370
  dalvikBytecodeOperationMultiplyIntLiteral16Parser,
@@ -279,38 +382,39 @@ const createDalvikBytecodeOperationBinaryOperationInPlace = (operation, opcode)
279
382
  operation,
280
383
  registers,
281
384
  }));
282
- const dalvikBytecodeOperationAddIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-int/2addr', 0xb0);
283
- const dalvikBytecodeOperationReverseSubtractIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rsub-int', 0xb1);
284
- const dalvikBytecodeOperationMultiplyIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-int/2addr', 0xb2);
285
- const dalvikBytecodeOperationDivideIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-int/2addr', 0xb3);
286
- const dalvikBytecodeOperationRemainderIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-int/2addr', 0xb4);
287
- const dalvikBytecodeOperationAndIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-int/2addr', 0xb5);
288
- const dalvikBytecodeOperationOrIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-int/2addr', 0xb6);
289
- const dalvikBytecodeOperationXorIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-int/2addr', 0xb7);
290
- const dalvikBytecodeOperationShiftLeftIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-int/2addr', 0xb8);
291
- const dalvikBytecodeOperationShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-int/2addr', 0xb9);
292
- const dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-int/2addr', 0xba);
293
- const dalvikBytecodeOperationAddLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-long/2addr', 0xbb);
294
- const dalvikBytecodeOperationReverseSubtractLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rsub-long', 0xbc);
295
- const dalvikBytecodeOperationMultiplyLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-long/2addr', 0xbd);
296
- const dalvikBytecodeOperationDivideLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-long/2addr', 0xbe);
297
- const dalvikBytecodeOperationRemainderLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-long/2addr', 0xbf);
298
- const dalvikBytecodeOperationAndLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-long/2addr', 0xc0);
299
- const dalvikBytecodeOperationOrLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-long/2addr', 0xc1);
300
- const dalvikBytecodeOperationXorLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-long/2addr', 0xc2);
301
- const dalvikBytecodeOperationShiftLeftLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-long/2addr', 0xc3);
302
- const dalvikBytecodeOperationShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-long/2addr', 0xc4);
303
- const dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-long/2addr', 0xc5);
304
- const dalvikBytecodeOperationAddFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-float/2addr', 0xc6);
305
- const dalvikBytecodeOperationSubtractFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-float/2addr', 0xc7);
306
- const dalvikBytecodeOperationMultiplyFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-float/2addr', 0xc8);
307
- const dalvikBytecodeOperationDivideFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-float/2addr', 0xc9);
308
- const dalvikBytecodeOperationAddDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-double/2addr', 0xca);
309
- const dalvikBytecodeOperationSubtractDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-double/2addr', 0xcb);
310
- const dalvikBytecodeOperationMultiplyDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-double/2addr', 0xcc);
311
- const dalvikBytecodeOperationDivideDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-double/2addr', 0xcd);
312
- const dalvikBytecodeOperationRemainderDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-double/2addr', 0xce);
313
- const dalvikBytecodeOperationBinaryOperationInPlaceParser = createUnionParser([
385
+ const dalvikBytecodeOperationAddIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-int/2addr', 0xB0);
386
+ const dalvikBytecodeOperationReverseSubtractIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-int/2addr', 0xB1);
387
+ const dalvikBytecodeOperationMultiplyIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-int/2addr', 0xB2);
388
+ const dalvikBytecodeOperationDivideIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-int/2addr', 0xB3);
389
+ const dalvikBytecodeOperationRemainderIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-int/2addr', 0xB4);
390
+ const dalvikBytecodeOperationAndIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-int/2addr', 0xB5);
391
+ const dalvikBytecodeOperationOrIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-int/2addr', 0xB6);
392
+ const dalvikBytecodeOperationXorIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-int/2addr', 0xB7);
393
+ const dalvikBytecodeOperationShiftLeftIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-int/2addr', 0xB8);
394
+ const dalvikBytecodeOperationShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-int/2addr', 0xB9);
395
+ const dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-int/2addr', 0xBA);
396
+ const dalvikBytecodeOperationAddLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-long/2addr', 0xBB);
397
+ const dalvikBytecodeOperationSubtractLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-long/2addr', 0xBC);
398
+ const dalvikBytecodeOperationMultiplyLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-long/2addr', 0xBD);
399
+ const dalvikBytecodeOperationDivideLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-long/2addr', 0xBE);
400
+ const dalvikBytecodeOperationRemainderLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-long/2addr', 0xBF);
401
+ const dalvikBytecodeOperationAndLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('and-long/2addr', 0xC0);
402
+ const dalvikBytecodeOperationOrLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('or-long/2addr', 0xC1);
403
+ const dalvikBytecodeOperationXorLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('xor-long/2addr', 0xC2);
404
+ const dalvikBytecodeOperationShiftLeftLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shl-long/2addr', 0xC3);
405
+ const dalvikBytecodeOperationShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('shr-long/2addr', 0xC4);
406
+ const dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('ushr-long/2addr', 0xC5);
407
+ const dalvikBytecodeOperationAddFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-float/2addr', 0xC6);
408
+ const dalvikBytecodeOperationSubtractFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-float/2addr', 0xC7);
409
+ const dalvikBytecodeOperationMultiplyFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-float/2addr', 0xC8);
410
+ const dalvikBytecodeOperationDivideFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-float/2addr', 0xC9);
411
+ const dalvikBytecodeOperationRemainderFloatInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-float/2addr', 0xCA);
412
+ const dalvikBytecodeOperationAddDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('add-double/2addr', 0xCB);
413
+ const dalvikBytecodeOperationSubtractDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('sub-double/2addr', 0xCC);
414
+ const dalvikBytecodeOperationMultiplyDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('mul-double/2addr', 0xCD);
415
+ const dalvikBytecodeOperationDivideDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('div-double/2addr', 0xCE);
416
+ const dalvikBytecodeOperationRemainderDoubleInPlaceParser = createDalvikBytecodeOperationBinaryOperationInPlace('rem-double/2addr', 0xCF);
417
+ const dalvikBytecodeOperationBinaryOperationInPlaceParser = createDisjunctionParser([
314
418
  dalvikBytecodeOperationAddIntInPlaceParser,
315
419
  dalvikBytecodeOperationReverseSubtractIntInPlaceParser,
316
420
  dalvikBytecodeOperationMultiplyIntInPlaceParser,
@@ -323,7 +427,7 @@ const dalvikBytecodeOperationBinaryOperationInPlaceParser = createUnionParser([
323
427
  dalvikBytecodeOperationShiftRightIntInPlaceParser,
324
428
  dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser,
325
429
  dalvikBytecodeOperationAddLongInPlaceParser,
326
- dalvikBytecodeOperationReverseSubtractLongInPlaceParser,
430
+ dalvikBytecodeOperationSubtractLongInPlaceParser,
327
431
  dalvikBytecodeOperationMultiplyLongInPlaceParser,
328
432
  dalvikBytecodeOperationDivideLongInPlaceParser,
329
433
  dalvikBytecodeOperationRemainderLongInPlaceParser,
@@ -337,6 +441,7 @@ const dalvikBytecodeOperationBinaryOperationInPlaceParser = createUnionParser([
337
441
  dalvikBytecodeOperationSubtractFloatInPlaceParser,
338
442
  dalvikBytecodeOperationMultiplyFloatInPlaceParser,
339
443
  dalvikBytecodeOperationDivideFloatInPlaceParser,
444
+ dalvikBytecodeOperationRemainderFloatInPlaceParser,
340
445
  dalvikBytecodeOperationAddDoubleInPlaceParser,
341
446
  dalvikBytecodeOperationSubtractDoubleInPlaceParser,
342
447
  dalvikBytecodeOperationMultiplyDoubleInPlaceParser,
@@ -361,28 +466,28 @@ const dalvikBytecodeOperationOrIntParser = createDalvikBytecodeOperationBinaryOp
361
466
  const dalvikBytecodeOperationXorIntParser = createDalvikBytecodeOperationBinaryOperation('xor-int', 0x97);
362
467
  const dalvikBytecodeOperationShiftLeftIntParser = createDalvikBytecodeOperationBinaryOperation('shl-int', 0x98);
363
468
  const dalvikBytecodeOperationShiftRightIntParser = createDalvikBytecodeOperationBinaryOperation('shr-int', 0x99);
364
- const dalvikBytecodeOperationUnsignedShiftRightIntParser = createDalvikBytecodeOperationBinaryOperation('ushr-int', 0x9a);
365
- const dalvikBytecodeOperationAddLongParser = createDalvikBytecodeOperationBinaryOperation('add-long', 0x9b);
366
- const dalvikBytecodeOperationSubtractLongParser = createDalvikBytecodeOperationBinaryOperation('sub-long', 0x9c);
367
- const dalvikBytecodeOperationMultiplyLongParser = createDalvikBytecodeOperationBinaryOperation('mul-long', 0x9d);
368
- const dalvikBytecodeOperationDivideLongParser = createDalvikBytecodeOperationBinaryOperation('div-long', 0x9e);
369
- const dalvikBytecodeOperationRemainderLongParser = createDalvikBytecodeOperationBinaryOperation('rem-long', 0x9f);
370
- const dalvikBytecodeOperationAndLongParser = createDalvikBytecodeOperationBinaryOperation('and-long', 0xa0);
371
- const dalvikBytecodeOperationOrLongParser = createDalvikBytecodeOperationBinaryOperation('or-long', 0xa1);
372
- const dalvikBytecodeOperationXorLongParser = createDalvikBytecodeOperationBinaryOperation('xor-long', 0xa2);
373
- const dalvikBytecodeOperationShiftLeftLongParser = createDalvikBytecodeOperationBinaryOperation('shl-long', 0xa3);
374
- const dalvikBytecodeOperationShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('shr-long', 0xa4);
375
- const dalvikBytecodeOperationUnsignedShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('ushr-long', 0xa5);
376
- const dalvikBytecodeOperationAddFloatParser = createDalvikBytecodeOperationBinaryOperation('add-float', 0xa6);
377
- const dalvikBytecodeOperationSubtractFloatParser = createDalvikBytecodeOperationBinaryOperation('sub-float', 0xa7);
378
- const dalvikBytecodeOperationMultiplyFloatParser = createDalvikBytecodeOperationBinaryOperation('mul-float', 0xa8);
379
- const dalvikBytecodeOperationDivideFloatParser = createDalvikBytecodeOperationBinaryOperation('div-float', 0xa9);
380
- const dalvikBytecodeOperationAddDoubleParser = createDalvikBytecodeOperationBinaryOperation('add-double', 0xaa);
381
- const dalvikBytecodeOperationSubtractDoubleParser = createDalvikBytecodeOperationBinaryOperation('sub-double', 0xab);
382
- const dalvikBytecodeOperationMultiplyDoubleParser = createDalvikBytecodeOperationBinaryOperation('mul-double', 0xac);
383
- const dalvikBytecodeOperationDivideDoubleParser = createDalvikBytecodeOperationBinaryOperation('div-double', 0xad);
384
- const dalvikBytecodeOperationRemainderDoubleParser = createDalvikBytecodeOperationBinaryOperation('rem-double', 0xae);
385
- const dalvikBytecodeOperationBinaryOperationParser = createUnionParser([
469
+ const dalvikBytecodeOperationUnsignedShiftRightIntParser = createDalvikBytecodeOperationBinaryOperation('ushr-int', 0x9A);
470
+ const dalvikBytecodeOperationAddLongParser = createDalvikBytecodeOperationBinaryOperation('add-long', 0x9B);
471
+ const dalvikBytecodeOperationSubtractLongParser = createDalvikBytecodeOperationBinaryOperation('sub-long', 0x9C);
472
+ const dalvikBytecodeOperationMultiplyLongParser = createDalvikBytecodeOperationBinaryOperation('mul-long', 0x9D);
473
+ const dalvikBytecodeOperationDivideLongParser = createDalvikBytecodeOperationBinaryOperation('div-long', 0x9E);
474
+ const dalvikBytecodeOperationRemainderLongParser = createDalvikBytecodeOperationBinaryOperation('rem-long', 0x9F);
475
+ const dalvikBytecodeOperationAndLongParser = createDalvikBytecodeOperationBinaryOperation('and-long', 0xA0);
476
+ const dalvikBytecodeOperationOrLongParser = createDalvikBytecodeOperationBinaryOperation('or-long', 0xA1);
477
+ const dalvikBytecodeOperationXorLongParser = createDalvikBytecodeOperationBinaryOperation('xor-long', 0xA2);
478
+ const dalvikBytecodeOperationShiftLeftLongParser = createDalvikBytecodeOperationBinaryOperation('shl-long', 0xA3);
479
+ const dalvikBytecodeOperationShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('shr-long', 0xA4);
480
+ const dalvikBytecodeOperationUnsignedShiftRightLongParser = createDalvikBytecodeOperationBinaryOperation('ushr-long', 0xA5);
481
+ const dalvikBytecodeOperationAddFloatParser = createDalvikBytecodeOperationBinaryOperation('add-float', 0xA6);
482
+ const dalvikBytecodeOperationSubtractFloatParser = createDalvikBytecodeOperationBinaryOperation('sub-float', 0xA7);
483
+ const dalvikBytecodeOperationMultiplyFloatParser = createDalvikBytecodeOperationBinaryOperation('mul-float', 0xA8);
484
+ const dalvikBytecodeOperationDivideFloatParser = createDalvikBytecodeOperationBinaryOperation('div-float', 0xA9);
485
+ const dalvikBytecodeOperationAddDoubleParser = createDalvikBytecodeOperationBinaryOperation('add-double', 0xAB);
486
+ const dalvikBytecodeOperationSubtractDoubleParser = createDalvikBytecodeOperationBinaryOperation('sub-double', 0xAC);
487
+ const dalvikBytecodeOperationMultiplyDoubleParser = createDalvikBytecodeOperationBinaryOperation('mul-double', 0xAD);
488
+ const dalvikBytecodeOperationDivideDoubleParser = createDalvikBytecodeOperationBinaryOperation('div-double', 0xAE);
489
+ const dalvikBytecodeOperationRemainderDoubleParser = createDalvikBytecodeOperationBinaryOperation('rem-double', 0xAF);
490
+ const dalvikBytecodeOperationBinaryOperationParser = createDisjunctionParser([
386
491
  dalvikBytecodeOperationAddIntParser,
387
492
  dalvikBytecodeOperationSubtractIntParser,
388
493
  dalvikBytecodeOperationMultiplyIntParser,
@@ -423,11 +528,11 @@ const createDalvikBytecodeOperationUnaryOperation = (operation, opcode) => promi
423
528
  operation,
424
529
  registers,
425
530
  }));
426
- const dalvikBytecodeOperationNegateIntParser = createDalvikBytecodeOperationUnaryOperation('neg-int', 0x7b);
427
- const dalvikBytecodeOperationNotIntParser = createDalvikBytecodeOperationUnaryOperation('not-int', 0x7c);
428
- const dalvikBytecodeOperationNegateLongParser = createDalvikBytecodeOperationUnaryOperation('neg-long', 0x7d);
429
- const dalvikBytecodeOperationNotLongParser = createDalvikBytecodeOperationUnaryOperation('not-long', 0x7e);
430
- const dalvikBytecodeOperationNegateFloatParser = createDalvikBytecodeOperationUnaryOperation('neg-float', 0x7f);
531
+ const dalvikBytecodeOperationNegateIntParser = createDalvikBytecodeOperationUnaryOperation('neg-int', 0x7B);
532
+ const dalvikBytecodeOperationNotIntParser = createDalvikBytecodeOperationUnaryOperation('not-int', 0x7C);
533
+ const dalvikBytecodeOperationNegateLongParser = createDalvikBytecodeOperationUnaryOperation('neg-long', 0x7D);
534
+ const dalvikBytecodeOperationNotLongParser = createDalvikBytecodeOperationUnaryOperation('not-long', 0x7E);
535
+ const dalvikBytecodeOperationNegateFloatParser = createDalvikBytecodeOperationUnaryOperation('neg-float', 0x7F);
431
536
  const dalvikBytecodeOperationNegateDoubleParser = createDalvikBytecodeOperationUnaryOperation('neg-double', 0x80);
432
537
  const dalvikBytecodeOperationIntToLongParser = createDalvikBytecodeOperationUnaryOperation('int-to-long', 0x81);
433
538
  const dalvikBytecodeOperationIntToFloatParser = createDalvikBytecodeOperationUnaryOperation('int-to-float', 0x82);
@@ -438,13 +543,13 @@ const dalvikBytecodeOperationLongToDoubleParser = createDalvikBytecodeOperationU
438
543
  const dalvikBytecodeOperationFloatToIntParser = createDalvikBytecodeOperationUnaryOperation('float-to-int', 0x87);
439
544
  const dalvikBytecodeOperationFloatToLongParser = createDalvikBytecodeOperationUnaryOperation('float-to-long', 0x88);
440
545
  const dalvikBytecodeOperationFloatToDoubleParser = createDalvikBytecodeOperationUnaryOperation('float-to-double', 0x89);
441
- const dalvikBytecodeOperationDoubleToIntParser = createDalvikBytecodeOperationUnaryOperation('double-to-int', 0x8a);
442
- const dalvikBytecodeOperationDoubleToLongParser = createDalvikBytecodeOperationUnaryOperation('double-to-long', 0x8b);
443
- const dalvikBytecodeOperationDoubleToFloatParser = createDalvikBytecodeOperationUnaryOperation('double-to-float', 0x8c);
444
- const dalvikBytecodeOperationIntToByteParser = createDalvikBytecodeOperationUnaryOperation('int-to-byte', 0x8d);
445
- const dalvikBytecodeOperationIntToCharParser = createDalvikBytecodeOperationUnaryOperation('int-to-char', 0x8e);
446
- const dalvikBytecodeOperationIntToShortParser = createDalvikBytecodeOperationUnaryOperation('int-to-short', 0x8f);
447
- const dalvikBytecodeOperationUnaryOperationParser = createUnionParser([
546
+ const dalvikBytecodeOperationDoubleToIntParser = createDalvikBytecodeOperationUnaryOperation('double-to-int', 0x8A);
547
+ const dalvikBytecodeOperationDoubleToLongParser = createDalvikBytecodeOperationUnaryOperation('double-to-long', 0x8B);
548
+ const dalvikBytecodeOperationDoubleToFloatParser = createDalvikBytecodeOperationUnaryOperation('double-to-float', 0x8C);
549
+ const dalvikBytecodeOperationIntToByteParser = createDalvikBytecodeOperationUnaryOperation('int-to-byte', 0x8D);
550
+ const dalvikBytecodeOperationIntToCharParser = createDalvikBytecodeOperationUnaryOperation('int-to-char', 0x8E);
551
+ const dalvikBytecodeOperationIntToShortParser = createDalvikBytecodeOperationUnaryOperation('int-to-short', 0x8F);
552
+ const dalvikBytecodeOperationUnaryOperationParser = createDisjunctionParser([
448
553
  dalvikBytecodeOperationNegateIntParser,
449
554
  dalvikBytecodeOperationNotIntParser,
450
555
  dalvikBytecodeOperationNegateLongParser,
@@ -468,21 +573,31 @@ const dalvikBytecodeOperationUnaryOperationParser = createUnionParser([
468
573
  dalvikBytecodeOperationIntToShortParser,
469
574
  ]);
470
575
  setParserName(dalvikBytecodeOperationUnaryOperationParser, 'dalvikBytecodeOperationUnaryOperationParser');
576
+ // For commutative comparison operations (if-eq, if-ne), sort registers to match baksmali's canonical output
577
+ const createDalvikBytecodeOperationIfTestCommutative = (operation, opcode) => promiseCompose(createTupleParser([
578
+ createExactElementParser(opcode),
579
+ createDalvikBytecodeFormat22tParser(),
580
+ ]), ([_opcode, { registers, branchOffset }]) => ({
581
+ operation,
582
+ registers: registers.sort((a, b) => a - b),
583
+ branchOffset,
584
+ }));
585
+ // For non-commutative comparison operations (if-lt, if-ge, if-gt, if-le), reverse to get correct semantic order
471
586
  const createDalvikBytecodeOperationIfTest = (operation, opcode) => promiseCompose(createTupleParser([
472
587
  createExactElementParser(opcode),
473
588
  createDalvikBytecodeFormat22tParser(),
474
589
  ]), ([_opcode, { registers, branchOffset }]) => ({
475
590
  operation,
476
- registers,
591
+ registers: registers.reverse(),
477
592
  branchOffset,
478
593
  }));
479
- const dalvikBytecodeIfEqualParser = createDalvikBytecodeOperationIfTest('if-eq', 0x32);
480
- const dalvikBytecodeIfNotEqualParser = createDalvikBytecodeOperationIfTest('if-neq', 0x33);
594
+ const dalvikBytecodeIfEqualParser = createDalvikBytecodeOperationIfTestCommutative('if-eq', 0x32);
595
+ const dalvikBytecodeIfNotEqualParser = createDalvikBytecodeOperationIfTestCommutative('if-ne', 0x33);
481
596
  const dalvikBytecodeIfLessThanParser = createDalvikBytecodeOperationIfTest('if-lt', 0x34);
482
597
  const dalvikBytecodeIfGreaterThanOrEqualToParser = createDalvikBytecodeOperationIfTest('if-ge', 0x35);
483
598
  const dalvikBytecodeIfGreaterThanParser = createDalvikBytecodeOperationIfTest('if-gt', 0x36);
484
599
  const dalvikBytecodeIfLessThanOrEqualToParser = createDalvikBytecodeOperationIfTest('if-le', 0x37);
485
- const dalvikBytecodeOperationIfTestParser = createUnionParser([
600
+ const dalvikBytecodeOperationIfTestParser = createDisjunctionParser([
486
601
  dalvikBytecodeIfEqualParser,
487
602
  dalvikBytecodeIfNotEqualParser,
488
603
  dalvikBytecodeIfLessThanParser,
@@ -501,11 +616,11 @@ const createDalvikBytecodeOperationIfTestZero = (operation, opcode) => promiseCo
501
616
  }));
502
617
  const dalvikBytecodeIfEqualZeroParser = createDalvikBytecodeOperationIfTestZero('if-eqz', 0x38);
503
618
  const dalvikBytecodeIfNotEqualZeroParser = createDalvikBytecodeOperationIfTestZero('if-nez', 0x39);
504
- const dalvikBytecodeIfLessThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-ltz', 0x3a);
505
- const dalvikBytecodeIfGreaterThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-gez', 0x3b);
506
- const dalvikBytecodeIfGreaterThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-gtz', 0x3c);
507
- const dalvikBytecodeIfLessThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-lez', 0x3d);
508
- const dalvikBytecodeOperationIfTestZeroParser = createUnionParser([
619
+ const dalvikBytecodeIfLessThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-ltz', 0x3A);
620
+ const dalvikBytecodeIfGreaterThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-gez', 0x3B);
621
+ const dalvikBytecodeIfGreaterThanZeroParser = createDalvikBytecodeOperationIfTestZero('if-gtz', 0x3C);
622
+ const dalvikBytecodeIfLessThanOrEqualToZeroParser = createDalvikBytecodeOperationIfTestZero('if-lez', 0x3D);
623
+ const dalvikBytecodeOperationIfTestZeroParser = createDisjunctionParser([
509
624
  dalvikBytecodeIfEqualZeroParser,
510
625
  dalvikBytecodeIfNotEqualZeroParser,
511
626
  dalvikBytecodeIfLessThanZeroParser,
@@ -515,7 +630,7 @@ const dalvikBytecodeOperationIfTestZeroParser = createUnionParser([
515
630
  ]);
516
631
  setParserName(dalvikBytecodeOperationIfTestZeroParser, 'dalvikBytecodeOperationIfTestZeroParser');
517
632
  const dalvikBytecodeOperationConstStringParser = promiseCompose(createTupleParser([
518
- createExactElementParser(0x1a),
633
+ createExactElementParser(0x1A),
519
634
  createDalvikBytecodeFormat21cParser({
520
635
  isoIndex: isoIndexIntoStringIds,
521
636
  }),
@@ -525,8 +640,19 @@ const dalvikBytecodeOperationConstStringParser = promiseCompose(createTupleParse
525
640
  registers,
526
641
  }));
527
642
  setParserName(dalvikBytecodeOperationConstStringParser, 'dalvikBytecodeOperationConstStringParser');
643
+ const dalvikBytecodeOperationConstStringJumboParser = promiseCompose(createTupleParser([
644
+ createExactElementParser(0x1B),
645
+ createDalvikBytecodeFormat31cParser({
646
+ isoIndex: isoIndexIntoStringIds,
647
+ }),
648
+ ]), ([_opcode, { index, registers }]) => ({
649
+ operation: 'const-string/jumbo',
650
+ stringIndex: index,
651
+ registers,
652
+ }));
653
+ setParserName(dalvikBytecodeOperationConstStringJumboParser, 'dalvikBytecodeOperationConstStringJumboParser');
528
654
  const dalvikBytecodeOperationConstMethodHandleParser = promiseCompose(createTupleParser([
529
- createExactElementParser(0xfe),
655
+ createExactElementParser(0xFE),
530
656
  createDalvikBytecodeFormat21cParser({
531
657
  isoIndex: isoIndexIntoMethodIds,
532
658
  }),
@@ -558,8 +684,39 @@ const dalvikBytecodeOperationNewArrayParser = promiseCompose(createTupleParser([
558
684
  registers,
559
685
  }));
560
686
  setParserName(dalvikBytecodeOperationNewArrayParser, 'dalvikBytecodeOperationNewArrayParser');
687
+ const dalvikBytecodeOperationFilledNewArrayParser = promiseCompose(createTupleParser([
688
+ createExactElementParser(0x24),
689
+ createDalvikBytecodeFormat35cParser({
690
+ isoIndex: isoIndexIntoTypeIds,
691
+ }),
692
+ ]), ([_opcode, { index, registers }]) => ({
693
+ operation: 'filled-new-array',
694
+ typeIndex: index,
695
+ registers,
696
+ }));
697
+ setParserName(dalvikBytecodeOperationFilledNewArrayParser, 'dalvikBytecodeOperationFilledNewArrayParser');
698
+ const dalvikBytecodeOperationFilledNewArrayRangeParser = promiseCompose(createTupleParser([
699
+ createExactElementParser(0x25),
700
+ createDalvikBytecodeFormat3rcParser({
701
+ isoIndex: isoIndexIntoTypeIds,
702
+ }),
703
+ ]), ([_opcode, { index, registers }]) => ({
704
+ operation: 'filled-new-array/range',
705
+ typeIndex: index,
706
+ registers,
707
+ }));
708
+ setParserName(dalvikBytecodeOperationFilledNewArrayRangeParser, 'dalvikBytecodeOperationFilledNewArrayRangeParser');
709
+ const dalvikBytecodeOperationFillArrayDataParser = promiseCompose(createTupleParser([
710
+ createExactElementParser(0x26),
711
+ dalvikBytecodeFormat31tParser,
712
+ ]), ([_opcode, { branchOffset, registers }]) => ({
713
+ operation: 'fill-array-data',
714
+ branchOffset,
715
+ registers,
716
+ }));
717
+ setParserName(dalvikBytecodeOperationFillArrayDataParser, 'dalvikBytecodeOperationFillArrayDataParser');
561
718
  const dalvikBytecodeOperationCheckCastParser = promiseCompose(createTupleParser([
562
- createExactElementParser(0x1f),
719
+ createExactElementParser(0x1F),
563
720
  createDalvikBytecodeFormat21cParser({
564
721
  isoIndex: isoIndexIntoTypeIds,
565
722
  }),
@@ -569,8 +726,16 @@ const dalvikBytecodeOperationCheckCastParser = promiseCompose(createTupleParser(
569
726
  registers,
570
727
  }));
571
728
  setParserName(dalvikBytecodeOperationCheckCastParser, 'dalvikBytecodeOperationCheckCastParser');
729
+ const dalvikBytecodeOperationArrayLengthParser = promiseCompose(createTupleParser([
730
+ createExactElementParser(0x21),
731
+ dalvikBytecodeFormat12xParser,
732
+ ]), ([_opcode, { registers }]) => ({
733
+ operation: 'array-length',
734
+ registers: registers.reverse(),
735
+ }));
736
+ setParserName(dalvikBytecodeOperationArrayLengthParser, 'dalvikBytecodeOperationArrayLengthParser');
572
737
  const dalvikBytecodeOperationConstClassParser = promiseCompose(createTupleParser([
573
- createExactElementParser(0x1c),
738
+ createExactElementParser(0x1C),
574
739
  createDalvikBytecodeFormat21cParser({
575
740
  isoIndex: isoIndexIntoTypeIds,
576
741
  }),
@@ -580,8 +745,24 @@ const dalvikBytecodeOperationConstClassParser = promiseCompose(createTupleParser
580
745
  registers,
581
746
  }));
582
747
  setParserName(dalvikBytecodeOperationConstClassParser, 'dalvikBytecodeOperationConstClassParser');
748
+ const dalvikBytecodeOperationMonitorEnterParser = promiseCompose(createTupleParser([
749
+ createExactElementParser(0x1D),
750
+ dalvikBytecodeFormat11xParser,
751
+ ]), ([_opcode, { registers }]) => ({
752
+ operation: 'monitor-enter',
753
+ registers,
754
+ }));
755
+ setParserName(dalvikBytecodeOperationMonitorEnterParser, 'dalvikBytecodeOperationMonitorEnterParser');
756
+ const dalvikBytecodeOperationMonitorExitParser = promiseCompose(createTupleParser([
757
+ createExactElementParser(0x1E),
758
+ dalvikBytecodeFormat11xParser,
759
+ ]), ([_opcode, { registers }]) => ({
760
+ operation: 'monitor-exit',
761
+ registers,
762
+ }));
763
+ setParserName(dalvikBytecodeOperationMonitorExitParser, 'dalvikBytecodeOperationMonitorExitParser');
583
764
  const dalvikBytecodeOperationReturnVoidParser = promiseCompose(createTupleParser([
584
- createExactElementParser(0x0e),
765
+ createExactElementParser(0x0E),
585
766
  dalvikBytecodeFormat10xParser,
586
767
  ]), () => ({
587
768
  operation: 'return-void',
@@ -594,11 +775,11 @@ const createDalvikBytecodeMoveResult1Parser = (operation, opcode) => promiseComp
594
775
  operation,
595
776
  registers,
596
777
  }));
597
- const dalvikBytecodeMoveResultParser = createDalvikBytecodeMoveResult1Parser('move-result', 0x0a);
598
- const dalvikBytecodeMoveResultWideParser = createDalvikBytecodeMoveResult1Parser('move-result-wide', 0x0b);
599
- const dalvikBytecodeMoveResultObjectParser = createDalvikBytecodeMoveResult1Parser('move-result-object', 0x0c);
600
- const dalvikBytecodeMoveExceptionParser = createDalvikBytecodeMoveResult1Parser('move-exception', 0x0d);
601
- const dalvikBytecodeOperationMoveResult1Parser = createUnionParser([
778
+ const dalvikBytecodeMoveResultParser = createDalvikBytecodeMoveResult1Parser('move-result', 0x0A);
779
+ const dalvikBytecodeMoveResultWideParser = createDalvikBytecodeMoveResult1Parser('move-result-wide', 0x0B);
780
+ const dalvikBytecodeMoveResultObjectParser = createDalvikBytecodeMoveResult1Parser('move-result-object', 0x0C);
781
+ const dalvikBytecodeMoveExceptionParser = createDalvikBytecodeMoveResult1Parser('move-exception', 0x0D);
782
+ const dalvikBytecodeOperationMoveResult1Parser = createDisjunctionParser([
602
783
  dalvikBytecodeMoveResultParser,
603
784
  dalvikBytecodeMoveResultWideParser,
604
785
  dalvikBytecodeMoveResultObjectParser,
@@ -659,10 +840,10 @@ const dalvikBytecodeOperationMoveWide16Parser = promiseCompose(createTupleParser
659
840
  }));
660
841
  setParserName(dalvikBytecodeOperationMoveWide16Parser, 'dalvikBytecodeOperationMoveWide16Parser');
661
842
  const createDalvikBytecodeOperationReturn1Parser = createDalvikBytecodeMoveResult1Parser;
662
- const dalvikBytecodeOperationReturnParser = createDalvikBytecodeOperationReturn1Parser('return', 0x0f);
843
+ const dalvikBytecodeOperationReturnParser = createDalvikBytecodeOperationReturn1Parser('return', 0x0F);
663
844
  const dalvikBytecodeOperationReturnWideParser = createDalvikBytecodeOperationReturn1Parser('return-wide', 0x10);
664
845
  const dalvikBytecodeOperationReturnObjectParser = createDalvikBytecodeOperationReturn1Parser('return-object', 0x11);
665
- const dalvikBytecodeOperationReturn1Parser = createUnionParser([
846
+ const dalvikBytecodeOperationReturn1Parser = createDisjunctionParser([
666
847
  dalvikBytecodeOperationReturnParser,
667
848
  dalvikBytecodeOperationReturnWideParser,
668
849
  dalvikBytecodeOperationReturnObjectParser,
@@ -670,13 +851,11 @@ const dalvikBytecodeOperationReturn1Parser = createUnionParser([
670
851
  setParserName(dalvikBytecodeOperationReturn1Parser, 'dalvikBytecodeOperationReturn1Parser');
671
852
  const dalvikBytecodeOperationConst4Parser = promiseCompose(createTupleParser([
672
853
  createExactElementParser(0x12),
673
- nibblesParser,
674
- ]), ([_opcode, [register0, value,],]) => ({
854
+ dalvikBytecodeFormat11nParser,
855
+ ]), ([_opcode, { value, registers },]) => ({
675
856
  operation: 'const/4',
676
- registers: [
677
- register0,
678
- ],
679
- value: value << 28 >> 28,
857
+ registers,
858
+ value,
680
859
  }));
681
860
  setParserName(dalvikBytecodeOperationConst4Parser, 'dalvikBytecodeOperationConst4Parser');
682
861
  const dalvikBytecodeOperationConst16Parser = promiseCompose(createTupleParser([
@@ -706,6 +885,33 @@ const dalvikBytecodeOperationConstWide16Parser = promiseCompose(createTupleParse
706
885
  value: BigInt(value) << 48n >> 48n,
707
886
  }));
708
887
  setParserName(dalvikBytecodeOperationConstWide16Parser, 'dalvikBytecodeOperationConstWide16Parser');
888
+ const dalvikBytecodeOperationConstWide32Parser = promiseCompose(createTupleParser([
889
+ createExactElementParser(0x17),
890
+ dalvikBytecodeFormat31iParser,
891
+ ]), ([_opcode, { registers, value }]) => ({
892
+ operation: 'const-wide/32',
893
+ registers,
894
+ value: BigInt(value) << 32n >> 32n,
895
+ }));
896
+ setParserName(dalvikBytecodeOperationConstWide32Parser, 'dalvikBytecodeOperationConstWide32Parser');
897
+ const dalvikBytecodeOperationConstWideParser = promiseCompose(createTupleParser([
898
+ createExactElementParser(0x18),
899
+ dalvikBytecodeFormat51lParser,
900
+ ]), ([_opcode, { registers, value }]) => ({
901
+ operation: 'const-wide',
902
+ registers,
903
+ value,
904
+ }));
905
+ setParserName(dalvikBytecodeOperationConstWideParser, 'dalvikBytecodeOperationConstWideParser');
906
+ const dalvikBytecodeOperationConstWideHigh16Parser = promiseCompose(createTupleParser([
907
+ createExactElementParser(0x19),
908
+ createDalvikBytecodeFormat21sParser(),
909
+ ]), ([_opcode, { registers, value }]) => ({
910
+ operation: 'const-wide/high16',
911
+ registers,
912
+ value: BigInt(value) << 48n,
913
+ }));
914
+ setParserName(dalvikBytecodeOperationConstWideHigh16Parser, 'dalvikBytecodeOperationConstWideHigh16Parser');
709
915
  const dalvikBytecodeOperationConstParser = promiseCompose(createTupleParser([
710
916
  createExactElementParser(0x14),
711
917
  dalvikBytecodeFormat31iParser,
@@ -730,12 +936,12 @@ const createDalvikBytecodeOperationCompare = (operation, opcode) => promiseCompo
730
936
  operation,
731
937
  registers,
732
938
  }));
733
- const dalvikBytecodeOperationCompareFloatWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-float', 0x2d);
734
- const dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser = createDalvikBytecodeOperationCompare('cmpg-float', 0x2e);
735
- const dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-double', 0x2f);
939
+ const dalvikBytecodeOperationCompareFloatWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-float', 0x2D);
940
+ const dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser = createDalvikBytecodeOperationCompare('cmpg-float', 0x2E);
941
+ const dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser = createDalvikBytecodeOperationCompare('cmpl-double', 0x2F);
736
942
  const dalvikBytecodeOperationCompareDoubleWithGreaterThanBiasParser = createDalvikBytecodeOperationCompare('cmpg-double', 0x30);
737
943
  const dalvikBytecodeOperationCompareLongParser = createDalvikBytecodeOperationCompare('cmp-long', 0x31);
738
- const dalvikBytecodeOperationCompareParser = createUnionParser([
944
+ const dalvikBytecodeOperationCompareParser = createDisjunctionParser([
739
945
  dalvikBytecodeOperationCompareFloatWithLessThanBiasParser,
740
946
  dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser,
741
947
  dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser,
@@ -751,55 +957,302 @@ export const dalvikBytecodeOperationCompanion = {
751
957
  return [];
752
958
  },
753
959
  };
960
+ // Map of single-byte opcodes to their parsers for O(1) lookup
961
+ const dalvikBytecodeOperationOpcodeMap = new Map([
962
+ // Invoke operations
963
+ [0x6E, dalvikBytecodeOperationInvokeVirtualParser],
964
+ [0x6F, dalvikBytecodeOperationInvokeSuperParser],
965
+ [0x70, dalvikBytecodeOperationInvokeDirectParser],
966
+ [0x71, dalvikBytecodeOperationInvokeStaticParser],
967
+ [0x72, dalvikBytecodeOperationInvokeInterfaceParser],
968
+ // Invoke range operations
969
+ [0x74, dalvikBytecodeOperationInvokeVirtualRangeParser],
970
+ [0x75, dalvikBytecodeOperationInvokeSuperRangeParser],
971
+ [0x76, dalvikBytecodeOperationInvokeDirectRangeParser],
972
+ [0x77, dalvikBytecodeOperationInvokeStaticRangeParser],
973
+ [0x78, dalvikBytecodeOperationInvokeInterfaceRangeParser],
974
+ // Invoke polymorphic operations
975
+ [0xFA, dalvikBytecodeOperationInvokePolymorphicParser],
976
+ [0xFB, dalvikBytecodeOperationInvokePolymorphicRangeParser],
977
+ // New instance/array operations
978
+ [0x22, dalvikBytecodeOperationNewInstanceParser],
979
+ [0x23, dalvikBytecodeOperationNewArrayParser],
980
+ [0x24, dalvikBytecodeOperationFilledNewArrayParser],
981
+ [0x25, dalvikBytecodeOperationFilledNewArrayRangeParser],
982
+ [0x26, dalvikBytecodeOperationFillArrayDataParser],
983
+ [0x1F, dalvikBytecodeOperationCheckCastParser],
984
+ [0x20, dalvikBytecodeOperationInstanceOfParser],
985
+ [0x21, dalvikBytecodeOperationArrayLengthParser],
986
+ // Array element operations (aget/aput)
987
+ [0x44, dalvikBytecodeOperationArrayElementGetParser],
988
+ [0x45, dalvikBytecodeOperationArrayElementGetWideParser],
989
+ [0x46, dalvikBytecodeOperationArrayElementGetObjectParser],
990
+ [0x47, dalvikBytecodeOperationArrayElementGetBooleanParser],
991
+ [0x48, dalvikBytecodeOperationArrayElementGetByteParser],
992
+ [0x49, dalvikBytecodeOperationArrayElementGetCharParser],
993
+ [0x4A, dalvikBytecodeOperationArrayElementGetShortParser],
994
+ [0x4B, dalvikBytecodeOperationArrayElementPutParser],
995
+ [0x4C, dalvikBytecodeOperationArrayElementPutWideParser],
996
+ [0x4D, dalvikBytecodeOperationArrayElementPutObjectParser],
997
+ [0x4E, dalvikBytecodeOperationArrayElementPutBooleanParser],
998
+ [0x4F, dalvikBytecodeOperationArrayElementPutByteParser],
999
+ [0x50, dalvikBytecodeOperationArrayElementPutCharParser],
1000
+ [0x51, dalvikBytecodeOperationArrayElementPutShortParser],
1001
+ // Instance field operations (iget/iput)
1002
+ [0x52, dalvikBytecodeOperationInstanceFieldGetParser],
1003
+ [0x53, dalvikBytecodeOperationInstanceFieldGetWideParser],
1004
+ [0x54, dalvikBytecodeOperationInstanceFieldGetObjectParser],
1005
+ [0x55, dalvikBytecodeOperationInstanceFieldGetBooleanParser],
1006
+ [0x56, dalvikBytecodeOperationInstanceFieldGetByteParser],
1007
+ [0x57, dalvikBytecodeOperationInstanceFieldGetCharParser],
1008
+ [0x58, dalvikBytecodeOperationInstanceFieldGetShortParser],
1009
+ [0x59, dalvikBytecodeOperationInstanceFieldPutParser],
1010
+ [0x5A, dalvikBytecodeOperationInstanceFieldPutWideParser],
1011
+ [0x5B, dalvikBytecodeOperationInstanceFieldPutObjectParser],
1012
+ [0x5C, dalvikBytecodeOperationInstanceFieldPutBooleanParser],
1013
+ [0x5D, dalvikBytecodeOperationInstanceFieldPutByteParser],
1014
+ [0x5E, dalvikBytecodeOperationInstanceFieldPutCharParser],
1015
+ [0x5F, dalvikBytecodeOperationInstanceFieldPutShortParser],
1016
+ // Static field operations (sget/sput)
1017
+ [0x60, dalvikBytecodeOperationStaticFieldGetParser],
1018
+ [0x61, dalvikBytecodeOperationStaticFieldGetWideParser],
1019
+ [0x62, dalvikBytecodeOperationStaticFieldGetObjectParser],
1020
+ [0x63, dalvikBytecodeOperationStaticFieldGetBooleanParser],
1021
+ [0x64, dalvikBytecodeOperationStaticFieldGetByteParser],
1022
+ [0x65, dalvikBytecodeOperationStaticFieldGetCharParser],
1023
+ [0x66, dalvikBytecodeOperationStaticFieldGetShortParser],
1024
+ [0x67, dalvikBytecodeOperationStaticFieldPutParser],
1025
+ [0x68, dalvikBytecodeOperationStaticFieldPutWideParser],
1026
+ [0x69, dalvikBytecodeOperationStaticFieldPutObjectParser],
1027
+ [0x6A, dalvikBytecodeOperationStaticFieldPutBooleanParser],
1028
+ [0x6B, dalvikBytecodeOperationStaticFieldPutByteParser],
1029
+ [0x6C, dalvikBytecodeOperationStaticFieldPutCharParser],
1030
+ [0x6D, dalvikBytecodeOperationStaticFieldPutShortParser],
1031
+ // Const operations
1032
+ [0x1A, dalvikBytecodeOperationConstStringParser],
1033
+ [0x1B, dalvikBytecodeOperationConstStringJumboParser],
1034
+ [0xFE, dalvikBytecodeOperationConstMethodHandleParser],
1035
+ [0x1C, dalvikBytecodeOperationConstClassParser],
1036
+ // Monitor operations
1037
+ [0x1D, dalvikBytecodeOperationMonitorEnterParser],
1038
+ [0x1E, dalvikBytecodeOperationMonitorExitParser],
1039
+ // Return operations
1040
+ [0x0E, dalvikBytecodeOperationReturnVoidParser],
1041
+ [0x0F, dalvikBytecodeOperationReturnParser],
1042
+ [0x10, dalvikBytecodeOperationReturnWideParser],
1043
+ [0x11, dalvikBytecodeOperationReturnObjectParser],
1044
+ // Throw operation
1045
+ [0x27, dalvikBytecodeOperationThrowParser],
1046
+ // Goto operations
1047
+ [0x28, dalvikBytecodeOperationGotoParser],
1048
+ [0x29, dalvikBytecodeOperationGoto16Parser],
1049
+ [0x2A, dalvikBytecodeOperationGoto32Parser],
1050
+ [0x2B, dalvikBytecodeOperationPackedSwitchParser],
1051
+ [0x2C, dalvikBytecodeOperationSparseSwitchParser],
1052
+ // Move result operations
1053
+ [0x0A, dalvikBytecodeMoveResultParser],
1054
+ [0x0B, dalvikBytecodeMoveResultWideParser],
1055
+ [0x0C, dalvikBytecodeMoveResultObjectParser],
1056
+ [0x0D, dalvikBytecodeMoveExceptionParser],
1057
+ // Move operations
1058
+ [0x01, dalvikBytecodeOperationMoveParser],
1059
+ [0x04, dalvikBytecodeOperationMoveWideParser],
1060
+ [0x07, dalvikBytecodeOperationMoveObjectParser],
1061
+ [0x02, dalvikBytecodeOperationMoveFrom16Parser],
1062
+ [0x05, dalvikBytecodeOperationMoveWideFrom16Parser],
1063
+ [0x08, dalvikBytecodeOperationMoveObjectFrom16Parser],
1064
+ [0x06, dalvikBytecodeOperationMoveWide16Parser],
1065
+ // Const value operations
1066
+ [0x12, dalvikBytecodeOperationConst4Parser],
1067
+ [0x13, dalvikBytecodeOperationConst16Parser],
1068
+ [0x15, dalvikBytecodeOperationConstHigh16Parser],
1069
+ [0x16, dalvikBytecodeOperationConstWide16Parser],
1070
+ [0x17, dalvikBytecodeOperationConstWide32Parser],
1071
+ [0x18, dalvikBytecodeOperationConstWideParser],
1072
+ [0x19, dalvikBytecodeOperationConstWideHigh16Parser],
1073
+ [0x14, dalvikBytecodeOperationConstParser],
1074
+ // Compare operations
1075
+ [0x2D, dalvikBytecodeOperationCompareFloatWithLessThanBiasParser],
1076
+ [0x2E, dalvikBytecodeOperationCompareFloatWithGreaterThanBiasParser],
1077
+ [0x2F, dalvikBytecodeOperationCompareDoubleWithLessThanBiasParser],
1078
+ [0x30, dalvikBytecodeOperationCompareDoubleWithGreaterThanBiasParser],
1079
+ [0x31, dalvikBytecodeOperationCompareLongParser],
1080
+ // If test operations
1081
+ [0x32, dalvikBytecodeIfEqualParser],
1082
+ [0x33, dalvikBytecodeIfNotEqualParser],
1083
+ [0x34, dalvikBytecodeIfLessThanParser],
1084
+ [0x35, dalvikBytecodeIfGreaterThanOrEqualToParser],
1085
+ [0x36, dalvikBytecodeIfGreaterThanParser],
1086
+ [0x37, dalvikBytecodeIfLessThanOrEqualToParser],
1087
+ // If test zero operations
1088
+ [0x38, dalvikBytecodeIfEqualZeroParser],
1089
+ [0x39, dalvikBytecodeIfNotEqualZeroParser],
1090
+ [0x3A, dalvikBytecodeIfLessThanZeroParser],
1091
+ [0x3B, dalvikBytecodeIfGreaterThanOrEqualToZeroParser],
1092
+ [0x3C, dalvikBytecodeIfGreaterThanZeroParser],
1093
+ [0x3D, dalvikBytecodeIfLessThanOrEqualToZeroParser],
1094
+ // Binary operations
1095
+ [0x90, dalvikBytecodeOperationAddIntParser],
1096
+ [0x91, dalvikBytecodeOperationSubtractIntParser],
1097
+ [0x92, dalvikBytecodeOperationMultiplyIntParser],
1098
+ [0x93, dalvikBytecodeOperationDivideIntParser],
1099
+ [0x94, dalvikBytecodeOperationRemainderIntParser],
1100
+ [0x95, dalvikBytecodeOperationAndIntParser],
1101
+ [0x96, dalvikBytecodeOperationOrIntParser],
1102
+ [0x97, dalvikBytecodeOperationXorIntParser],
1103
+ [0x98, dalvikBytecodeOperationShiftLeftIntParser],
1104
+ [0x99, dalvikBytecodeOperationShiftRightIntParser],
1105
+ [0x9A, dalvikBytecodeOperationUnsignedShiftRightIntParser],
1106
+ [0x9B, dalvikBytecodeOperationAddLongParser],
1107
+ [0x9C, dalvikBytecodeOperationSubtractLongParser],
1108
+ [0x9D, dalvikBytecodeOperationMultiplyLongParser],
1109
+ [0x9E, dalvikBytecodeOperationDivideLongParser],
1110
+ [0x9F, dalvikBytecodeOperationRemainderLongParser],
1111
+ [0xA0, dalvikBytecodeOperationAndLongParser],
1112
+ [0xA1, dalvikBytecodeOperationOrLongParser],
1113
+ [0xA2, dalvikBytecodeOperationXorLongParser],
1114
+ [0xA3, dalvikBytecodeOperationShiftLeftLongParser],
1115
+ [0xA4, dalvikBytecodeOperationShiftRightLongParser],
1116
+ [0xA5, dalvikBytecodeOperationUnsignedShiftRightLongParser],
1117
+ [0xA6, dalvikBytecodeOperationAddFloatParser],
1118
+ [0xA7, dalvikBytecodeOperationSubtractFloatParser],
1119
+ [0xA8, dalvikBytecodeOperationMultiplyFloatParser],
1120
+ [0xA9, dalvikBytecodeOperationDivideFloatParser],
1121
+ // Note: 0xAA (rem-float) parser is missing in codebase
1122
+ [0xAB, dalvikBytecodeOperationAddDoubleParser],
1123
+ [0xAC, dalvikBytecodeOperationSubtractDoubleParser],
1124
+ [0xAD, dalvikBytecodeOperationMultiplyDoubleParser],
1125
+ [0xAE, dalvikBytecodeOperationDivideDoubleParser],
1126
+ [0xAF, dalvikBytecodeOperationRemainderDoubleParser],
1127
+ // Binary operations in place (2addr)
1128
+ [0xB0, dalvikBytecodeOperationAddIntInPlaceParser],
1129
+ [0xB1, dalvikBytecodeOperationReverseSubtractIntInPlaceParser],
1130
+ [0xB2, dalvikBytecodeOperationMultiplyIntInPlaceParser],
1131
+ [0xB3, dalvikBytecodeOperationDivideIntInPlaceParser],
1132
+ [0xB4, dalvikBytecodeOperationRemainderIntInPlaceParser],
1133
+ [0xB5, dalvikBytecodeOperationAndIntInPlaceParser],
1134
+ [0xB6, dalvikBytecodeOperationOrIntInPlaceParser],
1135
+ [0xB7, dalvikBytecodeOperationXorIntInPlaceParser],
1136
+ [0xB8, dalvikBytecodeOperationShiftLeftIntInPlaceParser],
1137
+ [0xB9, dalvikBytecodeOperationShiftRightIntInPlaceParser],
1138
+ [0xBA, dalvikBytecodeOperationUnsignedShiftRightIntInPlaceParser],
1139
+ [0xBB, dalvikBytecodeOperationAddLongInPlaceParser],
1140
+ [0xBC, dalvikBytecodeOperationSubtractLongInPlaceParser],
1141
+ [0xBD, dalvikBytecodeOperationMultiplyLongInPlaceParser],
1142
+ [0xBE, dalvikBytecodeOperationDivideLongInPlaceParser],
1143
+ [0xBF, dalvikBytecodeOperationRemainderLongInPlaceParser],
1144
+ [0xC0, dalvikBytecodeOperationAndLongInPlaceParser],
1145
+ [0xC1, dalvikBytecodeOperationOrLongInPlaceParser],
1146
+ [0xC2, dalvikBytecodeOperationXorLongInPlaceParser],
1147
+ [0xC3, dalvikBytecodeOperationShiftLeftLongInPlaceParser],
1148
+ [0xC4, dalvikBytecodeOperationShiftRightLongInPlaceParser],
1149
+ [0xC5, dalvikBytecodeOperationUnsignedShiftRightLongInPlaceParser],
1150
+ [0xC6, dalvikBytecodeOperationAddFloatInPlaceParser],
1151
+ [0xC7, dalvikBytecodeOperationSubtractFloatInPlaceParser],
1152
+ [0xC8, dalvikBytecodeOperationMultiplyFloatInPlaceParser],
1153
+ [0xC9, dalvikBytecodeOperationDivideFloatInPlaceParser],
1154
+ [0xCA, dalvikBytecodeOperationRemainderFloatInPlaceParser],
1155
+ [0xCB, dalvikBytecodeOperationAddDoubleInPlaceParser],
1156
+ [0xCC, dalvikBytecodeOperationSubtractDoubleInPlaceParser],
1157
+ [0xCD, dalvikBytecodeOperationMultiplyDoubleInPlaceParser],
1158
+ [0xCE, dalvikBytecodeOperationDivideDoubleInPlaceParser],
1159
+ [0xCF, dalvikBytecodeOperationRemainderDoubleInPlaceParser],
1160
+ // Binary operations with literal16
1161
+ [0xD0, dalvikBytecodeOperationAddIntLiteral16Parser],
1162
+ [0xD1, dalvikBytecodeOperationReverseSubtractIntLiteral16Parser],
1163
+ [0xD2, dalvikBytecodeOperationMultiplyIntLiteral16Parser],
1164
+ [0xD3, dalvikBytecodeOperationDivideIntLiteral16Parser],
1165
+ [0xD4, dalvikBytecodeOperationRemainderIntLiteral16Parser],
1166
+ [0xD5, dalvikBytecodeOperationAndIntLiteral16Parser],
1167
+ [0xD6, dalvikBytecodeOperationOrIntLiteral16Parser],
1168
+ [0xD7, dalvikBytecodeOperationXorIntLiteral16Parser],
1169
+ // Binary operations with literal8
1170
+ [0xD8, dalvikBytecodeOperationAddIntLiteral8Parser],
1171
+ [0xD9, dalvikBytecodeOperationReverseSubtractIntLiteral8Parser],
1172
+ [0xDA, dalvikBytecodeOperationMultiplyIntLiteral8Parser],
1173
+ [0xDB, dalvikBytecodeOperationDivideIntLiteral8Parser],
1174
+ [0xDC, dalvikBytecodeOperationRemainderIntLiteral8Parser],
1175
+ [0xDD, dalvikBytecodeOperationAndIntLiteral8Parser],
1176
+ [0xDE, dalvikBytecodeOperationOrIntLiteral8Parser],
1177
+ [0xDF, dalvikBytecodeOperationXorIntLiteral8Parser],
1178
+ [0xE0, dalvikBytecodeOperationShiftLeftIntLiteral8Parser],
1179
+ [0xE1, dalvikBytecodeOperationShiftRightIntLiteral8Parser],
1180
+ [0xE2, dalvikBytecodeOperationUnsignedShiftRightIntLiteral8Parser],
1181
+ // Unary operations
1182
+ [0x7B, dalvikBytecodeOperationNegateIntParser],
1183
+ [0x7C, dalvikBytecodeOperationNotIntParser],
1184
+ [0x7D, dalvikBytecodeOperationNegateLongParser],
1185
+ [0x7E, dalvikBytecodeOperationNotLongParser],
1186
+ [0x7F, dalvikBytecodeOperationNegateFloatParser],
1187
+ [0x80, dalvikBytecodeOperationNegateDoubleParser],
1188
+ [0x81, dalvikBytecodeOperationIntToLongParser],
1189
+ [0x82, dalvikBytecodeOperationIntToFloatParser],
1190
+ [0x83, dalvikBytecodeOperationIntToDoubleParser],
1191
+ [0x84, dalvikBytecodeOperationLongToIntParser],
1192
+ [0x85, dalvikBytecodeOperationLongToFloatParser],
1193
+ [0x86, dalvikBytecodeOperationLongToDoubleParser],
1194
+ [0x87, dalvikBytecodeOperationFloatToIntParser],
1195
+ [0x88, dalvikBytecodeOperationFloatToLongParser],
1196
+ [0x89, dalvikBytecodeOperationFloatToDoubleParser],
1197
+ [0x8A, dalvikBytecodeOperationDoubleToIntParser],
1198
+ [0x8B, dalvikBytecodeOperationDoubleToLongParser],
1199
+ [0x8C, dalvikBytecodeOperationDoubleToFloatParser],
1200
+ [0x8D, dalvikBytecodeOperationIntToByteParser],
1201
+ [0x8E, dalvikBytecodeOperationIntToCharParser],
1202
+ [0x8F, dalvikBytecodeOperationIntToShortParser],
1203
+ // Unused opcodes
1204
+ // Range 0x3E-0x43
1205
+ [0x3E, dalvikBytecodeOperationUnusedParser],
1206
+ [0x3F, dalvikBytecodeOperationUnusedParser],
1207
+ [0x40, dalvikBytecodeOperationUnusedParser],
1208
+ [0x41, dalvikBytecodeOperationUnusedParser],
1209
+ [0x42, dalvikBytecodeOperationUnusedParser],
1210
+ [0x43, dalvikBytecodeOperationUnusedParser],
1211
+ // 0x73
1212
+ [0x73, dalvikBytecodeOperationUnusedParser],
1213
+ // Range 0x79-0x7A
1214
+ [0x79, dalvikBytecodeOperationUnusedParser],
1215
+ [0x7A, dalvikBytecodeOperationUnusedParser],
1216
+ // Range 0xE3-0xF9
1217
+ [0xE3, dalvikBytecodeOperationUnusedParser],
1218
+ [0xE4, dalvikBytecodeOperationUnusedParser],
1219
+ [0xE5, dalvikBytecodeOperationUnusedParser],
1220
+ [0xE6, dalvikBytecodeOperationUnusedParser],
1221
+ [0xE7, dalvikBytecodeOperationUnusedParser],
1222
+ [0xE8, dalvikBytecodeOperationUnusedParser],
1223
+ [0xE9, dalvikBytecodeOperationUnusedParser],
1224
+ [0xEA, dalvikBytecodeOperationUnusedParser],
1225
+ [0xEB, dalvikBytecodeOperationUnusedParser],
1226
+ [0xEC, dalvikBytecodeOperationUnusedParser],
1227
+ [0xED, dalvikBytecodeOperationUnusedParser],
1228
+ [0xEE, dalvikBytecodeOperationUnusedParser],
1229
+ [0xEF, dalvikBytecodeOperationUnusedParser],
1230
+ [0xF0, dalvikBytecodeOperationUnusedParser],
1231
+ [0xF1, dalvikBytecodeOperationUnusedParser],
1232
+ [0xF2, dalvikBytecodeOperationUnusedParser],
1233
+ [0xF3, dalvikBytecodeOperationUnusedParser],
1234
+ [0xF4, dalvikBytecodeOperationUnusedParser],
1235
+ [0xF5, dalvikBytecodeOperationUnusedParser],
1236
+ [0xF6, dalvikBytecodeOperationUnusedParser],
1237
+ [0xF7, dalvikBytecodeOperationUnusedParser],
1238
+ [0xF8, dalvikBytecodeOperationUnusedParser],
1239
+ [0xF9, dalvikBytecodeOperationUnusedParser],
1240
+ ]);
1241
+ // Fallback parser for multi-byte opcodes (nop and payload instructions)
1242
+ const dalvikBytecodeOperationMultiByteParser = createDisjunctionParser([
1243
+ dalvikBytecodeOperationNoOperationParser,
1244
+ dalvikBytecodeOperationPackedSwitchPayloadParser,
1245
+ dalvikBytecodeOperationSparseSwitchPayloadParser,
1246
+ dalvikBytecodeOperationFillArrayDataPayloadParser,
1247
+ ]);
1248
+ setParserName(dalvikBytecodeOperationMultiByteParser, 'dalvikBytecodeOperationMultiByteParser');
754
1249
  const dalvikBytecodeOperationParser = promiseCompose(createTupleParser([
755
1250
  () => { },
756
- //createDebugLogInputParser(),
757
- createUnionParser([
758
- dalvikBytecodeOperationUnusedParser,
759
- dalvikBytecodeOperationNoOperationParser,
760
- dalvikBytecodeOperationInvokeParser,
761
- dalvikBytecodeOperationInvokeRangeParser,
762
- dalvikBytecodeOperationNewInstanceParser,
763
- dalvikBytecodeOperationNewArrayParser,
764
- dalvikBytecodeOperationCheckCastParser,
765
- dalvikBytecodeOperationInstanceOfParser,
766
- dalvikBytecodeOperationArrayElementParser,
767
- dalvikBytecodeOperationInstanceFieldParser,
768
- dalvikBytecodeOperationStaticFieldParser,
769
- dalvikBytecodeOperationConstStringParser,
770
- dalvikBytecodeOperationConstMethodHandleParser,
771
- dalvikBytecodeOperationConstClassParser,
772
- dalvikBytecodeOperationReturnVoidParser,
773
- dalvikBytecodeOperationReturn1Parser,
774
- dalvikBytecodeOperationThrowParser,
775
- dalvikBytecodeOperationGotoParser,
776
- dalvikBytecodeOperationGoto16Parser,
777
- dalvikBytecodeOperationMoveResult1Parser,
778
- dalvikBytecodeOperationMoveParser,
779
- dalvikBytecodeOperationMoveWideParser,
780
- dalvikBytecodeOperationMoveObjectParser,
781
- dalvikBytecodeOperationMoveFrom16Parser,
782
- dalvikBytecodeOperationMoveWideFrom16Parser,
783
- dalvikBytecodeOperationMoveObjectFrom16Parser,
784
- dalvikBytecodeOperationMoveWide16Parser,
785
- dalvikBytecodeOperationConst4Parser,
786
- dalvikBytecodeOperationConst16Parser,
787
- dalvikBytecodeOperationConstHigh16Parser,
788
- dalvikBytecodeOperationConstWide16Parser,
789
- dalvikBytecodeOperationConstParser,
790
- dalvikBytecodeOperationCompareParser,
791
- dalvikBytecodeOperationIfTestParser,
792
- dalvikBytecodeOperationIfTestZeroParser,
793
- dalvikBytecodeOperationBinaryOperationParser,
794
- dalvikBytecodeOperationBinaryOperationLiteral8Parser,
795
- dalvikBytecodeOperationBinaryOperationLiteral16Parser,
796
- dalvikBytecodeOperationBinaryOperationInPlaceParser,
797
- dalvikBytecodeOperationUnaryOperationParser,
798
- ]),
799
- ]), ([_debug, operation,]) => {
800
- // console.log(operation);
801
- return operation;
802
- });
1251
+ // CreateDebugLogInputParser(),
1252
+ createElementSwitchParser(dalvikBytecodeOperationOpcodeMap, dalvikBytecodeOperationMultiByteParser),
1253
+ ]), ([_debug, operation,]) =>
1254
+ // Console.log(operation);
1255
+ operation);
803
1256
  setParserName(dalvikBytecodeOperationParser, 'dalvikBytecodeOperationParser');
804
1257
  const dalvikBytecodeParser = promiseCompose(createArrayParser(dalvikBytecodeOperationParser), operations => operations.filter((operation) => operation !== undefined));
805
1258
  export const createDalvikBytecodeParser = (size) => createSliceBoundedParser(dalvikBytecodeParser, size, true);