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,77 @@
1
+ # tpy: cpp_namespace("tpystd::typing")
2
+ from tpy import Int32
3
+ from .._bootstrap._decorators import readonly
4
+ from .._bootstrap._extern import builtin_type, builtin_decorator, builtin_function
5
+
6
+
7
+ @builtin_type("typing.Protocol")
8
+ class Protocol: ...
9
+
10
+ @builtin_type("typing.Self")
11
+ class Self: ...
12
+
13
+ @builtin_type("typing.Optional")
14
+ class Optional: ...
15
+
16
+ @builtin_type("typing.Any")
17
+ class Any:
18
+ """Type-erased value cell. Holds any concrete copyable value.
19
+ Use `typing.cast(T, x)` or `isinstance(x, T)` to extract."""
20
+
21
+ @builtin_type("typing.Final")
22
+ class Final: ...
23
+
24
+ @builtin_type("typing.ClassVar")
25
+ class ClassVar: ...
26
+
27
+ @builtin_type("typing.Callable")
28
+ class Callable: ...
29
+
30
+ @builtin_type("typing.Literal")
31
+ class Literal: ...
32
+
33
+ @builtin_type("typing.TypedDict")
34
+ class TypedDict: ...
35
+
36
+ @builtin_type("typing.Unpack")
37
+ class Unpack: ...
38
+
39
+ @builtin_decorator("typing.overload")
40
+ def overload(): ...
41
+
42
+ @builtin_decorator("typing.override")
43
+ def override(): ...
44
+
45
+ # typing.cast(T, x): static-only no-op in CPython; in TPy compiled
46
+ # binaries this gets runtime panic-on-mismatch semantics when the source
47
+ # is Any. Signature is illustrative; sema/codegen handle this specially.
48
+ @builtin_function("typing.cast")
49
+ def cast(target_type, value): ...
50
+
51
+
52
+ class Sized(Protocol):
53
+ @readonly
54
+ def __len__(self) -> Int32: ...
55
+
56
+
57
+ class Sequence[T](Protocol):
58
+ @readonly
59
+ def __len__(self) -> Int32: ...
60
+ @readonly
61
+ def __getitem__(self, index: Int32) -> T: ...
62
+
63
+
64
+ class MutableSequence[T](Protocol):
65
+ @readonly
66
+ def __len__(self) -> Int32: ...
67
+ def __getitem__(self, index: Int32) -> T: ...
68
+ def __setitem__(self, index: Int32, value: T) -> None: ...
69
+
70
+
71
+ class Iterator[T](Protocol):
72
+ def __next__(self) -> T: ...
73
+ def __iter__(self) -> Self: ...
74
+
75
+
76
+ class Iterable[T](Protocol):
77
+ def __iter__(self) -> Iterator[T]: ...
@@ -0,0 +1,29 @@
1
+ # tpy: macro_module
2
+ """Compile-time macros exposing the tpyc compiler version to user code.
3
+
4
+ Consumed by tpy/version.py to initialise tpy.version.__version__ and
5
+ tpy.version.version_info. Each macro runs during compilation (via the
6
+ macro loader running on CPython) and emits a literal expression that
7
+ the compiler splices into the generated C++ as a constant.
8
+ """
9
+
10
+ from tpyc.macro_api import (
11
+ __version__ as _v, VERSION_INFO as _vi,
12
+ CallMacroContext, Expr, call_macro, ast,
13
+ )
14
+
15
+
16
+ @call_macro
17
+ def version(ctx: CallMacroContext) -> Expr:
18
+ return ast.str_lit(_v)
19
+
20
+
21
+ @call_macro
22
+ def version_info(ctx: CallMacroContext) -> Expr:
23
+ return ast.tuple_lit([
24
+ ast.int_lit(_vi[0]),
25
+ ast.int_lit(_vi[1]),
26
+ ast.int_lit(_vi[2]),
27
+ ast.str_lit(_vi[3]),
28
+ ast.int_lit(_vi[4]),
29
+ ])
@@ -0,0 +1,28 @@
1
+ # tpy.bits -- bit manipulation primitives for fixed-width integers.
2
+ #
3
+ # Wraps C++20 <bit> (std::rotl/std::rotr) and C++23 <bit> (std::byteswap).
4
+ # Rotations don't lose bits by construction; byteswap is endianness-neutral.
5
+ # Use these instead of hand-rolled `(x << n) | (x >> (w-n))` which would
6
+ # trip TPy's overflow-checked left shift.
7
+ # tpy: native_module
8
+ # tpy: cpp_namespace("tpy::bits")
9
+ from tpy.extern import cpp_template
10
+ from tpy import Int32, UInt32, UInt64
11
+
12
+ @cpp_template("std::rotl<uint32_t>({0}, {1})")
13
+ def rotl32(x: UInt32, n: Int32) -> UInt32: ...
14
+
15
+ @cpp_template("std::rotr<uint32_t>({0}, {1})")
16
+ def rotr32(x: UInt32, n: Int32) -> UInt32: ...
17
+
18
+ @cpp_template("std::rotl<uint64_t>({0}, {1})")
19
+ def rotl64(x: UInt64, n: Int32) -> UInt64: ...
20
+
21
+ @cpp_template("std::rotr<uint64_t>({0}, {1})")
22
+ def rotr64(x: UInt64, n: Int32) -> UInt64: ...
23
+
24
+ @cpp_template("std::byteswap<uint32_t>({0})")
25
+ def byteswap32(x: UInt32) -> UInt32: ...
26
+
27
+ @cpp_template("std::byteswap<uint64_t>({0})")
28
+ def byteswap64(x: UInt64) -> UInt64: ...
@@ -0,0 +1,127 @@
1
+ # tpy: cpp_namespace("tpystd::coro")
2
+ """Coroutine / async runtime primitives.
3
+
4
+ Module name borrowed from the design-doc's `Coroutine[T]` terminology
5
+ (see Rust `std::task` / Tokio `tokio::task` for prior art).
6
+ """
7
+ from .._typing import Protocol
8
+ from .._bootstrap._decorators import Own, dynamic
9
+ from .._bootstrap._extern import builtin_type
10
+ from .._builtins._exceptions import CancelledError
11
+ from .._core import Poll, Ptr, ValueType, Int32
12
+
13
+
14
+ # The dispatch target for `Waker.wake()`. `asyncio.Executor` inherits
15
+ # this protocol; Waker holds a `Ptr[Awaker]` to the running executor and
16
+ # calls `mark_runnable` through the @dynamic vtable. The only concrete
17
+ # implementer today lives in `asyncio._executor`.
18
+ #
19
+ # `register_timer(deadline, Waker)` would form an `Awaker` <-> `Waker`
20
+ # forward-declaration cycle in generated C++ headers if it lived on
21
+ # this protocol; timer registration goes through a direct
22
+ # `Executor.register_timer(...)` call in `asyncio/__init__.py` where
23
+ # the concrete `Ptr[Executor]` handle is available.
24
+ @dynamic
25
+ class Awaker(Protocol):
26
+ def mark_runnable(self, task_id: Int32, generation: Int32) -> None: ...
27
+
28
+
29
+ @builtin_type("tpy.coro.Waker")
30
+ class Waker(ValueType):
31
+ """Handle that lets a parked task be re-scheduled.
32
+
33
+ Awaitables that haven't yet produced a value store the Waker passed
34
+ to their poll() method; when the underlying event fires, they call
35
+ waker.wake() to signal the executor that the parked task is runnable.
36
+
37
+ Layout: a non-owning `Ptr[Awaker]` to the running executor + a
38
+ (task_id, generation) slot identifier. Late wakes (from a task that
39
+ completed before wake() fires) are filtered by the executor's
40
+ generation check.
41
+ """
42
+ awaker: Ptr[Awaker]
43
+ task_id: Int32
44
+ generation: Int32
45
+
46
+ def __init__(self) -> None:
47
+ self.awaker = None
48
+ self.task_id = 0
49
+ self.generation = 0
50
+
51
+ # Not @readonly: wake() doesn't mutate self, but it dispatches into
52
+ # the awaker's `mark_runnable`, which mutates the executor's runnable
53
+ # queue. Marking wake() readonly would narrow `self.awaker` to
54
+ # `Ptr[readonly[Awaker]]` and reject the call.
55
+ def wake(self) -> None:
56
+ if self.awaker is None:
57
+ return
58
+ try:
59
+ self.awaker.mark_runnable(self.task_id, self.generation)
60
+ except BaseException:
61
+ # Swallow: mark_runnable can raise (e.g. OOM in the
62
+ # runnable-queue push) and wake() has no useful error
63
+ # channel. Use-after-free against a torn-down executor is
64
+ # the caller's invariant -- see `_ExecutorScope` in
65
+ # `lib/tpy/asyncio/_executor.py`.
66
+ pass
67
+
68
+
69
+ # Structural awaitable. Distinct from `typing.Awaitable[T]` (CPython's
70
+ # `__await__`-based shape) -- TPy uses `__poll__(Waker) -> Poll[T]`.
71
+ # The dunder name matches how other TPy/typing structural protocols
72
+ # spell their required methods (`__iter__`, `__hash__`, `__lt__`, ...)
73
+ # and signals "runtime protocol method -- prefer `await` / `poll_once`
74
+ # to direct calls".
75
+ class Awaitable[T](Protocol):
76
+ def __poll__(self, waker: Waker) -> Own[Poll[T]]: ...
77
+
78
+
79
+ # Cancellable awaitable -- the @dynamic protocol every consumer of
80
+ # asyncio's cancellation machinery accepts (`run`, `create_task`,
81
+ # `wait_for`, `Task[T]` storage, ...). Structurally extends `Awaitable`
82
+ # with a `cancel()` precondition that lets the task layer deliver a
83
+ # `CancelledError` at the awaitee's next suspension. gen_async.py
84
+ # auto-emits cancel() on every coro struct, so any compiled `async def`
85
+ # conforms automatically. Re-exported from `asyncio` for user-facing
86
+ # API typing.
87
+ @dynamic
88
+ class Cancellable[T](Protocol):
89
+ def __poll__(self, waker: Waker) -> Own[Poll[T]]: ...
90
+ def cancel(self) -> None: ...
91
+
92
+
93
+ # `AnyTask` (@dynamic protocol used by the task machinery) lives in
94
+ # `asyncio._executor` -- it sits on tplib, which isn't reachable from
95
+ # this implicit-stdlib module.
96
+
97
+
98
+ def poll_ready[T](value: Own[T]) -> Own[Poll[T]]:
99
+ return Poll[T].ready(value)
100
+
101
+
102
+ def poll_pending[T]() -> Own[Poll[T]]:
103
+ return Poll[T].pending()
104
+
105
+
106
+ # Separate factory because `poll_ready[T](value)` needs an `Own[T]`
107
+ # argument that `Own[None]` can't satisfy with no payload.
108
+ def poll_ready_none() -> Own[Poll[None]]:
109
+ return Poll[None].ready(None)
110
+
111
+
112
+ # Synchronous one-step driver. Calls `__poll__(Waker())` once and
113
+ # returns the Poll[T] for the caller to inspect. Useful for tests and
114
+ # synchronous drivers that don't go through `asyncio.run`.
115
+ def poll_once[T](aw: Awaitable[T]) -> Own[Poll[T]]:
116
+ return aw.__poll__(Waker())
117
+
118
+
119
+ # Poll an awaitable once and report whether it raised CancelledError.
120
+ # Test convenience: production code should `try: await aw / except
121
+ # CancelledError` directly. Pure TPy body.
122
+ def task_poll_cancelled[T](aw: Awaitable[T]) -> bool:
123
+ try:
124
+ aw.__poll__(Waker())
125
+ return False
126
+ except CancelledError:
127
+ return True
@@ -0,0 +1,8 @@
1
+ # tpy: native_module
2
+ from ._bootstrap._extern import (
3
+ builtin_decorator, builtin_type,
4
+ native, export, cpp_template,
5
+ value_ptr_coercion, native_preserves_refs,
6
+ native_global, native_field, native_member,
7
+ type_param_default, DefaultInt,
8
+ )
@@ -0,0 +1,49 @@
1
+ # tpy: native_module
2
+ from tpy.extern import native
3
+ from tpy import Ptr, Own, UInt32, Span, nocopy, readonly
4
+
5
+ @native("tpy::UninitArrayStorage")
6
+ @nocopy
7
+ class UninitArrayStorage[T, N: int]:
8
+ """Inline uninitialized storage for N elements of type T."""
9
+ def __init__(self) -> None: ...
10
+ def init(self, index: UInt32, value: Own[T]) -> None: ...
11
+ def drop(self, index: UInt32) -> None: ...
12
+ @readonly
13
+ def load(self, index: UInt32) -> T: ...
14
+ def init0(self, value: Own[T]) -> None: ...
15
+ def drop0(self) -> None: ...
16
+ @readonly
17
+ def load0(self) -> T: ...
18
+ def take(self, index: UInt32) -> Own[T]: ...
19
+ def take0(self) -> Own[T]: ...
20
+ @readonly
21
+ def capacity(self) -> UInt32: ...
22
+ def init_from_span(self, start: UInt32, src: Span[readonly[T]]) -> None: ...
23
+ def drop_n(self, start: UInt32, count: UInt32) -> None: ...
24
+ def shift(self, src: UInt32, dst: UInt32, count: UInt32) -> None: ...
25
+ @readonly
26
+ def ptr(self) -> Ptr[T]: ...
27
+
28
+ @native("tpy::UninitHeapStorage")
29
+ @nocopy
30
+ class UninitHeapStorage[T]:
31
+ """Heap-allocated uninitialized storage with dynamic capacity."""
32
+ def __init__(self, capacity: UInt32) -> None: ...
33
+ def init(self, index: UInt32, value: Own[T]) -> None: ...
34
+ def drop(self, index: UInt32) -> None: ...
35
+ @readonly
36
+ def load(self, index: UInt32) -> T: ...
37
+ def init0(self, value: Own[T]) -> None: ...
38
+ def drop0(self) -> None: ...
39
+ @readonly
40
+ def load0(self) -> T: ...
41
+ def take(self, index: UInt32) -> Own[T]: ...
42
+ def take0(self) -> Own[T]: ...
43
+ @readonly
44
+ def capacity(self) -> UInt32: ...
45
+ def init_from_span(self, start: UInt32, src: Span[readonly[T]]) -> None: ...
46
+ def drop_n(self, start: UInt32, count: UInt32) -> None: ...
47
+ def shift(self, src: UInt32, dst: UInt32, count: UInt32) -> None: ...
48
+ @readonly
49
+ def ptr(self) -> Ptr[T]: ...
@@ -0,0 +1,195 @@
1
+ # tpy: native_module
2
+ from typing import overload
3
+ from tpy.extern import native, cpp_template
4
+ from tpy import Ptr, Own, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, StrView, Char, Array, readonly
5
+
6
+ # unsafe_ptr: get a raw pointer from a container or string
7
+ @overload
8
+ @cpp_template("{0}.data()")
9
+ def unsafe_ptr(s: str) -> Ptr[readonly[Char]]: ...
10
+
11
+ @overload
12
+ @cpp_template("{0}.data()")
13
+ def unsafe_ptr[T, N: int](a: Array[T, N]) -> Ptr[T]: ...
14
+
15
+ @overload
16
+ @cpp_template("{0}.data()")
17
+ def unsafe_ptr[T](l: list[T]) -> Ptr[T]: ...
18
+
19
+ @overload
20
+ @cpp_template("{0}.data()")
21
+ def unsafe_ptr(b: bytes) -> Ptr[readonly[UInt8]]: ...
22
+
23
+ # unsafe_cast: reinterpret a pointer as a different pointee type
24
+ # TODO: add @compiler_check decorator to make sema validation visible here
25
+ # (currently keyed on qualified_name in calls.py: const-safety, type hint checks)
26
+ #
27
+ # Uses `{cpp}` (the return-type spelling) rather than `{T}*` so the
28
+ # PtrType -> void* special-case for `T = None` is preserved -- bare
29
+ # `{T}*` substitutes T via to_cpp_stored() and produces
30
+ # `std::monostate*`, defeating the opaque-pointer-for-@native-C-interop
31
+ # convention of `Ptr[None]`.
32
+ @overload
33
+ @cpp_template("reinterpret_cast<{cpp}>({0})")
34
+ def unsafe_cast[T, U](p: Ptr[U]) -> Ptr[T]: ...
35
+
36
+ @overload
37
+ @cpp_template("reinterpret_cast<{cpp}>({0})")
38
+ def unsafe_cast[T, U](p: Ptr[readonly[U]]) -> Ptr[readonly[T]]: ...
39
+
40
+ # unsafe_load: read a value through a pointer at offset
41
+ @overload
42
+ @cpp_template("{0}[{1}]")
43
+ def unsafe_load[T](p: Ptr[T], offset: UInt32) -> Own[T]: ...
44
+
45
+ @overload
46
+ @cpp_template("{0}[{1}]")
47
+ def unsafe_load[T](p: Ptr[readonly[T]], offset: UInt32) -> Own[T]: ...
48
+
49
+ # unsafe_store: write a value through a pointer at offset
50
+ @cpp_template("{0}[{1}] = {2}")
51
+ def unsafe_store[T](p: Ptr[T], offset: UInt32, value: T) -> None: ...
52
+
53
+ # unsafe_copy_n: copy N elements between pointers
54
+ @overload
55
+ @cpp_template("std::copy_n({1}, {2}, {0})")
56
+ def unsafe_copy_n[T](dest: Ptr[T], src: Ptr[T], count: UInt32) -> None: ...
57
+
58
+ @overload
59
+ @cpp_template("std::copy_n({1}, {2}, {0})")
60
+ def unsafe_copy_n[T](dest: Ptr[T], src: Ptr[readonly[T]], count: UInt32) -> None: ...
61
+
62
+ # unsafe_const_cast: remove const from a pointer
63
+ @cpp_template("const_cast<{T}*>({0})")
64
+ def unsafe_const_cast[T](p: Ptr[readonly[T]]) -> Ptr[T]: ...
65
+
66
+ # unsafe_ptr_add: advance a pointer by a signed element offset
67
+ @overload
68
+ @cpp_template("({0} + {1})")
69
+ def unsafe_ptr_add[T](p: Ptr[T], delta: Int64) -> Ptr[T]: ...
70
+
71
+ @overload
72
+ @cpp_template("({0} + {1})")
73
+ def unsafe_ptr_add[T](p: Ptr[readonly[T]], delta: Int64) -> Ptr[readonly[T]]: ...
74
+
75
+ # unsafe_ptr_diff: distance between two pointers in elements
76
+ @overload
77
+ @cpp_template("static_cast<int64_t>({0} - {1})")
78
+ def unsafe_ptr_diff[T](p1: Ptr[T], p2: Ptr[T]) -> Int64: ...
79
+
80
+ @overload
81
+ @cpp_template("static_cast<int64_t>({0} - {1})")
82
+ def unsafe_ptr_diff[T](p1: Ptr[readonly[T]], p2: Ptr[readonly[T]]) -> Int64: ...
83
+
84
+ # unsafe_alloc: allocate raw memory for a single element
85
+ @cpp_template("static_cast<{T}*>(::operator new(sizeof({T}), std::align_val_t(alignof({T}))))")
86
+ def unsafe_alloc[T]() -> Ptr[T]: ...
87
+
88
+ # unsafe_alloc_n: allocate raw memory for N elements
89
+ @cpp_template("static_cast<{T}*>(::operator new(sizeof({T}) * {0}, std::align_val_t(alignof({T}))))")
90
+ def unsafe_alloc_n[T](count: UInt32) -> Ptr[T]: ...
91
+
92
+ # unsafe_free: free raw memory
93
+ @cpp_template("::operator delete({0}, std::align_val_t(alignof({T})))")
94
+ def unsafe_free[T](p: Ptr[T]) -> None: ...
95
+
96
+ # unsafe_init: placement-new construct an object
97
+ @cpp_template("::new(static_cast<void*>({0})) {T}({1})")
98
+ def unsafe_init[T](p: Ptr[T], value: Own[T]) -> None: ...
99
+
100
+ # unsafe_drop: call destructor
101
+ @native("tpy::destroy_at")
102
+ def unsafe_drop[T](p: Ptr[T]) -> None: ...
103
+
104
+ # unsafe_take: heap-allocate and move-in a value (combined alloc + init).
105
+ # Abstract-T case is handled by C++ overload resolution: heap_take has
106
+ # both a T&& primary and a unique_ptr<T> overload.
107
+ @native("tpy::heap_take")
108
+ def unsafe_take[T](value: Own[T]) -> Ptr[T]: ...
109
+
110
+ # unsafe_release: destruct and free a heap-allocated T (combined drop + free).
111
+ @native("tpy::heap_release")
112
+ def unsafe_release[T](p: Ptr[T]) -> None: ...
113
+
114
+ # unsafe_replace: replace the heap-stored T at p with value, returning the
115
+ # live slot pointer. Caller must write the returned pointer back to its
116
+ # storage slot -- for abstract @dynamic T the slot changes.
117
+ # Precondition: value must not alias *p.
118
+ @native("tpy::heap_replace")
119
+ def unsafe_replace[T](p: Ptr[T], value: Own[T]) -> Ptr[T]: ...
120
+
121
+ # unsafe_transfer_ownership: adopt a heap-allocated Ptr[T] as Own[T].
122
+ # After the call the input pointer is invalidated.
123
+ @native("tpy::transfer_ownership")
124
+ def unsafe_transfer_ownership[T](p: Ptr[T]) -> Own[T]: ...
125
+
126
+ # unsafe_move_out: move a value out of a pointer location
127
+ @cpp_template("std::move(*{0})")
128
+ def unsafe_move_out[T](p: Ptr[T]) -> Own[T]: ...
129
+
130
+ # unsafe_read_*: read typed values from a byte buffer at a byte offset.
131
+ # Uses reinterpret_cast -- safe on little-endian targets (x86, ARM).
132
+ @cpp_template("*reinterpret_cast<const int8_t*>({0}.data() + {1})")
133
+ def unsafe_read_i8(data: bytes, offset: Int32) -> Int8: ...
134
+
135
+ @cpp_template("({0})[{1}]")
136
+ def unsafe_read_u8(data: bytes, offset: Int32) -> UInt8: ...
137
+
138
+ @cpp_template("*reinterpret_cast<const int16_t*>({0}.data() + {1})")
139
+ def unsafe_read_i16(data: bytes, offset: Int32) -> Int16: ...
140
+
141
+ @cpp_template("*reinterpret_cast<const uint16_t*>({0}.data() + {1})")
142
+ def unsafe_read_u16(data: bytes, offset: Int32) -> UInt16: ...
143
+
144
+ @cpp_template("*reinterpret_cast<const int32_t*>({0}.data() + {1})")
145
+ def unsafe_read_i32(data: bytes, offset: Int32) -> Int32: ...
146
+
147
+ @cpp_template("*reinterpret_cast<const uint32_t*>({0}.data() + {1})")
148
+ def unsafe_read_u32(data: bytes, offset: Int32) -> UInt32: ...
149
+
150
+ @cpp_template("*reinterpret_cast<const int64_t*>({0}.data() + {1})")
151
+ def unsafe_read_i64(data: bytes, offset: Int32) -> Int64: ...
152
+
153
+ @cpp_template("*reinterpret_cast<const uint64_t*>({0}.data() + {1})")
154
+ def unsafe_read_u64(data: bytes, offset: Int32) -> UInt64: ...
155
+
156
+ @cpp_template("*reinterpret_cast<const float*>({0}.data() + {1})")
157
+ def unsafe_read_f32(data: bytes, offset: Int32) -> Float32: ...
158
+
159
+ @cpp_template("*reinterpret_cast<const double*>({0}.data() + {1})")
160
+ def unsafe_read_f64(data: bytes, offset: Int32) -> float: ...
161
+
162
+ @native("tpy::bytes_read_sub")
163
+ def unsafe_read_bytes(data: bytes, offset: Int32, count: Int32) -> bytes: ...
164
+
165
+ # unsafe_str_view: create a StrView from a pointer and length
166
+ @overload
167
+ @cpp_template("std::string_view({0}, {1})")
168
+ def unsafe_str_view(p: Ptr[Char], size: UInt32) -> StrView: ...
169
+
170
+ @overload
171
+ @cpp_template("std::string_view({0}, {1})")
172
+ def unsafe_str_view(p: Ptr[readonly[Char]], size: UInt32) -> StrView: ...
173
+
174
+ # unsafe_str_from_cstr: read a null-terminated C string into an owned TPy
175
+ # str. Caller ensures the pointer is valid and there is a \0 within the
176
+ # intended range. Typical use: wrap a `const char*` returned by a libc
177
+ # call (strerror, inet_ntop, gai_strerror, ...).
178
+ @cpp_template("std::string(reinterpret_cast<const char*>({0}))")
179
+ def unsafe_str_from_cstr(p: Ptr[readonly[UInt8]]) -> str: ...
180
+
181
+ # unsafe_str_from_buf: build an owned TPy str from a raw byte buffer of
182
+ # `size` bytes. No null terminator required. Typical use: decode the
183
+ # written portion of a pre-sized output buffer (pcre2 substitute, iconv,
184
+ # ...). Companion to unsafe_str_view above -- that one borrows, this one
185
+ # copies into owned storage.
186
+ @cpp_template("std::string(reinterpret_cast<const char*>({0}), static_cast<size_t>({1}))")
187
+ def unsafe_str_from_buf(p: Ptr[readonly[UInt8]], size: UInt64) -> str: ...
188
+
189
+ # unsafe_bytes_from_buf: construct an owned bytes from a raw byte buffer
190
+ # of `size` bytes. Caller ensures the pointer + range is valid for read.
191
+ # CPython's `bytes()` does not accept raw pointers (no buffer protocol
192
+ # exposure at that layer), so this can't be a bytes constructor overload;
193
+ # it lives here alongside other raw-memory constructors.
194
+ @cpp_template("std::vector<uint8_t>({0}, {0} + {1})")
195
+ def unsafe_bytes_from_buf(p: Ptr[UInt8], size: UInt64) -> bytes: ...
@@ -0,0 +1,21 @@
1
+ """Compiler/runtime version and implementation identification for TPy.
2
+
3
+ Usage:
4
+
5
+ from tpy.version import __version__, version_info, is_compiled
6
+
7
+ Lives as a dedicated submodule (not re-exported from tpy/__init__.py)
8
+ because variable re-exports through native_module facades and transitive
9
+ init-chain propagation through them are not currently supported. Values
10
+ come from the _version.py macros, which read tpyc.__version__ and
11
+ tpyc.VERSION_INFO at compile time.
12
+ """
13
+ from typing import Final
14
+ from tpy import Int32
15
+ from ._version import version as _version, version_info as _version_info
16
+
17
+ __version__: Final[str] = _version()
18
+ # Int32 components rather than `int` (BigInt): version numbers are small
19
+ # and BigInt would waste heap allocations on every access.
20
+ version_info: Final[tuple[Int32, Int32, Int32, str, Int32]] = _version_info()
21
+ is_compiled: Final[bool] = True
@@ -0,0 +1,13 @@
1
+ # tpy: native_module
2
+ # tpy: cpp_namespace("tpystd::typing")
3
+ from tpy._typing import (
4
+ Protocol, Self, overload, override,
5
+ Sized, Sequence, MutableSequence, Iterator, Iterable,
6
+ Optional, Final, ClassVar, Callable, Literal, TypedDict, Unpack, Any, cast,
7
+ )
8
+
9
+ __all__ = [
10
+ "Optional", "Protocol", "Self", "Sized", "Sequence", "MutableSequence",
11
+ "Iterator", "Iterable", "Final", "ClassVar", "override", "overload",
12
+ "Callable", "Literal", "TypedDict", "Unpack", "Any", "cast",
13
+ ]