@futpib/parser 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/.github/copilot-instructions.md +149 -0
  2. package/.github/workflows/copilot-setup-steps.yml +18 -0
  3. package/.github/workflows/main.yml +29 -8
  4. package/.yarn/releases/yarn-4.9.4.cjs +942 -0
  5. package/.yarnrc.yml +1 -1
  6. package/build/allSettledStream.js +1 -1
  7. package/build/allSettledStream.test.js +2 -2
  8. package/build/androidPackageParser.d.ts +1 -1
  9. package/build/androidPackageParser.js +5 -3
  10. package/build/androidPackageParser.test.js +7 -7
  11. package/build/androidPackageUnparser.d.ts +2 -2
  12. package/build/androidPackageUnparser.js +18 -14
  13. package/build/androidPackageUnparser.test.js +7 -7
  14. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  15. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  16. package/build/arbitraryDalvikBytecode.js +640 -0
  17. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  18. package/build/arbitraryDalvikExecutable.js +282 -0
  19. package/build/arbitraryDosDateTime.js +1 -0
  20. package/build/arbitraryZipStream.js +1 -1
  21. package/build/arrayParser.js +2 -2
  22. package/build/arrayUnparser.d.ts +1 -1
  23. package/build/backsmali.d.ts +3 -1
  24. package/build/backsmali.js +31 -3
  25. package/build/customInvariant.d.ts +2 -1
  26. package/build/customInvariant.js +4 -6
  27. package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
  28. package/build/dalvikBytecodeParser/formatParsers.js +146 -11
  29. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  30. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  31. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  32. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  33. package/build/dalvikBytecodeParser.d.ts +1105 -5
  34. package/build/dalvikBytecodeParser.js +658 -205
  35. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  36. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  37. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  38. package/build/dalvikBytecodeUnparser.js +642 -0
  39. package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
  40. package/build/dalvikBytecodeUnparser.test.js +25 -0
  41. package/build/dalvikExecutable.d.ts +65 -8
  42. package/build/dalvikExecutable.js +36 -0
  43. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
  44. package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
  45. package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
  46. package/build/dalvikExecutableParser/typeParsers.js +16 -11
  47. package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
  48. package/build/dalvikExecutableParser/typedNumbers.js +0 -1
  49. package/build/dalvikExecutableParser.d.ts +2 -2
  50. package/build/dalvikExecutableParser.js +655 -337
  51. package/build/dalvikExecutableParser.test.js +24 -22
  52. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
  53. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  54. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  55. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  56. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  57. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  58. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  59. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  60. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  61. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  62. package/build/dalvikExecutableUnparser/utils.js +108 -0
  63. package/build/dalvikExecutableUnparser.d.ts +4 -0
  64. package/build/dalvikExecutableUnparser.js +406 -0
  65. package/build/dalvikExecutableUnparser.test.d.ts +1 -0
  66. package/build/dalvikExecutableUnparser.test.js +31 -0
  67. package/build/debugLogInputParser.js +1 -1
  68. package/build/disjunctionParser.d.ts +2 -2
  69. package/build/disjunctionParser.js +2 -2
  70. package/build/elementTerminatedArrayParser.d.ts +2 -2
  71. package/build/elementTerminatedArrayParser.js +1 -1
  72. package/build/elementTerminatedArrayParser.test.js +5 -5
  73. package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
  74. package/build/elementTerminatedSequenceArrayParser.js +1 -1
  75. package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
  76. package/build/elementTerminatedSequenceParser.d.ts +2 -2
  77. package/build/elementTerminatedSequenceParser.js +1 -1
  78. package/build/elementTerminatedSequenceParser.test.js +2 -2
  79. package/build/endOfInputParser.d.ts +1 -1
  80. package/build/exactElementSwitchParser.d.ts +3 -0
  81. package/build/exactElementSwitchParser.js +22 -0
  82. package/build/fetchCid.js +2 -6
  83. package/build/fetchCid.test.d.ts +1 -0
  84. package/build/fetchCid.test.js +16 -0
  85. package/build/fixedLengthSequenceParser.test.js +2 -2
  86. package/build/hasExecutable.js +2 -2
  87. package/build/highResolutionTimer.js +1 -1
  88. package/build/inputReader.d.ts +1 -1
  89. package/build/inputReader.test.js +33 -45
  90. package/build/javaKeyStoreParser.test.js +6 -6
  91. package/build/jsonParser.js +8 -8
  92. package/build/lazyMessageError.d.ts +48 -0
  93. package/build/lazyMessageError.js +53 -0
  94. package/build/lazyMessageError.test.d.ts +1 -0
  95. package/build/lazyMessageError.test.js +15 -0
  96. package/build/leb128Parser.d.ts +1 -1
  97. package/build/leb128Parser.js +10 -10
  98. package/build/leb128Parser.test.js +7 -7
  99. package/build/negativeLookaheadParser.js +2 -2
  100. package/build/negativeLookaheadParser.test.js +4 -4
  101. package/build/noStackCaptureOverheadError.d.ts +4 -0
  102. package/build/noStackCaptureOverheadError.js +9 -0
  103. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  104. package/build/noStackCaptureOverheadError.test.js +15 -0
  105. package/build/nonEmptyArrayParser.js +2 -2
  106. package/build/nonEmptyArrayParser.test.js +2 -1
  107. package/build/optionalParser.js +2 -2
  108. package/build/parser.d.ts +2 -1
  109. package/build/parser.js +23 -8
  110. package/build/parser.test.js +78 -29
  111. package/build/parserConsumedSequenceParser.d.ts +1 -1
  112. package/build/parserConsumedSequenceParser.js +2 -2
  113. package/build/parserContext.d.ts +8 -6
  114. package/build/parserContext.js +60 -33
  115. package/build/parserContext.test.js +7 -3
  116. package/build/parserError.d.ts +603 -44
  117. package/build/parserError.js +98 -53
  118. package/build/parserImplementationInvariant.d.ts +1 -1
  119. package/build/parserImplementationInvariant.js +2 -2
  120. package/build/parserInputCompanion.js +2 -2
  121. package/build/promiseCompose.js +1 -2
  122. package/build/separatedArrayParser.js +2 -2
  123. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  124. package/build/separatedNonEmptyArrayParser.js +40 -0
  125. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  126. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  127. package/build/sequenceBuffer.js +1 -1
  128. package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
  129. package/build/sequenceTerminatedSequenceParser.js +3 -3
  130. package/build/sequenceTerminatedSequenceParser.test.js +1 -1
  131. package/build/sequenceUnparser.d.ts +1 -1
  132. package/build/skipToParser.d.ts +1 -1
  133. package/build/skipToParser.js +2 -2
  134. package/build/sliceBoundedParser.test.js +4 -9
  135. package/build/smali.d.ts +1 -1
  136. package/build/smali.js +6 -2
  137. package/build/smaliParser.d.ts +62 -6
  138. package/build/smaliParser.js +1721 -296
  139. package/build/smaliParser.test.js +338 -43
  140. package/build/stringFromAsyncIterable.d.ts +1 -0
  141. package/build/stringFromAsyncIterable.js +7 -0
  142. package/build/terminatedArrayParser.js +4 -4
  143. package/build/terminatedArrayParser.test.js +7 -7
  144. package/build/toAsyncIterator.js +4 -4
  145. package/build/unionParser.d.ts +1 -1
  146. package/build/unionParser.js +2 -2
  147. package/build/unionParser.test.js +3 -3
  148. package/build/unparser.d.ts +3 -3
  149. package/build/unparser.js +6 -4
  150. package/build/unparser.test.js +7 -19
  151. package/build/unparserContext.d.ts +2 -2
  152. package/build/unparserContext.js +2 -3
  153. package/build/unparserError.d.ts +2 -1
  154. package/build/unparserError.js +2 -1
  155. package/build/unparserImplementationInvariant.d.ts +1 -1
  156. package/build/unparserOutputCompanion.d.ts +1 -1
  157. package/build/unparserOutputCompanion.js +1 -1
  158. package/build/zipParser.js +1 -1
  159. package/build/zipUnparser.d.ts +3 -3
  160. package/build/zipUnparser.js +9 -19
  161. package/build/zipUnparser.test.js +1 -1
  162. package/package.json +19 -26
  163. package/src/allSettledStream.test.ts +2 -2
  164. package/src/allSettledStream.ts +3 -3
  165. package/src/androidPackageParser.test.ts +17 -19
  166. package/src/androidPackageParser.ts +129 -171
  167. package/src/androidPackageUnparser.test.ts +19 -21
  168. package/src/androidPackageUnparser.ts +23 -17
  169. package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
  170. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  171. package/src/arbitraryDalvikBytecode.ts +992 -0
  172. package/src/arbitraryDalvikExecutable.ts +434 -0
  173. package/src/arbitraryDosDateTime.ts +1 -0
  174. package/src/arbitraryZipStream.ts +1 -1
  175. package/src/arrayParser.ts +2 -2
  176. package/src/arrayUnparser.ts +2 -2
  177. package/src/backsmali.ts +48 -4
  178. package/src/bsonParser.test.ts +12 -14
  179. package/src/customInvariant.ts +8 -12
  180. package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
  181. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  182. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  183. package/src/dalvikBytecodeParser.ts +1042 -243
  184. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  185. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  186. package/src/dalvikBytecodeUnparser.ts +758 -0
  187. package/src/dalvikExecutable.ts +110 -48
  188. package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
  189. package/src/dalvikExecutableParser/typeParsers.ts +23 -14
  190. package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
  191. package/src/dalvikExecutableParser.test.ts +60 -60
  192. package/src/dalvikExecutableParser.test.ts.md +6 -6
  193. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  194. package/src/dalvikExecutableParser.ts +911 -434
  195. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
  196. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  197. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  198. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  199. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  200. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  201. package/src/dalvikExecutableUnparser.test.ts +57 -0
  202. package/src/dalvikExecutableUnparser.ts +581 -0
  203. package/src/debugLogInputParser.ts +1 -1
  204. package/src/disjunctionParser.ts +5 -5
  205. package/src/elementTerminatedArrayParser.test.ts +8 -8
  206. package/src/elementTerminatedArrayParser.ts +2 -2
  207. package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
  208. package/src/elementTerminatedSequenceArrayParser.ts +2 -2
  209. package/src/elementTerminatedSequenceParser.test.ts +4 -6
  210. package/src/elementTerminatedSequenceParser.ts +2 -2
  211. package/src/endOfInputParser.ts +1 -1
  212. package/src/exactElementSwitchParser.ts +41 -0
  213. package/src/fetchCid.test.ts +20 -0
  214. package/src/fetchCid.ts +3 -7
  215. package/src/fixedLengthSequenceParser.test.ts +10 -12
  216. package/src/hasExecutable.ts +2 -2
  217. package/src/highResolutionTimer.ts +1 -1
  218. package/src/inputReader.test.ts +39 -52
  219. package/src/inputReader.ts +2 -4
  220. package/src/inputReaderState.ts +1 -1
  221. package/src/inspect.ts +1 -1
  222. package/src/javaKeyStoreParser.test.ts +12 -14
  223. package/src/javaKeyStoreParser.ts +2 -6
  224. package/src/jsonParser.test.ts +2 -4
  225. package/src/jsonParser.ts +34 -38
  226. package/src/lazyMessageError.test.ts +21 -0
  227. package/src/lazyMessageError.ts +88 -0
  228. package/src/leb128Parser.test.ts +25 -23
  229. package/src/leb128Parser.ts +19 -19
  230. package/src/negativeLookaheadParser.test.ts +7 -11
  231. package/src/negativeLookaheadParser.ts +2 -2
  232. package/src/noStackCaptureOverheadError.test.ts +17 -0
  233. package/src/noStackCaptureOverheadError.ts +12 -0
  234. package/src/nonEmptyArrayParser.test.ts +3 -2
  235. package/src/nonEmptyArrayParser.ts +2 -2
  236. package/src/optionalParser.ts +2 -2
  237. package/src/parser.test.ts +96 -43
  238. package/src/parser.test.ts.md +13 -6
  239. package/src/parser.test.ts.snap +0 -0
  240. package/src/parser.ts +35 -12
  241. package/src/parserAccessorParser.ts +1 -1
  242. package/src/parserConsumedSequenceParser.ts +3 -3
  243. package/src/parserContext.test.ts +7 -3
  244. package/src/parserContext.ts +82 -48
  245. package/src/parserError.ts +143 -63
  246. package/src/parserImplementationInvariant.ts +3 -3
  247. package/src/parserInputCompanion.ts +2 -2
  248. package/src/promiseCompose.ts +2 -2
  249. package/src/separatedArrayParser.ts +3 -3
  250. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  251. package/src/separatedNonEmptyArrayParser.ts +61 -0
  252. package/src/sequenceBuffer.test.ts +9 -9
  253. package/src/sequenceBuffer.ts +4 -4
  254. package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
  255. package/src/sequenceTerminatedSequenceParser.ts +4 -4
  256. package/src/sequenceUnparser.ts +2 -2
  257. package/src/skipToParser.ts +2 -2
  258. package/src/sliceBoundedParser.test.ts +4 -12
  259. package/src/sliceBoundedParser.ts +2 -2
  260. package/src/smali.ts +8 -3
  261. package/src/smaliParser.test.ts +377 -66
  262. package/src/smaliParser.test.ts.md +1635 -48
  263. package/src/smaliParser.test.ts.snap +0 -0
  264. package/src/smaliParser.ts +2751 -569
  265. package/src/stringFromAsyncIterable.ts +9 -0
  266. package/src/terminatedArrayParser.test.ts +11 -11
  267. package/src/terminatedArrayParser.ts +5 -7
  268. package/src/toAsyncIterator.ts +8 -8
  269. package/src/uint8Array.ts +2 -3
  270. package/src/unionParser.test.ts +22 -23
  271. package/src/unionParser.ts +6 -8
  272. package/src/unparser.test.ts +18 -34
  273. package/src/unparser.ts +13 -9
  274. package/src/unparserContext.ts +9 -13
  275. package/src/unparserError.ts +2 -1
  276. package/src/unparserImplementationInvariant.ts +1 -1
  277. package/src/unparserOutputCompanion.ts +1 -1
  278. package/src/zip.ts +2 -6
  279. package/src/zipParser.ts +10 -18
  280. package/src/zipUnparser.test.ts +1 -1
  281. package/src/zipUnparser.ts +52 -64
  282. package/tsconfig.json +7 -1
  283. package/xo.config.ts +15 -0
  284. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
@@ -0,0 +1,640 @@
1
+ import * as fc from 'fast-check';
2
+ import { isoIndexIntoStringIds, isoIndexIntoTypeIds, isoIndexIntoMethodIds, isoIndexIntoFieldIds, isoIndexIntoPrototypeIds, } from './dalvikExecutableParser/typedNumbers.js';
3
+ // Arbitrary generators for typed indexes
4
+ const arbitraryIndexIntoStringIds = fc
5
+ .nat({ max: 65535 })
6
+ .map(n => isoIndexIntoStringIds.wrap(n));
7
+ const arbitraryIndexIntoTypeIds = fc
8
+ .nat({ max: 65535 })
9
+ .map(n => isoIndexIntoTypeIds.wrap(n));
10
+ const arbitraryIndexIntoMethodIds = fc
11
+ .nat({ max: 65535 })
12
+ .map(n => isoIndexIntoMethodIds.wrap(n));
13
+ const arbitraryIndexIntoFieldIds = fc
14
+ .nat({ max: 65535 })
15
+ .map(n => isoIndexIntoFieldIds.wrap(n));
16
+ const arbitraryIndexIntoPrototypeIds = fc
17
+ .nat({ max: 65535 })
18
+ .map(n => isoIndexIntoPrototypeIds.wrap(n));
19
+ // Arbitrary register number (4-bit or 8-bit or 16-bit depending on format)
20
+ const arbitraryRegister4 = fc.nat({ max: 15 });
21
+ const arbitraryRegister8 = fc.nat({ max: 255 });
22
+ const arbitraryRegister16 = fc.nat({ max: 65535 });
23
+ // Arbitrary values for const operations
24
+ const arbitraryNibbleValue = fc.integer({ min: -8, max: 7 }); // 4-bit signed
25
+ const arbitraryByteValue = fc.integer({ min: -128, max: 127 }); // 8-bit signed
26
+ const arbitraryShortValue = fc.integer({ min: -32768, max: 32767 }); // 16-bit signed
27
+ const arbitraryIntValue = fc.integer({ min: -2147483648, max: 2147483647 }); // 32-bit signed
28
+ const arbitraryLongValue = fc.bigInt({ min: -9223372036854775808n, max: 9223372036854775807n }); // 64-bit signed
29
+ // Arbitrary branch offsets (relative)
30
+ const arbitraryBranchOffset8 = fc.integer({ min: -128, max: 127 });
31
+ const arbitraryBranchOffset16 = fc.integer({ min: -32768, max: 32767 });
32
+ const arbitraryBranchOffset32 = fc.integer({ min: -2147483648, max: 2147483647 });
33
+ // No-operation
34
+ const arbitraryNop = fc.constant({
35
+ operation: 'nop',
36
+ });
37
+ // Move operations (Format 12x)
38
+ const arbitraryMove = fc.record({
39
+ operation: fc.constant('move'),
40
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
41
+ });
42
+ const arbitraryMoveWide = fc.record({
43
+ operation: fc.constant('move-wide'),
44
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
45
+ });
46
+ const arbitraryMoveObject = fc.record({
47
+ operation: fc.constant('move-object'),
48
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
49
+ });
50
+ // Move operations (Format 22x - from16)
51
+ const arbitraryMoveFrom16 = fc.record({
52
+ operation: fc.constant('move/from16'),
53
+ registers: fc.tuple(arbitraryRegister8, arbitraryRegister16),
54
+ });
55
+ const arbitraryMoveWideFrom16 = fc.record({
56
+ operation: fc.constant('move-wide/from16'),
57
+ registers: fc.tuple(arbitraryRegister8, arbitraryRegister16),
58
+ });
59
+ const arbitraryMoveObjectFrom16 = fc.record({
60
+ operation: fc.constant('move-object/from16'),
61
+ registers: fc.tuple(arbitraryRegister8, arbitraryRegister16),
62
+ });
63
+ // Move operations (Format 32x - /16)
64
+ const arbitraryMoveWide16 = fc.record({
65
+ operation: fc.constant('move-wide/16'),
66
+ registers: fc.tuple(arbitraryRegister16, arbitraryRegister16),
67
+ });
68
+ // Move-result operations (Format 11x)
69
+ const arbitraryMoveResult = fc.record({
70
+ operation: fc.constant('move-result'),
71
+ registers: fc.tuple(arbitraryRegister8),
72
+ });
73
+ const arbitraryMoveResultWide = fc.record({
74
+ operation: fc.constant('move-result-wide'),
75
+ registers: fc.tuple(arbitraryRegister8),
76
+ });
77
+ const arbitraryMoveResultObject = fc.record({
78
+ operation: fc.constant('move-result-object'),
79
+ registers: fc.tuple(arbitraryRegister8),
80
+ });
81
+ const arbitraryMoveException = fc.record({
82
+ operation: fc.constant('move-exception'),
83
+ registers: fc.tuple(arbitraryRegister8),
84
+ });
85
+ // Return operations
86
+ const arbitraryReturnVoid = fc.constant({
87
+ operation: 'return-void',
88
+ });
89
+ const arbitraryReturn = fc.record({
90
+ operation: fc.constant('return'),
91
+ registers: fc.tuple(arbitraryRegister8),
92
+ });
93
+ const arbitraryReturnWide = fc.record({
94
+ operation: fc.constant('return-wide'),
95
+ registers: fc.tuple(arbitraryRegister8),
96
+ });
97
+ const arbitraryReturnObject = fc.record({
98
+ operation: fc.constant('return-object'),
99
+ registers: fc.tuple(arbitraryRegister8),
100
+ });
101
+ // Const operations
102
+ const arbitraryConst4 = fc.record({
103
+ operation: fc.constant('const/4'),
104
+ registers: fc.tuple(arbitraryRegister4),
105
+ value: arbitraryNibbleValue,
106
+ });
107
+ const arbitraryConst16 = fc.record({
108
+ operation: fc.constant('const/16'),
109
+ registers: fc.tuple(arbitraryRegister8),
110
+ value: arbitraryShortValue,
111
+ });
112
+ const arbitraryConst = fc.record({
113
+ operation: fc.constant('const'),
114
+ registers: fc.tuple(arbitraryRegister8),
115
+ value: arbitraryIntValue,
116
+ });
117
+ const arbitraryConstHigh16 = fc.record({
118
+ operation: fc.constant('const/high16'),
119
+ registers: fc.tuple(arbitraryRegister8),
120
+ // Parser shifts left by 16, so value is stored pre-shifted
121
+ value: arbitraryShortValue.map(v => v << 16),
122
+ });
123
+ const arbitraryConstWide16 = fc.record({
124
+ operation: fc.constant('const-wide/16'),
125
+ registers: fc.tuple(arbitraryRegister8),
126
+ // Parser stores value as-is (no shift for const-wide/16)
127
+ value: fc.integer({ min: -32768, max: 32767 }).map(v => BigInt(v)),
128
+ });
129
+ const arbitraryConstWide32 = fc.record({
130
+ operation: fc.constant('const-wide/32'),
131
+ registers: fc.tuple(arbitraryRegister8),
132
+ // Parser stores value as-is (no shift for const-wide/32)
133
+ value: fc.integer({ min: -2147483648, max: 2147483647 }).map(v => BigInt(v)),
134
+ });
135
+ const arbitraryConstWide = fc.record({
136
+ operation: fc.constant('const-wide'),
137
+ registers: fc.tuple(arbitraryRegister8),
138
+ value: arbitraryLongValue,
139
+ });
140
+ const arbitraryConstWideHigh16 = fc.record({
141
+ operation: fc.constant('const-wide/high16'),
142
+ registers: fc.tuple(arbitraryRegister8),
143
+ // Parser shifts value left by 48 bits, so generate pre-shifted values
144
+ value: fc.integer({ min: -32768, max: 32767 }).map(v => BigInt(v) << 48n),
145
+ });
146
+ const arbitraryConstString = fc.record({
147
+ operation: fc.constant('const-string'),
148
+ registers: fc.tuple(arbitraryRegister8),
149
+ stringIndex: arbitraryIndexIntoStringIds,
150
+ });
151
+ const arbitraryConstStringJumbo = fc.record({
152
+ operation: fc.constant('const-string/jumbo'),
153
+ registers: fc.tuple(arbitraryRegister8),
154
+ stringIndex: arbitraryIndexIntoStringIds,
155
+ });
156
+ const arbitraryConstClass = fc.record({
157
+ operation: fc.constant('const-class'),
158
+ registers: fc.tuple(arbitraryRegister8),
159
+ typeIndex: arbitraryIndexIntoTypeIds,
160
+ });
161
+ const arbitraryConstMethodHandle = fc.record({
162
+ operation: fc.constant('const-method-handle'),
163
+ registers: fc.tuple(arbitraryRegister8),
164
+ methodIndex: arbitraryIndexIntoMethodIds,
165
+ });
166
+ // Monitor operations
167
+ const arbitraryMonitorEnter = fc.record({
168
+ operation: fc.constant('monitor-enter'),
169
+ registers: fc.tuple(arbitraryRegister8),
170
+ });
171
+ const arbitraryMonitorExit = fc.record({
172
+ operation: fc.constant('monitor-exit'),
173
+ registers: fc.tuple(arbitraryRegister8),
174
+ });
175
+ // Type operations
176
+ const arbitraryCheckCast = fc.record({
177
+ operation: fc.constant('check-cast'),
178
+ registers: fc.tuple(arbitraryRegister8),
179
+ typeIndex: arbitraryIndexIntoTypeIds,
180
+ });
181
+ const arbitraryInstanceOf = fc.record({
182
+ operation: fc.constant('instance-of'),
183
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
184
+ typeIndex: arbitraryIndexIntoTypeIds,
185
+ });
186
+ const arbitraryNewInstance = fc.record({
187
+ operation: fc.constant('new-instance'),
188
+ registers: fc.tuple(arbitraryRegister8),
189
+ typeIndex: arbitraryIndexIntoTypeIds,
190
+ });
191
+ const arbitraryNewArray = fc.record({
192
+ operation: fc.constant('new-array'),
193
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
194
+ typeIndex: arbitraryIndexIntoTypeIds,
195
+ });
196
+ // Array operations
197
+ const arbitraryArrayLength = fc.record({
198
+ operation: fc.constant('array-length'),
199
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
200
+ });
201
+ const arbitraryThrow = fc.record({
202
+ operation: fc.constant('throw'),
203
+ registers: fc.tuple(arbitraryRegister8),
204
+ });
205
+ // Goto operations
206
+ const arbitraryGoto = fc.record({
207
+ operation: fc.constant('goto'),
208
+ branchOffset: arbitraryBranchOffset8,
209
+ });
210
+ const arbitraryGoto16 = fc.record({
211
+ operation: fc.constant('goto/16'),
212
+ branchOffset: arbitraryBranchOffset16,
213
+ });
214
+ const arbitraryGoto32 = fc.record({
215
+ operation: fc.constant('goto/32'),
216
+ branchOffset: arbitraryBranchOffset32,
217
+ });
218
+ // Switch operations
219
+ const arbitraryPackedSwitch = fc.record({
220
+ operation: fc.constant('packed-switch'),
221
+ registers: fc.tuple(arbitraryRegister8),
222
+ branchOffset: arbitraryBranchOffset32,
223
+ });
224
+ const arbitrarySparseSwitch = fc.record({
225
+ operation: fc.constant('sparse-switch'),
226
+ registers: fc.tuple(arbitraryRegister8),
227
+ branchOffset: arbitraryBranchOffset32,
228
+ });
229
+ const arbitraryFillArrayData = fc.record({
230
+ operation: fc.constant('fill-array-data'),
231
+ registers: fc.tuple(arbitraryRegister8),
232
+ branchOffset: arbitraryBranchOffset32,
233
+ });
234
+ // Payload operations
235
+ const arbitraryPackedSwitchPayload = fc
236
+ .nat({ max: 20 })
237
+ .chain(size => fc.record({
238
+ operation: fc.constant('packed-switch-payload'),
239
+ value: arbitraryIntValue,
240
+ branchOffsets: fc.array(arbitraryBranchOffset32, { minLength: size, maxLength: size }),
241
+ }));
242
+ const arbitrarySparseSwitchPayload = fc
243
+ .nat({ max: 20 })
244
+ .chain(size => fc.record({
245
+ operation: fc.constant('sparse-switch-payload'),
246
+ keys: fc.array(arbitraryIntValue, { minLength: size, maxLength: size }),
247
+ branchOffsets: fc.array(arbitraryBranchOffset32, { minLength: size, maxLength: size }),
248
+ }));
249
+ const arbitraryFillArrayDataPayload = fc
250
+ .record({
251
+ elementWidth: fc.constantFrom(1, 2, 4, 8),
252
+ size: fc.nat({ max: 100 }),
253
+ })
254
+ .chain(({ elementWidth, size }) => fc.record({
255
+ operation: fc.constant('fill-array-data-payload'),
256
+ elementWidth: fc.constant(elementWidth),
257
+ // Data array contains bytes, so length must be size * elementWidth
258
+ data: fc.array(fc.nat({ max: 255 }), { minLength: size * elementWidth, maxLength: size * elementWidth }),
259
+ }));
260
+ // If-test operations (Format 22t)
261
+ // Commutative operations (if-eq, if-ne) generate sorted registers to match parser behavior
262
+ const arbitraryIfEqual = fc.record({
263
+ operation: fc.constant('if-eq'),
264
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4).map(([a, b]) => [a, b].sort((x, y) => x - y)),
265
+ branchOffset: arbitraryBranchOffset16,
266
+ });
267
+ const arbitraryIfNotEqual = fc.record({
268
+ operation: fc.constant('if-ne'),
269
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4).map(([a, b]) => [a, b].sort((x, y) => x - y)),
270
+ branchOffset: arbitraryBranchOffset16,
271
+ });
272
+ const arbitraryIfLessThan = fc.record({
273
+ operation: fc.constant('if-lt'),
274
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
275
+ branchOffset: arbitraryBranchOffset16,
276
+ });
277
+ const arbitraryIfGreaterThanOrEqualTo = fc.record({
278
+ operation: fc.constant('if-ge'),
279
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
280
+ branchOffset: arbitraryBranchOffset16,
281
+ });
282
+ const arbitraryIfGreaterThan = fc.record({
283
+ operation: fc.constant('if-gt'),
284
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
285
+ branchOffset: arbitraryBranchOffset16,
286
+ });
287
+ const arbitraryIfLessThanOrEqualTo = fc.record({
288
+ operation: fc.constant('if-le'),
289
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
290
+ branchOffset: arbitraryBranchOffset16,
291
+ });
292
+ // If-test-zero operations (Format 21t)
293
+ const arbitraryIfEqualZero = fc.record({
294
+ operation: fc.constant('if-eqz'),
295
+ registers: fc.tuple(arbitraryRegister8),
296
+ branchOffset: arbitraryBranchOffset16,
297
+ });
298
+ const arbitraryIfNotEqualZero = fc.record({
299
+ operation: fc.constant('if-nez'),
300
+ registers: fc.tuple(arbitraryRegister8),
301
+ branchOffset: arbitraryBranchOffset16,
302
+ });
303
+ const arbitraryIfLessThanZero = fc.record({
304
+ operation: fc.constant('if-ltz'),
305
+ registers: fc.tuple(arbitraryRegister8),
306
+ branchOffset: arbitraryBranchOffset16,
307
+ });
308
+ const arbitraryIfGreaterThanOrEqualToZero = fc.record({
309
+ operation: fc.constant('if-gez'),
310
+ registers: fc.tuple(arbitraryRegister8),
311
+ branchOffset: arbitraryBranchOffset16,
312
+ });
313
+ const arbitraryIfGreaterThanZero = fc.record({
314
+ operation: fc.constant('if-gtz'),
315
+ registers: fc.tuple(arbitraryRegister8),
316
+ branchOffset: arbitraryBranchOffset16,
317
+ });
318
+ const arbitraryIfLessThanOrEqualToZero = fc.record({
319
+ operation: fc.constant('if-lez'),
320
+ registers: fc.tuple(arbitraryRegister8),
321
+ branchOffset: arbitraryBranchOffset16,
322
+ });
323
+ // Array element operations (Format 23x)
324
+ const createArbitraryArrayElementOperation = (operation) => fc.record({
325
+ operation: fc.constant(operation),
326
+ registers: fc.tuple(arbitraryRegister8, arbitraryRegister8, arbitraryRegister8),
327
+ });
328
+ const arbitraryArrayElementGet = createArbitraryArrayElementOperation('aget');
329
+ const arbitraryArrayElementGetWide = createArbitraryArrayElementOperation('aget-wide');
330
+ const arbitraryArrayElementGetObject = createArbitraryArrayElementOperation('aget-object');
331
+ const arbitraryArrayElementGetBoolean = createArbitraryArrayElementOperation('aget-boolean');
332
+ const arbitraryArrayElementGetByte = createArbitraryArrayElementOperation('aget-byte');
333
+ const arbitraryArrayElementGetChar = createArbitraryArrayElementOperation('aget-char');
334
+ const arbitraryArrayElementGetShort = createArbitraryArrayElementOperation('aget-short');
335
+ const arbitraryArrayElementPut = createArbitraryArrayElementOperation('aput');
336
+ const arbitraryArrayElementPutWide = createArbitraryArrayElementOperation('aput-wide');
337
+ const arbitraryArrayElementPutObject = createArbitraryArrayElementOperation('aput-object');
338
+ const arbitraryArrayElementPutBoolean = createArbitraryArrayElementOperation('aput-boolean');
339
+ const arbitraryArrayElementPutByte = createArbitraryArrayElementOperation('aput-byte');
340
+ const arbitraryArrayElementPutChar = createArbitraryArrayElementOperation('aput-char');
341
+ const arbitraryArrayElementPutShort = createArbitraryArrayElementOperation('aput-short');
342
+ // Instance field operations (Format 22c)
343
+ const createArbitraryInstanceFieldOperation = (operation) => fc.record({
344
+ operation: fc.constant(operation),
345
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
346
+ fieldIndex: arbitraryIndexIntoFieldIds,
347
+ });
348
+ const arbitraryInstanceFieldGet = createArbitraryInstanceFieldOperation('iget');
349
+ const arbitraryInstanceFieldGetWide = createArbitraryInstanceFieldOperation('iget-wide');
350
+ const arbitraryInstanceFieldGetObject = createArbitraryInstanceFieldOperation('iget-object');
351
+ const arbitraryInstanceFieldGetBoolean = createArbitraryInstanceFieldOperation('iget-boolean');
352
+ const arbitraryInstanceFieldGetByte = createArbitraryInstanceFieldOperation('iget-byte');
353
+ const arbitraryInstanceFieldGetChar = createArbitraryInstanceFieldOperation('iget-char');
354
+ const arbitraryInstanceFieldGetShort = createArbitraryInstanceFieldOperation('iget-short');
355
+ const arbitraryInstanceFieldPut = createArbitraryInstanceFieldOperation('iput');
356
+ const arbitraryInstanceFieldPutWide = createArbitraryInstanceFieldOperation('iput-wide');
357
+ const arbitraryInstanceFieldPutObject = createArbitraryInstanceFieldOperation('iput-object');
358
+ const arbitraryInstanceFieldPutBoolean = createArbitraryInstanceFieldOperation('iput-boolean');
359
+ const arbitraryInstanceFieldPutByte = createArbitraryInstanceFieldOperation('iput-byte');
360
+ const arbitraryInstanceFieldPutChar = createArbitraryInstanceFieldOperation('iput-char');
361
+ const arbitraryInstanceFieldPutShort = createArbitraryInstanceFieldOperation('iput-short');
362
+ // Static field operations (Format 21c)
363
+ const createArbitraryStaticFieldOperation = (operation) => fc.record({
364
+ operation: fc.constant(operation),
365
+ registers: fc.tuple(arbitraryRegister8),
366
+ fieldIndex: arbitraryIndexIntoFieldIds,
367
+ });
368
+ const arbitraryStaticFieldGet = createArbitraryStaticFieldOperation('sget');
369
+ const arbitraryStaticFieldGetWide = createArbitraryStaticFieldOperation('sget-wide');
370
+ const arbitraryStaticFieldGetObject = createArbitraryStaticFieldOperation('sget-object');
371
+ const arbitraryStaticFieldGetBoolean = createArbitraryStaticFieldOperation('sget-boolean');
372
+ const arbitraryStaticFieldGetByte = createArbitraryStaticFieldOperation('sget-byte');
373
+ const arbitraryStaticFieldGetChar = createArbitraryStaticFieldOperation('sget-char');
374
+ const arbitraryStaticFieldGetShort = createArbitraryStaticFieldOperation('sget-short');
375
+ const arbitraryStaticFieldPut = createArbitraryStaticFieldOperation('sput');
376
+ const arbitraryStaticFieldPutWide = createArbitraryStaticFieldOperation('sput-wide');
377
+ const arbitraryStaticFieldPutObject = createArbitraryStaticFieldOperation('sput-object');
378
+ const arbitraryStaticFieldPutBoolean = createArbitraryStaticFieldOperation('sput-boolean');
379
+ const arbitraryStaticFieldPutByte = createArbitraryStaticFieldOperation('sput-byte');
380
+ const arbitraryStaticFieldPutChar = createArbitraryStaticFieldOperation('sput-char');
381
+ const arbitraryStaticFieldPutShort = createArbitraryStaticFieldOperation('sput-short');
382
+ // Invoke operations (Format 35c)
383
+ const createArbitraryInvokeOperation = (operation) => fc
384
+ .nat({ max: 5 })
385
+ .chain(registerCount => fc.record({
386
+ operation: fc.constant(operation),
387
+ registers: fc.array(arbitraryRegister4, {
388
+ minLength: registerCount,
389
+ maxLength: registerCount,
390
+ }),
391
+ methodIndex: arbitraryIndexIntoMethodIds,
392
+ }));
393
+ const arbitraryInvokeVirtual = createArbitraryInvokeOperation('invoke-virtual');
394
+ const arbitraryInvokeSuper = createArbitraryInvokeOperation('invoke-super');
395
+ const arbitraryInvokeDirect = createArbitraryInvokeOperation('invoke-direct');
396
+ const arbitraryInvokeStatic = createArbitraryInvokeOperation('invoke-static');
397
+ const arbitraryInvokeInterface = createArbitraryInvokeOperation('invoke-interface');
398
+ // Invoke-range operations (Format 3rc)
399
+ const createArbitraryInvokeRangeOperation = (operation) => fc
400
+ .nat({ max: 255 })
401
+ .chain(registerCount => fc.record({
402
+ operation: fc.constant(operation),
403
+ registers: fc
404
+ .nat({ max: 65535 - registerCount })
405
+ .map(startRegister => Array.from({ length: registerCount }, (_, i) => startRegister + i)),
406
+ methodIndex: arbitraryIndexIntoMethodIds,
407
+ }));
408
+ const arbitraryInvokeVirtualRange = createArbitraryInvokeRangeOperation('invoke-virtual/range');
409
+ const arbitraryInvokeSuperRange = createArbitraryInvokeRangeOperation('invoke-super/range');
410
+ const arbitraryInvokeDirectRange = createArbitraryInvokeRangeOperation('invoke-direct/range');
411
+ const arbitraryInvokeStaticRange = createArbitraryInvokeRangeOperation('invoke-static/range');
412
+ const arbitraryInvokeInterfaceRange = createArbitraryInvokeRangeOperation('invoke-interface/range');
413
+ // Invoke-polymorphic operations
414
+ const arbitraryInvokePolymorphic = fc
415
+ .nat({ max: 5 })
416
+ .chain(registerCount => fc.record({
417
+ operation: fc.constant('invoke-polymorphic'),
418
+ registers: fc.array(arbitraryRegister4, {
419
+ minLength: registerCount,
420
+ maxLength: registerCount,
421
+ }),
422
+ methodIndex: arbitraryIndexIntoMethodIds,
423
+ protoIndex: arbitraryIndexIntoPrototypeIds,
424
+ }));
425
+ const arbitraryInvokePolymorphicRange = fc
426
+ .nat({ max: 255 })
427
+ .chain(registerCount => fc.record({
428
+ operation: fc.constant('invoke-polymorphic/range'),
429
+ registers: fc
430
+ .nat({ max: 65535 - registerCount })
431
+ .map(startRegister => Array.from({ length: registerCount }, (_, i) => startRegister + i)),
432
+ methodIndex: arbitraryIndexIntoMethodIds,
433
+ protoIndex: arbitraryIndexIntoPrototypeIds,
434
+ }));
435
+ // Filled-new-array operations
436
+ const arbitraryFilledNewArray = fc
437
+ .nat({ max: 5 })
438
+ .chain(registerCount => fc.record({
439
+ operation: fc.constant('filled-new-array'),
440
+ registers: fc.array(arbitraryRegister4, {
441
+ minLength: registerCount,
442
+ maxLength: registerCount,
443
+ }),
444
+ typeIndex: arbitraryIndexIntoTypeIds,
445
+ }));
446
+ const arbitraryFilledNewArrayRange = fc
447
+ .nat({ max: 255 })
448
+ .chain(registerCount => fc.record({
449
+ operation: fc.constant('filled-new-array/range'),
450
+ registers: fc
451
+ .nat({ max: 65535 - registerCount })
452
+ .map(startRegister => Array.from({ length: registerCount }, (_, i) => startRegister + i)),
453
+ typeIndex: arbitraryIndexIntoTypeIds,
454
+ }));
455
+ // Binary operations (Format 23x)
456
+ const createArbitraryBinaryOperation = (operation) => fc.record({
457
+ operation: fc.constant(operation),
458
+ registers: fc.tuple(arbitraryRegister8, arbitraryRegister8, arbitraryRegister8),
459
+ });
460
+ // Int operations
461
+ const arbitraryAddInt = createArbitraryBinaryOperation('add-int');
462
+ const arbitrarySubInt = createArbitraryBinaryOperation('sub-int');
463
+ const arbitraryMulInt = createArbitraryBinaryOperation('mul-int');
464
+ const arbitraryDivInt = createArbitraryBinaryOperation('div-int');
465
+ const arbitraryRemInt = createArbitraryBinaryOperation('rem-int');
466
+ const arbitraryAndInt = createArbitraryBinaryOperation('and-int');
467
+ const arbitraryOrInt = createArbitraryBinaryOperation('or-int');
468
+ const arbitraryXorInt = createArbitraryBinaryOperation('xor-int');
469
+ const arbitraryShlInt = createArbitraryBinaryOperation('shl-int');
470
+ const arbitraryShrInt = createArbitraryBinaryOperation('shr-int');
471
+ const arbitraryUshrInt = createArbitraryBinaryOperation('ushr-int');
472
+ // Long operations
473
+ const arbitraryAddLong = createArbitraryBinaryOperation('add-long');
474
+ const arbitrarySubLong = createArbitraryBinaryOperation('sub-long');
475
+ const arbitraryMulLong = createArbitraryBinaryOperation('mul-long');
476
+ const arbitraryDivLong = createArbitraryBinaryOperation('div-long');
477
+ const arbitraryRemLong = createArbitraryBinaryOperation('rem-long');
478
+ const arbitraryAndLong = createArbitraryBinaryOperation('and-long');
479
+ const arbitraryOrLong = createArbitraryBinaryOperation('or-long');
480
+ const arbitraryXorLong = createArbitraryBinaryOperation('xor-long');
481
+ const arbitraryShlLong = createArbitraryBinaryOperation('shl-long');
482
+ const arbitraryShrLong = createArbitraryBinaryOperation('shr-long');
483
+ const arbitraryUshrLong = createArbitraryBinaryOperation('ushr-long');
484
+ // Float operations
485
+ const arbitraryAddFloat = createArbitraryBinaryOperation('add-float');
486
+ const arbitrarySubFloat = createArbitraryBinaryOperation('sub-float');
487
+ const arbitraryMulFloat = createArbitraryBinaryOperation('mul-float');
488
+ const arbitraryDivFloat = createArbitraryBinaryOperation('div-float');
489
+ // Double operations
490
+ const arbitraryAddDouble = createArbitraryBinaryOperation('add-double');
491
+ const arbitrarySubDouble = createArbitraryBinaryOperation('sub-double');
492
+ const arbitraryMulDouble = createArbitraryBinaryOperation('mul-double');
493
+ const arbitraryDivDouble = createArbitraryBinaryOperation('div-double');
494
+ const arbitraryRemDouble = createArbitraryBinaryOperation('rem-double');
495
+ // Compare operations
496
+ const arbitraryCmpLong = createArbitraryBinaryOperation('cmp-long');
497
+ const arbitraryCmplFloat = createArbitraryBinaryOperation('cmpl-float');
498
+ const arbitraryCmpgFloat = createArbitraryBinaryOperation('cmpg-float');
499
+ const arbitraryCmplDouble = createArbitraryBinaryOperation('cmpl-double');
500
+ const arbitraryCmpgDouble = createArbitraryBinaryOperation('cmpg-double');
501
+ // Binary operations in-place (Format 12x)
502
+ const createArbitraryBinaryOperationInPlace = (operation) => fc.record({
503
+ operation: fc.constant(operation),
504
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
505
+ });
506
+ const arbitraryAddIntInPlace = createArbitraryBinaryOperationInPlace('add-int/2addr');
507
+ const arbitrarySubIntInPlace = createArbitraryBinaryOperationInPlace('sub-int/2addr');
508
+ const arbitraryMulIntInPlace = createArbitraryBinaryOperationInPlace('mul-int/2addr');
509
+ const arbitraryDivIntInPlace = createArbitraryBinaryOperationInPlace('div-int/2addr');
510
+ const arbitraryRemIntInPlace = createArbitraryBinaryOperationInPlace('rem-int/2addr');
511
+ const arbitraryAndIntInPlace = createArbitraryBinaryOperationInPlace('and-int/2addr');
512
+ const arbitraryOrIntInPlace = createArbitraryBinaryOperationInPlace('or-int/2addr');
513
+ const arbitraryXorIntInPlace = createArbitraryBinaryOperationInPlace('xor-int/2addr');
514
+ const arbitraryShlIntInPlace = createArbitraryBinaryOperationInPlace('shl-int/2addr');
515
+ const arbitraryShrIntInPlace = createArbitraryBinaryOperationInPlace('shr-int/2addr');
516
+ const arbitraryUshrIntInPlace = createArbitraryBinaryOperationInPlace('ushr-int/2addr');
517
+ const arbitraryAddLongInPlace = createArbitraryBinaryOperationInPlace('add-long/2addr');
518
+ const arbitrarySubLongInPlace = createArbitraryBinaryOperationInPlace('sub-long/2addr');
519
+ const arbitraryMulLongInPlace = createArbitraryBinaryOperationInPlace('mul-long/2addr');
520
+ const arbitraryDivLongInPlace = createArbitraryBinaryOperationInPlace('div-long/2addr');
521
+ const arbitraryRemLongInPlace = createArbitraryBinaryOperationInPlace('rem-long/2addr');
522
+ const arbitraryAndLongInPlace = createArbitraryBinaryOperationInPlace('and-long/2addr');
523
+ const arbitraryOrLongInPlace = createArbitraryBinaryOperationInPlace('or-long/2addr');
524
+ const arbitraryXorLongInPlace = createArbitraryBinaryOperationInPlace('xor-long/2addr');
525
+ const arbitraryShlLongInPlace = createArbitraryBinaryOperationInPlace('shl-long/2addr');
526
+ const arbitraryShrLongInPlace = createArbitraryBinaryOperationInPlace('shr-long/2addr');
527
+ const arbitraryUshrLongInPlace = createArbitraryBinaryOperationInPlace('ushr-long/2addr');
528
+ const arbitraryAddFloatInPlace = createArbitraryBinaryOperationInPlace('add-float/2addr');
529
+ const arbitrarySubFloatInPlace = createArbitraryBinaryOperationInPlace('sub-float/2addr');
530
+ const arbitraryMulFloatInPlace = createArbitraryBinaryOperationInPlace('mul-float/2addr');
531
+ const arbitraryDivFloatInPlace = createArbitraryBinaryOperationInPlace('div-float/2addr');
532
+ const arbitraryRemFloatInPlace = createArbitraryBinaryOperationInPlace('rem-float/2addr');
533
+ const arbitraryAddDoubleInPlace = createArbitraryBinaryOperationInPlace('add-double/2addr');
534
+ const arbitrarySubDoubleInPlace = createArbitraryBinaryOperationInPlace('sub-double/2addr');
535
+ const arbitraryMulDoubleInPlace = createArbitraryBinaryOperationInPlace('mul-double/2addr');
536
+ const arbitraryDivDoubleInPlace = createArbitraryBinaryOperationInPlace('div-double/2addr');
537
+ const arbitraryRemDoubleInPlace = createArbitraryBinaryOperationInPlace('rem-double/2addr');
538
+ // Binary operations with literal8 (Format 22b)
539
+ const createArbitraryBinaryOperationLiteral8 = (operation) => fc.record({
540
+ operation: fc.constant(operation),
541
+ registers: fc.tuple(arbitraryRegister8, arbitraryRegister8),
542
+ value: arbitraryByteValue,
543
+ });
544
+ const arbitraryAddIntLiteral8 = createArbitraryBinaryOperationLiteral8('add-int/lit8');
545
+ const arbitraryReverseSubtractIntLiteral8 = createArbitraryBinaryOperationLiteral8('rsub-int/lit8');
546
+ const arbitraryMultiplyIntLiteral8 = createArbitraryBinaryOperationLiteral8('mul-int/lit8');
547
+ const arbitraryDivideIntLiteral8 = createArbitraryBinaryOperationLiteral8('div-int/lit8');
548
+ const arbitraryRemainderIntLiteral8 = createArbitraryBinaryOperationLiteral8('rem-int/lit8');
549
+ const arbitraryAndIntLiteral8 = createArbitraryBinaryOperationLiteral8('and-int/lit8');
550
+ const arbitraryOrIntLiteral8 = createArbitraryBinaryOperationLiteral8('or-int/lit8');
551
+ const arbitraryXorIntLiteral8 = createArbitraryBinaryOperationLiteral8('xor-int/lit8');
552
+ const arbitraryShlIntLiteral8 = createArbitraryBinaryOperationLiteral8('shl-int/lit8');
553
+ const arbitraryShrIntLiteral8 = createArbitraryBinaryOperationLiteral8('shr-int/lit8');
554
+ const arbitraryUshrIntLiteral8 = createArbitraryBinaryOperationLiteral8('ushr-int/lit8');
555
+ // Binary operations with literal16 (Format 22s)
556
+ const createArbitraryBinaryOperationLiteral16 = (operation) => fc.record({
557
+ operation: fc.constant(operation),
558
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
559
+ value: arbitraryShortValue,
560
+ });
561
+ const arbitraryAddIntLiteral16 = createArbitraryBinaryOperationLiteral16('add-int/lit16');
562
+ const arbitraryReverseSubtractIntLiteral16 = createArbitraryBinaryOperationLiteral16('rsub-int');
563
+ const arbitraryMultiplyIntLiteral16 = createArbitraryBinaryOperationLiteral16('mul-int/lit16');
564
+ const arbitraryDivideIntLiteral16 = createArbitraryBinaryOperationLiteral16('div-int/lit16');
565
+ const arbitraryRemainderIntLiteral16 = createArbitraryBinaryOperationLiteral16('rem-int/lit16');
566
+ const arbitraryAndIntLiteral16 = createArbitraryBinaryOperationLiteral16('and-int/lit16');
567
+ const arbitraryOrIntLiteral16 = createArbitraryBinaryOperationLiteral16('or-int/lit16');
568
+ const arbitraryXorIntLiteral16 = createArbitraryBinaryOperationLiteral16('xor-int/lit16');
569
+ // Unary operations (Format 12x)
570
+ const createArbitraryUnaryOperation = (operation) => fc.record({
571
+ operation: fc.constant(operation),
572
+ registers: fc.tuple(arbitraryRegister4, arbitraryRegister4),
573
+ });
574
+ const arbitraryNegateInt = createArbitraryUnaryOperation('neg-int');
575
+ const arbitraryNotInt = createArbitraryUnaryOperation('not-int');
576
+ const arbitraryNegateLong = createArbitraryUnaryOperation('neg-long');
577
+ const arbitraryNotLong = createArbitraryUnaryOperation('not-long');
578
+ const arbitraryNegateFloat = createArbitraryUnaryOperation('neg-float');
579
+ const arbitraryNegateDouble = createArbitraryUnaryOperation('neg-double');
580
+ const arbitraryIntToLong = createArbitraryUnaryOperation('int-to-long');
581
+ const arbitraryIntToFloat = createArbitraryUnaryOperation('int-to-float');
582
+ const arbitraryIntToDouble = createArbitraryUnaryOperation('int-to-double');
583
+ const arbitraryLongToInt = createArbitraryUnaryOperation('long-to-int');
584
+ const arbitraryLongToFloat = createArbitraryUnaryOperation('long-to-float');
585
+ const arbitraryLongToDouble = createArbitraryUnaryOperation('long-to-double');
586
+ const arbitraryFloatToInt = createArbitraryUnaryOperation('float-to-int');
587
+ const arbitraryFloatToLong = createArbitraryUnaryOperation('float-to-long');
588
+ const arbitraryFloatToDouble = createArbitraryUnaryOperation('float-to-double');
589
+ const arbitraryDoubleToInt = createArbitraryUnaryOperation('double-to-int');
590
+ const arbitraryDoubleToLong = createArbitraryUnaryOperation('double-to-long');
591
+ const arbitraryDoubleToFloat = createArbitraryUnaryOperation('double-to-float');
592
+ const arbitraryIntToByte = createArbitraryUnaryOperation('int-to-byte');
593
+ const arbitraryIntToChar = createArbitraryUnaryOperation('int-to-char');
594
+ const arbitraryIntToShort = createArbitraryUnaryOperation('int-to-short');
595
+ // Combine all operations
596
+ export const arbitraryDalvikBytecodeOperation = fc.oneof(arbitraryNop,
597
+ // Move operations
598
+ arbitraryMove, arbitraryMoveWide, arbitraryMoveObject, arbitraryMoveFrom16, arbitraryMoveWideFrom16, arbitraryMoveObjectFrom16, arbitraryMoveWide16, arbitraryMoveResult, arbitraryMoveResultWide, arbitraryMoveResultObject, arbitraryMoveException,
599
+ // Return operations
600
+ arbitraryReturnVoid, arbitraryReturn, arbitraryReturnWide, arbitraryReturnObject,
601
+ // Const operations
602
+ arbitraryConst4, arbitraryConst16, arbitraryConst, arbitraryConstHigh16, arbitraryConstWide16, arbitraryConstWide32, arbitraryConstWide, arbitraryConstWideHigh16, arbitraryConstString, arbitraryConstStringJumbo, arbitraryConstClass, arbitraryConstMethodHandle,
603
+ // Monitor operations
604
+ arbitraryMonitorEnter, arbitraryMonitorExit,
605
+ // Type operations
606
+ arbitraryCheckCast, arbitraryInstanceOf, arbitraryNewInstance, arbitraryNewArray,
607
+ // Array operations
608
+ arbitraryArrayLength, arbitraryThrow,
609
+ // Goto operations
610
+ arbitraryGoto, arbitraryGoto16, arbitraryGoto32,
611
+ // Switch operations
612
+ arbitraryPackedSwitch, arbitrarySparseSwitch, arbitraryFillArrayData,
613
+ // Payload operations
614
+ arbitraryPackedSwitchPayload, arbitrarySparseSwitchPayload, arbitraryFillArrayDataPayload,
615
+ // If-test operations
616
+ arbitraryIfEqual, arbitraryIfNotEqual, arbitraryIfLessThan, arbitraryIfGreaterThanOrEqualTo, arbitraryIfGreaterThan, arbitraryIfLessThanOrEqualTo,
617
+ // If-test-zero operations
618
+ arbitraryIfEqualZero, arbitraryIfNotEqualZero, arbitraryIfLessThanZero, arbitraryIfGreaterThanOrEqualToZero, arbitraryIfGreaterThanZero, arbitraryIfLessThanOrEqualToZero,
619
+ // Array element operations
620
+ arbitraryArrayElementGet, arbitraryArrayElementGetWide, arbitraryArrayElementGetObject, arbitraryArrayElementGetBoolean, arbitraryArrayElementGetByte, arbitraryArrayElementGetChar, arbitraryArrayElementGetShort, arbitraryArrayElementPut, arbitraryArrayElementPutWide, arbitraryArrayElementPutObject, arbitraryArrayElementPutBoolean, arbitraryArrayElementPutByte, arbitraryArrayElementPutChar, arbitraryArrayElementPutShort,
621
+ // Instance field operations
622
+ arbitraryInstanceFieldGet, arbitraryInstanceFieldGetWide, arbitraryInstanceFieldGetObject, arbitraryInstanceFieldGetBoolean, arbitraryInstanceFieldGetByte, arbitraryInstanceFieldGetChar, arbitraryInstanceFieldGetShort, arbitraryInstanceFieldPut, arbitraryInstanceFieldPutWide, arbitraryInstanceFieldPutObject, arbitraryInstanceFieldPutBoolean, arbitraryInstanceFieldPutByte, arbitraryInstanceFieldPutChar, arbitraryInstanceFieldPutShort,
623
+ // Static field operations
624
+ arbitraryStaticFieldGet, arbitraryStaticFieldGetWide, arbitraryStaticFieldGetObject, arbitraryStaticFieldGetBoolean, arbitraryStaticFieldGetByte, arbitraryStaticFieldGetChar, arbitraryStaticFieldGetShort, arbitraryStaticFieldPut, arbitraryStaticFieldPutWide, arbitraryStaticFieldPutObject, arbitraryStaticFieldPutBoolean, arbitraryStaticFieldPutByte, arbitraryStaticFieldPutChar, arbitraryStaticFieldPutShort,
625
+ // Invoke operations
626
+ arbitraryInvokeVirtual, arbitraryInvokeSuper, arbitraryInvokeDirect, arbitraryInvokeStatic, arbitraryInvokeInterface, arbitraryInvokeVirtualRange, arbitraryInvokeSuperRange, arbitraryInvokeDirectRange, arbitraryInvokeStaticRange, arbitraryInvokeInterfaceRange, arbitraryInvokePolymorphic, arbitraryInvokePolymorphicRange,
627
+ // Filled-new-array operations
628
+ arbitraryFilledNewArray, arbitraryFilledNewArrayRange,
629
+ // Binary operations
630
+ arbitraryAddInt, arbitrarySubInt, arbitraryMulInt, arbitraryDivInt, arbitraryRemInt, arbitraryAndInt, arbitraryOrInt, arbitraryXorInt, arbitraryShlInt, arbitraryShrInt, arbitraryUshrInt, arbitraryAddLong, arbitrarySubLong, arbitraryMulLong, arbitraryDivLong, arbitraryRemLong, arbitraryAndLong, arbitraryOrLong, arbitraryXorLong, arbitraryShlLong, arbitraryShrLong, arbitraryUshrLong, arbitraryAddFloat, arbitrarySubFloat, arbitraryMulFloat, arbitraryDivFloat, arbitraryAddDouble, arbitrarySubDouble, arbitraryMulDouble, arbitraryDivDouble, arbitraryRemDouble, arbitraryCmpLong, arbitraryCmplFloat, arbitraryCmpgFloat, arbitraryCmplDouble, arbitraryCmpgDouble,
631
+ // Binary operations in-place
632
+ arbitraryAddIntInPlace, arbitrarySubIntInPlace, arbitraryMulIntInPlace, arbitraryDivIntInPlace, arbitraryRemIntInPlace, arbitraryAndIntInPlace, arbitraryOrIntInPlace, arbitraryXorIntInPlace, arbitraryShlIntInPlace, arbitraryShrIntInPlace, arbitraryUshrIntInPlace, arbitraryAddLongInPlace, arbitrarySubLongInPlace, arbitraryMulLongInPlace, arbitraryDivLongInPlace, arbitraryRemLongInPlace, arbitraryAndLongInPlace, arbitraryOrLongInPlace, arbitraryXorLongInPlace, arbitraryShlLongInPlace, arbitraryShrLongInPlace, arbitraryUshrLongInPlace, arbitraryAddFloatInPlace, arbitrarySubFloatInPlace, arbitraryMulFloatInPlace, arbitraryDivFloatInPlace, arbitraryRemFloatInPlace, arbitraryAddDoubleInPlace, arbitrarySubDoubleInPlace, arbitraryMulDoubleInPlace, arbitraryDivDoubleInPlace, arbitraryRemDoubleInPlace,
633
+ // Binary operations with literal8
634
+ arbitraryAddIntLiteral8, arbitraryReverseSubtractIntLiteral8, arbitraryMultiplyIntLiteral8, arbitraryDivideIntLiteral8, arbitraryRemainderIntLiteral8, arbitraryAndIntLiteral8, arbitraryOrIntLiteral8, arbitraryXorIntLiteral8, arbitraryShlIntLiteral8, arbitraryShrIntLiteral8, arbitraryUshrIntLiteral8,
635
+ // Binary operations with literal16
636
+ arbitraryAddIntLiteral16, arbitraryReverseSubtractIntLiteral16, arbitraryMultiplyIntLiteral16, arbitraryDivideIntLiteral16, arbitraryRemainderIntLiteral16, arbitraryAndIntLiteral16, arbitraryOrIntLiteral16, arbitraryXorIntLiteral16,
637
+ // Unary operations
638
+ arbitraryNegateInt, arbitraryNotInt, arbitraryNegateLong, arbitraryNotLong, arbitraryNegateFloat, arbitraryNegateDouble, arbitraryIntToLong, arbitraryIntToFloat, arbitraryIntToDouble, arbitraryLongToInt, arbitraryLongToFloat, arbitraryLongToDouble, arbitraryFloatToInt, arbitraryFloatToLong, arbitraryFloatToDouble, arbitraryDoubleToInt, arbitraryDoubleToLong, arbitraryDoubleToFloat, arbitraryIntToByte, arbitraryIntToChar, arbitraryIntToShort);
639
+ // Arbitrary for complete Dalvik bytecode (array of operations)
640
+ export const arbitraryDalvikBytecode = fc.array(arbitraryDalvikBytecodeOperation, { minLength: 0, maxLength: 100 });
@@ -0,0 +1,3 @@
1
+ import * as fc from 'fast-check';
2
+ import { type DalvikExecutable } from './dalvikExecutable.js';
3
+ export declare const createArbitraryDalvikExecutable: <Instructions>(arbitraryInstructions: fc.Arbitrary<Instructions>) => fc.Arbitrary<DalvikExecutable<Instructions>>;