tpy-lang 0.3.0.dev0__py3-none-any.whl

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 (333) hide show
  1. tpy_lang-0.3.0.dev0.dist-info/METADATA +151 -0
  2. tpy_lang-0.3.0.dev0.dist-info/RECORD +333 -0
  3. tpy_lang-0.3.0.dev0.dist-info/WHEEL +4 -0
  4. tpy_lang-0.3.0.dev0.dist-info/entry_points.txt +3 -0
  5. tpyc/__init__.py +104 -0
  6. tpyc/__main__.py +6 -0
  7. tpyc/_buildinfo.py +1 -0
  8. tpyc/_data/docs/LANGUAGE_FEATURES.md +6278 -0
  9. tpyc/_data/docs/STDLIB_ROADMAP.md +1258 -0
  10. tpyc/_data/docs/TPY_FOR_AGENTS.md +556 -0
  11. tpyc/_data/lib/tpy/_bindings/__init__.py +6 -0
  12. tpyc/_data/lib/tpy/_bindings/pcre2.py +173 -0
  13. tpyc/_data/lib/tpy/_bindings/posix_socket.py +161 -0
  14. tpyc/_data/lib/tpy/_functools_macros.py +80 -0
  15. tpyc/_data/lib/tpy/_macro_helpers.py +161 -0
  16. tpyc/_data/lib/tpy/argparse.py +2062 -0
  17. tpyc/_data/lib/tpy/asyncio/__init__.py +744 -0
  18. tpyc/_data/lib/tpy/asyncio/_executor.py +515 -0
  19. tpyc/_data/lib/tpy/base64.py +410 -0
  20. tpyc/_data/lib/tpy/bisect.py +39 -0
  21. tpyc/_data/lib/tpy/builtins.py +38 -0
  22. tpyc/_data/lib/tpy/dataclasses.py +354 -0
  23. tpyc/_data/lib/tpy/enum.py +23 -0
  24. tpyc/_data/lib/tpy/functools.py +33 -0
  25. tpyc/_data/lib/tpy/hashlib.py +206 -0
  26. tpyc/_data/lib/tpy/heapq.py +118 -0
  27. tpyc/_data/lib/tpy/io.py +395 -0
  28. tpyc/_data/lib/tpy/json.py +221 -0
  29. tpyc/_data/lib/tpy/math.py +406 -0
  30. tpyc/_data/lib/tpy/random.py +597 -0
  31. tpyc/_data/lib/tpy/re.py +467 -0
  32. tpyc/_data/lib/tpy/socket.py +379 -0
  33. tpyc/_data/lib/tpy/struct.py +178 -0
  34. tpyc/_data/lib/tpy/sys.py +40 -0
  35. tpyc/_data/lib/tpy/time.py +39 -0
  36. tpyc/_data/lib/tpy/tpy/__init__.py +78 -0
  37. tpyc/_data/lib/tpy/tpy/_bootstrap/__init__.py +10 -0
  38. tpyc/_data/lib/tpy/tpy/_bootstrap/_decorators.py +37 -0
  39. tpyc/_data/lib/tpy/tpy/_bootstrap/_extern.py +64 -0
  40. tpyc/_data/lib/tpy/tpy/_builtins/__init__.py +11 -0
  41. tpyc/_data/lib/tpy/tpy/_builtins/_bytes.py +378 -0
  42. tpyc/_data/lib/tpy/tpy/_builtins/_dict.py +151 -0
  43. tpyc/_data/lib/tpy/tpy/_builtins/_exceptions.py +125 -0
  44. tpyc/_data/lib/tpy/tpy/_builtins/_funcs.py +681 -0
  45. tpyc/_data/lib/tpy/tpy/_builtins/_io.py +97 -0
  46. tpyc/_data/lib/tpy/tpy/_builtins/_list.py +127 -0
  47. tpyc/_data/lib/tpy/tpy/_builtins/_range.py +52 -0
  48. tpyc/_data/lib/tpy/tpy/_builtins/_set.py +139 -0
  49. tpyc/_data/lib/tpy/tpy/_builtins/_super.py +11 -0
  50. tpyc/_data/lib/tpy/tpy/_builtins/_types.py +661 -0
  51. tpyc/_data/lib/tpy/tpy/_core/__init__.py +23 -0
  52. tpyc/_data/lib/tpy/tpy/_core/_bytes_view.py +129 -0
  53. tpyc/_data/lib/tpy/tpy/_core/_containers.py +137 -0
  54. tpyc/_data/lib/tpy/tpy/_core/_functions.py +40 -0
  55. tpyc/_data/lib/tpy/tpy/_core/_types.py +2061 -0
  56. tpyc/_data/lib/tpy/tpy/_typing/__init__.py +77 -0
  57. tpyc/_data/lib/tpy/tpy/_version.py +29 -0
  58. tpyc/_data/lib/tpy/tpy/bits.py +28 -0
  59. tpyc/_data/lib/tpy/tpy/coro/__init__.py +127 -0
  60. tpyc/_data/lib/tpy/tpy/extern.py +8 -0
  61. tpyc/_data/lib/tpy/tpy/mem.py +49 -0
  62. tpyc/_data/lib/tpy/tpy/unsafe.py +195 -0
  63. tpyc/_data/lib/tpy/tpy/version.py +21 -0
  64. tpyc/_data/lib/tpy/typing.py +13 -0
  65. tpyc/_data/runtime/cpp/include/tpy/any.hpp +461 -0
  66. tpyc/_data/runtime/cpp/include/tpy/as_ostream.hpp +117 -0
  67. tpyc/_data/runtime/cpp/include/tpy/async.hpp +76 -0
  68. tpyc/_data/runtime/cpp/include/tpy/bigint.hpp +1343 -0
  69. tpyc/_data/runtime/cpp/include/tpy/builtins.hpp +400 -0
  70. tpyc/_data/runtime/cpp/include/tpy/bytes_ops.hpp +469 -0
  71. tpyc/_data/runtime/cpp/include/tpy/container_ops.hpp +487 -0
  72. tpyc/_data/runtime/cpp/include/tpy/copy_iter.hpp +82 -0
  73. tpyc/_data/runtime/cpp/include/tpy/core.hpp +558 -0
  74. tpyc/_data/runtime/cpp/include/tpy/dict_ops.hpp +289 -0
  75. tpyc/_data/runtime/cpp/include/tpy/dunder.hpp +750 -0
  76. tpyc/_data/runtime/cpp/include/tpy/dynamic.hpp +44 -0
  77. tpyc/_data/runtime/cpp/include/tpy/enum.hpp +40 -0
  78. tpyc/_data/runtime/cpp/include/tpy/file.hpp +245 -0
  79. tpyc/_data/runtime/cpp/include/tpy/fixed_int.hpp +317 -0
  80. tpyc/_data/runtime/cpp/include/tpy/format.hpp +954 -0
  81. tpyc/_data/runtime/cpp/include/tpy/frame_slot.hpp +120 -0
  82. tpyc/_data/runtime/cpp/include/tpy/generator.hpp +47 -0
  83. tpyc/_data/runtime/cpp/include/tpy/iterable_ops.hpp +122 -0
  84. tpyc/_data/runtime/cpp/include/tpy/itertools.hpp +749 -0
  85. tpyc/_data/runtime/cpp/include/tpy/next_iter.hpp +82 -0
  86. tpyc/_data/runtime/cpp/include/tpy/ordered_map.hpp +518 -0
  87. tpyc/_data/runtime/cpp/include/tpy/ordered_set.hpp +337 -0
  88. tpyc/_data/runtime/cpp/include/tpy/own_iter.hpp +54 -0
  89. tpyc/_data/runtime/cpp/include/tpy/pascal_graph_sdl.hpp +192 -0
  90. tpyc/_data/runtime/cpp/include/tpy/printing.hpp +302 -0
  91. tpyc/_data/runtime/cpp/include/tpy/protocols.hpp +61 -0
  92. tpyc/_data/runtime/cpp/include/tpy/range.hpp +115 -0
  93. tpyc/_data/runtime/cpp/include/tpy/ranges.hpp +212 -0
  94. tpyc/_data/runtime/cpp/include/tpy/set_ops.hpp +265 -0
  95. tpyc/_data/runtime/cpp/include/tpy/slice.hpp +47 -0
  96. tpyc/_data/runtime/cpp/include/tpy/span_iter.hpp +42 -0
  97. tpyc/_data/runtime/cpp/include/tpy/stdlib/math.hpp +41 -0
  98. tpyc/_data/runtime/cpp/include/tpy/stdlib/pcre2_h.hpp +96 -0
  99. tpyc/_data/runtime/cpp/include/tpy/stdlib/random.hpp +25 -0
  100. tpyc/_data/runtime/cpp/include/tpy/stdlib/socket_h.hpp +145 -0
  101. tpyc/_data/runtime/cpp/include/tpy/stdlib/time.hpp +62 -0
  102. tpyc/_data/runtime/cpp/include/tpy/system.hpp +121 -0
  103. tpyc/_data/runtime/cpp/include/tpy/throwable.hpp +55 -0
  104. tpyc/_data/runtime/cpp/include/tpy/tpy.hpp +156 -0
  105. tpyc/_data/runtime/cpp/include/tpy/type_name.hpp +77 -0
  106. tpyc/_data/runtime/cpp/include/tpy/type_traits.hpp +240 -0
  107. tpyc/_data/runtime/cpp/include/tpy/uninit_array_storage.hpp +250 -0
  108. tpyc/_data/runtime/cpp/include/tpy/uninit_heap_storage.hpp +277 -0
  109. tpyc/_data/runtime/cpp/include/tpy/varargs.hpp +174 -0
  110. tpyc/_data/runtime/cpp/include/tpy/variant_ref.hpp +118 -0
  111. tpyc/_data/runtime/cpp/src/stdlib/socket_impl.cpp +104 -0
  112. tpyc/_data/runtime/cpp/third_party/README.md +58 -0
  113. tpyc/_data/runtime/cpp/third_party/pcre2/AUTHORS +36 -0
  114. tpyc/_data/runtime/cpp/third_party/pcre2/CMakeLists.txt +1233 -0
  115. tpyc/_data/runtime/cpp/third_party/pcre2/COPYING +5 -0
  116. tpyc/_data/runtime/cpp/third_party/pcre2/ChangeLog +3097 -0
  117. tpyc/_data/runtime/cpp/third_party/pcre2/HACKING +853 -0
  118. tpyc/_data/runtime/cpp/third_party/pcre2/INSTALL +368 -0
  119. tpyc/_data/runtime/cpp/third_party/pcre2/LICENCE +94 -0
  120. tpyc/_data/runtime/cpp/third_party/pcre2/NEWS +492 -0
  121. tpyc/_data/runtime/cpp/third_party/pcre2/NON-AUTOTOOLS-BUILD +430 -0
  122. tpyc/_data/runtime/cpp/third_party/pcre2/README +956 -0
  123. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/COPYING-CMAKE-SCRIPTS +22 -0
  124. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindEditline.cmake +16 -0
  125. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindPackageHandleStandardArgs.cmake +58 -0
  126. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindReadline.cmake +29 -0
  127. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config-version.cmake.in +15 -0
  128. tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config.cmake.in +148 -0
  129. tpyc/_data/runtime/cpp/third_party/pcre2/config-cmake.h.in +56 -0
  130. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-16.pc.in +13 -0
  131. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-32.pc.in +13 -0
  132. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-8.pc.in +13 -0
  133. tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-posix.pc.in +13 -0
  134. tpyc/_data/runtime/cpp/third_party/pcre2/pcre2-config.in +121 -0
  135. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h +483 -0
  136. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.generic +483 -0
  137. tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.in +460 -0
  138. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h +1010 -0
  139. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.generic +1010 -0
  140. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.in +1010 -0
  141. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_auto_possess.c +1371 -0
  142. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c +196 -0
  143. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c.dist +196 -0
  144. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chkdint.c +96 -0
  145. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_compile.c +11001 -0
  146. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_config.c +252 -0
  147. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_context.c +510 -0
  148. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_convert.c +1189 -0
  149. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dfa_match.c +4119 -0
  150. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dftables.c +297 -0
  151. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_error.c +345 -0
  152. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_extuni.c +162 -0
  153. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_find_bracket.c +219 -0
  154. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_fuzzsupport.c +792 -0
  155. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_internal.h +2084 -0
  156. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_intmodedep.h +940 -0
  157. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_compile.c +14972 -0
  158. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_match.c +200 -0
  159. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_misc.c +234 -0
  160. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_neon_inc.h +354 -0
  161. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_simd_inc.h +2355 -0
  162. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_test.c +2528 -0
  163. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_maketables.c +165 -0
  164. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match.c +7777 -0
  165. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match_data.c +185 -0
  166. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_newline.c +243 -0
  167. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ord2utf.c +120 -0
  168. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_pattern_info.c +432 -0
  169. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_printint.c +886 -0
  170. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_script_run.c +344 -0
  171. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_serialize.c +286 -0
  172. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_string_utils.c +237 -0
  173. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_study.c +1915 -0
  174. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substitute.c +1009 -0
  175. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substring.c +550 -0
  176. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_tables.c +234 -0
  177. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucd.c +5460 -0
  178. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucp.h +396 -0
  179. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucptables.c +1533 -0
  180. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_valid_utf.c +398 -0
  181. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_xclass.c +308 -0
  182. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2demo.c +497 -0
  183. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2grep.c +4606 -0
  184. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.c +425 -0
  185. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.h +187 -0
  186. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix_test.c +209 -0
  187. tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2test.c +9708 -0
  188. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c +137 -0
  189. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c +327 -0
  190. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c +89 -0
  191. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c +62 -0
  192. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c +40 -0
  193. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c +72 -0
  194. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c +172 -0
  195. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c +141 -0
  196. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c +102 -0
  197. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfig.h +142 -0
  198. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigCPU.h +188 -0
  199. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigInternal.h +907 -0
  200. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.c +3561 -0
  201. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.h +2466 -0
  202. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_32.c +4636 -0
  203. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_64.c +3491 -0
  204. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_T2_32.c +4302 -0
  205. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeLOONGARCH_64.c +3765 -0
  206. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_32.c +472 -0
  207. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_64.c +387 -0
  208. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_common.c +4259 -0
  209. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_32.c +485 -0
  210. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_64.c +719 -0
  211. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_common.c +3161 -0
  212. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_32.c +142 -0
  213. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_64.c +222 -0
  214. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_common.c +3121 -0
  215. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeS390X.c +4526 -0
  216. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_32.c +1685 -0
  217. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_64.c +1398 -0
  218. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_common.c +5001 -0
  219. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitSerialize.c +516 -0
  220. tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitUtils.c +344 -0
  221. tpyc/_data/runtime/cpp/third_party/pcre2.sources.txt +54 -0
  222. tpyc/_data/runtime/cpp/third_party/pcre2.vendor.json +7 -0
  223. tpyc/build/__init__.py +7 -0
  224. tpyc/build/pcre2.py +122 -0
  225. tpyc/build/third_party.py +413 -0
  226. tpyc/cli.py +822 -0
  227. tpyc/codegen_cpp/__init__.py +18 -0
  228. tpyc/codegen_cpp/builtins.py +484 -0
  229. tpyc/codegen_cpp/context.py +2064 -0
  230. tpyc/codegen_cpp/expressions.py +5940 -0
  231. tpyc/codegen_cpp/functions.py +1913 -0
  232. tpyc/codegen_cpp/gen_async.py +3258 -0
  233. tpyc/codegen_cpp/gen_generators.py +657 -0
  234. tpyc/codegen_cpp/generator.py +2258 -0
  235. tpyc/codegen_cpp/match.py +1997 -0
  236. tpyc/codegen_cpp/param_const.py +172 -0
  237. tpyc/codegen_cpp/protocols.py +907 -0
  238. tpyc/codegen_cpp/records.py +1654 -0
  239. tpyc/codegen_cpp/resumable_cfg.py +1651 -0
  240. tpyc/codegen_cpp/statements.py +4963 -0
  241. tpyc/codegen_cpp/string_dispatch.py +76 -0
  242. tpyc/codegen_cpp/test_context.py +46 -0
  243. tpyc/codegen_cpp/test_param_const.py +113 -0
  244. tpyc/codegen_cpp/test_resumable_cfg.py +182 -0
  245. tpyc/codegen_cpp/type_resolution.py +53 -0
  246. tpyc/codegen_cpp/types.py +436 -0
  247. tpyc/codegen_cpp/variant_access.py +135 -0
  248. tpyc/coercions.py +749 -0
  249. tpyc/compilation_context.py +57 -0
  250. tpyc/compiler.py +3945 -0
  251. tpyc/cycle_detection.py +358 -0
  252. tpyc/diagnostics.py +135 -0
  253. tpyc/dump_types.py +353 -0
  254. tpyc/frontend_diagnostics.py +47 -0
  255. tpyc/frontend_ir/__init__.py +140 -0
  256. tpyc/frontend_ir/lower.py +1098 -0
  257. tpyc/frontend_ir/nodes.py +718 -0
  258. tpyc/frontend_ir/resolver_adapter.py +151 -0
  259. tpyc/frontend_plugin.py +209 -0
  260. tpyc/install_docs.py +81 -0
  261. tpyc/liveness.py +756 -0
  262. tpyc/macro_api.py +1724 -0
  263. tpyc/macro_loader.py +497 -0
  264. tpyc/module_names.py +64 -0
  265. tpyc/modules/__init__.py +31 -0
  266. tpyc/modules/defs.py +89 -0
  267. tpyc/modules/registry.py +36 -0
  268. tpyc/modules/resolver.py +192 -0
  269. tpyc/modules/type_resolution.py +629 -0
  270. tpyc/namespace.py +172 -0
  271. tpyc/parse/__init__.py +84 -0
  272. tpyc/parse/imports.py +490 -0
  273. tpyc/parse/nodes.py +1732 -0
  274. tpyc/parse/parser.py +4043 -0
  275. tpyc/parse/resolve_refs.py +466 -0
  276. tpyc/parse/type_resolver.py +1060 -0
  277. tpyc/prescan.py +254 -0
  278. tpyc/qnames.py +149 -0
  279. tpyc/repl.py +529 -0
  280. tpyc/repl_backends.py +848 -0
  281. tpyc/sema/__init__.py +21 -0
  282. tpyc/sema/analyzer.py +3625 -0
  283. tpyc/sema/bound_check.py +72 -0
  284. tpyc/sema/builder_trace.py +684 -0
  285. tpyc/sema/calls.py +5406 -0
  286. tpyc/sema/compatibility.py +2107 -0
  287. tpyc/sema/context.py +1243 -0
  288. tpyc/sema/expressions.py +3737 -0
  289. tpyc/sema/flow_facts.py +199 -0
  290. tpyc/sema/init_tracker.py +150 -0
  291. tpyc/sema/list_literals.py +69 -0
  292. tpyc/sema/literal_utils.py +27 -0
  293. tpyc/sema/local_deduction.py +1088 -0
  294. tpyc/sema/macros.py +179 -0
  295. tpyc/sema/match.py +1177 -0
  296. tpyc/sema/method_expansion.py +347 -0
  297. tpyc/sema/methods.py +2197 -0
  298. tpyc/sema/mutation_propagation.py +268 -0
  299. tpyc/sema/narrowing.py +857 -0
  300. tpyc/sema/numeric_lattice.py +160 -0
  301. tpyc/sema/operators.py +402 -0
  302. tpyc/sema/overloads.py +841 -0
  303. tpyc/sema/protocols.py +1209 -0
  304. tpyc/sema/reach_analysis.py +202 -0
  305. tpyc/sema/registration.py +3156 -0
  306. tpyc/sema/scope_tracker.py +193 -0
  307. tpyc/sema/statements.py +4426 -0
  308. tpyc/sema/type_ops.py +1879 -0
  309. tpyc/sema/value_range.py +181 -0
  310. tpyc/symbol_binding.py +259 -0
  311. tpyc/test_c3_mro.py +208 -0
  312. tpyc/test_cli_argv.py +52 -0
  313. tpyc/test_compiler.py +559 -0
  314. tpyc/test_contains_type_param.py +101 -0
  315. tpyc/test_cycle_detection.py +221 -0
  316. tpyc/test_dump_types.py +225 -0
  317. tpyc/test_install_docs.py +65 -0
  318. tpyc/test_local_cpp_form.py +135 -0
  319. tpyc/test_macro_loader.py +76 -0
  320. tpyc/test_method_expansion.py +254 -0
  321. tpyc/test_nominal_identity.py +182 -0
  322. tpyc/test_overloads.py +410 -0
  323. tpyc/test_parse.py +303 -0
  324. tpyc/test_parse_type_ref.py +506 -0
  325. tpyc/test_parse_version_info.py +58 -0
  326. tpyc/test_reach_analysis.py +72 -0
  327. tpyc/test_ref_type.py +216 -0
  328. tpyc/test_send_sync_substitution.py +276 -0
  329. tpyc/test_tuple_mutation_propagation.py +206 -0
  330. tpyc/test_type_def_registry.py +1729 -0
  331. tpyc/test_union_types.py +195 -0
  332. tpyc/type_def_registry.py +975 -0
  333. tpyc/typesys.py +5104 -0
@@ -0,0 +1,344 @@
1
+ /*
2
+ * Stack-less Just-In-Time compiler
3
+ *
4
+ * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without modification, are
7
+ * permitted provided that the following conditions are met:
8
+ *
9
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
10
+ * conditions and the following disclaimer.
11
+ *
12
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
13
+ * of conditions and the following disclaimer in the documentation and/or other materials
14
+ * provided with the distribution.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
17
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19
+ * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
+ */
26
+
27
+ /* ------------------------------------------------------------------------ */
28
+ /* Locks */
29
+ /* ------------------------------------------------------------------------ */
30
+
31
+ /* Executable Allocator */
32
+
33
+ #if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) \
34
+ && !(defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)
35
+ #if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)
36
+ #define SLJIT_ALLOCATOR_LOCK()
37
+ #define SLJIT_ALLOCATOR_UNLOCK()
38
+ #elif !(defined _WIN32)
39
+ #include <pthread.h>
40
+
41
+ static pthread_mutex_t allocator_lock = PTHREAD_MUTEX_INITIALIZER;
42
+
43
+ #define SLJIT_ALLOCATOR_LOCK() pthread_mutex_lock(&allocator_lock)
44
+ #define SLJIT_ALLOCATOR_UNLOCK() pthread_mutex_unlock(&allocator_lock)
45
+ #else /* windows */
46
+ static HANDLE allocator_lock;
47
+
48
+ static SLJIT_INLINE void allocator_grab_lock(void)
49
+ {
50
+ HANDLE lock;
51
+ if (SLJIT_UNLIKELY(!InterlockedCompareExchangePointer(&allocator_lock, NULL, NULL))) {
52
+ lock = CreateMutex(NULL, FALSE, NULL);
53
+ if (InterlockedCompareExchangePointer(&allocator_lock, lock, NULL))
54
+ CloseHandle(lock);
55
+ }
56
+ WaitForSingleObject(allocator_lock, INFINITE);
57
+ }
58
+
59
+ #define SLJIT_ALLOCATOR_LOCK() allocator_grab_lock()
60
+ #define SLJIT_ALLOCATOR_UNLOCK() ReleaseMutex(allocator_lock)
61
+ #endif /* thread implementation */
62
+ #endif /* SLJIT_EXECUTABLE_ALLOCATOR && !SLJIT_WX_EXECUTABLE_ALLOCATOR */
63
+
64
+ /* ------------------------------------------------------------------------ */
65
+ /* Stack */
66
+ /* ------------------------------------------------------------------------ */
67
+
68
+ #if ((defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) \
69
+ && !(defined SLJIT_UTIL_SIMPLE_STACK_ALLOCATION && SLJIT_UTIL_SIMPLE_STACK_ALLOCATION)) \
70
+ || ((defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR) \
71
+ && !((defined SLJIT_PROT_EXECUTABLE_ALLOCATOR && SLJIT_PROT_EXECUTABLE_ALLOCATOR) \
72
+ || (defined SLJIT_WX_EXECUTABLE_ALLOCATOR && SLJIT_WX_EXECUTABLE_ALLOCATOR)))
73
+
74
+ #ifndef _WIN32
75
+ /* Provides mmap function. */
76
+ #include <sys/types.h>
77
+ #include <sys/mman.h>
78
+
79
+ #ifndef MAP_ANON
80
+ #ifdef MAP_ANONYMOUS
81
+ #define MAP_ANON MAP_ANONYMOUS
82
+ #endif /* MAP_ANONYMOUS */
83
+ #endif /* !MAP_ANON */
84
+
85
+ #ifndef MAP_ANON
86
+
87
+ #include <fcntl.h>
88
+
89
+ #ifdef O_CLOEXEC
90
+ #define SLJIT_CLOEXEC O_CLOEXEC
91
+ #else /* !O_CLOEXEC */
92
+ #define SLJIT_CLOEXEC 0
93
+ #endif /* O_CLOEXEC */
94
+
95
+ /* Some old systems do not have MAP_ANON. */
96
+ static int dev_zero = -1;
97
+
98
+ #if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)
99
+
100
+ static SLJIT_INLINE int open_dev_zero(void)
101
+ {
102
+ dev_zero = open("/dev/zero", O_RDWR | SLJIT_CLOEXEC);
103
+
104
+ return dev_zero < 0;
105
+ }
106
+
107
+ #else /* !SLJIT_SINGLE_THREADED */
108
+
109
+ #include <pthread.h>
110
+
111
+ static pthread_mutex_t dev_zero_mutex = PTHREAD_MUTEX_INITIALIZER;
112
+
113
+ static SLJIT_INLINE int open_dev_zero(void)
114
+ {
115
+ pthread_mutex_lock(&dev_zero_mutex);
116
+ if (SLJIT_UNLIKELY(dev_zero < 0))
117
+ dev_zero = open("/dev/zero", O_RDWR | SLJIT_CLOEXEC);
118
+
119
+ pthread_mutex_unlock(&dev_zero_mutex);
120
+ return dev_zero < 0;
121
+ }
122
+
123
+ #endif /* SLJIT_SINGLE_THREADED */
124
+ #undef SLJIT_CLOEXEC
125
+ #endif /* !MAP_ANON */
126
+ #endif /* !_WIN32 */
127
+ #endif /* open_dev_zero */
128
+
129
+ #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) \
130
+ || (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
131
+
132
+ #ifdef _WIN32
133
+
134
+ static SLJIT_INLINE sljit_uw get_page_alignment(void) {
135
+ SYSTEM_INFO si;
136
+ static sljit_uw sljit_page_align = 0;
137
+ if (!sljit_page_align) {
138
+ GetSystemInfo(&si);
139
+ sljit_page_align = (sljit_uw)si.dwPageSize - 1;
140
+ }
141
+ return sljit_page_align;
142
+ }
143
+
144
+ #else
145
+
146
+ #include <unistd.h>
147
+
148
+ static SLJIT_INLINE sljit_uw get_page_alignment(void) {
149
+ static sljit_uw sljit_page_align = 0;
150
+
151
+ sljit_sw align;
152
+
153
+ if (!sljit_page_align) {
154
+ #ifdef _SC_PAGESIZE
155
+ align = sysconf(_SC_PAGESIZE);
156
+ #else
157
+ align = getpagesize();
158
+ #endif
159
+ /* Should never happen. */
160
+ if (align < 0)
161
+ align = 4096;
162
+ sljit_page_align = (sljit_uw)align - 1;
163
+ }
164
+ return sljit_page_align;
165
+ }
166
+
167
+ #endif /* _WIN32 */
168
+
169
+ #endif /* get_page_alignment() */
170
+
171
+ #if (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK)
172
+
173
+ #if (defined SLJIT_UTIL_SIMPLE_STACK_ALLOCATION && SLJIT_UTIL_SIMPLE_STACK_ALLOCATION)
174
+
175
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data)
176
+ {
177
+ struct sljit_stack *stack;
178
+ void *ptr;
179
+
180
+ SLJIT_UNUSED_ARG(allocator_data);
181
+
182
+ if (start_size > max_size || start_size < 1)
183
+ return NULL;
184
+
185
+ stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack), allocator_data);
186
+ if (stack == NULL)
187
+ return NULL;
188
+
189
+ ptr = SLJIT_MALLOC(max_size, allocator_data);
190
+ if (ptr == NULL) {
191
+ SLJIT_FREE(stack, allocator_data);
192
+ return NULL;
193
+ }
194
+
195
+ stack->min_start = (sljit_u8 *)ptr;
196
+ stack->end = stack->min_start + max_size;
197
+ stack->start = stack->end - start_size;
198
+ stack->top = stack->end;
199
+ return stack;
200
+ }
201
+
202
+ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)
203
+ {
204
+ SLJIT_UNUSED_ARG(allocator_data);
205
+ SLJIT_FREE((void*)stack->min_start, allocator_data);
206
+ SLJIT_FREE(stack, allocator_data);
207
+ }
208
+
209
+ SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start)
210
+ {
211
+ if ((new_start < stack->min_start) || (new_start >= stack->end))
212
+ return NULL;
213
+ stack->start = new_start;
214
+ return new_start;
215
+ }
216
+
217
+ #else /* !SLJIT_UTIL_SIMPLE_STACK_ALLOCATION */
218
+
219
+ #ifdef _WIN32
220
+
221
+ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)
222
+ {
223
+ SLJIT_UNUSED_ARG(allocator_data);
224
+ VirtualFree((void*)stack->min_start, 0, MEM_RELEASE);
225
+ SLJIT_FREE(stack, allocator_data);
226
+ }
227
+
228
+ #else /* !_WIN32 */
229
+
230
+ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_FUNC sljit_free_stack(struct sljit_stack *stack, void *allocator_data)
231
+ {
232
+ SLJIT_UNUSED_ARG(allocator_data);
233
+ munmap((void*)stack->min_start, (size_t)(stack->end - stack->min_start));
234
+ SLJIT_FREE(stack, allocator_data);
235
+ }
236
+
237
+ #endif /* _WIN32 */
238
+
239
+ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_FUNC sljit_allocate_stack(sljit_uw start_size, sljit_uw max_size, void *allocator_data)
240
+ {
241
+ struct sljit_stack *stack;
242
+ void *ptr;
243
+ sljit_uw page_align;
244
+
245
+ SLJIT_UNUSED_ARG(allocator_data);
246
+
247
+ if (start_size > max_size || start_size < 1)
248
+ return NULL;
249
+
250
+ stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack), allocator_data);
251
+ if (stack == NULL)
252
+ return NULL;
253
+
254
+ /* Align max_size. */
255
+ page_align = get_page_alignment();
256
+ max_size = (max_size + page_align) & ~page_align;
257
+
258
+ #ifdef _WIN32
259
+ ptr = VirtualAlloc(NULL, max_size, MEM_RESERVE, PAGE_READWRITE);
260
+ if (!ptr) {
261
+ SLJIT_FREE(stack, allocator_data);
262
+ return NULL;
263
+ }
264
+
265
+ stack->min_start = (sljit_u8 *)ptr;
266
+ stack->end = stack->min_start + max_size;
267
+ stack->start = stack->end;
268
+
269
+ if (sljit_stack_resize(stack, stack->end - start_size) == NULL) {
270
+ sljit_free_stack(stack, allocator_data);
271
+ return NULL;
272
+ }
273
+ #else /* !_WIN32 */
274
+ #ifdef MAP_ANON
275
+ ptr = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
276
+ #else /* !MAP_ANON */
277
+ if (SLJIT_UNLIKELY((dev_zero < 0) && open_dev_zero())) {
278
+ SLJIT_FREE(stack, allocator_data);
279
+ return NULL;
280
+ }
281
+ ptr = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, dev_zero, 0);
282
+ #endif /* MAP_ANON */
283
+ if (ptr == MAP_FAILED) {
284
+ SLJIT_FREE(stack, allocator_data);
285
+ return NULL;
286
+ }
287
+ stack->min_start = (sljit_u8 *)ptr;
288
+ stack->end = stack->min_start + max_size;
289
+ stack->start = stack->end - start_size;
290
+ #endif /* _WIN32 */
291
+
292
+ stack->top = stack->end;
293
+ return stack;
294
+ }
295
+
296
+ SLJIT_API_FUNC_ATTRIBUTE sljit_u8 *SLJIT_FUNC sljit_stack_resize(struct sljit_stack *stack, sljit_u8 *new_start)
297
+ {
298
+ #if defined _WIN32 || defined(POSIX_MADV_DONTNEED)
299
+ sljit_uw aligned_old_start;
300
+ sljit_uw aligned_new_start;
301
+ sljit_uw page_align;
302
+ #endif
303
+
304
+ if ((new_start < stack->min_start) || (new_start >= stack->end))
305
+ return NULL;
306
+
307
+ #ifdef _WIN32
308
+ page_align = get_page_alignment();
309
+
310
+ aligned_new_start = (sljit_uw)new_start & ~page_align;
311
+ aligned_old_start = ((sljit_uw)stack->start) & ~page_align;
312
+ if (aligned_new_start != aligned_old_start) {
313
+ if (aligned_new_start < aligned_old_start) {
314
+ if (!VirtualAlloc((void*)aligned_new_start, aligned_old_start - aligned_new_start, MEM_COMMIT, PAGE_READWRITE))
315
+ return NULL;
316
+ }
317
+ else {
318
+ if (!VirtualFree((void*)aligned_old_start, aligned_new_start - aligned_old_start, MEM_DECOMMIT))
319
+ return NULL;
320
+ }
321
+ }
322
+ #elif defined(POSIX_MADV_DONTNEED)
323
+ if (stack->start < new_start) {
324
+ page_align = get_page_alignment();
325
+
326
+ aligned_new_start = (sljit_uw)new_start & ~page_align;
327
+ aligned_old_start = ((sljit_uw)stack->start) & ~page_align;
328
+
329
+ if (aligned_new_start > aligned_old_start) {
330
+ posix_madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, POSIX_MADV_DONTNEED);
331
+ #ifdef MADV_FREE
332
+ madvise((void*)aligned_old_start, aligned_new_start - aligned_old_start, MADV_FREE);
333
+ #endif /* MADV_FREE */
334
+ }
335
+ }
336
+ #endif /* _WIN32 */
337
+
338
+ stack->start = new_start;
339
+ return new_start;
340
+ }
341
+
342
+ #endif /* SLJIT_UTIL_SIMPLE_STACK_ALLOCATION */
343
+
344
+ #endif /* SLJIT_UTIL_STACK */
@@ -0,0 +1,54 @@
1
+ # PCRE2 8-bit build sources.
2
+ #
3
+ # Canonical list for libpcre2-8, taken from PCRE2's upstream
4
+ # NON-AUTOTOOLS-BUILD documentation. tpyc/build/pcre2.py reads this file
5
+ # to drive compilation when PCRE2 is built in bundled mode. Keep in
6
+ # sync with upstream when bumping the vendored PCRE2 version.
7
+ #
8
+ # Files in src/ NOT listed here and why they're excluded:
9
+ # * Standalone tools with their own main():
10
+ # pcre2grep.c, pcre2test.c, pcre2demo.c
11
+ # * Test harnesses:
12
+ # pcre2_jit_test.c, pcre2posix_test.c, pcre2_fuzzsupport.c
13
+ # * Build helpers (we ship the pre-generated output):
14
+ # pcre2_dftables.c (generates pcre2_chartables.c at build time)
15
+ # * Separate library (POSIX wrapper, different .a):
16
+ # pcre2posix.c
17
+ # * Files meant to be `#include`d from other .c files, not compiled
18
+ # directly -- compiling them would produce duplicate symbols:
19
+ # pcre2_printint.c (#include'd by pcre2test, pcre2_dftables)
20
+ # pcre2_jit_match.c (#include'd by pcre2_jit_compile.c)
21
+ # pcre2_jit_misc.c (#include'd by pcre2_jit_compile.c)
22
+ # pcre2_ucptables.c (#include'd by pcre2_tables.c)
23
+ #
24
+ # Format: one filename per line, relative to the vendored `src/` dir.
25
+ # Blank lines and `#` comments ignored.
26
+
27
+ pcre2_auto_possess.c
28
+ pcre2_chartables.c
29
+ pcre2_chkdint.c
30
+ pcre2_compile.c
31
+ pcre2_config.c
32
+ pcre2_context.c
33
+ pcre2_convert.c
34
+ pcre2_dfa_match.c
35
+ pcre2_error.c
36
+ pcre2_extuni.c
37
+ pcre2_find_bracket.c
38
+ pcre2_jit_compile.c
39
+ pcre2_maketables.c
40
+ pcre2_match.c
41
+ pcre2_match_data.c
42
+ pcre2_newline.c
43
+ pcre2_ord2utf.c
44
+ pcre2_pattern_info.c
45
+ pcre2_script_run.c
46
+ pcre2_serialize.c
47
+ pcre2_string_utils.c
48
+ pcre2_study.c
49
+ pcre2_substitute.c
50
+ pcre2_substring.c
51
+ pcre2_tables.c
52
+ pcre2_ucd.c
53
+ pcre2_valid_utf.c
54
+ pcre2_xclass.c
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "pcre2",
3
+ "version": "10.44",
4
+ "url": "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.gz",
5
+ "sha256": "86b9cb0aa3bcb7994faa88018292bc704cdbb708e785f7c74352ff6ea7d3175b",
6
+ "vendored_at": "2026-04-20T00:00:00+00:00"
7
+ }
tpyc/build/__init__.py ADDED
@@ -0,0 +1,7 @@
1
+ """Build-side helpers for tpyc: third-party dependency resolution, etc.
2
+
3
+ This package hosts modules that deal with the boundary between generated
4
+ C++ and external build inputs (third-party libraries, bundled sources,
5
+ CMake snippet emission). Kept separate from `tpyc/compiler.py` so the
6
+ build concerns don't accumulate there.
7
+ """
tpyc/build/pcre2.py ADDED
@@ -0,0 +1,122 @@
1
+ """PCRE2-specific build wiring. Registered in
2
+ ``tpyc/build/third_party.py::_FACTORIES``.
3
+
4
+ PCRE2 ships a "non-autotools" build path: rename a few ``.generic`` /
5
+ ``.dist`` template files, then compile the .c files with
6
+ ``-DPCRE2_CODE_UNIT_WIDTH=8`` and ``-DHAVE_CONFIG_H``. We pre-materialize
7
+ the templates at vendoring time (``scripts/vendor_pcre2.py``), so all
8
+ the direct-compile path does here is:
9
+
10
+ * enumerate the .c files (from the sidecar manifest
11
+ ``runtime/cpp/third_party/pcre2.sources.txt``, next to the vendored
12
+ tree to keep the upstream tree pristine);
13
+ * emit the fixed -I / -D flags;
14
+ * point dependents at the include dir that holds pcre2.h.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from pathlib import Path
20
+
21
+ from .third_party import ThirdPartyLib, read_source_manifest
22
+
23
+
24
+ # Manifest lives next to the vendored tree, not inside it, so the
25
+ # upstream tree stays pristine (same reason pcre2.vendor.json lives
26
+ # outside). Filename mirrors the vendor.json sidecar.
27
+ _SOURCE_MANIFEST = "pcre2.sources.txt"
28
+
29
+
30
+ def _source_files(lib: ThirdPartyLib) -> list[Path]:
31
+ """Return the list of PCRE2 .c files to compile into libpcre2-8.
32
+
33
+ Reads the sidecar manifest next to the vendored source tree rather
34
+ than globbing -- globbing would sweep in files that aren't meant to
35
+ be compiled directly (standalone tools, test harnesses, .c files
36
+ that exist only to be #included by others). The manifest is the
37
+ canonical source list from upstream PCRE2's NON-AUTOTOOLS-BUILD doc.
38
+ """
39
+ if lib.bundled_source_dir is None:
40
+ raise RuntimeError(f"{lib.name}: no bundled source dir configured")
41
+ src_dir = lib.bundled_source_dir / "src"
42
+ if not src_dir.is_dir():
43
+ raise FileNotFoundError(
44
+ f"{lib.name}: bundled src/ not found at {src_dir}"
45
+ )
46
+ manifest = lib.bundled_source_dir.parent / _SOURCE_MANIFEST
47
+ if not manifest.is_file():
48
+ raise FileNotFoundError(
49
+ f"{lib.name}: source manifest not found at {manifest}"
50
+ )
51
+ paths: list[Path] = []
52
+ for name in read_source_manifest(manifest):
53
+ p = src_dir / name
54
+ if not p.is_file():
55
+ raise FileNotFoundError(
56
+ f"{lib.name}: expected source file missing: {p} "
57
+ f"(listed in {manifest})"
58
+ )
59
+ paths.append(p)
60
+ return paths
61
+
62
+
63
+ def _compile_flags(lib: ThirdPartyLib) -> list[str]:
64
+ """C-compiler flags needed to build a PCRE2 .c file.
65
+
66
+ -I<src_dir> is required so PCRE2's internal headers (pcre2_internal.h,
67
+ pcre2.h, config.h) resolve. -DHAVE_CONFIG_H tells PCRE2 to include
68
+ config.h (which we materialized from config.h.generic at vendoring
69
+ time with SUPPORT_PCRE2_8 / SUPPORT_JIT / SUPPORT_UNICODE enabled).
70
+ """
71
+ if lib.bundled_source_dir is None:
72
+ raise RuntimeError(f"{lib.name}: no bundled source dir configured")
73
+ return [
74
+ "-DHAVE_CONFIG_H",
75
+ "-DPCRE2_CODE_UNIT_WIDTH=8",
76
+ f"-I{lib.bundled_source_dir / 'src'}",
77
+ ]
78
+
79
+
80
+ def _user_include_dir(lib: ThirdPartyLib) -> Path:
81
+ """Path containing pcre2.h for user code to ``#include``.
82
+ Same dir as the source files; PCRE2 keeps everything in ``src/``."""
83
+ if lib.bundled_source_dir is None:
84
+ raise RuntimeError(f"{lib.name}: no bundled source dir configured")
85
+ return lib.bundled_source_dir / "src"
86
+
87
+
88
+ def factory(runtime_cpp_dir: Path) -> ThirdPartyLib:
89
+ """Build the PCRE2 ``ThirdPartyLib`` declaration.
90
+
91
+ Vendored build options picked for TPy's use:
92
+ * 8-bit only -- Python str maps to UTF-8 bytes; 16/32-bit unused.
93
+ * JIT on -- ~10x match-time speedup, widely supported.
94
+ * Tests + pcre2grep off -- we validate via our own test cases, and
95
+ the grep CLI utility doesn't belong in a runtime build.
96
+ """
97
+ return ThirdPartyLib(
98
+ name="pcre2",
99
+ cli_flag="--pcre2",
100
+ cmake_var="TPY_PCRE2",
101
+ default_mode="bundled",
102
+ min_version="10.35",
103
+ find_package_name="PCRE2",
104
+ find_package_components=("8BIT",),
105
+ find_package_target="PCRE2::8BIT",
106
+ pkgconfig_name="libpcre2-8",
107
+ system_link_flags=("-lpcre2-8",),
108
+ bundled_source_dir=runtime_cpp_dir / "third_party" / "pcre2",
109
+ bundled_cmake_vars={
110
+ "PCRE2_BUILD_PCRE2_8": "ON",
111
+ "PCRE2_BUILD_PCRE2_16": "OFF",
112
+ "PCRE2_BUILD_PCRE2_32": "OFF",
113
+ "PCRE2_SUPPORT_JIT": "ON",
114
+ "PCRE2_BUILD_TESTS": "OFF",
115
+ "PCRE2_BUILD_PCRE2GREP": "OFF",
116
+ },
117
+ bundled_static_target="pcre2-8-static",
118
+ license_file="LICENCE",
119
+ bundled_source_files=_source_files,
120
+ bundled_compile_flags=_compile_flags,
121
+ bundled_user_include_dir=_user_include_dir,
122
+ )