frida 16.2.0 → 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,542 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2014 The Meson development team
3
+
4
+ """This is (mostly) a standalone module used to write logging
5
+ information about Meson runs. Some output goes to screen,
6
+ some to logging dir and some goes to both."""
7
+
8
+ from __future__ import annotations
9
+
10
+ import enum
11
+ import os
12
+ import io
13
+ import sys
14
+ import time
15
+ import platform
16
+ import shlex
17
+ import subprocess
18
+ import shutil
19
+ import typing as T
20
+ from contextlib import contextmanager
21
+ from dataclasses import dataclass, field
22
+ from pathlib import Path
23
+
24
+ if T.TYPE_CHECKING:
25
+ from ._typing import StringProtocol, SizedStringProtocol
26
+
27
+ from .mparser import BaseNode
28
+
29
+ TV_Loggable = T.Union[str, 'AnsiDecorator', StringProtocol]
30
+ TV_LoggableList = T.List[TV_Loggable]
31
+
32
+ def is_windows() -> bool:
33
+ platname = platform.system().lower()
34
+ return platname == 'windows'
35
+
36
+ def _windows_ansi() -> bool:
37
+ # windll only exists on windows, so mypy will get mad
38
+ from ctypes import windll, byref # type: ignore
39
+ from ctypes.wintypes import DWORD
40
+
41
+ kernel = windll.kernel32
42
+ stdout = kernel.GetStdHandle(-11)
43
+ mode = DWORD()
44
+ if not kernel.GetConsoleMode(stdout, byref(mode)):
45
+ return False
46
+ # ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0x4
47
+ # If the call to enable VT processing fails (returns 0), we fallback to
48
+ # original behavior
49
+ return bool(kernel.SetConsoleMode(stdout, mode.value | 0x4) or os.environ.get('ANSICON'))
50
+
51
+ def colorize_console() -> bool:
52
+ _colorize_console: bool = getattr(sys.stdout, 'colorize_console', None)
53
+ if _colorize_console is not None:
54
+ return _colorize_console
55
+
56
+ try:
57
+ if is_windows():
58
+ _colorize_console = os.isatty(sys.stdout.fileno()) and _windows_ansi()
59
+ else:
60
+ _colorize_console = os.isatty(sys.stdout.fileno()) and os.environ.get('TERM', 'dumb') != 'dumb'
61
+ except Exception:
62
+ _colorize_console = False
63
+
64
+ sys.stdout.colorize_console = _colorize_console # type: ignore[attr-defined]
65
+ return _colorize_console
66
+
67
+ def setup_console() -> None:
68
+ # on Windows, a subprocess might call SetConsoleMode() on the console
69
+ # connected to stdout and turn off ANSI escape processing. Call this after
70
+ # running a subprocess to ensure we turn it on again.
71
+ if is_windows():
72
+ try:
73
+ delattr(sys.stdout, 'colorize_console')
74
+ except AttributeError:
75
+ pass
76
+
77
+ _in_ci = 'CI' in os.environ
78
+
79
+
80
+ class _Severity(enum.Enum):
81
+
82
+ NOTICE = enum.auto()
83
+ WARNING = enum.auto()
84
+ ERROR = enum.auto()
85
+ DEPRECATION = enum.auto()
86
+
87
+ @dataclass
88
+ class _Logger:
89
+
90
+ log_dir: T.Optional[str] = None
91
+ log_depth: T.List[str] = field(default_factory=list)
92
+ log_file: T.Optional[T.TextIO] = None
93
+ log_timestamp_start: T.Optional[float] = None
94
+ log_fatal_warnings = False
95
+ log_disable_stdout = False
96
+ log_errors_only = False
97
+ logged_once: T.Set[T.Tuple[str, ...]] = field(default_factory=set)
98
+ log_warnings_counter = 0
99
+ log_pager: T.Optional['subprocess.Popen'] = None
100
+
101
+ _LOG_FNAME: T.ClassVar[str] = 'meson-log.txt'
102
+
103
+ @contextmanager
104
+ def no_logging(self) -> T.Iterator[None]:
105
+ self.log_disable_stdout = True
106
+ try:
107
+ yield
108
+ finally:
109
+ self.log_disable_stdout = False
110
+
111
+ @contextmanager
112
+ def force_logging(self) -> T.Iterator[None]:
113
+ restore = self.log_disable_stdout
114
+ self.log_disable_stdout = False
115
+ try:
116
+ yield
117
+ finally:
118
+ self.log_disable_stdout = restore
119
+
120
+ def set_quiet(self) -> None:
121
+ self.log_errors_only = True
122
+
123
+ def set_verbose(self) -> None:
124
+ self.log_errors_only = False
125
+
126
+ def set_timestamp_start(self, start: float) -> None:
127
+ self.log_timestamp_start = start
128
+
129
+ def shutdown(self) -> T.Optional[str]:
130
+ if self.log_file is not None:
131
+ path = self.log_file.name
132
+ exception_around_goer = self.log_file
133
+ self.log_file = None
134
+ exception_around_goer.close()
135
+ return path
136
+ self.stop_pager()
137
+ return None
138
+
139
+ def start_pager(self) -> None:
140
+ if not colorize_console():
141
+ return
142
+ pager_cmd = []
143
+ if 'PAGER' in os.environ:
144
+ pager_cmd = shlex.split(os.environ['PAGER'])
145
+ else:
146
+ less = shutil.which('less')
147
+ if not less and is_windows():
148
+ git = shutil.which('git')
149
+ if git:
150
+ path = Path(git).parents[1] / 'usr' / 'bin'
151
+ less = shutil.which('less', path=str(path))
152
+ if less:
153
+ pager_cmd = [less]
154
+ if not pager_cmd:
155
+ return
156
+ try:
157
+ # Set 'LESS' environment variable, rather than arguments in
158
+ # pager_cmd, to also support the case where the user has 'PAGER'
159
+ # set to 'less'. Arguments set are:
160
+ # "R" : support color
161
+ # "X" : do not clear the screen when leaving the pager
162
+ # "F" : skip the pager if content fits into the screen
163
+ env = os.environ.copy()
164
+ if 'LESS' not in env:
165
+ env['LESS'] = 'RXF'
166
+ # Set "-c" for lv to support color
167
+ if 'LV' not in env:
168
+ env['LV'] = '-c'
169
+ self.log_pager = subprocess.Popen(pager_cmd, stdin=subprocess.PIPE,
170
+ text=True, encoding='utf-8', env=env)
171
+ except Exception as e:
172
+ # Ignore errors, unless it is a user defined pager.
173
+ if 'PAGER' in os.environ:
174
+ from .mesonlib import MesonException
175
+ raise MesonException(f'Failed to start pager: {str(e)}')
176
+
177
+ def stop_pager(self) -> None:
178
+ if self.log_pager:
179
+ try:
180
+ self.log_pager.stdin.flush()
181
+ self.log_pager.stdin.close()
182
+ except OSError:
183
+ pass
184
+ self.log_pager.wait()
185
+ self.log_pager = None
186
+
187
+ def initialize(self, logdir: str, fatal_warnings: bool = False) -> None:
188
+ self.log_dir = logdir
189
+ self.log_file = open(os.path.join(logdir, self._LOG_FNAME), 'w', encoding='utf-8')
190
+ self.log_fatal_warnings = fatal_warnings
191
+
192
+ def process_markup(self, args: T.Sequence[TV_Loggable], keep: bool, display_timestamp: bool = True) -> T.List[str]:
193
+ arr: T.List[str] = []
194
+ if self.log_timestamp_start is not None and display_timestamp:
195
+ arr = ['[{:.3f}]'.format(time.monotonic() - self.log_timestamp_start)]
196
+ for arg in args:
197
+ if arg is None:
198
+ continue
199
+ if isinstance(arg, str):
200
+ arr.append(arg)
201
+ elif isinstance(arg, AnsiDecorator):
202
+ arr.append(arg.get_text(keep))
203
+ else:
204
+ arr.append(str(arg))
205
+ return arr
206
+
207
+ def force_print(self, *args: str, nested: bool, sep: T.Optional[str] = None,
208
+ end: T.Optional[str] = None) -> None:
209
+ if self.log_disable_stdout:
210
+ return
211
+ iostr = io.StringIO()
212
+ print(*args, sep=sep, end=end, file=iostr)
213
+
214
+ raw = iostr.getvalue()
215
+ if self.log_depth:
216
+ prepend = self.log_depth[-1] + '| ' if nested else ''
217
+ lines = []
218
+ for l in raw.split('\n'):
219
+ l = l.strip()
220
+ lines.append(prepend + l if l else '')
221
+ raw = '\n'.join(lines)
222
+
223
+ # _Something_ is going to get printed.
224
+ try:
225
+ output = self.log_pager.stdin if self.log_pager else None
226
+ print(raw, end='', file=output)
227
+ except UnicodeEncodeError:
228
+ cleaned = raw.encode('ascii', 'replace').decode('ascii')
229
+ print(cleaned, end='')
230
+
231
+ def debug(self, *args: TV_Loggable, sep: T.Optional[str] = None,
232
+ end: T.Optional[str] = None, display_timestamp: bool = True) -> None:
233
+ arr = process_markup(args, False, display_timestamp)
234
+ if self.log_file is not None:
235
+ print(*arr, file=self.log_file, sep=sep, end=end)
236
+ self.log_file.flush()
237
+
238
+ def _log(self, *args: TV_Loggable, is_error: bool = False,
239
+ nested: bool = True, sep: T.Optional[str] = None,
240
+ end: T.Optional[str] = None, display_timestamp: bool = True) -> None:
241
+ arr = process_markup(args, False, display_timestamp)
242
+ if self.log_file is not None:
243
+ print(*arr, file=self.log_file, sep=sep, end=end)
244
+ self.log_file.flush()
245
+ if colorize_console():
246
+ arr = process_markup(args, True, display_timestamp)
247
+ if not self.log_errors_only or is_error:
248
+ force_print(*arr, nested=nested, sep=sep, end=end)
249
+
250
+ def _debug_log_cmd(self, cmd: str, args: T.List[str]) -> None:
251
+ if not _in_ci:
252
+ return
253
+ args = [f'"{x}"' for x in args] # Quote all args, just in case
254
+ self.debug('!meson_ci!/{} {}'.format(cmd, ' '.join(args)))
255
+
256
+ def cmd_ci_include(self, file: str) -> None:
257
+ self._debug_log_cmd('ci_include', [file])
258
+
259
+ def log(self, *args: TV_Loggable, is_error: bool = False,
260
+ once: bool = False, nested: bool = True,
261
+ sep: T.Optional[str] = None,
262
+ end: T.Optional[str] = None,
263
+ display_timestamp: bool = True) -> None:
264
+ if once:
265
+ self._log_once(*args, is_error=is_error, nested=nested, sep=sep, end=end, display_timestamp=display_timestamp)
266
+ else:
267
+ self._log(*args, is_error=is_error, nested=nested, sep=sep, end=end, display_timestamp=display_timestamp)
268
+
269
+ def log_timestamp(self, *args: TV_Loggable) -> None:
270
+ if self.log_timestamp_start:
271
+ self.log(*args)
272
+
273
+ def _log_once(self, *args: TV_Loggable, is_error: bool = False,
274
+ nested: bool = True, sep: T.Optional[str] = None,
275
+ end: T.Optional[str] = None, display_timestamp: bool = True) -> None:
276
+ """Log variant that only prints a given message one time per meson invocation.
277
+
278
+ This considers ansi decorated values by the values they wrap without
279
+ regard for the AnsiDecorator itself.
280
+ """
281
+ def to_str(x: TV_Loggable) -> str:
282
+ if isinstance(x, str):
283
+ return x
284
+ if isinstance(x, AnsiDecorator):
285
+ return x.text
286
+ return str(x)
287
+ t = tuple(to_str(a) for a in args)
288
+ if t in self.logged_once:
289
+ return
290
+ self.logged_once.add(t)
291
+ self._log(*args, is_error=is_error, nested=nested, sep=sep, end=end, display_timestamp=display_timestamp)
292
+
293
+ def _log_error(self, severity: _Severity, *rargs: TV_Loggable,
294
+ once: bool = False, fatal: bool = True,
295
+ location: T.Optional[BaseNode] = None,
296
+ nested: bool = True, sep: T.Optional[str] = None,
297
+ end: T.Optional[str] = None,
298
+ is_error: bool = True) -> None:
299
+ from .mesonlib import MesonException, relpath
300
+
301
+ # The typing requirements here are non-obvious. Lists are invariant,
302
+ # therefore T.List[A] and T.List[T.Union[A, B]] are not able to be joined
303
+ if severity is _Severity.NOTICE:
304
+ label: TV_LoggableList = [bold('NOTICE:')]
305
+ elif severity is _Severity.WARNING:
306
+ label = [yellow('WARNING:')]
307
+ elif severity is _Severity.ERROR:
308
+ label = [red('ERROR:')]
309
+ elif severity is _Severity.DEPRECATION:
310
+ label = [red('DEPRECATION:')]
311
+ # rargs is a tuple, not a list
312
+ args = label + list(rargs)
313
+
314
+ if location is not None:
315
+ location_file = relpath(location.filename, os.getcwd())
316
+ location_str = get_error_location_string(location_file, location.lineno)
317
+ # Unions are frankly awful, and we have to T.cast here to get mypy
318
+ # to understand that the list concatenation is safe
319
+ location_list = T.cast('TV_LoggableList', [location_str])
320
+ args = location_list + args
321
+
322
+ log(*args, once=once, nested=nested, sep=sep, end=end, is_error=is_error)
323
+
324
+ self.log_warnings_counter += 1
325
+
326
+ if self.log_fatal_warnings and fatal:
327
+ raise MesonException("Fatal warnings enabled, aborting")
328
+
329
+ def error(self, *args: TV_Loggable,
330
+ once: bool = False, fatal: bool = True,
331
+ location: T.Optional[BaseNode] = None,
332
+ nested: bool = True, sep: T.Optional[str] = None,
333
+ end: T.Optional[str] = None) -> None:
334
+ return self._log_error(_Severity.ERROR, *args, once=once, fatal=fatal, location=location,
335
+ nested=nested, sep=sep, end=end, is_error=True)
336
+
337
+ def warning(self, *args: TV_Loggable,
338
+ once: bool = False, fatal: bool = True,
339
+ location: T.Optional[BaseNode] = None,
340
+ nested: bool = True, sep: T.Optional[str] = None,
341
+ end: T.Optional[str] = None) -> None:
342
+ return self._log_error(_Severity.WARNING, *args, once=once, fatal=fatal, location=location,
343
+ nested=nested, sep=sep, end=end, is_error=True)
344
+
345
+ def deprecation(self, *args: TV_Loggable,
346
+ once: bool = False, fatal: bool = True,
347
+ location: T.Optional[BaseNode] = None,
348
+ nested: bool = True, sep: T.Optional[str] = None,
349
+ end: T.Optional[str] = None) -> None:
350
+ return self._log_error(_Severity.DEPRECATION, *args, once=once, fatal=fatal, location=location,
351
+ nested=nested, sep=sep, end=end, is_error=True)
352
+
353
+ def notice(self, *args: TV_Loggable,
354
+ once: bool = False, fatal: bool = True,
355
+ location: T.Optional[BaseNode] = None,
356
+ nested: bool = True, sep: T.Optional[str] = None,
357
+ end: T.Optional[str] = None) -> None:
358
+ return self._log_error(_Severity.NOTICE, *args, once=once, fatal=fatal, location=location,
359
+ nested=nested, sep=sep, end=end, is_error=False)
360
+
361
+ def exception(self, e: Exception, prefix: T.Optional[AnsiDecorator] = None) -> None:
362
+ if prefix is None:
363
+ prefix = red('ERROR:')
364
+ self.log()
365
+ args: T.List[T.Union[AnsiDecorator, str]] = []
366
+ if all(getattr(e, a, None) is not None for a in ['file', 'lineno', 'colno']):
367
+ # Mypy doesn't follow hasattr, and it's pretty easy to visually inspect
368
+ # that this is correct, so we'll just ignore it.
369
+ path = get_relative_path(Path(e.file), Path(os.getcwd())) # type: ignore
370
+ args.append(f'{path}:{e.lineno}:{e.colno}:') # type: ignore
371
+ if prefix:
372
+ args.append(prefix)
373
+ args.append(str(e))
374
+
375
+ with self.force_logging():
376
+ self.log(*args, is_error=True)
377
+
378
+ @contextmanager
379
+ def nested(self, name: str = '') -> T.Generator[None, None, None]:
380
+ self.log_depth.append(name)
381
+ try:
382
+ yield
383
+ finally:
384
+ self.log_depth.pop()
385
+
386
+ def get_log_dir(self) -> str:
387
+ return self.log_dir
388
+
389
+ def get_log_depth(self) -> int:
390
+ return len(self.log_depth)
391
+
392
+ @contextmanager
393
+ def nested_warnings(self) -> T.Iterator[None]:
394
+ old = self.log_warnings_counter
395
+ self.log_warnings_counter = 0
396
+ try:
397
+ yield
398
+ finally:
399
+ self.log_warnings_counter = old
400
+
401
+ def get_warning_count(self) -> int:
402
+ return self.log_warnings_counter
403
+
404
+ _logger = _Logger()
405
+ cmd_ci_include = _logger.cmd_ci_include
406
+ debug = _logger.debug
407
+ deprecation = _logger.deprecation
408
+ error = _logger.error
409
+ exception = _logger.exception
410
+ force_print = _logger.force_print
411
+ get_log_depth = _logger.get_log_depth
412
+ get_log_dir = _logger.get_log_dir
413
+ get_warning_count = _logger.get_warning_count
414
+ initialize = _logger.initialize
415
+ log = _logger.log
416
+ log_timestamp = _logger.log_timestamp
417
+ nested = _logger.nested
418
+ nested_warnings = _logger.nested_warnings
419
+ no_logging = _logger.no_logging
420
+ notice = _logger.notice
421
+ process_markup = _logger.process_markup
422
+ set_quiet = _logger.set_quiet
423
+ set_timestamp_start = _logger.set_timestamp_start
424
+ set_verbose = _logger.set_verbose
425
+ shutdown = _logger.shutdown
426
+ start_pager = _logger.start_pager
427
+ stop_pager = _logger.stop_pager
428
+ warning = _logger.warning
429
+
430
+ class AnsiDecorator:
431
+ plain_code = "\033[0m"
432
+
433
+ def __init__(self, text: str, code: str, quoted: bool = False):
434
+ self.text = text
435
+ self.code = code
436
+ self.quoted = quoted
437
+
438
+ def get_text(self, with_codes: bool) -> str:
439
+ text = self.text
440
+ if with_codes and self.code:
441
+ text = self.code + self.text + AnsiDecorator.plain_code
442
+ if self.quoted:
443
+ text = f'"{text}"'
444
+ return text
445
+
446
+ def __len__(self) -> int:
447
+ return len(self.text)
448
+
449
+ def __str__(self) -> str:
450
+ return self.get_text(colorize_console())
451
+
452
+ class AnsiText:
453
+ def __init__(self, *args: 'SizedStringProtocol'):
454
+ self.args = args
455
+
456
+ def __len__(self) -> int:
457
+ return sum(len(x) for x in self.args)
458
+
459
+ def __str__(self) -> str:
460
+ return ''.join(str(x) for x in self.args)
461
+
462
+
463
+ def bold(text: str, quoted: bool = False) -> AnsiDecorator:
464
+ return AnsiDecorator(text, "\033[1m", quoted=quoted)
465
+
466
+ def italic(text: str, quoted: bool = False) -> AnsiDecorator:
467
+ return AnsiDecorator(text, "\033[3m", quoted=quoted)
468
+
469
+ def plain(text: str) -> AnsiDecorator:
470
+ return AnsiDecorator(text, "")
471
+
472
+ def red(text: str) -> AnsiDecorator:
473
+ return AnsiDecorator(text, "\033[1;31m")
474
+
475
+ def green(text: str) -> AnsiDecorator:
476
+ return AnsiDecorator(text, "\033[1;32m")
477
+
478
+ def yellow(text: str) -> AnsiDecorator:
479
+ return AnsiDecorator(text, "\033[1;33m")
480
+
481
+ def blue(text: str) -> AnsiDecorator:
482
+ return AnsiDecorator(text, "\033[1;34m")
483
+
484
+ def cyan(text: str) -> AnsiDecorator:
485
+ return AnsiDecorator(text, "\033[1;36m")
486
+
487
+ def normal_red(text: str) -> AnsiDecorator:
488
+ return AnsiDecorator(text, "\033[31m")
489
+
490
+ def normal_green(text: str) -> AnsiDecorator:
491
+ return AnsiDecorator(text, "\033[32m")
492
+
493
+ def normal_yellow(text: str) -> AnsiDecorator:
494
+ return AnsiDecorator(text, "\033[33m")
495
+
496
+ def normal_blue(text: str) -> AnsiDecorator:
497
+ return AnsiDecorator(text, "\033[34m")
498
+
499
+ def normal_cyan(text: str) -> AnsiDecorator:
500
+ return AnsiDecorator(text, "\033[36m")
501
+
502
+ def get_error_location_string(fname: StringProtocol, lineno: int) -> str:
503
+ return f'{fname}:{lineno}:'
504
+
505
+ def get_relative_path(target: Path, current: Path) -> Path:
506
+ """Get the path to target from current"""
507
+ # Go up "current" until we find a common ancestor to target
508
+ acc = ['.']
509
+ for part in [current, *current.parents]:
510
+ try:
511
+ path = target.relative_to(part)
512
+ return Path(*acc, path)
513
+ except ValueError:
514
+ pass
515
+ acc += ['..']
516
+
517
+ # we failed, should not get here
518
+ return target
519
+
520
+ # Format a list for logging purposes as a string. It separates
521
+ # all but the last item with commas, and the last with 'and'.
522
+ def format_list(input_list: T.List[str]) -> str:
523
+ l = len(input_list)
524
+ if l > 2:
525
+ return ' and '.join([', '.join(input_list[:-1]), input_list[-1]])
526
+ elif l == 2:
527
+ return ' and '.join(input_list)
528
+ elif l == 1:
529
+ return input_list[0]
530
+ else:
531
+ return ''
532
+
533
+
534
+ def code_line(text: str, line: str, colno: int) -> str:
535
+ """Print a line with a caret pointing to the colno
536
+
537
+ :param text: A message to display before the line
538
+ :param line: The line of code to be pointed to
539
+ :param colno: The column number to point at
540
+ :return: A formatted string of the text, line, and a caret
541
+ """
542
+ return f'{text}\n{line}\n{" " * colno}^'