@futpib/parser 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/.github/copilot-instructions.md +149 -0
  2. package/.github/workflows/copilot-setup-steps.yml +18 -0
  3. package/.github/workflows/main.yml +29 -8
  4. package/.yarn/releases/yarn-4.9.4.cjs +942 -0
  5. package/.yarnrc.yml +1 -1
  6. package/build/allSettledStream.js +1 -1
  7. package/build/allSettledStream.test.js +2 -2
  8. package/build/androidPackageParser.d.ts +1 -1
  9. package/build/androidPackageParser.js +5 -3
  10. package/build/androidPackageParser.test.js +7 -7
  11. package/build/androidPackageUnparser.d.ts +2 -2
  12. package/build/androidPackageUnparser.js +18 -14
  13. package/build/androidPackageUnparser.test.js +7 -7
  14. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  15. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  16. package/build/arbitraryDalvikBytecode.js +640 -0
  17. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  18. package/build/arbitraryDalvikExecutable.js +282 -0
  19. package/build/arbitraryDosDateTime.js +1 -0
  20. package/build/arbitraryZipStream.js +1 -1
  21. package/build/arrayParser.js +2 -2
  22. package/build/arrayUnparser.d.ts +1 -1
  23. package/build/backsmali.d.ts +3 -1
  24. package/build/backsmali.js +31 -3
  25. package/build/bash.d.ts +84 -0
  26. package/build/bash.js +1 -0
  27. package/build/bashParser.d.ts +6 -0
  28. package/build/bashParser.js +294 -0
  29. package/build/bashParser.test.d.ts +1 -0
  30. package/build/bashParser.test.js +181 -0
  31. package/build/customInvariant.d.ts +2 -1
  32. package/build/customInvariant.js +4 -6
  33. package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
  34. package/build/dalvikBytecodeParser/formatParsers.js +146 -11
  35. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  36. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  37. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  38. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  39. package/build/dalvikBytecodeParser.d.ts +1105 -5
  40. package/build/dalvikBytecodeParser.js +658 -205
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  42. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  43. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  44. package/build/dalvikBytecodeUnparser.js +642 -0
  45. package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
  46. package/build/dalvikBytecodeUnparser.test.js +25 -0
  47. package/build/dalvikExecutable.d.ts +65 -8
  48. package/build/dalvikExecutable.js +36 -0
  49. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
  50. package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
  51. package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
  52. package/build/dalvikExecutableParser/typeParsers.js +16 -11
  53. package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
  54. package/build/dalvikExecutableParser/typedNumbers.js +0 -1
  55. package/build/dalvikExecutableParser.d.ts +2 -2
  56. package/build/dalvikExecutableParser.js +655 -337
  57. package/build/dalvikExecutableParser.test.js +24 -22
  58. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
  59. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  60. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  61. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  62. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  63. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  64. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  65. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  66. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  67. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  68. package/build/dalvikExecutableUnparser/utils.js +108 -0
  69. package/build/dalvikExecutableUnparser.d.ts +4 -0
  70. package/build/dalvikExecutableUnparser.js +406 -0
  71. package/build/dalvikExecutableUnparser.test.d.ts +1 -0
  72. package/build/dalvikExecutableUnparser.test.js +31 -0
  73. package/build/debugLogInputParser.js +1 -1
  74. package/build/disjunctionParser.d.ts +2 -2
  75. package/build/disjunctionParser.js +2 -2
  76. package/build/elementTerminatedArrayParser.d.ts +2 -2
  77. package/build/elementTerminatedArrayParser.js +1 -1
  78. package/build/elementTerminatedArrayParser.test.js +5 -5
  79. package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
  80. package/build/elementTerminatedSequenceArrayParser.js +1 -1
  81. package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
  82. package/build/elementTerminatedSequenceParser.d.ts +2 -2
  83. package/build/elementTerminatedSequenceParser.js +1 -1
  84. package/build/elementTerminatedSequenceParser.test.js +2 -2
  85. package/build/endOfInputParser.d.ts +1 -1
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/fetchCid.js +2 -6
  89. package/build/fetchCid.test.d.ts +1 -0
  90. package/build/fetchCid.test.js +16 -0
  91. package/build/fixedLengthSequenceParser.test.js +2 -2
  92. package/build/hasExecutable.js +2 -2
  93. package/build/highResolutionTimer.js +1 -1
  94. package/build/index.d.ts +24 -2
  95. package/build/index.js +22 -1
  96. package/build/inputReader.d.ts +1 -1
  97. package/build/inputReader.test.js +33 -45
  98. package/build/javaKeyStoreParser.test.js +6 -6
  99. package/build/jsonParser.js +8 -8
  100. package/build/lazyMessageError.d.ts +48 -0
  101. package/build/lazyMessageError.js +53 -0
  102. package/build/lazyMessageError.test.d.ts +1 -0
  103. package/build/lazyMessageError.test.js +15 -0
  104. package/build/leb128Parser.d.ts +1 -1
  105. package/build/leb128Parser.js +10 -10
  106. package/build/leb128Parser.test.js +7 -7
  107. package/build/negativeLookaheadParser.js +2 -2
  108. package/build/negativeLookaheadParser.test.js +4 -4
  109. package/build/noStackCaptureOverheadError.d.ts +4 -0
  110. package/build/noStackCaptureOverheadError.js +9 -0
  111. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  112. package/build/noStackCaptureOverheadError.test.js +15 -0
  113. package/build/nonEmptyArrayParser.js +2 -2
  114. package/build/nonEmptyArrayParser.test.js +2 -1
  115. package/build/optionalParser.js +2 -2
  116. package/build/parser.d.ts +2 -1
  117. package/build/parser.js +23 -8
  118. package/build/parser.test.js +78 -29
  119. package/build/parserConsumedSequenceParser.d.ts +1 -1
  120. package/build/parserConsumedSequenceParser.js +2 -2
  121. package/build/parserContext.d.ts +8 -6
  122. package/build/parserContext.js +60 -33
  123. package/build/parserContext.test.js +7 -3
  124. package/build/parserError.d.ts +603 -44
  125. package/build/parserError.js +98 -53
  126. package/build/parserImplementationInvariant.d.ts +1 -1
  127. package/build/parserImplementationInvariant.js +2 -2
  128. package/build/parserInputCompanion.js +2 -2
  129. package/build/promiseCompose.js +1 -2
  130. package/build/regexpParser.d.ts +2 -0
  131. package/build/regexpParser.js +71 -0
  132. package/build/regexpParser.test.d.ts +1 -0
  133. package/build/regexpParser.test.js +83 -0
  134. package/build/regularExpression.d.ts +63 -0
  135. package/build/regularExpression.js +1 -0
  136. package/build/regularExpressionParser.d.ts +3 -0
  137. package/build/regularExpressionParser.js +580 -0
  138. package/build/regularExpressionParser.test.d.ts +1 -0
  139. package/build/regularExpressionParser.test.js +89 -0
  140. package/build/separatedArrayParser.js +2 -2
  141. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  142. package/build/separatedNonEmptyArrayParser.js +40 -0
  143. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  144. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  145. package/build/sequenceBuffer.js +1 -1
  146. package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
  147. package/build/sequenceTerminatedSequenceParser.js +3 -3
  148. package/build/sequenceTerminatedSequenceParser.test.js +1 -1
  149. package/build/sequenceUnparser.d.ts +1 -1
  150. package/build/skipToParser.d.ts +1 -1
  151. package/build/skipToParser.js +2 -2
  152. package/build/sliceBoundedParser.test.js +4 -9
  153. package/build/smali.d.ts +1 -1
  154. package/build/smali.js +6 -2
  155. package/build/smaliParser.d.ts +62 -6
  156. package/build/smaliParser.js +1721 -296
  157. package/build/smaliParser.test.js +338 -43
  158. package/build/stringFromAsyncIterable.d.ts +1 -0
  159. package/build/stringFromAsyncIterable.js +7 -0
  160. package/build/terminatedArrayParser.js +4 -4
  161. package/build/terminatedArrayParser.test.js +7 -7
  162. package/build/toAsyncIterator.js +4 -4
  163. package/build/unionParser.d.ts +1 -1
  164. package/build/unionParser.js +2 -2
  165. package/build/unionParser.test.js +3 -3
  166. package/build/unparser.d.ts +3 -3
  167. package/build/unparser.js +6 -4
  168. package/build/unparser.test.js +7 -19
  169. package/build/unparserContext.d.ts +2 -2
  170. package/build/unparserContext.js +2 -3
  171. package/build/unparserError.d.ts +2 -1
  172. package/build/unparserError.js +2 -1
  173. package/build/unparserImplementationInvariant.d.ts +1 -1
  174. package/build/unparserOutputCompanion.d.ts +1 -1
  175. package/build/unparserOutputCompanion.js +1 -1
  176. package/build/zipParser.js +1 -1
  177. package/build/zipUnparser.d.ts +3 -3
  178. package/build/zipUnparser.js +9 -19
  179. package/build/zipUnparser.test.js +1 -1
  180. package/package.json +20 -26
  181. package/src/allSettledStream.test.ts +2 -2
  182. package/src/allSettledStream.ts +3 -3
  183. package/src/androidPackageParser.test.ts +17 -19
  184. package/src/androidPackageParser.ts +129 -171
  185. package/src/androidPackageUnparser.test.ts +19 -21
  186. package/src/androidPackageUnparser.ts +23 -17
  187. package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
  188. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  189. package/src/arbitraryDalvikBytecode.ts +992 -0
  190. package/src/arbitraryDalvikExecutable.ts +434 -0
  191. package/src/arbitraryDosDateTime.ts +1 -0
  192. package/src/arbitraryZipStream.ts +1 -1
  193. package/src/arrayParser.ts +2 -2
  194. package/src/arrayUnparser.ts +2 -2
  195. package/src/backsmali.ts +48 -4
  196. package/src/bash.ts +120 -0
  197. package/src/bashParser.test.ts +332 -0
  198. package/src/bashParser.ts +461 -0
  199. package/src/bsonParser.test.ts +12 -14
  200. package/src/customInvariant.ts +8 -12
  201. package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
  202. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  203. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  204. package/src/dalvikBytecodeParser.ts +1042 -243
  205. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  206. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  207. package/src/dalvikBytecodeUnparser.ts +758 -0
  208. package/src/dalvikExecutable.ts +110 -48
  209. package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
  210. package/src/dalvikExecutableParser/typeParsers.ts +23 -14
  211. package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
  212. package/src/dalvikExecutableParser.test.ts +60 -60
  213. package/src/dalvikExecutableParser.test.ts.md +6 -6
  214. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  215. package/src/dalvikExecutableParser.ts +911 -434
  216. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
  217. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  218. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  219. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  220. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  221. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  222. package/src/dalvikExecutableUnparser.test.ts +57 -0
  223. package/src/dalvikExecutableUnparser.ts +581 -0
  224. package/src/debugLogInputParser.ts +1 -1
  225. package/src/disjunctionParser.ts +5 -5
  226. package/src/elementTerminatedArrayParser.test.ts +8 -8
  227. package/src/elementTerminatedArrayParser.ts +2 -2
  228. package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
  229. package/src/elementTerminatedSequenceArrayParser.ts +2 -2
  230. package/src/elementTerminatedSequenceParser.test.ts +4 -6
  231. package/src/elementTerminatedSequenceParser.ts +2 -2
  232. package/src/endOfInputParser.ts +1 -1
  233. package/src/exactElementSwitchParser.ts +41 -0
  234. package/src/fetchCid.test.ts +20 -0
  235. package/src/fetchCid.ts +3 -7
  236. package/src/fixedLengthSequenceParser.test.ts +10 -12
  237. package/src/hasExecutable.ts +2 -2
  238. package/src/highResolutionTimer.ts +1 -1
  239. package/src/index.ts +113 -2
  240. package/src/inputReader.test.ts +39 -52
  241. package/src/inputReader.ts +2 -4
  242. package/src/inputReaderState.ts +1 -1
  243. package/src/inspect.ts +1 -1
  244. package/src/javaKeyStoreParser.test.ts +12 -14
  245. package/src/javaKeyStoreParser.ts +2 -6
  246. package/src/jsonParser.test.ts +2 -4
  247. package/src/jsonParser.ts +34 -38
  248. package/src/lazyMessageError.test.ts +21 -0
  249. package/src/lazyMessageError.ts +88 -0
  250. package/src/leb128Parser.test.ts +25 -23
  251. package/src/leb128Parser.ts +19 -19
  252. package/src/negativeLookaheadParser.test.ts +7 -11
  253. package/src/negativeLookaheadParser.ts +2 -2
  254. package/src/noStackCaptureOverheadError.test.ts +17 -0
  255. package/src/noStackCaptureOverheadError.ts +12 -0
  256. package/src/nonEmptyArrayParser.test.ts +3 -2
  257. package/src/nonEmptyArrayParser.ts +2 -2
  258. package/src/optionalParser.ts +2 -2
  259. package/src/parser.test.ts +96 -43
  260. package/src/parser.test.ts.md +13 -6
  261. package/src/parser.test.ts.snap +0 -0
  262. package/src/parser.ts +35 -12
  263. package/src/parserAccessorParser.ts +1 -1
  264. package/src/parserConsumedSequenceParser.ts +3 -3
  265. package/src/parserContext.test.ts +7 -3
  266. package/src/parserContext.ts +82 -48
  267. package/src/parserError.ts +143 -63
  268. package/src/parserImplementationInvariant.ts +3 -3
  269. package/src/parserInputCompanion.ts +2 -2
  270. package/src/promiseCompose.ts +2 -2
  271. package/src/regexpParser.test.ts +186 -0
  272. package/src/regexpParser.ts +94 -0
  273. package/src/regularExpression.ts +24 -0
  274. package/src/regularExpressionParser.test.ts +102 -0
  275. package/src/regularExpressionParser.ts +921 -0
  276. package/src/separatedArrayParser.ts +3 -3
  277. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  278. package/src/separatedNonEmptyArrayParser.ts +61 -0
  279. package/src/sequenceBuffer.test.ts +9 -9
  280. package/src/sequenceBuffer.ts +4 -4
  281. package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
  282. package/src/sequenceTerminatedSequenceParser.ts +4 -4
  283. package/src/sequenceUnparser.ts +2 -2
  284. package/src/skipToParser.ts +2 -2
  285. package/src/sliceBoundedParser.test.ts +4 -12
  286. package/src/sliceBoundedParser.ts +2 -2
  287. package/src/smali.ts +8 -3
  288. package/src/smaliParser.test.ts +377 -66
  289. package/src/smaliParser.test.ts.md +1635 -48
  290. package/src/smaliParser.test.ts.snap +0 -0
  291. package/src/smaliParser.ts +2751 -569
  292. package/src/stringFromAsyncIterable.ts +9 -0
  293. package/src/terminatedArrayParser.test.ts +11 -11
  294. package/src/terminatedArrayParser.ts +5 -7
  295. package/src/toAsyncIterator.ts +8 -8
  296. package/src/uint8Array.ts +2 -3
  297. package/src/unionParser.test.ts +22 -23
  298. package/src/unionParser.ts +6 -8
  299. package/src/unparser.test.ts +18 -34
  300. package/src/unparser.ts +13 -9
  301. package/src/unparserContext.ts +9 -13
  302. package/src/unparserError.ts +2 -1
  303. package/src/unparserImplementationInvariant.ts +1 -1
  304. package/src/unparserOutputCompanion.ts +1 -1
  305. package/src/zip.ts +2 -6
  306. package/src/zipParser.ts +10 -18
  307. package/src/zipUnparser.test.ts +1 -1
  308. package/src/zipUnparser.ts +52 -64
  309. package/tsconfig.json +7 -1
  310. package/xo.config.ts +15 -0
  311. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
@@ -1,24 +1,24 @@
1
- import test from 'ava';
1
+ import test, { TryResult } from 'ava';
2
2
  import { runParser } from './parser.js';
3
3
  import { stringParserInputCompanion, uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
4
4
  import { dalvikExecutableParser } from './dalvikExecutableParser.js';
5
5
  import { fetchCid } from './fetchCid.js';
6
6
  import { hasExecutable } from './hasExecutable.js';
7
- import { baksmaliClass } from './backsmali.js';
7
+ import { backsmaliSmaliIsolateClass, baksmaliClass, baksmaliListClasses } from './backsmali.js';
8
8
  import { smaliParser } from './smaliParser.js';
9
9
  import { smaliClass } from './smali.js';
10
10
 
11
11
  const hasBaksmaliPromise = hasExecutable('baksmali');
12
12
  const hasSmaliPromise = hasExecutable('smali');
13
13
 
14
- type ObjectPath = (string | symbol | number)[];
14
+ type ObjectPath = Array<string | symbol | number>;
15
15
 
16
16
  function objectWalk(object: unknown, f: (path: ObjectPath, value: unknown) => void, initialPath: ObjectPath = []) {
17
17
  f(initialPath, object);
18
18
 
19
19
  if (
20
20
  !object
21
- || typeof object !== 'object'
21
+ || typeof object !== 'object'
22
22
  ) {
23
23
  return;
24
24
  }
@@ -34,267 +34,294 @@ function objectWalk(object: unknown, f: (path: ObjectPath, value: unknown) => vo
34
34
  }
35
35
  }
36
36
 
37
- for (const [ dexCid, smaliFilePaths ] of [
38
- [
39
- 'bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4',
40
- [
41
- 'pl/czak/minimal/MainActivity',
42
- ],
43
- ],
44
- // [
45
- // 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq',
46
- // [
47
- // 'd/m',
48
- // ],
49
- // ],
50
- // [ 'bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq' ],
51
- // [
52
- // 'bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy',
53
- // [
54
- // 'com/journeyapps/barcodescanner/CaptureActivity',
55
- // ],
56
- // ],
57
- // [ 'bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda' ],
58
- ] as const) {
59
- for (const smaliFilePath of smaliFilePaths) {
60
- test.serial(
61
- 'parse(dex) against parse(smali(dex))' + dexCid + ' ' + smaliFilePath,
62
- async t => {
63
- const hasBaksmali = await hasBaksmaliPromise;
64
-
65
- if (!hasBaksmali) {
66
- t.pass('skipping test because baksmali is not available');
67
-
68
- return;
69
- }
70
-
71
- const dexStream = await fetchCid(dexCid);
72
-
73
- const smali = await baksmaliClass(dexStream, smaliFilePath);
74
-
75
- const classDefinitionFromSmali = await runParser(smaliParser, smali, stringParserInputCompanion, {
76
- errorJoinMode: 'all',
77
- });
78
-
79
- const dexStream2 = await fetchCid(dexCid);
80
-
81
- const executableFromDex = await runParser(dalvikExecutableParser, dexStream2, uint8ArrayParserInputCompanion, {
82
- errorJoinMode: 'all',
83
- });
84
-
85
- const classDefinitionFromDex = executableFromDex.classDefinitions.find(classDefinition => classDefinition.class === classDefinitionFromSmali.class);
86
-
87
- // console.log(smali);
88
-
89
- // console.dir({
90
- // classDefinitionFromDex,
91
- // classDefinitionFromSmali,
92
- // }, {
93
- // depth: null,
94
- // });
95
-
96
- objectWalk(classDefinitionFromDex, (_path, value) => {
97
- if (
98
- value
99
- && typeof value === 'object'
100
- && 'debugInfo' in value
101
- ) {
102
- value.debugInfo = undefined;
103
- }
104
- });
105
-
106
- t.deepEqual(
107
- classDefinitionFromDex,
108
- classDefinitionFromSmali,
109
- );
110
- },
111
- );
37
+ function normalizeSmaliFilePath(smaliFilePath: string | {
38
+ smaliFilePath: string;
39
+ isolate?: boolean;
40
+ }): {
41
+ smaliFilePath: string;
42
+ isolate: boolean;
43
+ } {
44
+ if (typeof smaliFilePath === 'string') {
45
+ return {
46
+ smaliFilePath,
47
+ isolate: false,
48
+ };
112
49
  }
113
- }
114
-
115
- const smali = `
116
- .class public Lcom/journeyapps/barcodescanner/CaptureActivity;
117
- .super Landroid/app/Activity;
118
- .source "CaptureActivity.java"
119
-
120
-
121
- # instance fields
122
- .field private barcodeScannerView:Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;
123
-
124
- .field private capture:Lcom/journeyapps/barcodescanner/CaptureManager;
125
-
126
-
127
- # direct methods
128
- .method public constructor <init>()V
129
- .registers 1
130
-
131
- .line 13
132
- invoke-direct {p0}, Landroid/app/Activity;-><init>()V
133
50
 
134
- return-void
135
- .end method
136
-
137
-
138
- # virtual methods
139
- .method protected initializeContent()Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;
140
- .registers 2
141
-
142
- sget v0, Lcom/google/zxing/client/android/R$layout;->zxing_capture:I
143
-
144
- .line 34
145
- invoke-virtual {p0, v0}, Landroid/app/Activity;->setContentView(I)V
146
-
147
- sget v0, Lcom/google/zxing/client/android/R$id;->zxing_barcode_scanner:I
148
-
149
- .line 35
150
- invoke-virtual {p0, v0}, Landroid/app/Activity;->findViewById(I)Landroid/view/View;
151
-
152
- move-result-object v0
153
-
154
- check-cast v0, Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;
155
-
156
- return-object v0
157
- .end method
158
-
159
- .method protected onCreate(Landroid/os/Bundle;)V
160
- .registers 4
161
-
162
- .line 19
163
- invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
164
-
165
- .line 21
166
- invoke-virtual {p0}, Lcom/journeyapps/barcodescanner/CaptureActivity;->initializeContent()Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;
167
-
168
- move-result-object v0
169
-
170
- iput-object v0, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->barcodeScannerView:Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;
171
-
172
- .line 23
173
- new-instance v0, Lcom/journeyapps/barcodescanner/CaptureManager;
174
-
175
- iget-object v1, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->barcodeScannerView:Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;
176
-
177
- invoke-direct {v0, p0, v1}, Lcom/journeyapps/barcodescanner/CaptureManager;-><init>(Landroid/app/Activity;Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;)V
178
-
179
- iput-object v0, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->capture:Lcom/journeyapps/barcodescanner/CaptureManager;
180
-
181
- .line 24
182
- invoke-virtual {p0}, Landroid/app/Activity;->getIntent()Landroid/content/Intent;
183
-
184
- move-result-object v1
51
+ return {
52
+ smaliFilePath: smaliFilePath.smaliFilePath,
53
+ isolate: smaliFilePath.isolate ?? false,
54
+ };
55
+ }
185
56
 
186
- invoke-virtual {v0, v1, p1}, Lcom/journeyapps/barcodescanner/CaptureManager;->initializeFromIntent(Landroid/content/Intent;Landroid/os/Bundle;)V
187
57
 
188
- iget-object p1, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->capture:Lcom/journeyapps/barcodescanner/CaptureManager;
189
58
 
190
- .line 25
191
- invoke-virtual {p1}, Lcom/journeyapps/barcodescanner/CaptureManager;->decode()V
59
+ function normalizeClassDefinition(classDefinition: any) {
60
+ objectWalk(classDefinition, (_path, value) => {
61
+ if (
62
+ value
63
+ && typeof value === 'object'
64
+ && 'debugInfo' in value
65
+ ) {
66
+ value.debugInfo = undefined;
67
+ }
68
+ });
69
+ }
192
70
 
193
- return-void
194
- .end method
71
+ const parseDexAgainstSmaliMacro = test.macro({
72
+ title(providedTitle, dexCid: string, smaliFilePathInput: string | { smaliFilePath: string; isolate?: boolean }) {
73
+ const { smaliFilePath, isolate } = normalizeSmaliFilePath(smaliFilePathInput);
74
+ return providedTitle ?? `parse(dex) against parse(smali(dex)) ${dexCid} ${smaliFilePath}${isolate ? ' isolated' : ''}`;
75
+ },
76
+ async exec(t, dexCid: string, smaliFilePathInput: string | { smaliFilePath: string; isolate?: boolean }) {
77
+ const { smaliFilePath, isolate } = normalizeSmaliFilePath(smaliFilePathInput);
78
+ const hasBaksmali = await hasBaksmaliPromise;
195
79
 
196
- .method protected onDestroy()V
197
- .registers 2
80
+ if (!hasBaksmali) {
81
+ t.pass('skipping test because baksmali is not available');
82
+ return;
83
+ }
198
84
 
199
- .line 52
200
- invoke-super {p0}, Landroid/app/Activity;->onDestroy()V
85
+ const dexStream: Uint8Array | AsyncIterable<Uint8Array> = await fetchCid(dexCid);
201
86
 
202
- iget-object v0, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->capture:Lcom/journeyapps/barcodescanner/CaptureManager;
87
+ const smali_ = await baksmaliClass(dexStream, smaliFilePath);
203
88
 
204
- .line 53
205
- invoke-virtual {v0}, Lcom/journeyapps/barcodescanner/CaptureManager;->onDestroy()V
89
+ const smali = (
90
+ smali_
91
+ .replaceAll(/^\s+# getter for:.*$/gm, '')
92
+ .replaceAll(/^\s+# setter for:.*$/gm, '')
93
+ .replaceAll(/^\s+# invokes:.*$/gm, '')
94
+ .replaceAll(/\n{3,}/g, '\n\n')
95
+ );
206
96
 
207
- return-void
208
- .end method
97
+ // Console.log(smali);
209
98
 
210
- .method public onKeyDown(ILandroid/view/KeyEvent;)Z
211
- .registers 4
99
+ const classDefinitionFromSmali = await runParser(smaliParser, smali, stringParserInputCompanion, {
100
+ errorJoinMode: 'all',
101
+ });
212
102
 
213
- iget-object v0, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->barcodeScannerView:Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;
103
+ let dexStream2: Uint8Array | AsyncIterable<Uint8Array> = await fetchCid(dexCid);
214
104
 
215
- .line 69
216
- invoke-virtual {v0, p1, p2}, Lcom/journeyapps/barcodescanner/DecoratedBarcodeView;->onKeyDown(ILandroid/view/KeyEvent;)Z
105
+ if (isolate) {
106
+ dexStream2 = await backsmaliSmaliIsolateClass(dexStream2, smaliFilePath);
107
+ }
217
108
 
218
- move-result v0
109
+ const executableFromDex = await runParser(dalvikExecutableParser, dexStream2, uint8ArrayParserInputCompanion, {
110
+ errorJoinMode: 'all',
111
+ });
219
112
 
220
- if-nez v0, :cond_11
113
+ const classDefinitionFromDex = executableFromDex.classDefinitions.find(classDefinition => classDefinition.class === classDefinitionFromSmali.class);
221
114
 
222
- invoke-super {p0, p1, p2}, Landroid/app/Activity;->onKeyDown(ILandroid/view/KeyEvent;)Z
115
+ // Normalize both DEX and Smali by removing debug info
116
+ normalizeClassDefinition(classDefinitionFromDex);
117
+ normalizeClassDefinition(classDefinitionFromSmali);
223
118
 
224
- move-result p1
119
+ // Console.dir({
120
+ // classDefinitionFromSmali,
121
+ // classDefinitionFromDex,
122
+ // }, {
123
+ // depth: null,
124
+ // });
225
125
 
226
- if-eqz p1, :cond_f
126
+ t.deepEqual(
127
+ classDefinitionFromDex,
128
+ classDefinitionFromSmali,
129
+ );
130
+ },
131
+ });
132
+
133
+ const parseAllClassesInDexAgainstSmaliMacro = test.macro({
134
+ title(providedTitle, dexCid: string, options?: {
135
+ skipUntilClassPath?: string;
136
+ maxFailures?: number;
137
+ }) {
138
+ return providedTitle ?? `parse all classes from dex ${dexCid} against smali${options?.skipUntilClassPath ? ` (skip until ${options.skipUntilClassPath})` : ''}`;
139
+ },
140
+ async exec(t, dexCid: string, options?: {
141
+ skipUntilClassPath?: string;
142
+ maxFailures?: number;
143
+ }) {
144
+ const hasBaksmali = await hasBaksmaliPromise;
145
+
146
+ if (!hasBaksmali) {
147
+ t.pass('skipping test because baksmali is not available');
148
+ return;
149
+ }
227
150
 
228
- goto :goto_11
151
+ const dexStream: Uint8Array | AsyncIterable<Uint8Array> = await fetchCid(dexCid);
229
152
 
230
- :cond_f
231
- const/4 p1, 0x0
153
+ const classes = (
154
+ (await baksmaliListClasses(dexStream))
155
+ .map(smaliFilePath => ({ smaliFilePath, sort: Math.random() }))
156
+ .sort((a, b) => a.sort - b.sort)
157
+ .map(({ smaliFilePath }) => smaliFilePath)
158
+ );
232
159
 
233
- goto :goto_12
160
+ const failures: TryResult[] = [];
234
161
 
235
- :cond_11
236
- :goto_11
237
- const/4 p1, 0x1
162
+ let shouldProcess = options?.skipUntilClassPath === undefined;
163
+ let processedCount = 0;
238
164
 
239
- :goto_12
240
- return p1
241
- .end method
165
+ for (const smaliFilePath of classes) {
166
+ if (options?.skipUntilClassPath && smaliFilePath === options.skipUntilClassPath) {
167
+ shouldProcess = true;
168
+ }
242
169
 
243
- .method protected onPause()V
244
- .registers 2
170
+ if (!shouldProcess) {
171
+ continue;
172
+ }
245
173
 
246
- .line 46
247
- invoke-super {p0}, Landroid/app/Activity;->onPause()V
174
+ processedCount++;
248
175
 
249
- iget-object v0, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->capture:Lcom/journeyapps/barcodescanner/CaptureManager;
176
+ const result = await t.try(parseDexAgainstSmaliMacro, dexCid, {
177
+ smaliFilePath,
178
+ isolate: true,
179
+ });
250
180
 
251
- .line 47
252
- invoke-virtual {v0}, Lcom/journeyapps/barcodescanner/CaptureManager;->onPause()V
181
+ if (result.passed) {
182
+ result.commit();
253
183
 
254
- return-void
255
- .end method
184
+ console.log(`ok ${processedCount}/${classes.length}`, smaliFilePath);
256
185
 
257
- .method public onRequestPermissionsResult(I[Ljava/lang/String;[I)V
258
- .registers 5
186
+ continue;
187
+ }
259
188
 
260
- iget-object v0, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->capture:Lcom/journeyapps/barcodescanner/CaptureManager;
189
+ function consoleLogFailure(failure: TryResult) {
190
+ const [ error ] = failure.errors;
261
191
 
262
- .line 64
263
- invoke-virtual {v0, p1, p2, p3}, Lcom/journeyapps/barcodescanner/CaptureManager;->onRequestPermissionsResult(I[Ljava/lang/String;[I)V
192
+ console.log((error as any).formattedDetails.at(0).formatted ?? error);
193
+ }
264
194
 
265
- return-void
266
- .end method
195
+ console.log(smaliFilePath);
196
+ consoleLogFailure(result);
267
197
 
268
- .method protected onResume()V
269
- .registers 2
198
+ failures.push(result);
270
199
 
271
- .line 40
272
- invoke-super {p0}, Landroid/app/Activity;->onResume()V
200
+ if (failures.length >= (options?.maxFailures ?? 1)) {
201
+ for (const failure of failures) {
202
+ consoleLogFailure(failure);
203
+ }
273
204
 
274
- iget-object v0, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->capture:Lcom/journeyapps/barcodescanner/CaptureManager;
205
+ for (const failure of failures) {
206
+ failure.commit();
207
+ }
208
+ }
209
+ }
275
210
 
276
- .line 41
277
- invoke-virtual {v0}, Lcom/journeyapps/barcodescanner/CaptureManager;->onResume()V
211
+ for (const failure of failures) {
212
+ failure.commit();
213
+ }
278
214
 
279
- return-void
280
- .end method
215
+ t.pass('completed all classes');
216
+ },
217
+ });
218
+
219
+ const testCasesByCid: Record<string, Array<string | { smaliFilePath: string; isolate?: boolean }>> = {
220
+ bafybeicb3qajmwy6li7hche2nkucvytaxcyxhwhphmi73tgydjzmyoqoda: [
221
+ { smaliFilePath: 'androidx/activity/ComponentActivity$1', isolate: true },
222
+ { smaliFilePath: 'androidx/activity/R$id', isolate: true },
223
+ { smaliFilePath: 'androidx/activity/ComponentActivity$NonConfigurationInstances', isolate: true },
224
+ { smaliFilePath: 'androidx/appcompat/R$styleable', isolate: true },
225
+ { smaliFilePath: 'androidx/core/content/FileProvider', isolate: true },
226
+ { smaliFilePath: 'androidx/core/view/KeyEventDispatcher', isolate: true },
227
+ { smaliFilePath: 'com/google/android/exoplayer2/audio/Sonic', isolate: true },
228
+ { smaliFilePath: 'com/google/android/exoplayer2/ext/opus/OpusDecoder', isolate: true },
229
+ { smaliFilePath: 'com/google/android/exoplayer2/extractor/ts/H262Reader', isolate: true },
230
+ { smaliFilePath: 'com/google/android/gms/internal/common/zzg', isolate: true },
231
+ { smaliFilePath: 'com/google/android/gms/internal/mlkit_vision_label/zzcm', isolate: true },
232
+ { smaliFilePath: 'com/google/android/play/core/integrity/model/StandardIntegrityErrorCode', isolate: true },
233
+ { smaliFilePath: 'com/google/common/math/IntMath', isolate: true },
234
+ { smaliFilePath: 'com/google/gson/internal/bind/CollectionTypeAdapterFactory', isolate: true },
235
+ ],
236
+ bafkreibb4gsprc3fvmnyqx6obswvm7e7wngnfj64gz65ey72r7xgyzymt4: [
237
+ 'pl/czak/minimal/MainActivity',
238
+ 'pl/czak/minimal/R',
239
+ ],
240
+ bafybeibbupm7uzhuq4pa674rb2amxsenbdaoijigmaf4onaodaql4mh7yy: [
241
+ { smaliFilePath: 'com/journeyapps/barcodescanner/CaptureActivity', isolate: true },
242
+ { smaliFilePath: '_COROUTINE/ArtificialStackFrames', isolate: true },
243
+ { smaliFilePath: 'androidx/appcompat/widget/AppCompatTextHelper', isolate: true },
244
+ { smaliFilePath: '_COROUTINE/CoroutineDebuggingKt', isolate: true },
245
+ { smaliFilePath: 'androidx/compose/ui/text/android/style/LineHeightSpan', isolate: true },
246
+ { smaliFilePath: 'androidx/compose/ui/layout/LayoutIdElement', isolate: true },
247
+ { smaliFilePath: 'androidx/compose/ui/text/EmojiSupportMatch', isolate: true },
248
+ { smaliFilePath: 'androidx/compose/ui/focus/FocusTransactionsKt', isolate: true },
249
+ { smaliFilePath: 'androidx/compose/animation/core/SpringSimulationKt', isolate: true },
250
+ { smaliFilePath: 'androidx/constraintlayout/core/widgets/ConstraintWidget', isolate: true },
251
+ { smaliFilePath: 'ch/qos/logback/core/CoreConstants', isolate: true },
252
+ { smaliFilePath: 'ch/qos/logback/classic/spi/ClassPackagingData', isolate: true },
253
+ { smaliFilePath: 'kotlin/coroutines/jvm/internal/DebugMetadata', isolate: true },
254
+ ],
255
+ bafybeiebe27ylo53trgitu6fqfbmba43c4ivxj3nt4kumsilkucpbdxtqq: [
256
+ { smaliFilePath: 'androidx/viewpager2/adapter/FragmentStateAdapter$5', isolate: true },
257
+ { smaliFilePath: 'androidx/lifecycle/b0', isolate: true },
258
+ { smaliFilePath: 'androidx/activity/b', isolate: true },
259
+ { smaliFilePath: 'androidx/activity/result/a$a', isolate: true },
260
+ { smaliFilePath: 'androidx/annotation/Keep', isolate: true },
261
+ { smaliFilePath: 'androidx/activity/result/e', isolate: true },
262
+ { smaliFilePath: 'androidx/appcompat/widget/ActionBarContextView$a', isolate: true },
263
+ { smaliFilePath: 'androidx/appcompat/widget/b0', isolate: true },
264
+ { smaliFilePath: 'androidx/appcompat/widget/b1', isolate: true },
265
+ { smaliFilePath: 'androidx/appcompat/widget/e', isolate: true },
266
+ { smaliFilePath: 'androidx/appcompat/widget/m0', isolate: true },
267
+ { smaliFilePath: 'androidx/appcompat/widget/r1', isolate: true },
268
+ { smaliFilePath: 'androidx/recyclerview/widget/RecyclerView$a0', isolate: true },
269
+ { smaliFilePath: 'androidx/constraintlayout/widget/ConstraintLayout$a', isolate: true },
270
+ { smaliFilePath: 'l4/a', isolate: true },
271
+ { smaliFilePath: 'n4/o', isolate: true },
272
+ { smaliFilePath: 'o6/f', isolate: true },
273
+ { smaliFilePath: 'a', isolate: true },
274
+ { smaliFilePath: 'a/b', isolate: true },
275
+ { smaliFilePath: 'f/b', isolate: true },
276
+ { smaliFilePath: 'h1/j', isolate: true },
277
+ { smaliFilePath: 'android/app/AppComponentFactory', isolate: true },
278
+ { smaliFilePath: 'android/app/job/JobInfo$TriggerContentUri', isolate: true },
279
+ { smaliFilePath: 'android/graphics/BlendModeColorFilter', isolate: true },
280
+ { smaliFilePath: 'android/graphics/fonts/Font$Builder', isolate: true },
281
+ { smaliFilePath: 'android/os/LocaleList', isolate: true },
282
+ { smaliFilePath: 'a0/i', isolate: true },
283
+ { smaliFilePath: 'a0/l', isolate: true },
284
+ { smaliFilePath: 'a0/n', isolate: true },
285
+ { smaliFilePath: 'a0/p', isolate: true },
286
+ { smaliFilePath: 'a0/v', isolate: true },
287
+ { smaliFilePath: 'a0/v$a', isolate: true },
288
+ { smaliFilePath: 'a3/a', isolate: true },
289
+ { smaliFilePath: 'a3/b', isolate: true },
290
+ { smaliFilePath: 'a3/d', isolate: true },
291
+ { smaliFilePath: 'a4/b', isolate: true },
292
+ { smaliFilePath: 'b4/v', isolate: true },
293
+ { smaliFilePath: 'd6/a', isolate: true },
294
+ { smaliFilePath: 'q2/d$a', isolate: true },
295
+ { smaliFilePath: 'y4/t1', isolate: true },
296
+ { smaliFilePath: 'com/google/android/material/textfield/b', isolate: true },
297
+ { smaliFilePath: 'm/g', isolate: true },
298
+ ],
299
+ };
281
300
 
282
- .method protected onSaveInstanceState(Landroid/os/Bundle;)V
283
- .registers 3
301
+ for (const [ dexCid, smaliFilePaths ] of Object.entries(testCasesByCid)) {
302
+ for (const smaliFilePath of smaliFilePaths) {
303
+ test.serial(parseDexAgainstSmaliMacro, dexCid, smaliFilePath);
304
+ }
305
+ }
284
306
 
285
- .line 58
286
- invoke-super {p0, p1}, Landroid/app/Activity;->onSaveInstanceState(Landroid/os/Bundle;)V
307
+ for (const dexCid of Object.keys(testCasesByCid)) {
308
+ test.serial.skip(parseAllClassesInDexAgainstSmaliMacro, dexCid);
309
+ }
287
310
 
288
- iget-object v0, p0, Lcom/journeyapps/barcodescanner/CaptureActivity;->capture:Lcom/journeyapps/barcodescanner/CaptureManager;
311
+ const smali = `
312
+ .class public final La0/l;
313
+ .super Ljava/lang/Object;
314
+ .source "SourceFile"
289
315
 
290
- .line 59
291
- invoke-virtual {v0, p1}, Lcom/journeyapps/barcodescanner/CaptureManager;->onSaveInstanceState(Landroid/os/Bundle;)V
316
+ # direct methods
317
+ .method public static final a(Lh1/p;ZJ)F
318
+ .registers 6
292
319
 
293
- return-void
320
+ return v0
294
321
  .end method
295
322
  `;
296
323
 
297
- test.serial.skip(
324
+ test.serial(
298
325
  'parse(dex(smali)) againts parse(smali)',
299
326
  async t => {
300
327
  const hasSmali = await hasSmaliPromise;
@@ -305,9 +332,7 @@ test.serial.skip(
305
332
  return;
306
333
  }
307
334
 
308
- const dexBuffer = await smaliClass(async function* () {
309
- yield smali;
310
- }());
335
+ const dexBuffer = await smaliClass(smali);
311
336
 
312
337
  const classDefinitionFromSmali = await runParser(smaliParser, smali, stringParserInputCompanion, {
313
338
  errorJoinMode: 'all',
@@ -319,24 +344,16 @@ test.serial.skip(
319
344
 
320
345
  const classDefinitionFromDex = executableFromDex.classDefinitions.find(classDefinition => classDefinition.class === classDefinitionFromSmali.class);
321
346
 
322
- // console.log(smali);
347
+ // Normalize both DEX and Smali by removing debug info
348
+ normalizeClassDefinition(classDefinitionFromDex);
349
+ normalizeClassDefinition(classDefinitionFromSmali);
323
350
 
324
- console.dir({
325
- classDefinitionFromDex,
326
- classDefinitionFromSmali,
327
- }, {
328
- depth: null,
329
- });
330
-
331
- objectWalk(classDefinitionFromDex, (_path, value) => {
332
- if (
333
- value
334
- && typeof value === 'object'
335
- && 'debugInfo' in value
336
- ) {
337
- value.debugInfo = undefined;
338
- }
339
- });
351
+ // Console.dir({
352
+ // classDefinitionFromDex,
353
+ // classDefinitionFromSmali,
354
+ // }, {
355
+ // depth: null,
356
+ // });
340
357
 
341
358
  t.deepEqual(
342
359
  classDefinitionFromDex,