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