@futpib/parser 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +1 -1
- package/build/allSettledStream.test.js +2 -2
- package/build/androidPackageParser.d.ts +1 -1
- package/build/androidPackageParser.js +5 -3
- package/build/androidPackageParser.test.js +7 -7
- package/build/androidPackageUnparser.d.ts +2 -2
- package/build/androidPackageUnparser.js +18 -14
- package/build/androidPackageUnparser.test.js +7 -7
- 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/arrayUnparser.d.ts +1 -1
- package/build/backsmali.d.ts +3 -1
- package/build/backsmali.js +31 -3
- package/build/customInvariant.d.ts +2 -1
- package/build/customInvariant.js +4 -6
- package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
- package/build/dalvikBytecodeParser/formatParsers.js +146 -11
- 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 +1105 -5
- package/build/dalvikBytecodeParser.js +658 -205
- 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.d.ts +1 -0
- package/build/dalvikBytecodeUnparser.test.js +25 -0
- package/build/dalvikExecutable.d.ts +65 -8
- package/build/dalvikExecutable.js +36 -0
- package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
- package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
- package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
- package/build/dalvikExecutableParser/typeParsers.js +16 -11
- package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
- package/build/dalvikExecutableParser/typedNumbers.js +0 -1
- package/build/dalvikExecutableParser.d.ts +2 -2
- package/build/dalvikExecutableParser.js +655 -337
- package/build/dalvikExecutableParser.test.js +24 -22
- package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
- 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.d.ts +1 -0
- package/build/dalvikExecutableUnparser.test.js +31 -0
- package/build/debugLogInputParser.js +1 -1
- package/build/disjunctionParser.d.ts +2 -2
- package/build/disjunctionParser.js +2 -2
- package/build/elementTerminatedArrayParser.d.ts +2 -2
- package/build/elementTerminatedArrayParser.js +1 -1
- package/build/elementTerminatedArrayParser.test.js +5 -5
- package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
- package/build/elementTerminatedSequenceArrayParser.js +1 -1
- package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
- package/build/elementTerminatedSequenceParser.d.ts +2 -2
- package/build/elementTerminatedSequenceParser.js +1 -1
- package/build/elementTerminatedSequenceParser.test.js +2 -2
- package/build/endOfInputParser.d.ts +1 -1
- package/build/exactElementSwitchParser.d.ts +3 -0
- package/build/exactElementSwitchParser.js +22 -0
- package/build/fetchCid.js +2 -6
- package/build/fetchCid.test.d.ts +1 -0
- package/build/fetchCid.test.js +16 -0
- package/build/fixedLengthSequenceParser.test.js +2 -2
- package/build/hasExecutable.js +2 -2
- package/build/highResolutionTimer.js +1 -1
- package/build/inputReader.d.ts +1 -1
- package/build/inputReader.test.js +33 -45
- package/build/javaKeyStoreParser.test.js +6 -6
- package/build/jsonParser.js +8 -8
- 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 +1 -1
- package/build/leb128Parser.js +10 -10
- package/build/leb128Parser.test.js +7 -7
- package/build/negativeLookaheadParser.js +2 -2
- package/build/negativeLookaheadParser.test.js +4 -4
- 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.js +2 -2
- package/build/nonEmptyArrayParser.test.js +2 -1
- package/build/optionalParser.js +2 -2
- package/build/parser.d.ts +2 -1
- package/build/parser.js +23 -8
- package/build/parser.test.js +78 -29
- package/build/parserConsumedSequenceParser.d.ts +1 -1
- package/build/parserConsumedSequenceParser.js +2 -2
- package/build/parserContext.d.ts +8 -6
- package/build/parserContext.js +60 -33
- package/build/parserContext.test.js +7 -3
- package/build/parserError.d.ts +603 -44
- package/build/parserError.js +98 -53
- package/build/parserImplementationInvariant.d.ts +1 -1
- package/build/parserImplementationInvariant.js +2 -2
- package/build/parserInputCompanion.js +2 -2
- package/build/promiseCompose.js +1 -2
- package/build/separatedArrayParser.js +2 -2
- 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.js +1 -1
- package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
- package/build/sequenceTerminatedSequenceParser.js +3 -3
- package/build/sequenceTerminatedSequenceParser.test.js +1 -1
- package/build/sequenceUnparser.d.ts +1 -1
- package/build/skipToParser.d.ts +1 -1
- package/build/skipToParser.js +2 -2
- package/build/sliceBoundedParser.test.js +4 -9
- package/build/smali.d.ts +1 -1
- package/build/smali.js +6 -2
- package/build/smaliParser.d.ts +62 -6
- package/build/smaliParser.js +1721 -296
- package/build/smaliParser.test.js +338 -43
- package/build/stringFromAsyncIterable.d.ts +1 -0
- package/build/stringFromAsyncIterable.js +7 -0
- package/build/terminatedArrayParser.js +4 -4
- package/build/terminatedArrayParser.test.js +7 -7
- package/build/toAsyncIterator.js +4 -4
- package/build/unionParser.d.ts +1 -1
- package/build/unionParser.js +2 -2
- package/build/unionParser.test.js +3 -3
- 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.js +1 -1
- package/build/zipUnparser.d.ts +3 -3
- package/build/zipUnparser.js +9 -19
- package/build/zipUnparser.test.js +1 -1
- package/package.json +19 -26
- package/src/allSettledStream.test.ts +2 -2
- package/src/allSettledStream.ts +3 -3
- package/src/androidPackageParser.test.ts +17 -19
- package/src/androidPackageParser.ts +129 -171
- package/src/androidPackageUnparser.test.ts +19 -21
- package/src/androidPackageUnparser.ts +23 -17
- package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
- 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.ts +2 -2
- package/src/arrayUnparser.ts +2 -2
- package/src/backsmali.ts +48 -4
- package/src/bsonParser.test.ts +12 -14
- package/src/customInvariant.ts +8 -12
- package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
- package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
- package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
- package/src/dalvikBytecodeParser.ts +1042 -243
- package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
- package/src/dalvikBytecodeUnparser.test.ts +44 -0
- package/src/dalvikBytecodeUnparser.ts +758 -0
- package/src/dalvikExecutable.ts +110 -48
- package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
- package/src/dalvikExecutableParser/typeParsers.ts +23 -14
- package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
- package/src/dalvikExecutableParser.test.ts +60 -60
- package/src/dalvikExecutableParser.test.ts.md +6 -6
- package/src/dalvikExecutableParser.test.ts.snap +0 -0
- package/src/dalvikExecutableParser.ts +911 -434
- package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
- 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 +1 -1
- package/src/disjunctionParser.ts +5 -5
- package/src/elementTerminatedArrayParser.test.ts +8 -8
- package/src/elementTerminatedArrayParser.ts +2 -2
- package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
- package/src/elementTerminatedSequenceArrayParser.ts +2 -2
- package/src/elementTerminatedSequenceParser.test.ts +4 -6
- package/src/elementTerminatedSequenceParser.ts +2 -2
- package/src/endOfInputParser.ts +1 -1
- package/src/exactElementSwitchParser.ts +41 -0
- package/src/fetchCid.test.ts +20 -0
- package/src/fetchCid.ts +3 -7
- package/src/fixedLengthSequenceParser.test.ts +10 -12
- package/src/hasExecutable.ts +2 -2
- package/src/highResolutionTimer.ts +1 -1
- package/src/inputReader.test.ts +39 -52
- package/src/inputReader.ts +2 -4
- package/src/inputReaderState.ts +1 -1
- package/src/inspect.ts +1 -1
- package/src/javaKeyStoreParser.test.ts +12 -14
- package/src/javaKeyStoreParser.ts +2 -6
- package/src/jsonParser.test.ts +2 -4
- package/src/jsonParser.ts +34 -38
- package/src/lazyMessageError.test.ts +21 -0
- package/src/lazyMessageError.ts +88 -0
- package/src/leb128Parser.test.ts +25 -23
- package/src/leb128Parser.ts +19 -19
- package/src/negativeLookaheadParser.test.ts +7 -11
- package/src/negativeLookaheadParser.ts +2 -2
- package/src/noStackCaptureOverheadError.test.ts +17 -0
- package/src/noStackCaptureOverheadError.ts +12 -0
- package/src/nonEmptyArrayParser.test.ts +3 -2
- package/src/nonEmptyArrayParser.ts +2 -2
- package/src/optionalParser.ts +2 -2
- package/src/parser.test.ts +96 -43
- package/src/parser.test.ts.md +13 -6
- package/src/parser.test.ts.snap +0 -0
- package/src/parser.ts +35 -12
- package/src/parserAccessorParser.ts +1 -1
- package/src/parserConsumedSequenceParser.ts +3 -3
- package/src/parserContext.test.ts +7 -3
- package/src/parserContext.ts +82 -48
- package/src/parserError.ts +143 -63
- package/src/parserImplementationInvariant.ts +3 -3
- package/src/parserInputCompanion.ts +2 -2
- package/src/promiseCompose.ts +2 -2
- package/src/separatedArrayParser.ts +3 -3
- package/src/separatedNonEmptyArrayParser.test.ts +117 -0
- package/src/separatedNonEmptyArrayParser.ts +61 -0
- package/src/sequenceBuffer.test.ts +9 -9
- package/src/sequenceBuffer.ts +4 -4
- package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
- package/src/sequenceTerminatedSequenceParser.ts +4 -4
- package/src/sequenceUnparser.ts +2 -2
- package/src/skipToParser.ts +2 -2
- package/src/sliceBoundedParser.test.ts +4 -12
- package/src/sliceBoundedParser.ts +2 -2
- package/src/smali.ts +8 -3
- package/src/smaliParser.test.ts +377 -66
- package/src/smaliParser.test.ts.md +1635 -48
- package/src/smaliParser.test.ts.snap +0 -0
- package/src/smaliParser.ts +2751 -569
- package/src/stringFromAsyncIterable.ts +9 -0
- package/src/terminatedArrayParser.test.ts +11 -11
- package/src/terminatedArrayParser.ts +5 -7
- package/src/toAsyncIterator.ts +8 -8
- package/src/uint8Array.ts +2 -3
- package/src/unionParser.test.ts +22 -23
- package/src/unionParser.ts +6 -8
- 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 +10 -18
- package/src/zipUnparser.test.ts +1 -1
- package/src/zipUnparser.ts +52 -64
- package/tsconfig.json +7 -1
- package/xo.config.ts +15 -0
- package/.yarn/releases/yarn-4.5.3.cjs +0 -934
package/src/dalvikExecutable.ts
CHANGED
|
@@ -1,27 +1,70 @@
|
|
|
1
1
|
|
|
2
2
|
export type DalvikExecutableAccessFlags = {
|
|
3
|
-
public: boolean
|
|
4
|
-
private: boolean
|
|
5
|
-
protected: boolean
|
|
6
|
-
static: boolean
|
|
7
|
-
final: boolean
|
|
8
|
-
synchronized: boolean
|
|
9
|
-
volatile: boolean
|
|
10
|
-
bridge: boolean
|
|
11
|
-
transient: boolean
|
|
12
|
-
varargs: boolean
|
|
13
|
-
native: boolean
|
|
14
|
-
interface: boolean
|
|
15
|
-
abstract: boolean
|
|
16
|
-
strict: boolean
|
|
17
|
-
synthetic: boolean
|
|
18
|
-
annotation: boolean
|
|
19
|
-
enum: boolean
|
|
20
|
-
constructor: boolean
|
|
21
|
-
declaredSynchronized: boolean
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export
|
|
3
|
+
public: boolean;
|
|
4
|
+
private: boolean;
|
|
5
|
+
protected: boolean;
|
|
6
|
+
static: boolean;
|
|
7
|
+
final: boolean;
|
|
8
|
+
synchronized: boolean;
|
|
9
|
+
volatile: boolean;
|
|
10
|
+
bridge: boolean;
|
|
11
|
+
transient: boolean;
|
|
12
|
+
varargs: boolean;
|
|
13
|
+
native: boolean;
|
|
14
|
+
interface: boolean;
|
|
15
|
+
abstract: boolean;
|
|
16
|
+
strict: boolean;
|
|
17
|
+
synthetic: boolean;
|
|
18
|
+
annotation: boolean;
|
|
19
|
+
enum: boolean;
|
|
20
|
+
constructor: boolean;
|
|
21
|
+
declaredSynchronized: boolean;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export function dalvikExecutableAccessFlagsDefault(): DalvikExecutableAccessFlags {
|
|
25
|
+
return {
|
|
26
|
+
public: false,
|
|
27
|
+
private: false,
|
|
28
|
+
protected: false,
|
|
29
|
+
static: false,
|
|
30
|
+
final: false,
|
|
31
|
+
synchronized: false,
|
|
32
|
+
volatile: false,
|
|
33
|
+
bridge: false,
|
|
34
|
+
transient: false,
|
|
35
|
+
varargs: false,
|
|
36
|
+
native: false,
|
|
37
|
+
interface: false,
|
|
38
|
+
abstract: false,
|
|
39
|
+
strict: false,
|
|
40
|
+
synthetic: false,
|
|
41
|
+
annotation: false,
|
|
42
|
+
enum: false,
|
|
43
|
+
constructor: false,
|
|
44
|
+
declaredSynchronized: false,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type DalvikExecutableEncodedValue =
|
|
49
|
+
| { type: 'byte'; value: number }
|
|
50
|
+
| { type: 'short'; value: number }
|
|
51
|
+
| { type: 'char'; value: number }
|
|
52
|
+
| { type: 'int'; value: number }
|
|
53
|
+
| { type: 'long'; value: bigint }
|
|
54
|
+
| { type: 'float'; value: number }
|
|
55
|
+
| { type: 'double'; value: number }
|
|
56
|
+
| { type: 'methodType'; value: DalvikExecutablePrototype }
|
|
57
|
+
| { type: 'methodHandle'; value: number }
|
|
58
|
+
| { type: 'string'; value: string }
|
|
59
|
+
| { type: 'type'; value: string }
|
|
60
|
+
| { type: 'field'; value: DalvikExecutableField }
|
|
61
|
+
| { type: 'method'; value: DalvikExecutableMethod }
|
|
62
|
+
| { type: 'enum'; value: DalvikExecutableField }
|
|
63
|
+
| { type: 'array'; value: DalvikExecutableEncodedValue[] }
|
|
64
|
+
| { type: 'annotation'; value: DalvikExecutableAnnotation }
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-restricted-types
|
|
66
|
+
| { type: 'null'; value: null }
|
|
67
|
+
| { type: 'boolean'; value: boolean };
|
|
25
68
|
|
|
26
69
|
type DalvikExecutableTry = {
|
|
27
70
|
startAddress: number;
|
|
@@ -35,8 +78,8 @@ type DalvikExecutableEncodedTypeAddressPair = {
|
|
|
35
78
|
};
|
|
36
79
|
|
|
37
80
|
type DalvikExecutableEncodedCatchHandler = {
|
|
38
|
-
handlers: DalvikExecutableEncodedTypeAddressPair[]
|
|
39
|
-
catchAllAddress: undefined | number
|
|
81
|
+
handlers: DalvikExecutableEncodedTypeAddressPair[];
|
|
82
|
+
catchAllAddress: undefined | number;
|
|
40
83
|
};
|
|
41
84
|
|
|
42
85
|
export type DalvikExecutableCode<Instructions> = {
|
|
@@ -98,7 +141,7 @@ type DalvikExecutableDebugByteCode = DalvikExecutableDebugByteCodeValue[];
|
|
|
98
141
|
|
|
99
142
|
export type DalvikExecutableDebugInfo = {
|
|
100
143
|
lineStart: number;
|
|
101
|
-
parameterNames:
|
|
144
|
+
parameterNames: Array<undefined | string>;
|
|
102
145
|
bytecode: DalvikExecutableDebugByteCode;
|
|
103
146
|
};
|
|
104
147
|
|
|
@@ -117,7 +160,7 @@ export type DalvikExecutableAnnotation = {
|
|
|
117
160
|
visibility: DalvikExecutableAnnotationItemVisibility;
|
|
118
161
|
type: string;
|
|
119
162
|
elements: DalvikExecutableAnnotationElement[];
|
|
120
|
-
}
|
|
163
|
+
};
|
|
121
164
|
|
|
122
165
|
export type DalvikExecutablePrototype = {
|
|
123
166
|
shorty: string;
|
|
@@ -134,13 +177,21 @@ export type DalvikExecutableField = {
|
|
|
134
177
|
export function isDalvikExecutableField(x: unknown): x is DalvikExecutableField {
|
|
135
178
|
return (
|
|
136
179
|
x !== null
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
180
|
+
&& typeof x === 'object'
|
|
181
|
+
&& 'class' in x
|
|
182
|
+
&& 'type' in x
|
|
183
|
+
&& 'name' in x
|
|
184
|
+
&& typeof (x as DalvikExecutableField).class === 'string'
|
|
185
|
+
&& typeof (x as DalvikExecutableField).type === 'string'
|
|
186
|
+
&& typeof (x as DalvikExecutableField).name === 'string'
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function dalvikExecutableFieldEquals(a: DalvikExecutableField, b: DalvikExecutableField): boolean {
|
|
191
|
+
return (
|
|
192
|
+
a.class === b.class
|
|
193
|
+
&& a.type === b.type
|
|
194
|
+
&& a.name === b.name
|
|
144
195
|
);
|
|
145
196
|
}
|
|
146
197
|
|
|
@@ -158,13 +209,24 @@ export type DalvikExecutableMethod = {
|
|
|
158
209
|
export function isDalvikExecutableMethod(x: unknown): x is DalvikExecutableMethod {
|
|
159
210
|
return (
|
|
160
211
|
x !== null
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
212
|
+
&& typeof x === 'object'
|
|
213
|
+
&& 'class' in x
|
|
214
|
+
&& 'prototype' in x
|
|
215
|
+
&& 'name' in x
|
|
216
|
+
&& typeof (x as DalvikExecutableMethod).class === 'string'
|
|
217
|
+
&& typeof (x as DalvikExecutableMethod).prototype === 'object'
|
|
218
|
+
&& typeof (x as DalvikExecutableMethod).name === 'string'
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function dalvikExecutableMethodEquals(a: DalvikExecutableMethod, b: DalvikExecutableMethod): boolean {
|
|
223
|
+
return (
|
|
224
|
+
a.class === b.class
|
|
225
|
+
&& a.name === b.name
|
|
226
|
+
&& a.prototype.shorty === b.prototype.shorty
|
|
227
|
+
&& a.prototype.returnType === b.prototype.returnType
|
|
228
|
+
&& a.prototype.parameters.length === b.prototype.parameters.length
|
|
229
|
+
&& a.prototype.parameters.every((v, i) => v === b.prototype.parameters[i])
|
|
168
230
|
);
|
|
169
231
|
}
|
|
170
232
|
|
|
@@ -181,16 +243,16 @@ export type DalvikExecutableClassFieldAnnotation = {
|
|
|
181
243
|
|
|
182
244
|
export type DalvikExecutableClassMethodAnnotation = {
|
|
183
245
|
method: DalvikExecutableMethod;
|
|
184
|
-
annotations:
|
|
246
|
+
annotations: DalvikExecutableAnnotation[];
|
|
185
247
|
};
|
|
186
248
|
|
|
187
249
|
export type DalvikExecutableClassParameterAnnotation = {
|
|
188
250
|
method: DalvikExecutableMethod;
|
|
189
|
-
annotations:
|
|
251
|
+
annotations: DalvikExecutableAnnotation[][];
|
|
190
252
|
};
|
|
191
253
|
|
|
192
254
|
export type DalvikExecutableClassAnnotations = {
|
|
193
|
-
classAnnotations:
|
|
255
|
+
classAnnotations: DalvikExecutableAnnotation[];
|
|
194
256
|
fieldAnnotations: DalvikExecutableClassFieldAnnotation[];
|
|
195
257
|
methodAnnotations: DalvikExecutableClassMethodAnnotation[];
|
|
196
258
|
parameterAnnotations: DalvikExecutableClassParameterAnnotation[];
|
|
@@ -199,13 +261,13 @@ export type DalvikExecutableClassAnnotations = {
|
|
|
199
261
|
export type DalvikExecutableClassData<Instructions> = {
|
|
200
262
|
staticFields: DalvikExecutableFieldWithAccess[];
|
|
201
263
|
instanceFields: DalvikExecutableFieldWithAccess[];
|
|
202
|
-
directMethods: DalvikExecutableMethodWithAccess<Instructions
|
|
203
|
-
virtualMethods: DalvikExecutableMethodWithAccess<Instructions
|
|
264
|
+
directMethods: Array<DalvikExecutableMethodWithAccess<Instructions>>;
|
|
265
|
+
virtualMethods: Array<DalvikExecutableMethodWithAccess<Instructions>>;
|
|
204
266
|
};
|
|
205
267
|
|
|
206
268
|
export type DalvikExecutableClassDefinition<Instructions> = {
|
|
207
269
|
class: string;
|
|
208
|
-
accessFlags: DalvikExecutableAccessFlags
|
|
270
|
+
accessFlags: DalvikExecutableAccessFlags;
|
|
209
271
|
superclass: string;
|
|
210
272
|
interfaces: string[];
|
|
211
273
|
sourceFile: undefined | string;
|
|
@@ -215,6 +277,6 @@ export type DalvikExecutableClassDefinition<Instructions> = {
|
|
|
215
277
|
};
|
|
216
278
|
|
|
217
279
|
export type DalvikExecutable<Instructions> = {
|
|
218
|
-
classDefinitions: DalvikExecutableClassDefinition<Instructions
|
|
219
|
-
link: undefined | Uint8Array
|
|
280
|
+
classDefinitions: Array<DalvikExecutableClassDefinition<Instructions>>;
|
|
281
|
+
link: undefined | Uint8Array;
|
|
220
282
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import invariant from
|
|
2
|
-
import { Parser, setParserName } from
|
|
3
|
-
import { ParserContext } from
|
|
4
|
-
import { promiseCompose } from
|
|
5
|
-
import { createSeparatedArrayParser } from
|
|
6
|
-
import { createExactSequenceParser } from
|
|
7
|
-
import { createUnionParser } from
|
|
8
|
-
import { createTupleParser } from
|
|
9
|
-
import { createArrayParser } from
|
|
1
|
+
import invariant from 'invariant';
|
|
2
|
+
import { type Parser, setParserName } from '../parser.js';
|
|
3
|
+
import { type ParserContext } from '../parserContext.js';
|
|
4
|
+
import { promiseCompose } from '../promiseCompose.js';
|
|
5
|
+
import { createSeparatedArrayParser } from '../separatedArrayParser.js';
|
|
6
|
+
import { createExactSequenceParser } from '../exactSequenceParser.js';
|
|
7
|
+
import { createUnionParser } from '../unionParser.js';
|
|
8
|
+
import { createTupleParser } from '../tupleParser.js';
|
|
9
|
+
import { createArrayParser } from '../arrayParser.js';
|
|
10
10
|
|
|
11
11
|
export const smaliSimpleNameParser: Parser<string, string> = async (parserContext: ParserContext<string, string>) => {
|
|
12
12
|
const characters: string[] = [];
|
|
@@ -22,47 +22,47 @@ export const smaliSimpleNameParser: Parser<string, string> = async (parserContex
|
|
|
22
22
|
(
|
|
23
23
|
character >= 'a' && character <= 'z'
|
|
24
24
|
)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
25
|
+
|| (
|
|
26
|
+
character >= 'A' && character <= 'Z'
|
|
27
|
+
)
|
|
28
|
+
|| (
|
|
29
|
+
character >= '0' && character <= '9'
|
|
30
|
+
)
|
|
31
|
+
|| (
|
|
32
|
+
character === ' '
|
|
33
|
+
)
|
|
34
|
+
|| (
|
|
35
|
+
character === '$'
|
|
36
|
+
)
|
|
37
|
+
|| (
|
|
38
|
+
character === '-'
|
|
39
|
+
)
|
|
40
40
|
|| (
|
|
41
41
|
character === '_'
|
|
42
42
|
)
|
|
43
43
|
|| (
|
|
44
|
-
character === '\
|
|
44
|
+
character === '\u00A0'
|
|
45
45
|
)
|
|
46
46
|
|| (
|
|
47
|
-
character >= '\
|
|
47
|
+
character >= '\u00A1' && character <= '\u1FFF'
|
|
48
48
|
)
|
|
49
49
|
|| (
|
|
50
|
-
character >= '\u2000' && character <= '\
|
|
50
|
+
character >= '\u2000' && character <= '\u200A'
|
|
51
51
|
)
|
|
52
52
|
|| (
|
|
53
53
|
character >= '\u2010' && character <= '\u2027'
|
|
54
54
|
)
|
|
55
55
|
|| (
|
|
56
|
-
character === '\
|
|
56
|
+
character === '\u202F'
|
|
57
57
|
)
|
|
58
58
|
|| (
|
|
59
|
-
character >= '\u2030' && character <= '\
|
|
59
|
+
character >= '\u2030' && character <= '\uD7FF'
|
|
60
60
|
)
|
|
61
61
|
|| (
|
|
62
|
-
character >= '\
|
|
62
|
+
character >= '\uE000' && character <= '\uFFEF'
|
|
63
63
|
)
|
|
64
64
|
|| (
|
|
65
|
-
character >= '\
|
|
65
|
+
character >= '\uD800' && character <= '\uDBFF'
|
|
66
66
|
)
|
|
67
67
|
) {
|
|
68
68
|
parserContext.skip(1);
|
|
@@ -90,7 +90,7 @@ export const smaliMemberNameParser: Parser<string, string> = createUnionParser([
|
|
|
90
90
|
smaliSimpleNameParser,
|
|
91
91
|
createExactSequenceParser('>'),
|
|
92
92
|
]),
|
|
93
|
-
|
|
93
|
+
strings => strings.join(''),
|
|
94
94
|
),
|
|
95
95
|
]);
|
|
96
96
|
|
|
@@ -101,7 +101,7 @@ const smaliFullClassNameParser: Parser<string, string> = promiseCompose(
|
|
|
101
101
|
smaliMemberNameParser,
|
|
102
102
|
createExactSequenceParser('/'),
|
|
103
103
|
),
|
|
104
|
-
|
|
104
|
+
pathSegments => pathSegments.join('/'),
|
|
105
105
|
);
|
|
106
106
|
|
|
107
107
|
setParserName(smaliFullClassNameParser, 'smaliFullClassNameParser');
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
import { createElementParser } from
|
|
2
|
-
import { createFixedLengthSequenceParser } from
|
|
3
|
-
import { uleb128NumberParser } from
|
|
4
|
-
import { Parser } from
|
|
5
|
-
import {
|
|
1
|
+
import { createElementParser } from '../elementParser.js';
|
|
2
|
+
import { createFixedLengthSequenceParser } from '../fixedLengthSequenceParser.js';
|
|
3
|
+
import { uleb128NumberParser } from '../leb128Parser.js';
|
|
4
|
+
import { type Parser } from '../parser.js';
|
|
5
|
+
import { parserCreatorCompose } from '../parserCreatorCompose.js';
|
|
6
|
+
import { promiseCompose } from '../promiseCompose.js';
|
|
6
7
|
|
|
7
|
-
export const uleb128p1NumberParser: Parser<number, Uint8Array> = async
|
|
8
|
+
export const uleb128p1NumberParser: Parser<number, Uint8Array> = async parserContext => {
|
|
8
9
|
const value = await uleb128NumberParser(parserContext);
|
|
9
10
|
return value - 1;
|
|
10
|
-
}
|
|
11
|
+
};
|
|
11
12
|
|
|
12
13
|
export const ubyteParser: Parser<number, Uint8Array> = createElementParser();
|
|
13
14
|
|
|
14
15
|
export const byteParser: Parser<number, Uint8Array> = promiseCompose(
|
|
15
16
|
ubyteParser,
|
|
16
|
-
|
|
17
|
+
ubyte => ubyte > 127 ? ubyte - 256 : ubyte,
|
|
17
18
|
);
|
|
18
19
|
|
|
19
20
|
export const shortParser: Parser<number, Uint8Array> = promiseCompose(
|
|
20
21
|
createFixedLengthSequenceParser<Uint8Array>(2),
|
|
21
|
-
|
|
22
|
+
uint8Array => {
|
|
22
23
|
const buffer = Buffer.from(uint8Array);
|
|
23
24
|
return buffer.readInt16LE(0);
|
|
24
25
|
},
|
|
@@ -26,15 +27,23 @@ export const shortParser: Parser<number, Uint8Array> = promiseCompose(
|
|
|
26
27
|
|
|
27
28
|
export const ushortParser: Parser<number, Uint8Array> = promiseCompose(
|
|
28
29
|
createFixedLengthSequenceParser<Uint8Array>(2),
|
|
29
|
-
|
|
30
|
+
uint8Array => {
|
|
30
31
|
const buffer = Buffer.from(uint8Array);
|
|
31
32
|
return buffer.readUInt16LE(0);
|
|
32
33
|
},
|
|
33
34
|
);
|
|
34
35
|
|
|
36
|
+
export const createExactUshortParser = (expectedValue: number): Parser<number, Uint8Array> => parserCreatorCompose(
|
|
37
|
+
() => ushortParser,
|
|
38
|
+
ushortValue => async parserContext => {
|
|
39
|
+
parserContext.invariant(ushortValue === expectedValue, `Expected ushort value ${expectedValue}, got ${ushortValue}`);
|
|
40
|
+
return ushortValue;
|
|
41
|
+
},
|
|
42
|
+
)();
|
|
43
|
+
|
|
35
44
|
export const intParser: Parser<number, Uint8Array> = promiseCompose(
|
|
36
45
|
createFixedLengthSequenceParser<Uint8Array>(4),
|
|
37
|
-
|
|
46
|
+
uint8Array => {
|
|
38
47
|
const buffer = Buffer.from(uint8Array);
|
|
39
48
|
return buffer.readInt32LE(0);
|
|
40
49
|
},
|
|
@@ -42,7 +51,7 @@ export const intParser: Parser<number, Uint8Array> = promiseCompose(
|
|
|
42
51
|
|
|
43
52
|
export const uintParser: Parser<number, Uint8Array> = promiseCompose(
|
|
44
53
|
createFixedLengthSequenceParser<Uint8Array>(4),
|
|
45
|
-
|
|
54
|
+
uint8Array => {
|
|
46
55
|
const buffer = Buffer.from(uint8Array);
|
|
47
56
|
return buffer.readUInt32LE(0);
|
|
48
57
|
},
|
|
@@ -50,7 +59,7 @@ export const uintParser: Parser<number, Uint8Array> = promiseCompose(
|
|
|
50
59
|
|
|
51
60
|
export const longParser: Parser<bigint, Uint8Array> = promiseCompose(
|
|
52
61
|
createFixedLengthSequenceParser<Uint8Array>(8),
|
|
53
|
-
|
|
62
|
+
uint8Array => {
|
|
54
63
|
const buffer = Buffer.from(uint8Array);
|
|
55
64
|
return buffer.readBigInt64LE(0);
|
|
56
65
|
},
|
|
@@ -58,7 +67,7 @@ export const longParser: Parser<bigint, Uint8Array> = promiseCompose(
|
|
|
58
67
|
|
|
59
68
|
export const ulongParser: Parser<bigint, Uint8Array> = promiseCompose(
|
|
60
69
|
createFixedLengthSequenceParser<Uint8Array>(8),
|
|
61
|
-
|
|
70
|
+
uint8Array => {
|
|
62
71
|
const buffer = Buffer.from(uint8Array);
|
|
63
72
|
return buffer.readBigUInt64LE(0);
|
|
64
73
|
},
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import { Newtype, iso } from 'newtype-ts';
|
|
1
|
+
import { type Newtype, iso } from 'newtype-ts';
|
|
2
2
|
|
|
3
|
-
export
|
|
3
|
+
export type IndexIntoStringIds = {} & Newtype<{ readonly IndexIntoStringIds: unique symbol }, number>;
|
|
4
4
|
export const isoIndexIntoStringIds = iso<IndexIntoStringIds>();
|
|
5
5
|
|
|
6
|
-
export
|
|
6
|
+
export type IndexIntoTypeIds = {} & Newtype<{ readonly IndexIntoTypeIds: unique symbol }, number>;
|
|
7
7
|
export const isoIndexIntoTypeIds = iso<IndexIntoTypeIds>();
|
|
8
8
|
|
|
9
|
-
export
|
|
9
|
+
export type IndexIntoPrototypeIds = {} & Newtype<{ readonly IndexIntoPrototypeIds: unique symbol }, number>;
|
|
10
10
|
export const isoIndexIntoPrototypeIds = iso<IndexIntoPrototypeIds>();
|
|
11
11
|
|
|
12
|
-
export
|
|
12
|
+
export type IndexIntoFieldIds = {} & Newtype<{ readonly IndexIntoFieldIds: unique symbol }, number>;
|
|
13
13
|
export const isoIndexIntoFieldIds = iso<IndexIntoFieldIds>();
|
|
14
14
|
|
|
15
|
-
export
|
|
15
|
+
export type IndexIntoMethodIds = {} & Newtype<{ readonly IndexIntoMethodIds: unique symbol }, number>;
|
|
16
16
|
export const isoIndexIntoMethodIds = iso<IndexIntoMethodIds>();
|
|
17
17
|
|
|
18
|
-
export
|
|
18
|
+
export type OffsetToStringDataItem = {} & Newtype<{ readonly OffsetToStringDataItem: unique symbol }, number>;
|
|
19
19
|
export const isoOffsetToStringDataItem = iso<OffsetToStringDataItem>();
|
|
20
20
|
|
|
21
|
-
export
|
|
21
|
+
export type OffsetToTypeList = {} & Newtype<{ readonly OffsetToTypeList: unique symbol }, number>;
|
|
22
22
|
export const isoOffsetToTypeList = iso<OffsetToTypeList>();
|
|
23
23
|
|
|
24
|
-
export
|
|
24
|
+
export type OffsetToAnnotationsDirectoryItem = {} & Newtype<{ readonly OffsetToAnnotationsDirectoryItem: unique symbol }, number>;
|
|
25
25
|
export const isoOffsetToAnnotationsDirectoryItem = iso<OffsetToAnnotationsDirectoryItem>();
|
|
26
26
|
|
|
27
|
-
export
|
|
27
|
+
export type OffsetToAnnotationSetItem = {} & Newtype<{ readonly OffsetToAnnotationSetItem: unique symbol }, number>;
|
|
28
28
|
export const isoOffsetToAnnotationSetItem = iso<OffsetToAnnotationSetItem>();
|
|
29
29
|
|
|
30
|
-
export
|
|
30
|
+
export type OffsetToAnnotationSetRefListItem = {} & Newtype<{ readonly OffsetToAnnotationSetRefListItem: unique symbol }, number>;
|
|
31
31
|
export const isoOffsetToAnnotationSetRefListItem = iso<OffsetToAnnotationSetRefListItem>();
|
|
32
32
|
|
|
33
|
-
export
|
|
33
|
+
export type OffsetToClassDataItem = {} & Newtype<{ readonly OffsetToClassDataItem: unique symbol }, number>;
|
|
34
34
|
export const isoOffsetToClassDataItem = iso<OffsetToClassDataItem>();
|
|
35
35
|
|
|
36
|
-
export
|
|
36
|
+
export type OffsetToEncodedArrayItem = {} & Newtype<{ readonly OffsetToEncodedArrayItem: unique symbol }, number>;
|
|
37
37
|
export const isoOffsetToEncodedArrayItem = iso<OffsetToEncodedArrayItem>();
|
|
38
38
|
|
|
39
|
-
export
|
|
39
|
+
export type OffsetToCodeItem = {} & Newtype<{ readonly OffsetToCodeItem: unique symbol }, number>;
|
|
40
40
|
export const isoOffsetToCodeItem = iso<OffsetToCodeItem>();
|
|
41
41
|
|
|
42
|
-
export
|
|
42
|
+
export type OffsetToDebugInfoItem = {} & Newtype<{ readonly OffsetToDebugInfoItem: unique symbol }, number>;
|
|
43
43
|
export const isoOffsetToDebugInfoItem = iso<OffsetToDebugInfoItem>();
|
|
44
44
|
|
|
45
|
-
export
|
|
45
|
+
export type OffsetToAnnotationItem = {} & Newtype<{ readonly OffsetToAnnotationItem: unique symbol }, number>;
|
|
46
46
|
export const isoOffsetToAnnotationItem = iso<OffsetToAnnotationItem>();
|
|
47
47
|
|
|
48
|
-
export
|
|
48
|
+
export type OffsetFromEncodedCatchHandlerListToEncodedCatchHandler = {} & Newtype<{ readonly OffsetFromEncodedCatchHandlerListToEncodedCatchHandler: unique symbol }, number>;
|
|
49
49
|
export const isoOffsetFromEncodedCatchHandlerListToEncodedCatchHandler = iso<OffsetFromEncodedCatchHandlerListToEncodedCatchHandler>();
|
|
50
50
|
|
|
51
|
-
export
|
|
51
|
+
export type TypedNumberArray<IndexType, ValueType> = {
|
|
52
52
|
get length(): number;
|
|
53
53
|
at(index: IndexType): undefined | ValueType;
|
|
54
54
|
map<NewValueType>(fn: (value: ValueType, index: IndexType) => NewValueType): TypedNumberArray<IndexType, NewValueType>;
|
|
55
55
|
[Symbol.iterator](): IterableIterator<ValueType>;
|
|
56
|
-
}
|
|
56
|
+
} & Newtype<{ readonly TypedNumberArray: unique symbol }, ValueType[]>;
|
|
57
57
|
export const getIsoTypedNumberArray = <IndexType, ValueType>() => iso<TypedNumberArray<IndexType, ValueType>>();
|
|
@@ -4,39 +4,37 @@ import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
|
|
|
4
4
|
import { dalvikExecutableParser, dalvikExecutableWithRawInstructionsParser } from './dalvikExecutableParser.js';
|
|
5
5
|
import { fetchCid } from './fetchCid.js';
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
);
|
|
30
|
-
}
|
|
7
|
+
const dexWithRawInstructionsMacro = test.macro({
|
|
8
|
+
title: (providedTitle, dexCid: string) => providedTitle ?? `dex (with instructions as bytes) ${dexCid}`,
|
|
9
|
+
async exec(t, dexCid: string, shouldSnapshot: boolean) {
|
|
10
|
+
const dexStream = await fetchCid(dexCid);
|
|
11
|
+
|
|
12
|
+
const actual = await runParser(dalvikExecutableWithRawInstructionsParser, dexStream, uint8ArrayParserInputCompanion, {
|
|
13
|
+
errorJoinMode: 'all',
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
if (shouldSnapshot) {
|
|
17
|
+
t.snapshot(actual);
|
|
18
|
+
} else {
|
|
19
|
+
// Console.dir(actual, { depth: null });
|
|
20
|
+
t.pass();
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test.serial(dexWithRawInstructionsMacro, 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', true);
|
|
26
|
+
test.serial(dexWithRawInstructionsMacro, 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', false);
|
|
27
|
+
test.serial(dexWithRawInstructionsMacro, 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', false);
|
|
28
|
+
test.serial(dexWithRawInstructionsMacro, 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', false);
|
|
31
29
|
|
|
32
|
-
type ObjectPath =
|
|
30
|
+
type ObjectPath = Array<string | symbol | number>;
|
|
33
31
|
|
|
34
32
|
function objectWalk(object: unknown, f: (path: ObjectPath, value: unknown) => void, initialPath: ObjectPath = []) {
|
|
35
33
|
f(initialPath, object);
|
|
36
34
|
|
|
37
35
|
if (
|
|
38
36
|
!object
|
|
39
|
-
|
|
37
|
+
|| typeof object !== 'object'
|
|
40
38
|
) {
|
|
41
39
|
return;
|
|
42
40
|
}
|
|
@@ -52,38 +50,40 @@ function objectWalk(object: unknown, f: (path: ObjectPath, value: unknown) => vo
|
|
|
52
50
|
}
|
|
53
51
|
}
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (typeof key !== 'string') {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
t.false(key.endsWith('Offset'), 'All offsets should be resolved: ' + path.join('.'));
|
|
78
|
-
t.false(key.endsWith('Index'), 'All indexes should be resolved: ' + path.join('.'));
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
if (shouldSnapshot) {
|
|
82
|
-
t.snapshot(actual);
|
|
83
|
-
} else {
|
|
84
|
-
//console.dir(actual, { depth: null });
|
|
85
|
-
t.pass();
|
|
53
|
+
const dexWithParsedInstructionsMacro = test.macro({
|
|
54
|
+
title: (providedTitle, dexCid: string) => providedTitle ?? `dex (with parsed instructions) ${dexCid}`,
|
|
55
|
+
async exec(t, dexCid: string, shouldSnapshot: boolean) {
|
|
56
|
+
const dexStream = await fetchCid(dexCid);
|
|
57
|
+
|
|
58
|
+
debugger;
|
|
59
|
+
|
|
60
|
+
const actual = await runParser(dalvikExecutableParser, dexStream, uint8ArrayParserInputCompanion, {
|
|
61
|
+
errorJoinMode: 'all',
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
debugger;
|
|
65
|
+
|
|
66
|
+
objectWalk(actual, path => {
|
|
67
|
+
const key = path.at(-1);
|
|
68
|
+
|
|
69
|
+
if (typeof key !== 'string') {
|
|
70
|
+
return;
|
|
86
71
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
72
|
+
|
|
73
|
+
t.false(key.endsWith('Offset') && key !== 'branchOffset', 'All offsets should be resolved: ' + path.join('.'));
|
|
74
|
+
t.false(key.endsWith('Index'), 'All indexes should be resolved: ' + path.join('.'));
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
if (shouldSnapshot) {
|
|
78
|
+
t.snapshot(actual);
|
|
79
|
+
} else {
|
|
80
|
+
// Console.dir(actual, { depth: null });
|
|
81
|
+
t.pass();
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test.serial.only(dexWithParsedInstructionsMacro, 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4', true);
|
|
87
|
+
test.serial.skip(dexWithParsedInstructionsMacro, 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq', false);
|
|
88
|
+
test.serial.skip(dexWithParsedInstructionsMacro, 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy', false);
|
|
89
|
+
test.serial.skip(dexWithParsedInstructionsMacro, 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda', false);
|