frida 16.2.1 → 16.2.2

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 (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import argparse
4
+ import hashlib
5
+ from pathlib import Path
6
+ import subprocess
7
+ import sys
8
+ from typing import Optional
9
+
10
+ REPO_ROOT = Path(__file__).resolve().parent.parent
11
+ sys.path.insert(0, str(REPO_ROOT))
12
+ from releng import devkit, env, machine_spec
13
+
14
+
15
+ def main():
16
+ raw_args: list[str] = []
17
+ ool_optvals: dict[str, list[str]] = {}
18
+ pending_raw_args = sys.argv[1:]
19
+ while len(pending_raw_args) > 0:
20
+ cur = pending_raw_args.pop(0)
21
+ if cur == ">>>":
22
+ ool_hash = hashlib.sha256()
23
+ ool_strv = []
24
+ while True:
25
+ cur = pending_raw_args.pop(0)
26
+ if cur == "<<<":
27
+ break
28
+ ool_hash.update(cur.encode("utf-8"))
29
+ ool_strv.append(cur)
30
+ val_id = "ool:" + ool_hash.hexdigest()
31
+ ool_optvals[val_id] = ool_strv
32
+ raw_args.append(val_id)
33
+ else:
34
+ raw_args.append(cur)
35
+
36
+ parser = argparse.ArgumentParser()
37
+ parser.add_argument("kit")
38
+ parser.add_argument("machine",
39
+ type=machine_spec.MachineSpec.parse)
40
+ parser.add_argument("outdir",
41
+ type=Path)
42
+ parser.add_argument("-t", "--thin",
43
+ help="build without cross-arch support",
44
+ action="store_const",
45
+ dest="flavor",
46
+ const="_thin",
47
+ default="")
48
+ parser.add_argument("--cc",
49
+ help="C compiler to use",
50
+ type=lambda v: parse_array_option_value(v, ool_optvals))
51
+ machine_options = dict.fromkeys(["c_args", "lib", "libtool", "ar", "nm", "objcopy", "pkg_config", "pkg_config_path"])
52
+ for name in machine_options.keys():
53
+ pretty_name = name.replace("_", "-")
54
+ parser.add_argument("--" + pretty_name,
55
+ help=f"The {pretty_name} to use",
56
+ type=lambda v: parse_array_option_value(v, ool_optvals))
57
+
58
+ options = parser.parse_args(raw_args)
59
+
60
+ kit = options.kit
61
+ machine = options.machine
62
+ outdir = options.outdir.resolve()
63
+ flavor = options.flavor
64
+
65
+ cc = options.cc
66
+ if cc is not None:
67
+ meson_config = {"c": cc}
68
+ for k, v in vars(options).items():
69
+ if k in machine_options and v is not None:
70
+ name = "pkg-config" if k == "pkg_config" else k
71
+ meson_config[name] = v
72
+ else:
73
+ build_dir = REPO_ROOT / "build"
74
+
75
+ if flavor == "":
76
+ fat_machine_file = env.query_machine_file_path(machine, flavor, build_dir)
77
+ if not fat_machine_file.exists() \
78
+ and env.query_machine_file_path(machine, "_thin", build_dir).exists():
79
+ flavor = "_thin"
80
+
81
+ meson_config = env.load_meson_config(machine, flavor, build_dir)
82
+ assert meson_config is not None
83
+
84
+ try:
85
+ app = devkit.CompilerApplication(kit, machine, meson_config, outdir)
86
+ app.run()
87
+ except subprocess.CalledProcessError as e:
88
+ print(e, file=sys.stderr)
89
+ if e.output:
90
+ print("Stdout:", e.output, file=sys.stderr)
91
+ if e.stderr:
92
+ print("Stderr:", e.stderr, file=sys.stderr)
93
+ sys.exit(1)
94
+
95
+
96
+ def parse_array_option_value(val: str, ool_optvals: dict[str, list[str]]) -> Optional[list[str]]:
97
+ if val == "":
98
+ return None
99
+ if val.startswith("ool:"):
100
+ ool_val = ool_optvals.get(val)
101
+ if ool_val is not None:
102
+ return ool_val
103
+ return [val]
104
+
105
+
106
+ if __name__ == "__main__":
107
+ main()
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import os
4
+ import shutil
5
+ import struct
6
+ import sys
7
+
8
+
9
+ def make_fat_macho(output_path, input_paths):
10
+ """
11
+ Used to create a FAT Mach-O when Apple's lipo tool refuses to do so, such as
12
+ when needing two arm64e slices to support both the new and the old arm64e ABI.
13
+ """
14
+ input_slices = []
15
+ offset = 0x8000
16
+ slice_alignment = 0x4000
17
+ for input_path in input_paths:
18
+ delta = offset % slice_alignment
19
+ if delta != 0:
20
+ offset += slice_alignment - delta
21
+
22
+ offset_bits = bin(offset)
23
+ alignment = len(offset_bits[offset_bits.rfind("1") + 1:])
24
+
25
+ f = open(input_path, "rb+")
26
+
27
+ f.seek(4)
28
+ cpu_type, cpu_subtype = struct.unpack("<II", f.read(8))
29
+
30
+ f.seek(0, os.SEEK_END)
31
+ size = f.tell()
32
+
33
+ input_slices.append((f, cpu_type, cpu_subtype, offset, size, alignment))
34
+
35
+ offset += size
36
+
37
+ with open(output_path, "wb") as output_file:
38
+ header = struct.pack(">II", 0xcafebabe, len(input_slices))
39
+ output_file.write(header)
40
+
41
+ for (_, cpu_type, cpu_subtype, offset, size, alignment) in input_slices:
42
+ slice_spec = struct.pack(">IIIII", cpu_type, cpu_subtype, offset, size, alignment)
43
+ output_file.write(slice_spec)
44
+
45
+ for (input_file, _, _, offset, _, _) in input_slices:
46
+ input_file.seek(0)
47
+ output_file.seek(offset)
48
+ shutil.copyfileobj(input_file, output_file)
49
+
50
+
51
+ if __name__ == '__main__':
52
+ output_path = sys.argv[1]
53
+ input_paths = sys.argv[2:]
54
+ make_fat_macho(output_path, input_paths)
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env python3
2
+ import argparse
3
+ from pathlib import Path
4
+ import shutil
5
+ import struct
6
+ import subprocess
7
+ import tarfile
8
+ import tempfile
9
+ import urllib.request
10
+
11
+
12
+ ARM64E_URL = "https://build.frida.re/deps/{version}/sdk-ios-arm64e.tar.xz"
13
+
14
+
15
+ class CommandError(Exception):
16
+ pass
17
+
18
+
19
+ def main():
20
+ parser = argparse.ArgumentParser()
21
+ parser.add_argument("--bundle", required=True)
22
+ parser.add_argument("--host", required=True)
23
+ parser.add_argument("--artifact", required=True)
24
+ parser.add_argument("--version", required=True)
25
+ args = parser.parse_args()
26
+
27
+ if args.bundle != "sdk":
28
+ raise CommandError("wrong bundle")
29
+ if args.host != "ios-arm64eoabi":
30
+ raise CommandError("wrong host")
31
+
32
+ arm64e_sdk_url = ARM64E_URL.format(version=args.version)
33
+
34
+ print(f"Downloading {arm64e_sdk_url}")
35
+ with urllib.request.urlopen(arm64e_sdk_url) as response, \
36
+ tempfile.NamedTemporaryFile(suffix=".tar.xz") as archive:
37
+ shutil.copyfileobj(response, archive)
38
+ archive.flush()
39
+ arm64e_artifact_path = Path(archive.name)
40
+
41
+ with tempfile.TemporaryDirectory() as patched_artifact_dir:
42
+ patched_artifact_file = Path(patched_artifact_dir) / "patched.tar.xz"
43
+
44
+ with tempfile.TemporaryDirectory() as artifact_extracted_dir, \
45
+ tempfile.TemporaryDirectory() as arm64e_extracted_dir:
46
+ artifact_extracted_path = Path(artifact_extracted_dir)
47
+ arm64e_extracted_path = Path(arm64e_extracted_dir)
48
+
49
+ with tarfile.open(arm64e_artifact_path, "r:xz") as arm64e_tar:
50
+ arm64e_tar.extractall(arm64e_extracted_path)
51
+
52
+ artifact_path = Path(args.artifact)
53
+ with tarfile.open(artifact_path, "r:xz") as tar:
54
+ tar.extractall(artifact_extracted_path)
55
+
56
+ print("Patching libffi.a...")
57
+ steal_object(artifact_extracted_path / "lib" / "libffi.a",
58
+ arm64e_extracted_path / "lib" / "libffi.a")
59
+ with tarfile.open(patched_artifact_file, "w:xz") as patched_tar:
60
+ patched_tar.add(artifact_extracted_path, arcname="./")
61
+
62
+ print(f"Overwriting {artifact_path}")
63
+ shutil.copy(patched_artifact_file, artifact_path)
64
+
65
+
66
+ def steal_object(arm64eoabi_libffi_a_path: Path, arm64e_libffi_a_path: Path):
67
+ """
68
+ Steal just the aarch64_sysv.S.o object file from the arm64e libffi.a in
69
+ order to get the CIE info from the future compiler. Then patch the Mach-O
70
+ header of the stolen object to match the old arm64e ABI. It works because
71
+ the __text section is exactly the same.
72
+ """
73
+ if not arm64eoabi_libffi_a_path.exists():
74
+ raise RuntimeError("input arm64eoabi libffi.a not found")
75
+ if not arm64e_libffi_a_path.exists():
76
+ raise RuntimeError("input arm64e libffi.a not found")
77
+
78
+ with tempfile.TemporaryDirectory() as oabi_dir, tempfile.TemporaryDirectory() as nabi_dir:
79
+ perform("ar", "-x", arm64eoabi_libffi_a_path.absolute(), cwd=oabi_dir)
80
+ perform("ar", "-x", arm64e_libffi_a_path.absolute(), cwd=nabi_dir)
81
+ dst = Path(oabi_dir) / "aarch64_sysv.S.o"
82
+ dst.unlink()
83
+ shutil.copy(Path(nabi_dir) / "aarch64_sysv.S.o", dst)
84
+ with dst.open("rb+") as f:
85
+ f.seek(0xb)
86
+ f.write(struct.pack("B", 0))
87
+
88
+ perform("ar", "-r", arm64eoabi_libffi_a_path.absolute(), dst.name, cwd=oabi_dir)
89
+
90
+
91
+ def perform(*args, **kwargs):
92
+ print(">", " ".join([str(arg) for arg in args]), flush=True)
93
+ return subprocess.run(args, check=True, **kwargs)
94
+
95
+
96
+ if __name__ == "__main__":
97
+ main()
@@ -0,0 +1,14 @@
1
+ from dataclasses import dataclass
2
+ from typing import Callable
3
+
4
+
5
+ @dataclass
6
+ class Progress:
7
+ message: str
8
+
9
+
10
+ ProgressCallback = Callable[[Progress], None]
11
+
12
+
13
+ def print_progress(progress: Progress):
14
+ print(f"{progress.message}...", flush=True)
@@ -0,0 +1,185 @@
1
+ import os
2
+ from pathlib import Path
3
+ import re
4
+ import subprocess
5
+ import sys
6
+
7
+
8
+ def make_gnome_url(repo_name):
9
+ return "https://gitlab.gnome.org/GNOME/{}.git".format(repo_name)
10
+
11
+
12
+ upstreams = {
13
+ "meson": ("https://github.com/mesonbuild/meson.git", "master"),
14
+ "termux-elf-cleaner": "https://github.com/termux/termux-elf-cleaner.git",
15
+ "libiconv": "https://git.savannah.gnu.org/git/libiconv.git",
16
+ "zlib": "https://github.com/madler/zlib.git",
17
+ "brotli": "https://github.com/google/brotli.git",
18
+ "minizip": "https://github.com/zlib-ng/minizip-ng.git",
19
+ "libffi": "https://github.com/libffi/libffi.git",
20
+ "libunwind": "https://github.com/libunwind/libunwind.git",
21
+ "glib": make_gnome_url("glib"),
22
+ "glib-networking": make_gnome_url("glib-networking"),
23
+ "libnice": "https://gitlab.freedesktop.org/libnice/libnice.git",
24
+ "usrsctp": "https://github.com/sctplab/usrsctp.git",
25
+ "libgee": make_gnome_url("libgee"),
26
+ "json-glib": make_gnome_url("json-glib"),
27
+ "libpsl": "https://github.com/rockdaboot/libpsl.git",
28
+ "libxml2": make_gnome_url("libxml2"),
29
+ "libsoup": make_gnome_url("libsoup"),
30
+ "vala": make_gnome_url("vala"),
31
+ "xz": "https://git.tukaani.org/xz.git",
32
+ "pkg-config": "https://gitlab.freedesktop.org/pkg-config/pkg-config.git",
33
+ "quickjs": ("https://github.com/bellard/quickjs.git", "master"),
34
+ "gn": "https://gn.googlesource.com/gn",
35
+ "v8": "https://chromium.googlesource.com/v8/v8",
36
+ "capstone": ("https://github.com/capstone-engine/capstone.git", "v5"),
37
+ "tinycc": "https://repo.or.cz/tinycc.git",
38
+ }
39
+
40
+
41
+ def sync(repo_path):
42
+ repo_name = os.path.basename(repo_path)
43
+
44
+ patches_path = os.path.join(str(Path.home()), ".frida-sync-" + re.sub(r"[^\w\d]", "-", repo_path.lower()).lstrip("-"))
45
+ if os.path.exists(patches_path):
46
+ patches = PendingPatches.load(patches_path)
47
+
48
+ print("Applying {} pending patches".format(patches.count))
49
+ else:
50
+ entry = upstreams.get(repo_name, None)
51
+ if entry is None:
52
+ raise UnknownUpstreamError("Unknown upstream: {}".format(repo_name))
53
+ if isinstance(entry, tuple):
54
+ upstream_url, upstream_branch = entry
55
+ else:
56
+ upstream_url = entry
57
+ upstream_branch = "main"
58
+ upstream_target = "upstream/" + upstream_branch
59
+
60
+ print("Synchronizing with {}".format(upstream_url))
61
+
62
+ subprocess.run(["git", "checkout", "main"], cwd=repo_path, capture_output=True, check=True)
63
+ subprocess.run(["git", "pull"], cwd=repo_path, capture_output=True, check=True)
64
+ result = subprocess.run(["git", "status"], cwd=repo_path, capture_output=True, check=True, encoding='utf-8')
65
+ if not "working tree clean" in result.stdout:
66
+ raise WorkingTreeDirtyError("Working tree is dirty")
67
+
68
+ subprocess.run(["git", "remote", "add", "upstream", upstream_url], cwd=repo_path, capture_output=True)
69
+ subprocess.run(["git", "fetch", "upstream"], cwd=repo_path, check=True)
70
+
71
+ patches, base = list_our_patches(repo_path)
72
+ print("We have {} patches on top of upstream".format(patches.count))
73
+
74
+ new_entries = list_upstream_changes(repo_path, upstream_target, base)
75
+ if len(new_entries) == 0:
76
+ print("Already up-to-date")
77
+ return
78
+
79
+ print("Upstream has {} new commits".format(len(new_entries)))
80
+
81
+ print("Merging...")
82
+ subprocess.run(["git", "merge", "-s", "ours", upstream_target], cwd=repo_path, capture_output=True, check=True)
83
+ subprocess.run(["git", "checkout", "--detach", upstream_target], cwd=repo_path, capture_output=True, check=True)
84
+ subprocess.run(["git", "reset", "--soft", "main"], cwd=repo_path, capture_output=True, check=True)
85
+ subprocess.run(["git", "checkout", "main"], cwd=repo_path, capture_output=True, check=True)
86
+ subprocess.run(["git", "commit", "--amend", "-C", "HEAD"], cwd=repo_path, capture_output=True, check=True)
87
+
88
+ patches.save(patches_path)
89
+
90
+ while True:
91
+ index, cid, message = patches.try_pop()
92
+ if index is None:
93
+ break
94
+
95
+ print("Cherry-picking {}/{}: {}".format(index + 1, patches.count, message))
96
+ try:
97
+ subprocess.run(["git", "cherry-pick", cid], cwd=repo_path, capture_output=True, encoding='utf-8', check=True)
98
+ except subprocess.CalledProcessError as e:
99
+ patches.save(patches_path)
100
+
101
+ print("\n*** Unable to apply this patch:")
102
+ print(e.stderr)
103
+ print("Run `git cherry-pick --abort` and re-run script to skip it.")
104
+
105
+ return
106
+
107
+ os.remove(patches_path)
108
+ print("Done!")
109
+
110
+ def list_our_patches(repo_path):
111
+ items = []
112
+ base = None
113
+ entries = list_recent_commits(repo_path, "--max-count=1000")
114
+ for index, entry in enumerate(entries):
115
+ cid, message = entry
116
+ if message.startswith("Merge"):
117
+ base = entries[index + 1][0]
118
+ break
119
+ items.append(("pending", cid, message))
120
+ items.reverse()
121
+ return (PendingPatches(items), base)
122
+
123
+ def list_upstream_changes(repo_path, upstream_target, since):
124
+ return list(reversed(list_recent_commits(repo_path, since + ".." + upstream_target)))
125
+
126
+ def list_recent_commits(repo_path, *args):
127
+ result = subprocess.run(["git", "log", "--pretty=oneline", "--abbrev-commit", "--topo-order"] + list(args),
128
+ cwd=repo_path, capture_output=True, check=True, encoding='utf-8', errors='surrogateescape')
129
+ return [line.split(" ", 1) for line in result.stdout.rstrip().split("\n")]
130
+
131
+
132
+ class PendingPatches(object):
133
+ def __init__(self, items):
134
+ self._items = items
135
+
136
+ offset = 0
137
+ for status, cid, message in items:
138
+ if status == "applied":
139
+ offset += 1
140
+ else:
141
+ break
142
+ self._offset = offset
143
+
144
+ @property
145
+ def count(self):
146
+ return len(self._items)
147
+
148
+ def try_pop(self):
149
+ index = self._offset
150
+ if index == len(self._items):
151
+ return (None, None, None)
152
+
153
+ _, cid, message = self._items[index]
154
+ self._items[index] = ("applied", cid, message)
155
+ self._offset += 1
156
+
157
+ return (index, cid, message)
158
+
159
+ @classmethod
160
+ def load(cls, path):
161
+ with open(path, "r", encoding='utf-8') as f:
162
+ data = f.read()
163
+
164
+ items = []
165
+ for line in data.strip().split("\n"):
166
+ status, cid, message = line.split(" ", maxsplit=2)
167
+ items.append((status, cid, message))
168
+ return PendingPatches(items)
169
+
170
+ def save(self, path):
171
+ data = "\n".join([" ".join(item) for item in self._items]) + "\n"
172
+ with open(path, "w", encoding='utf-8') as f:
173
+ f.write(data)
174
+
175
+
176
+ class WorkingTreeDirtyError(Exception):
177
+ pass
178
+
179
+
180
+ class UnknownUpstreamError(Exception):
181
+ pass
182
+
183
+
184
+ if __name__ == '__main__':
185
+ sync(os.path.abspath(sys.argv[1]))
@@ -0,0 +1,59 @@
1
+ from tomlkit.api import TOMLDocument
2
+ from tomlkit.api import aot
3
+ from tomlkit.api import array
4
+ from tomlkit.api import boolean
5
+ from tomlkit.api import comment
6
+ from tomlkit.api import date
7
+ from tomlkit.api import datetime
8
+ from tomlkit.api import document
9
+ from tomlkit.api import dump
10
+ from tomlkit.api import dumps
11
+ from tomlkit.api import float_
12
+ from tomlkit.api import inline_table
13
+ from tomlkit.api import integer
14
+ from tomlkit.api import item
15
+ from tomlkit.api import key
16
+ from tomlkit.api import key_value
17
+ from tomlkit.api import load
18
+ from tomlkit.api import loads
19
+ from tomlkit.api import nl
20
+ from tomlkit.api import parse
21
+ from tomlkit.api import register_encoder
22
+ from tomlkit.api import string
23
+ from tomlkit.api import table
24
+ from tomlkit.api import time
25
+ from tomlkit.api import unregister_encoder
26
+ from tomlkit.api import value
27
+ from tomlkit.api import ws
28
+
29
+
30
+ __version__ = "0.12.4"
31
+ __all__ = [
32
+ "aot",
33
+ "array",
34
+ "boolean",
35
+ "comment",
36
+ "date",
37
+ "datetime",
38
+ "document",
39
+ "dump",
40
+ "dumps",
41
+ "float_",
42
+ "inline_table",
43
+ "integer",
44
+ "item",
45
+ "key",
46
+ "key_value",
47
+ "load",
48
+ "loads",
49
+ "nl",
50
+ "parse",
51
+ "string",
52
+ "table",
53
+ "time",
54
+ "TOMLDocument",
55
+ "value",
56
+ "ws",
57
+ "register_encoder",
58
+ "unregister_encoder",
59
+ ]
@@ -0,0 +1,22 @@
1
+ from __future__ import annotations
2
+
3
+ import contextlib
4
+ import sys
5
+
6
+ from typing import Any
7
+
8
+
9
+ PY38 = sys.version_info >= (3, 8)
10
+
11
+
12
+ def decode(string: Any, encodings: list[str] | None = None):
13
+ if not isinstance(string, bytes):
14
+ return string
15
+
16
+ encodings = encodings or ["utf-8", "latin1", "ascii"]
17
+
18
+ for encoding in encodings:
19
+ with contextlib.suppress(UnicodeEncodeError, UnicodeDecodeError):
20
+ return string.decode(encoding)
21
+
22
+ return string.decode(encodings[0], errors="ignore")
@@ -0,0 +1,83 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+ from typing import Any
5
+ from typing import TypeVar
6
+
7
+
8
+ WT = TypeVar("WT", bound="WrapperType")
9
+
10
+ if TYPE_CHECKING: # pragma: no cover
11
+ # Define _CustomList and _CustomDict as a workaround for:
12
+ # https://github.com/python/mypy/issues/11427
13
+ #
14
+ # According to this issue, the typeshed contains a "lie"
15
+ # (it adds MutableSequence to the ancestry of list and MutableMapping to
16
+ # the ancestry of dict) which completely messes with the type inference for
17
+ # Table, InlineTable, Array and Container.
18
+ #
19
+ # Importing from builtins is preferred over simple assignment, see issues:
20
+ # https://github.com/python/mypy/issues/8715
21
+ # https://github.com/python/mypy/issues/10068
22
+ from builtins import dict as _CustomDict # noqa: N812
23
+ from builtins import float as _CustomFloat # noqa: N812
24
+ from builtins import int as _CustomInt # noqa: N812
25
+ from builtins import list as _CustomList # noqa: N812
26
+ from typing import Callable
27
+ from typing import Concatenate
28
+ from typing import ParamSpec
29
+ from typing import Protocol
30
+
31
+ P = ParamSpec("P")
32
+
33
+ class WrapperType(Protocol):
34
+ def _new(self: WT, value: Any) -> WT:
35
+ ...
36
+
37
+ else:
38
+ from collections.abc import MutableMapping
39
+ from collections.abc import MutableSequence
40
+ from numbers import Integral
41
+ from numbers import Real
42
+
43
+ class _CustomList(MutableSequence, list):
44
+ """Adds MutableSequence mixin while pretending to be a builtin list"""
45
+
46
+ def __add__(self, other):
47
+ new_list = self.copy()
48
+ new_list.extend(other)
49
+ return new_list
50
+
51
+ def __iadd__(self, other):
52
+ self.extend(other)
53
+ return self
54
+
55
+ class _CustomDict(MutableMapping, dict):
56
+ """Adds MutableMapping mixin while pretending to be a builtin dict"""
57
+
58
+ def __or__(self, other):
59
+ new_dict = self.copy()
60
+ new_dict.update(other)
61
+ return new_dict
62
+
63
+ def __ior__(self, other):
64
+ self.update(other)
65
+ return self
66
+
67
+ class _CustomInt(Integral, int):
68
+ """Adds Integral mixin while pretending to be a builtin int"""
69
+
70
+ class _CustomFloat(Real, float):
71
+ """Adds Real mixin while pretending to be a builtin float"""
72
+
73
+
74
+ def wrap_method(
75
+ original_method: Callable[Concatenate[WT, P], Any],
76
+ ) -> Callable[Concatenate[WT, P], Any]:
77
+ def wrapper(self: WT, *args: P.args, **kwargs: P.kwargs) -> Any:
78
+ result = original_method(self, *args, **kwargs)
79
+ if result is NotImplemented:
80
+ return result
81
+ return self._new(result)
82
+
83
+ return wrapper