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,268 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Phase 2 of parameter mutation inference (8a).
|
|
3
|
+
|
|
4
|
+
After sema collects local mutation facts (direct_mutated_params, call_edges)
|
|
5
|
+
per function, this pass builds an intra-module call graph and propagates
|
|
6
|
+
mutation facts transitively through it.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from ..typesys import FunctionInfo, CONST_PARAMS_METHODS, view_is_inherently_const
|
|
13
|
+
|
|
14
|
+
# Methods that must never be inferred const regardless of body analysis.
|
|
15
|
+
_NEVER_INFER_CONST = frozenset({"__init__", "__del__"}) | CONST_PARAMS_METHODS
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def propagate_mutation_facts(functions: list[FunctionInfo]) -> None:
|
|
19
|
+
"""Propagate mutation facts through the intra-module call graph.
|
|
20
|
+
|
|
21
|
+
For each function with Phase 1 facts (direct_mutated_params + call_edges),
|
|
22
|
+
compute the final mutated_params by unioning direct mutations with
|
|
23
|
+
transitive mutations from callees.
|
|
24
|
+
|
|
25
|
+
Functions without Phase 1 facts (builtins, imports with already-resolved
|
|
26
|
+
mutated_params) are treated as ground truth and not modified.
|
|
27
|
+
"""
|
|
28
|
+
# Separate module-local functions (have Phase 1 facts) from external
|
|
29
|
+
local_fis: list[FunctionInfo] = [
|
|
30
|
+
fi for fi in functions if fi.direct_mutated_params is not None
|
|
31
|
+
]
|
|
32
|
+
if not local_fis:
|
|
33
|
+
return
|
|
34
|
+
|
|
35
|
+
# Build identity set for fast membership check
|
|
36
|
+
local_set = set(id(fi) for fi in local_fis)
|
|
37
|
+
|
|
38
|
+
# Topological sort via Kahn's algorithm.
|
|
39
|
+
# Adjacency: fi -> callees (from call_edges).
|
|
40
|
+
# We want to process callees before callers, so edges go caller -> callee.
|
|
41
|
+
in_degree: dict[int, int] = {id(fi): 0 for fi in local_fis}
|
|
42
|
+
# callee_id -> list of callers
|
|
43
|
+
reverse_adj: dict[int, list[FunctionInfo]] = {id(fi): [] for fi in local_fis}
|
|
44
|
+
|
|
45
|
+
for fi in local_fis:
|
|
46
|
+
seen_callees: set[int] = set()
|
|
47
|
+
for edge in (fi.call_edges or []):
|
|
48
|
+
cid = id(edge.callee_fi)
|
|
49
|
+
if cid in local_set and cid not in seen_callees:
|
|
50
|
+
seen_callees.add(cid)
|
|
51
|
+
in_degree[id(fi)] += 1
|
|
52
|
+
reverse_adj[cid].append(fi)
|
|
53
|
+
|
|
54
|
+
# Start with leaf functions (no local callees)
|
|
55
|
+
queue: list[FunctionInfo] = [fi for fi in local_fis if in_degree[id(fi)] == 0]
|
|
56
|
+
order: list[FunctionInfo] = []
|
|
57
|
+
|
|
58
|
+
while queue:
|
|
59
|
+
fi = queue.pop()
|
|
60
|
+
order.append(fi)
|
|
61
|
+
for caller in reverse_adj.get(id(fi), []):
|
|
62
|
+
in_degree[id(caller)] -= 1
|
|
63
|
+
if in_degree[id(caller)] == 0:
|
|
64
|
+
queue.append(caller)
|
|
65
|
+
|
|
66
|
+
# Functions not in topo order are involved in cycles (or are acyclic
|
|
67
|
+
# callers whose callees are in cycles -- their in-degree never reached
|
|
68
|
+
# zero). Fixed-point iteration handles both cases correctly.
|
|
69
|
+
ordered_set = set(id(fi) for fi in order)
|
|
70
|
+
cycle_fis = [fi for fi in local_fis if id(fi) not in ordered_set]
|
|
71
|
+
|
|
72
|
+
# Process ordered (acyclic) functions
|
|
73
|
+
for fi in order:
|
|
74
|
+
_resolve_single(fi)
|
|
75
|
+
|
|
76
|
+
# Process cycle functions with fixed-point iteration
|
|
77
|
+
if cycle_fis:
|
|
78
|
+
_resolve_cycle(cycle_fis)
|
|
79
|
+
|
|
80
|
+
# Clear call_edges -- no longer needed after propagation, and leaving
|
|
81
|
+
# them on exported FunctionInfo would cause unnecessary deferrals in
|
|
82
|
+
# cross-module callers.
|
|
83
|
+
for fi in local_fis:
|
|
84
|
+
fi.call_edges = None
|
|
85
|
+
|
|
86
|
+
# Populate codegen ABI facts derived from finalized mutation_params.
|
|
87
|
+
# These are read directly by emitters and call-arg lowering instead of
|
|
88
|
+
# re-deriving the const decision at every site. Imported inside the
|
|
89
|
+
# function body to avoid an import cycle: codegen_cpp/__init__.py
|
|
90
|
+
# transitively imports sema, so a top-level `from ..codegen_cpp...`
|
|
91
|
+
# here would deadlock during package initialization.
|
|
92
|
+
from ..codegen_cpp.param_const import populate_const_borrow_params
|
|
93
|
+
for fi in local_fis:
|
|
94
|
+
populate_const_borrow_params(fi)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _resolve_single(fi: FunctionInfo) -> None:
|
|
98
|
+
"""Compute mutated_params, structural_mutated_params, and self_mutated for a function whose callees are resolved."""
|
|
99
|
+
result: set[int] = set(fi.direct_mutated_params or frozenset())
|
|
100
|
+
struct_result: set[int] = set(fi.direct_structural_mutated_params or frozenset())
|
|
101
|
+
self_mutated = bool(fi.direct_self_mutated)
|
|
102
|
+
for edge in (fi.call_edges or []):
|
|
103
|
+
callee_mp = edge.callee_fi.mutated_params
|
|
104
|
+
callee_smp = edge.callee_fi.structural_mutated_params
|
|
105
|
+
if callee_mp is None:
|
|
106
|
+
# Unknown callee -- conservative: mark all flowing params as mutated.
|
|
107
|
+
for _callee_idx, caller_idx in edge.param_map.items():
|
|
108
|
+
result.add(caller_idx)
|
|
109
|
+
if edge.receiver_is_self:
|
|
110
|
+
self_mutated = True
|
|
111
|
+
else:
|
|
112
|
+
for callee_idx, caller_idx in edge.param_map.items():
|
|
113
|
+
if callee_idx in callee_mp:
|
|
114
|
+
result.add(caller_idx)
|
|
115
|
+
# Propagate self-mutation: if callee mutates its self and is called
|
|
116
|
+
# as self.method(), the caller also mutates self.
|
|
117
|
+
if edge.receiver_is_self and edge.callee_fi.self_mutated:
|
|
118
|
+
self_mutated = True
|
|
119
|
+
# Structural mutation propagation: more specific than mutated_params.
|
|
120
|
+
if callee_smp is not None:
|
|
121
|
+
for callee_idx, caller_idx in edge.param_map.items():
|
|
122
|
+
if callee_idx in callee_smp:
|
|
123
|
+
struct_result.add(caller_idx)
|
|
124
|
+
elif callee_mp is None:
|
|
125
|
+
# Unknown callee: conservative -- treat all flowing params as structurally mutated
|
|
126
|
+
for _callee_idx, caller_idx in edge.param_map.items():
|
|
127
|
+
struct_result.add(caller_idx)
|
|
128
|
+
# Sentinel -1 means "self" was passed as a function argument and the
|
|
129
|
+
# callee mutated that parameter. Convert to self_mutated flag.
|
|
130
|
+
if -1 in result:
|
|
131
|
+
self_mutated = True
|
|
132
|
+
result.discard(-1)
|
|
133
|
+
if -1 in struct_result:
|
|
134
|
+
self_mutated = True
|
|
135
|
+
struct_result.discard(-1)
|
|
136
|
+
fi.mutated_params = frozenset(result)
|
|
137
|
+
fi.structural_mutated_params = frozenset(struct_result)
|
|
138
|
+
fi.self_mutated = self_mutated
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _resolve_cycle(cycle_fis: list[FunctionInfo]) -> None:
|
|
142
|
+
"""Resolve mutation facts for functions in cycles via fixed-point iteration.
|
|
143
|
+
|
|
144
|
+
Both mutated_params and self_mutated lattices are monotone (only grow),
|
|
145
|
+
so convergence is guaranteed. We bound iterations as a safety measure.
|
|
146
|
+
structural_mutated_params is propagated in parallel.
|
|
147
|
+
"""
|
|
148
|
+
# Initialize with direct mutations
|
|
149
|
+
for fi in cycle_fis:
|
|
150
|
+
fi.mutated_params = frozenset(fi.direct_mutated_params or frozenset())
|
|
151
|
+
fi.structural_mutated_params = frozenset(fi.direct_structural_mutated_params or frozenset())
|
|
152
|
+
fi.self_mutated = bool(fi.direct_self_mutated)
|
|
153
|
+
|
|
154
|
+
# Safety bound: each iteration must add at least one param/self-mutation somewhere.
|
|
155
|
+
max_iters = sum(len(fi.params) + 1 for fi in cycle_fis) + 1
|
|
156
|
+
|
|
157
|
+
for _ in range(max_iters):
|
|
158
|
+
changed = False
|
|
159
|
+
for fi in cycle_fis:
|
|
160
|
+
old_mp = fi.mutated_params
|
|
161
|
+
old_smp = fi.structural_mutated_params
|
|
162
|
+
old_sm = fi.self_mutated
|
|
163
|
+
result: set[int] = set(fi.direct_mutated_params or frozenset())
|
|
164
|
+
struct_result: set[int] = set(fi.direct_structural_mutated_params or frozenset())
|
|
165
|
+
self_mutated = bool(fi.direct_self_mutated)
|
|
166
|
+
for edge in (fi.call_edges or []):
|
|
167
|
+
callee_mp = edge.callee_fi.mutated_params
|
|
168
|
+
callee_smp = edge.callee_fi.structural_mutated_params
|
|
169
|
+
if callee_mp is None:
|
|
170
|
+
for _callee_idx, caller_idx in edge.param_map.items():
|
|
171
|
+
result.add(caller_idx)
|
|
172
|
+
if edge.receiver_is_self:
|
|
173
|
+
self_mutated = True
|
|
174
|
+
else:
|
|
175
|
+
for callee_idx, caller_idx in edge.param_map.items():
|
|
176
|
+
if callee_idx in callee_mp:
|
|
177
|
+
result.add(caller_idx)
|
|
178
|
+
if edge.receiver_is_self and edge.callee_fi.self_mutated:
|
|
179
|
+
self_mutated = True
|
|
180
|
+
if callee_smp is not None:
|
|
181
|
+
for callee_idx, caller_idx in edge.param_map.items():
|
|
182
|
+
if callee_idx in callee_smp:
|
|
183
|
+
struct_result.add(caller_idx)
|
|
184
|
+
elif callee_mp is None:
|
|
185
|
+
for _callee_idx, caller_idx in edge.param_map.items():
|
|
186
|
+
struct_result.add(caller_idx)
|
|
187
|
+
# Sentinel -1 means "self" was passed as a function argument
|
|
188
|
+
if -1 in result:
|
|
189
|
+
self_mutated = True
|
|
190
|
+
result.discard(-1)
|
|
191
|
+
if -1 in struct_result:
|
|
192
|
+
self_mutated = True
|
|
193
|
+
struct_result.discard(-1)
|
|
194
|
+
new_mp = frozenset(result)
|
|
195
|
+
new_smp = frozenset(struct_result)
|
|
196
|
+
if new_mp != old_mp or new_smp != old_smp or self_mutated != old_sm:
|
|
197
|
+
fi.mutated_params = new_mp
|
|
198
|
+
fi.structural_mutated_params = new_smp
|
|
199
|
+
fi.self_mutated = self_mutated
|
|
200
|
+
changed = True
|
|
201
|
+
if not changed:
|
|
202
|
+
break
|
|
203
|
+
else:
|
|
204
|
+
# Did not converge -- conservatively mark all params/self flowing through
|
|
205
|
+
# unresolved edges
|
|
206
|
+
for fi in cycle_fis:
|
|
207
|
+
result = set(fi.mutated_params or frozenset())
|
|
208
|
+
struct_result = set(fi.structural_mutated_params or frozenset())
|
|
209
|
+
for edge in (fi.call_edges or []):
|
|
210
|
+
if edge.callee_fi.mutated_params is None:
|
|
211
|
+
for _callee_idx, caller_idx in edge.param_map.items():
|
|
212
|
+
result.add(caller_idx)
|
|
213
|
+
struct_result.add(caller_idx)
|
|
214
|
+
if edge.receiver_is_self:
|
|
215
|
+
fi.self_mutated = True
|
|
216
|
+
if -1 in result:
|
|
217
|
+
fi.self_mutated = True
|
|
218
|
+
result.discard(-1)
|
|
219
|
+
if -1 in struct_result:
|
|
220
|
+
fi.self_mutated = True
|
|
221
|
+
struct_result.discard(-1)
|
|
222
|
+
fi.mutated_params = frozenset(result)
|
|
223
|
+
fi.structural_mutated_params = frozenset(struct_result)
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def infer_method_const(all_fis: list[FunctionInfo]) -> None:
|
|
227
|
+
"""Back-propagate const inference: set is_readonly=True for methods proven non-self-mutating.
|
|
228
|
+
|
|
229
|
+
A method is eligible for const inference when:
|
|
230
|
+
- It is a method (is_method=True) but not a staticmethod.
|
|
231
|
+
- It is not already readonly (explicit @readonly or built-in).
|
|
232
|
+
- It is not in _NEVER_INFER_CONST (constructors, in-place operators).
|
|
233
|
+
- It is not a consuming method (Own[Self] receiver).
|
|
234
|
+
- Phase 1 + Phase 2 determined self_mutated=False.
|
|
235
|
+
- The return value does not borrow from self (return_borrows_from does not contain -1).
|
|
236
|
+
|
|
237
|
+
The last condition prevents the compiler from silently changing "-> T" (mutable ref)
|
|
238
|
+
to "const T&" behind the user's back. If a method returns a reference into self's
|
|
239
|
+
storage, making it const overrides the user's declared mutable return type.
|
|
240
|
+
|
|
241
|
+
Setting is_readonly=True reuses all existing checks: codegen emits `const`,
|
|
242
|
+
readonly-receiver enforcement passes, protocol conformance passes unchanged.
|
|
243
|
+
"""
|
|
244
|
+
for fi in all_fis:
|
|
245
|
+
if not fi.is_method or fi.is_staticmethod:
|
|
246
|
+
continue
|
|
247
|
+
if fi.is_readonly:
|
|
248
|
+
continue
|
|
249
|
+
if fi.is_consuming:
|
|
250
|
+
continue
|
|
251
|
+
if fi.is_auto_readonly_mutable_clone:
|
|
252
|
+
# The const sibling is already skipped by the is_readonly check
|
|
253
|
+
# above. Flipping the mutable clone too would give the pair two
|
|
254
|
+
# identical signatures and break overload resolution.
|
|
255
|
+
continue
|
|
256
|
+
if fi.name in _NEVER_INFER_CONST:
|
|
257
|
+
continue
|
|
258
|
+
if fi.direct_self_mutated is None:
|
|
259
|
+
# Phase 1 facts not collected (should not happen for local methods)
|
|
260
|
+
continue
|
|
261
|
+
if fi.return_borrows_from is not None and -1 in fi.return_borrows_from:
|
|
262
|
+
# Return value borrows from self's storage -- auto-const would change
|
|
263
|
+
# the return from T& to const T&, overriding the user's declared type.
|
|
264
|
+
# Inherently-const views carry no mutable alias, so auto-const is safe.
|
|
265
|
+
if not view_is_inherently_const(fi.return_type):
|
|
266
|
+
continue
|
|
267
|
+
if not fi.self_mutated:
|
|
268
|
+
fi.is_readonly = True
|