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.
- tpy_lang-0.3.0.dev0.dist-info/METADATA +151 -0
- tpy_lang-0.3.0.dev0.dist-info/RECORD +333 -0
- tpy_lang-0.3.0.dev0.dist-info/WHEEL +4 -0
- tpy_lang-0.3.0.dev0.dist-info/entry_points.txt +3 -0
- tpyc/__init__.py +104 -0
- tpyc/__main__.py +6 -0
- tpyc/_buildinfo.py +1 -0
- tpyc/_data/docs/LANGUAGE_FEATURES.md +6278 -0
- tpyc/_data/docs/STDLIB_ROADMAP.md +1258 -0
- tpyc/_data/docs/TPY_FOR_AGENTS.md +556 -0
- tpyc/_data/lib/tpy/_bindings/__init__.py +6 -0
- tpyc/_data/lib/tpy/_bindings/pcre2.py +173 -0
- tpyc/_data/lib/tpy/_bindings/posix_socket.py +161 -0
- tpyc/_data/lib/tpy/_functools_macros.py +80 -0
- tpyc/_data/lib/tpy/_macro_helpers.py +161 -0
- tpyc/_data/lib/tpy/argparse.py +2062 -0
- tpyc/_data/lib/tpy/asyncio/__init__.py +744 -0
- tpyc/_data/lib/tpy/asyncio/_executor.py +515 -0
- tpyc/_data/lib/tpy/base64.py +410 -0
- tpyc/_data/lib/tpy/bisect.py +39 -0
- tpyc/_data/lib/tpy/builtins.py +38 -0
- tpyc/_data/lib/tpy/dataclasses.py +354 -0
- tpyc/_data/lib/tpy/enum.py +23 -0
- tpyc/_data/lib/tpy/functools.py +33 -0
- tpyc/_data/lib/tpy/hashlib.py +206 -0
- tpyc/_data/lib/tpy/heapq.py +118 -0
- tpyc/_data/lib/tpy/io.py +395 -0
- tpyc/_data/lib/tpy/json.py +221 -0
- tpyc/_data/lib/tpy/math.py +406 -0
- tpyc/_data/lib/tpy/random.py +597 -0
- tpyc/_data/lib/tpy/re.py +467 -0
- tpyc/_data/lib/tpy/socket.py +379 -0
- tpyc/_data/lib/tpy/struct.py +178 -0
- tpyc/_data/lib/tpy/sys.py +40 -0
- tpyc/_data/lib/tpy/time.py +39 -0
- tpyc/_data/lib/tpy/tpy/__init__.py +78 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/__init__.py +10 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/_decorators.py +37 -0
- tpyc/_data/lib/tpy/tpy/_bootstrap/_extern.py +64 -0
- tpyc/_data/lib/tpy/tpy/_builtins/__init__.py +11 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_bytes.py +378 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_dict.py +151 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_exceptions.py +125 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_funcs.py +681 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_io.py +97 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_list.py +127 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_range.py +52 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_set.py +139 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_super.py +11 -0
- tpyc/_data/lib/tpy/tpy/_builtins/_types.py +661 -0
- tpyc/_data/lib/tpy/tpy/_core/__init__.py +23 -0
- tpyc/_data/lib/tpy/tpy/_core/_bytes_view.py +129 -0
- tpyc/_data/lib/tpy/tpy/_core/_containers.py +137 -0
- tpyc/_data/lib/tpy/tpy/_core/_functions.py +40 -0
- tpyc/_data/lib/tpy/tpy/_core/_types.py +2061 -0
- tpyc/_data/lib/tpy/tpy/_typing/__init__.py +77 -0
- tpyc/_data/lib/tpy/tpy/_version.py +29 -0
- tpyc/_data/lib/tpy/tpy/bits.py +28 -0
- tpyc/_data/lib/tpy/tpy/coro/__init__.py +127 -0
- tpyc/_data/lib/tpy/tpy/extern.py +8 -0
- tpyc/_data/lib/tpy/tpy/mem.py +49 -0
- tpyc/_data/lib/tpy/tpy/unsafe.py +195 -0
- tpyc/_data/lib/tpy/tpy/version.py +21 -0
- tpyc/_data/lib/tpy/typing.py +13 -0
- tpyc/_data/runtime/cpp/include/tpy/any.hpp +461 -0
- tpyc/_data/runtime/cpp/include/tpy/as_ostream.hpp +117 -0
- tpyc/_data/runtime/cpp/include/tpy/async.hpp +76 -0
- tpyc/_data/runtime/cpp/include/tpy/bigint.hpp +1343 -0
- tpyc/_data/runtime/cpp/include/tpy/builtins.hpp +400 -0
- tpyc/_data/runtime/cpp/include/tpy/bytes_ops.hpp +469 -0
- tpyc/_data/runtime/cpp/include/tpy/container_ops.hpp +487 -0
- tpyc/_data/runtime/cpp/include/tpy/copy_iter.hpp +82 -0
- tpyc/_data/runtime/cpp/include/tpy/core.hpp +558 -0
- tpyc/_data/runtime/cpp/include/tpy/dict_ops.hpp +289 -0
- tpyc/_data/runtime/cpp/include/tpy/dunder.hpp +750 -0
- tpyc/_data/runtime/cpp/include/tpy/dynamic.hpp +44 -0
- tpyc/_data/runtime/cpp/include/tpy/enum.hpp +40 -0
- tpyc/_data/runtime/cpp/include/tpy/file.hpp +245 -0
- tpyc/_data/runtime/cpp/include/tpy/fixed_int.hpp +317 -0
- tpyc/_data/runtime/cpp/include/tpy/format.hpp +954 -0
- tpyc/_data/runtime/cpp/include/tpy/frame_slot.hpp +120 -0
- tpyc/_data/runtime/cpp/include/tpy/generator.hpp +47 -0
- tpyc/_data/runtime/cpp/include/tpy/iterable_ops.hpp +122 -0
- tpyc/_data/runtime/cpp/include/tpy/itertools.hpp +749 -0
- tpyc/_data/runtime/cpp/include/tpy/next_iter.hpp +82 -0
- tpyc/_data/runtime/cpp/include/tpy/ordered_map.hpp +518 -0
- tpyc/_data/runtime/cpp/include/tpy/ordered_set.hpp +337 -0
- tpyc/_data/runtime/cpp/include/tpy/own_iter.hpp +54 -0
- tpyc/_data/runtime/cpp/include/tpy/pascal_graph_sdl.hpp +192 -0
- tpyc/_data/runtime/cpp/include/tpy/printing.hpp +302 -0
- tpyc/_data/runtime/cpp/include/tpy/protocols.hpp +61 -0
- tpyc/_data/runtime/cpp/include/tpy/range.hpp +115 -0
- tpyc/_data/runtime/cpp/include/tpy/ranges.hpp +212 -0
- tpyc/_data/runtime/cpp/include/tpy/set_ops.hpp +265 -0
- tpyc/_data/runtime/cpp/include/tpy/slice.hpp +47 -0
- tpyc/_data/runtime/cpp/include/tpy/span_iter.hpp +42 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/math.hpp +41 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/pcre2_h.hpp +96 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/random.hpp +25 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/socket_h.hpp +145 -0
- tpyc/_data/runtime/cpp/include/tpy/stdlib/time.hpp +62 -0
- tpyc/_data/runtime/cpp/include/tpy/system.hpp +121 -0
- tpyc/_data/runtime/cpp/include/tpy/throwable.hpp +55 -0
- tpyc/_data/runtime/cpp/include/tpy/tpy.hpp +156 -0
- tpyc/_data/runtime/cpp/include/tpy/type_name.hpp +77 -0
- tpyc/_data/runtime/cpp/include/tpy/type_traits.hpp +240 -0
- tpyc/_data/runtime/cpp/include/tpy/uninit_array_storage.hpp +250 -0
- tpyc/_data/runtime/cpp/include/tpy/uninit_heap_storage.hpp +277 -0
- tpyc/_data/runtime/cpp/include/tpy/varargs.hpp +174 -0
- tpyc/_data/runtime/cpp/include/tpy/variant_ref.hpp +118 -0
- tpyc/_data/runtime/cpp/src/stdlib/socket_impl.cpp +104 -0
- tpyc/_data/runtime/cpp/third_party/README.md +58 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/AUTHORS +36 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/CMakeLists.txt +1233 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/COPYING +5 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/ChangeLog +3097 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/HACKING +853 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/INSTALL +368 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/LICENCE +94 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/NEWS +492 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/NON-AUTOTOOLS-BUILD +430 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/README +956 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/COPYING-CMAKE-SCRIPTS +22 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindEditline.cmake +16 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindPackageHandleStandardArgs.cmake +58 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/FindReadline.cmake +29 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config-version.cmake.in +15 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/cmake/pcre2-config.cmake.in +148 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/config-cmake.h.in +56 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-16.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-32.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-8.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/libpcre2-posix.pc.in +13 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/pcre2-config.in +121 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h +483 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.generic +483 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/config.h.in +460 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.generic +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2.h.in +1010 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_auto_possess.c +1371 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c +196 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chartables.c.dist +196 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_chkdint.c +96 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_compile.c +11001 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_config.c +252 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_context.c +510 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_convert.c +1189 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dfa_match.c +4119 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_dftables.c +297 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_error.c +345 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_extuni.c +162 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_find_bracket.c +219 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_fuzzsupport.c +792 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_internal.h +2084 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_intmodedep.h +940 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_compile.c +14972 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_match.c +200 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_misc.c +234 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_neon_inc.h +354 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_simd_inc.h +2355 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_jit_test.c +2528 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_maketables.c +165 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match.c +7777 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_match_data.c +185 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_newline.c +243 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ord2utf.c +120 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_pattern_info.c +432 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_printint.c +886 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_script_run.c +344 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_serialize.c +286 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_string_utils.c +237 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_study.c +1915 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substitute.c +1009 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_substring.c +550 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_tables.c +234 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucd.c +5460 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucp.h +396 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_ucptables.c +1533 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_valid_utf.c +398 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2_xclass.c +308 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2demo.c +497 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2grep.c +4606 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.c +425 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix.h +187 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2posix_test.c +209 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/pcre2test.c +9708 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorApple.c +137 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorCore.c +327 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorFreeBSD.c +89 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorPosix.c +62 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitExecAllocatorWindows.c +40 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorNetBSD.c +72 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitProtExecAllocatorPosix.c +172 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorPosix.c +141 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/allocator_src/sljitWXExecAllocatorWindows.c +102 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfig.h +142 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigCPU.h +188 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitConfigInternal.h +907 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.c +3561 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitLir.h +2466 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_32.c +4636 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_64.c +3491 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeARM_T2_32.c +4302 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeLOONGARCH_64.c +3765 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_32.c +472 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_64.c +387 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeMIPS_common.c +4259 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_32.c +485 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_64.c +719 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativePPC_common.c +3161 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_32.c +142 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_64.c +222 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeRISCV_common.c +3121 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeS390X.c +4526 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_32.c +1685 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_64.c +1398 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitNativeX86_common.c +5001 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitSerialize.c +516 -0
- tpyc/_data/runtime/cpp/third_party/pcre2/src/sljit/sljitUtils.c +344 -0
- tpyc/_data/runtime/cpp/third_party/pcre2.sources.txt +54 -0
- tpyc/_data/runtime/cpp/third_party/pcre2.vendor.json +7 -0
- tpyc/build/__init__.py +7 -0
- tpyc/build/pcre2.py +122 -0
- tpyc/build/third_party.py +413 -0
- tpyc/cli.py +822 -0
- tpyc/codegen_cpp/__init__.py +18 -0
- tpyc/codegen_cpp/builtins.py +484 -0
- tpyc/codegen_cpp/context.py +2064 -0
- tpyc/codegen_cpp/expressions.py +5940 -0
- tpyc/codegen_cpp/functions.py +1913 -0
- tpyc/codegen_cpp/gen_async.py +3258 -0
- tpyc/codegen_cpp/gen_generators.py +657 -0
- tpyc/codegen_cpp/generator.py +2258 -0
- tpyc/codegen_cpp/match.py +1997 -0
- tpyc/codegen_cpp/param_const.py +172 -0
- tpyc/codegen_cpp/protocols.py +907 -0
- tpyc/codegen_cpp/records.py +1654 -0
- tpyc/codegen_cpp/resumable_cfg.py +1651 -0
- tpyc/codegen_cpp/statements.py +4963 -0
- tpyc/codegen_cpp/string_dispatch.py +76 -0
- tpyc/codegen_cpp/test_context.py +46 -0
- tpyc/codegen_cpp/test_param_const.py +113 -0
- tpyc/codegen_cpp/test_resumable_cfg.py +182 -0
- tpyc/codegen_cpp/type_resolution.py +53 -0
- tpyc/codegen_cpp/types.py +436 -0
- tpyc/codegen_cpp/variant_access.py +135 -0
- tpyc/coercions.py +749 -0
- tpyc/compilation_context.py +57 -0
- tpyc/compiler.py +3945 -0
- tpyc/cycle_detection.py +358 -0
- tpyc/diagnostics.py +135 -0
- tpyc/dump_types.py +353 -0
- tpyc/frontend_diagnostics.py +47 -0
- tpyc/frontend_ir/__init__.py +140 -0
- tpyc/frontend_ir/lower.py +1098 -0
- tpyc/frontend_ir/nodes.py +718 -0
- tpyc/frontend_ir/resolver_adapter.py +151 -0
- tpyc/frontend_plugin.py +209 -0
- tpyc/install_docs.py +81 -0
- tpyc/liveness.py +756 -0
- tpyc/macro_api.py +1724 -0
- tpyc/macro_loader.py +497 -0
- tpyc/module_names.py +64 -0
- tpyc/modules/__init__.py +31 -0
- tpyc/modules/defs.py +89 -0
- tpyc/modules/registry.py +36 -0
- tpyc/modules/resolver.py +192 -0
- tpyc/modules/type_resolution.py +629 -0
- tpyc/namespace.py +172 -0
- tpyc/parse/__init__.py +84 -0
- tpyc/parse/imports.py +490 -0
- tpyc/parse/nodes.py +1732 -0
- tpyc/parse/parser.py +4043 -0
- tpyc/parse/resolve_refs.py +466 -0
- tpyc/parse/type_resolver.py +1060 -0
- tpyc/prescan.py +254 -0
- tpyc/qnames.py +149 -0
- tpyc/repl.py +529 -0
- tpyc/repl_backends.py +848 -0
- tpyc/sema/__init__.py +21 -0
- tpyc/sema/analyzer.py +3625 -0
- tpyc/sema/bound_check.py +72 -0
- tpyc/sema/builder_trace.py +684 -0
- tpyc/sema/calls.py +5406 -0
- tpyc/sema/compatibility.py +2107 -0
- tpyc/sema/context.py +1243 -0
- tpyc/sema/expressions.py +3737 -0
- tpyc/sema/flow_facts.py +199 -0
- tpyc/sema/init_tracker.py +150 -0
- tpyc/sema/list_literals.py +69 -0
- tpyc/sema/literal_utils.py +27 -0
- tpyc/sema/local_deduction.py +1088 -0
- tpyc/sema/macros.py +179 -0
- tpyc/sema/match.py +1177 -0
- tpyc/sema/method_expansion.py +347 -0
- tpyc/sema/methods.py +2197 -0
- tpyc/sema/mutation_propagation.py +268 -0
- tpyc/sema/narrowing.py +857 -0
- tpyc/sema/numeric_lattice.py +160 -0
- tpyc/sema/operators.py +402 -0
- tpyc/sema/overloads.py +841 -0
- tpyc/sema/protocols.py +1209 -0
- tpyc/sema/reach_analysis.py +202 -0
- tpyc/sema/registration.py +3156 -0
- tpyc/sema/scope_tracker.py +193 -0
- tpyc/sema/statements.py +4426 -0
- tpyc/sema/type_ops.py +1879 -0
- tpyc/sema/value_range.py +181 -0
- tpyc/symbol_binding.py +259 -0
- tpyc/test_c3_mro.py +208 -0
- tpyc/test_cli_argv.py +52 -0
- tpyc/test_compiler.py +559 -0
- tpyc/test_contains_type_param.py +101 -0
- tpyc/test_cycle_detection.py +221 -0
- tpyc/test_dump_types.py +225 -0
- tpyc/test_install_docs.py +65 -0
- tpyc/test_local_cpp_form.py +135 -0
- tpyc/test_macro_loader.py +76 -0
- tpyc/test_method_expansion.py +254 -0
- tpyc/test_nominal_identity.py +182 -0
- tpyc/test_overloads.py +410 -0
- tpyc/test_parse.py +303 -0
- tpyc/test_parse_type_ref.py +506 -0
- tpyc/test_parse_version_info.py +58 -0
- tpyc/test_reach_analysis.py +72 -0
- tpyc/test_ref_type.py +216 -0
- tpyc/test_send_sync_substitution.py +276 -0
- tpyc/test_tuple_mutation_propagation.py +206 -0
- tpyc/test_type_def_registry.py +1729 -0
- tpyc/test_union_types.py +195 -0
- tpyc/type_def_registry.py +975 -0
- 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,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
|
+
]
|