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,62 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <chrono>
|
|
4
|
+
#include <cstdint>
|
|
5
|
+
#include <ctime>
|
|
6
|
+
#include <thread>
|
|
7
|
+
|
|
8
|
+
namespace tpy::stdlib::time {
|
|
9
|
+
|
|
10
|
+
inline double perf_counter() {
|
|
11
|
+
auto now = std::chrono::steady_clock::now();
|
|
12
|
+
return std::chrono::duration<double>(now.time_since_epoch()).count();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
inline int64_t perf_counter_ns() {
|
|
16
|
+
auto now = std::chrono::steady_clock::now();
|
|
17
|
+
return std::chrono::duration_cast<std::chrono::nanoseconds>(
|
|
18
|
+
now.time_since_epoch()).count();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// monotonic aliases perf_counter -- CPython ties them on POSIX, so a
|
|
22
|
+
// distinct clock would only diverge artificially.
|
|
23
|
+
|
|
24
|
+
inline double monotonic() {
|
|
25
|
+
return perf_counter();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
inline int64_t monotonic_ns() {
|
|
29
|
+
return perf_counter_ns();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// system_clock can jump backward on NTP adjustments; callers measuring
|
|
33
|
+
// elapsed time should use monotonic_ns instead.
|
|
34
|
+
|
|
35
|
+
inline int64_t time_ns() {
|
|
36
|
+
auto now = std::chrono::system_clock::now();
|
|
37
|
+
return std::chrono::duration_cast<std::chrono::nanoseconds>(
|
|
38
|
+
now.time_since_epoch()).count();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// process_time: CPU time consumed by the current process, in seconds.
|
|
42
|
+
// CPython uses clock_gettime(CLOCK_PROCESS_CPUTIME_ID) where available;
|
|
43
|
+
// std::clock() is the portable C++ fallback (resolution typically ~1us
|
|
44
|
+
// on Linux, lower on some platforms).
|
|
45
|
+
|
|
46
|
+
inline double process_time() {
|
|
47
|
+
return static_cast<double>(std::clock()) / CLOCKS_PER_SEC;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Sleep until a steady_clock deadline expressed as seconds since the
|
|
51
|
+
// clock's epoch (the same domain as monotonic() / perf_counter()).
|
|
52
|
+
// Returns immediately if the deadline is already in the past.
|
|
53
|
+
// Used by asyncio's TPy-side run loop to wait for the next timer.
|
|
54
|
+
inline void sleep_until_steady(double deadline_seconds) {
|
|
55
|
+
using DurDouble = std::chrono::duration<double>;
|
|
56
|
+
using TP = std::chrono::steady_clock::time_point;
|
|
57
|
+
auto deadline = TP(std::chrono::duration_cast<TP::duration>(
|
|
58
|
+
DurDouble(deadline_seconds)));
|
|
59
|
+
std::this_thread::sleep_until(deadline);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
} // namespace tpy::stdlib::time
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TurboPython Runtime - System Utilities
|
|
3
|
+
*
|
|
4
|
+
* Time functions, sys.argv, and sys.stdout / sys.stderr wrappers.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#pragma once
|
|
8
|
+
|
|
9
|
+
#include <chrono>
|
|
10
|
+
#include <cstddef>
|
|
11
|
+
#include <cstdint>
|
|
12
|
+
#include <iostream>
|
|
13
|
+
#include <ostream>
|
|
14
|
+
#include <string>
|
|
15
|
+
#include <string_view>
|
|
16
|
+
#include <thread>
|
|
17
|
+
#include <vector>
|
|
18
|
+
|
|
19
|
+
#include "core.hpp"
|
|
20
|
+
|
|
21
|
+
namespace tpy {
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* time_time - Return seconds since epoch as double.
|
|
25
|
+
*
|
|
26
|
+
* Equivalent to Python's time.time().
|
|
27
|
+
*/
|
|
28
|
+
inline double time_time() {
|
|
29
|
+
auto now = std::chrono::system_clock::now();
|
|
30
|
+
auto duration = now.time_since_epoch();
|
|
31
|
+
return std::chrono::duration<double>(duration).count();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* time_sleep - Suspend execution for the given number of seconds.
|
|
36
|
+
*
|
|
37
|
+
* Equivalent to Python's time.sleep().
|
|
38
|
+
*/
|
|
39
|
+
inline void time_sleep(double seconds) {
|
|
40
|
+
if (seconds < 0) {
|
|
41
|
+
raise_value_error("sleep length must be non-negative");
|
|
42
|
+
}
|
|
43
|
+
auto duration = std::chrono::duration<double>(seconds);
|
|
44
|
+
std::this_thread::sleep_for(duration);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* sys_argv - Command line arguments as vector of string_view.
|
|
49
|
+
*
|
|
50
|
+
* Equivalent to Python's sys.argv. Initialized by init_sys_argv() in main().
|
|
51
|
+
* Note: string_views point to argv strings which are valid for program lifetime.
|
|
52
|
+
*/
|
|
53
|
+
inline std::vector<std::string_view> sys_argv;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* get_sys_argv - Return sys_argv as owned strings for module-level init.
|
|
57
|
+
*
|
|
58
|
+
* Called once during sys module init, after init_sys_argv() has populated sys_argv.
|
|
59
|
+
*/
|
|
60
|
+
inline std::vector<std::string> get_sys_argv() {
|
|
61
|
+
return {sys_argv.begin(), sys_argv.end()};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* sys_exit - Terminate the program with the given exit code.
|
|
66
|
+
*
|
|
67
|
+
* Equivalent to Python's sys.exit(code) for an integer argument.
|
|
68
|
+
* Static destructors and atexit handlers run; thread-local
|
|
69
|
+
* destructors and finally clauses do NOT (this is std::exit, not
|
|
70
|
+
* a thrown SystemExit). Acceptable for a v1 binding driven by
|
|
71
|
+
* argparse's --help / parse-error paths.
|
|
72
|
+
*/
|
|
73
|
+
[[noreturn]] inline void sys_exit(int code) {
|
|
74
|
+
std::exit(code);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* init_sys_argv - Initialize sys_argv from main()'s argc/argv.
|
|
79
|
+
*
|
|
80
|
+
* Called at program startup before __tpy_init().
|
|
81
|
+
*/
|
|
82
|
+
inline void init_sys_argv(int argc, char* argv[]) {
|
|
83
|
+
sys_argv.clear();
|
|
84
|
+
sys_argv.reserve(static_cast<std::size_t>(argc));
|
|
85
|
+
for (int i = 0; i < argc; ++i) {
|
|
86
|
+
sys_argv.emplace_back(argv[i]);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* StdStream - non-owning wrapper around std::cout / std::cerr.
|
|
92
|
+
*
|
|
93
|
+
* Backs sys.stdout / sys.stderr; satisfies the Writable protocol so it works
|
|
94
|
+
* as a `print(file=...)` target alongside TextFile and user types.
|
|
95
|
+
*/
|
|
96
|
+
class StdStream {
|
|
97
|
+
std::ostream* sink_;
|
|
98
|
+
|
|
99
|
+
public:
|
|
100
|
+
explicit StdStream(std::ostream& s) : sink_(&s) {}
|
|
101
|
+
|
|
102
|
+
int32_t write(std::string_view text) {
|
|
103
|
+
sink_->write(text.data(), static_cast<std::streamsize>(text.size()));
|
|
104
|
+
return static_cast<int32_t>(text.size());
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
void flush() { sink_->flush(); }
|
|
108
|
+
|
|
109
|
+
std::ostream& sink() const { return *sink_; }
|
|
110
|
+
|
|
111
|
+
friend std::ostream& operator<<(std::ostream& os, const StdStream& s) {
|
|
112
|
+
if (s.sink_ == &std::cout) return os << "<sys.stdout>";
|
|
113
|
+
if (s.sink_ == &std::cerr) return os << "<sys.stderr>";
|
|
114
|
+
return os << "<StdStream>";
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
inline StdStream get_sys_stdout() { return StdStream(std::cout); }
|
|
119
|
+
inline StdStream get_sys_stderr() { return StdStream(std::cerr); }
|
|
120
|
+
|
|
121
|
+
} // namespace tpy
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TurboPython Runtime - Throwable ABI
|
|
3
|
+
*
|
|
4
|
+
* Abstract base for the TPy exception hierarchy. Phase 20 (E9) promotes
|
|
5
|
+
* `Throwable` from a markerless `@dynamic` protocol to a real one with
|
|
6
|
+
* two virtuals so user code can store polymorphic exceptions in
|
|
7
|
+
* `Box[Throwable]` and rethrow them without slicing.
|
|
8
|
+
*
|
|
9
|
+
* - clone() -- polymorphic copy on the heap (used by Box(e.clone())).
|
|
10
|
+
* - __raise__() -- throws *this as the dynamic type, preserving the
|
|
11
|
+
* concrete subclass through C++ unwinding.
|
|
12
|
+
*
|
|
13
|
+
* what() stays as the std::exception virtual; the BaseException
|
|
14
|
+
* implementation returns the inherited `message` field.
|
|
15
|
+
*
|
|
16
|
+
* Stage 2a (this file) ships the abstract base and a per-class macro
|
|
17
|
+
* that emits the two overrides for every native exception subclass in
|
|
18
|
+
* core.hpp / async.hpp. Stage 4 deletes this macro when codegen auto-
|
|
19
|
+
* emits the same overrides on every TPy-defined Throwable subclass.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
#pragma once
|
|
23
|
+
|
|
24
|
+
#include <exception>
|
|
25
|
+
#include <memory>
|
|
26
|
+
|
|
27
|
+
#include "type_traits.hpp"
|
|
28
|
+
|
|
29
|
+
namespace tpy {
|
|
30
|
+
|
|
31
|
+
struct Throwable : std::exception {
|
|
32
|
+
[[nodiscard]] virtual std::unique_ptr<Throwable> clone() const = 0;
|
|
33
|
+
[[noreturn]] virtual void __raise__() const = 0;
|
|
34
|
+
~Throwable() override = default;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
} // namespace tpy
|
|
38
|
+
|
|
39
|
+
// Marks ::tpy::Throwable as a @dynamic-protocol base for the polymorphism
|
|
40
|
+
// predicate `is_polymorphic_class_type`. Normally codegen emits this
|
|
41
|
+
// specialization alongside its codegen-emitted abstract base; for
|
|
42
|
+
// `@native + @dynamic` protocols the codegen path is suppressed and the
|
|
43
|
+
// runtime supplies it.
|
|
44
|
+
template<> struct tpy::is_dyn_protocol_base<::tpy::Throwable> : std::true_type {};
|
|
45
|
+
|
|
46
|
+
// Per-class boilerplate for native exception subclasses. Stage 4 of Phase 20
|
|
47
|
+
// retires this macro in favor of codegen auto-emission on every TPy-defined
|
|
48
|
+
// Throwable subclass; until then, every concrete native subclass needs both
|
|
49
|
+
// overrides explicitly (inheriting them from BaseException would slice the
|
|
50
|
+
// dynamic type at clone() / __raise__() sites).
|
|
51
|
+
#define TPY_THROWABLE_VIRTUALS(ThisClass) \
|
|
52
|
+
[[nodiscard]] std::unique_ptr<::tpy::Throwable> clone() const override { \
|
|
53
|
+
return std::make_unique<ThisClass>(*this); \
|
|
54
|
+
} \
|
|
55
|
+
[[noreturn]] void __raise__() const override { throw *this; }
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TurboPython Runtime - Main Header
|
|
3
|
+
*
|
|
4
|
+
* Includes all runtime components. This is the primary header for
|
|
5
|
+
* TurboPython generated code.
|
|
6
|
+
*
|
|
7
|
+
* Requires C++23 for std::ranges concepts.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#pragma once
|
|
11
|
+
|
|
12
|
+
// Core utilities (no dependencies)
|
|
13
|
+
#include "core.hpp"
|
|
14
|
+
|
|
15
|
+
// Async primitives: CancelledError only. Waker / Awaker / Poll<T> /
|
|
16
|
+
// Awaitable<T> are pure-TPy in `lib/tpy/tpy/coro/__init__.py` (Waker,
|
|
17
|
+
// Awaker, Awaitable concept) and `lib/tpy/tpy/_core/_types.py` (Poll).
|
|
18
|
+
#include "async.hpp"
|
|
19
|
+
|
|
20
|
+
// Enum utility trait (primary template; specializations in generated code)
|
|
21
|
+
#include "enum.hpp"
|
|
22
|
+
|
|
23
|
+
// Dynamic protocol adapters (primary templates; specializations in generated code)
|
|
24
|
+
#include "dynamic.hpp"
|
|
25
|
+
|
|
26
|
+
// Formatting (no dependencies)
|
|
27
|
+
#include "format.hpp"
|
|
28
|
+
|
|
29
|
+
// Fixed-width integer checked arithmetic (depends on core)
|
|
30
|
+
#include "fixed_int.hpp"
|
|
31
|
+
|
|
32
|
+
// Type traits (no dependencies)
|
|
33
|
+
#include "type_traits.hpp"
|
|
34
|
+
|
|
35
|
+
// Range utilities (no dependencies)
|
|
36
|
+
#include "ranges.hpp"
|
|
37
|
+
|
|
38
|
+
// Range iterator (depends on core, fixed_int)
|
|
39
|
+
#include "range.hpp"
|
|
40
|
+
|
|
41
|
+
// Uninitialized storage (depends on core)
|
|
42
|
+
#include "uninit_array_storage.hpp"
|
|
43
|
+
#include "uninit_heap_storage.hpp"
|
|
44
|
+
#include "frame_slot.hpp"
|
|
45
|
+
|
|
46
|
+
// BigInt arbitrary precision (depends on core, fixed_int, type_traits)
|
|
47
|
+
#include "bigint.hpp"
|
|
48
|
+
|
|
49
|
+
// Builtin function helpers (depends on core, fixed_int, bigint)
|
|
50
|
+
#include "builtins.hpp"
|
|
51
|
+
|
|
52
|
+
// Slice type for user-defined __getitem__ overloads (no dependencies)
|
|
53
|
+
#include "slice.hpp"
|
|
54
|
+
|
|
55
|
+
// Container operations (depends on core, type_traits)
|
|
56
|
+
#include "container_ops.hpp"
|
|
57
|
+
|
|
58
|
+
// Protocols and concepts (depends on ranges)
|
|
59
|
+
#include "protocols.hpp"
|
|
60
|
+
|
|
61
|
+
// next_iter adapter: begin()/end() for __next__()-based iterators
|
|
62
|
+
#include "next_iter.hpp"
|
|
63
|
+
|
|
64
|
+
// Generator expression wrapper (depends on next_iter, <optional>, <expected>)
|
|
65
|
+
#include "generator.hpp"
|
|
66
|
+
|
|
67
|
+
// SpanIter: lightweight iterator over contiguous span (depends on <span>, error_return)
|
|
68
|
+
#include "span_iter.hpp"
|
|
69
|
+
|
|
70
|
+
// varargs<T>: dual-mode span for *args (direct contiguous or indirect pointer array)
|
|
71
|
+
#include "varargs.hpp"
|
|
72
|
+
|
|
73
|
+
// OwnIter: drain iterator for std::vector (depends on core)
|
|
74
|
+
#include "own_iter.hpp"
|
|
75
|
+
|
|
76
|
+
// CopyIter: copying iterator adapter (depends on dunder for __iter__)
|
|
77
|
+
#include "copy_iter.hpp"
|
|
78
|
+
|
|
79
|
+
// Iterator builtins: enumerate, reversed (depends on next_iter, dunder)
|
|
80
|
+
#include "itertools.hpp"
|
|
81
|
+
|
|
82
|
+
// Non-range overloads for container ops (depends on dunder, container_ops)
|
|
83
|
+
#include "iterable_ops.hpp"
|
|
84
|
+
|
|
85
|
+
// Collection printing (depends on bigint)
|
|
86
|
+
#include "printing.hpp"
|
|
87
|
+
|
|
88
|
+
// Ordered map (no runtime dependencies beyond standard library)
|
|
89
|
+
#include "ordered_map.hpp"
|
|
90
|
+
|
|
91
|
+
// Ordered set (no runtime dependencies beyond standard library)
|
|
92
|
+
#include "ordered_set.hpp"
|
|
93
|
+
|
|
94
|
+
// Dict operations and printing (depends on ordered_map, core, printing)
|
|
95
|
+
#include "dict_ops.hpp"
|
|
96
|
+
|
|
97
|
+
// Set operations and printing (depends on ordered_set, core, printing)
|
|
98
|
+
#include "set_ops.hpp"
|
|
99
|
+
|
|
100
|
+
// Bytes operations and printing (depends on core, container_ops)
|
|
101
|
+
#include "bytes_ops.hpp"
|
|
102
|
+
|
|
103
|
+
// System utilities (depends on core)
|
|
104
|
+
#include "system.hpp"
|
|
105
|
+
|
|
106
|
+
// Pointer-variant utilities for non-value union types (depends on <variant>)
|
|
107
|
+
#include "variant_ref.hpp"
|
|
108
|
+
|
|
109
|
+
// File I/O: TextFile for open() builtin (depends on core)
|
|
110
|
+
#include "file.hpp"
|
|
111
|
+
|
|
112
|
+
// User-facing TPy type names (depends on core, plus every type it
|
|
113
|
+
// specializes for -- so it must come after the type headers above)
|
|
114
|
+
#include "type_name.hpp"
|
|
115
|
+
|
|
116
|
+
// Any: type-erased value cell (depends on dunder, builtins, core, type_name)
|
|
117
|
+
#include "any.hpp"
|
|
118
|
+
|
|
119
|
+
// Output-sink dispatch for print(file=...) (depends on system, file)
|
|
120
|
+
#include "as_ostream.hpp"
|
|
121
|
+
|
|
122
|
+
// repr_of: user-facing repr dispatch helper. Defined here, after every
|
|
123
|
+
// header that contributes a tpy::__repr__ overload, so unqualified
|
|
124
|
+
// `__repr__(x)` inside its body sees the full overload set. Goes through
|
|
125
|
+
// here (not direct `::tpy::__repr__`) so ADL into the argument's
|
|
126
|
+
// namespace can find per-record overrides; qualified callers from inside
|
|
127
|
+
// runtime templates would freeze the candidate set at template-definition
|
|
128
|
+
// time and miss them.
|
|
129
|
+
namespace tpy {
|
|
130
|
+
template<typename T>
|
|
131
|
+
inline auto repr_of(const T& x) {
|
|
132
|
+
using ::tpy::__repr__;
|
|
133
|
+
return __repr__(x);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Pointer-repr Optional[Record] (`A | None` lowers to nullable `A*`):
|
|
137
|
+
// emit "None" for null, otherwise repr the pointee. Restricted to class
|
|
138
|
+
// pointers so raw `int*`/`char*` don't get caught (the latter has its
|
|
139
|
+
// own __repr__ for string literals).
|
|
140
|
+
template<typename T>
|
|
141
|
+
requires std::is_class_v<T>
|
|
142
|
+
inline std::string repr_of(T* p) {
|
|
143
|
+
if (!p) return "None";
|
|
144
|
+
using ::tpy::__repr__;
|
|
145
|
+
return std::string(__repr__(*p));
|
|
146
|
+
}
|
|
147
|
+
} // namespace tpy
|
|
148
|
+
|
|
149
|
+
// Expose types in global namespace for TurboPython generated code
|
|
150
|
+
using ::tpy::UninitArrayStorage;
|
|
151
|
+
using ::tpy::UninitHeapStorage;
|
|
152
|
+
using ::tpy::tpy_panic;
|
|
153
|
+
using ::tpy::BigInt;
|
|
154
|
+
using ::tpy::BaseException;
|
|
155
|
+
using ::tpy::Exception;
|
|
156
|
+
using ::tpy::StopIteration;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TurboPython Runtime - User-facing type names
|
|
3
|
+
*
|
|
4
|
+
* tpy::type_name<T>() returns the TPy-level name of a C++ type
|
|
5
|
+
* ("int" for tpy::BigInt, "str" for std::string, "Int32" for int32_t,
|
|
6
|
+
* "module.Cls" for user records via their `__tpy_class_name__` member,
|
|
7
|
+
* etc.). Used for diagnostics that surface to TPy users (Any cast errors,
|
|
8
|
+
* etc.) so messages don't leak C++ implementation details.
|
|
9
|
+
*
|
|
10
|
+
* Falls back to the demangled typeid for types without a specialization;
|
|
11
|
+
* the demangler output is normalized to be stable across libc++/libstdc++.
|
|
12
|
+
*
|
|
13
|
+
* Depends on: core.hpp (demangle_type_name), all type headers it
|
|
14
|
+
* specializes for. Include via tpy.hpp after the type headers.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#pragma once
|
|
18
|
+
|
|
19
|
+
#include <cstddef>
|
|
20
|
+
#include <cstdint>
|
|
21
|
+
#include <string>
|
|
22
|
+
#include <typeinfo>
|
|
23
|
+
#include <variant>
|
|
24
|
+
|
|
25
|
+
#include "core.hpp"
|
|
26
|
+
|
|
27
|
+
namespace tpy {
|
|
28
|
+
|
|
29
|
+
class BigInt;
|
|
30
|
+
|
|
31
|
+
// Primary template: derives a name for any T not covered by an explicit
|
|
32
|
+
// specialization below. Splits on whether T carries the codegen-emitted
|
|
33
|
+
// `__tpy_class_name__` member (user records / dataclasses) so we don't
|
|
34
|
+
// have to enumerate generated types.
|
|
35
|
+
template <typename T>
|
|
36
|
+
struct type_name_for {
|
|
37
|
+
static std::string get() {
|
|
38
|
+
if constexpr (requires { T::__tpy_class_name__; }) {
|
|
39
|
+
return std::string(T::__tpy_class_name__);
|
|
40
|
+
} else {
|
|
41
|
+
return demangle_type_name(typeid(T).name());
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
template <typename T>
|
|
47
|
+
inline std::string type_name() {
|
|
48
|
+
return type_name_for<T>::get();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Built-in TPy <-> C++ type pairings. Keep in sync with the type table in
|
|
52
|
+
// CLAUDE.md / docs/LANGUAGE_FEATURES.md.
|
|
53
|
+
#define TPY_TYPE_NAME_(CPP_TYPE, TPY_NAME) \
|
|
54
|
+
template <> struct type_name_for<CPP_TYPE> { \
|
|
55
|
+
static std::string get() { return TPY_NAME; } \
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
TPY_TYPE_NAME_(BigInt, "int");
|
|
59
|
+
TPY_TYPE_NAME_(bool, "bool");
|
|
60
|
+
TPY_TYPE_NAME_(char, "Char");
|
|
61
|
+
TPY_TYPE_NAME_(int8_t, "Int8");
|
|
62
|
+
TPY_TYPE_NAME_(int16_t, "Int16");
|
|
63
|
+
TPY_TYPE_NAME_(int32_t, "Int32");
|
|
64
|
+
TPY_TYPE_NAME_(int64_t, "Int64");
|
|
65
|
+
TPY_TYPE_NAME_(uint8_t, "UInt8");
|
|
66
|
+
TPY_TYPE_NAME_(uint16_t, "UInt16");
|
|
67
|
+
TPY_TYPE_NAME_(uint32_t, "UInt32");
|
|
68
|
+
TPY_TYPE_NAME_(uint64_t, "UInt64");
|
|
69
|
+
TPY_TYPE_NAME_(float, "Float32");
|
|
70
|
+
TPY_TYPE_NAME_(double, "Float64");
|
|
71
|
+
TPY_TYPE_NAME_(std::string, "str");
|
|
72
|
+
TPY_TYPE_NAME_(std::nullptr_t, "None");
|
|
73
|
+
TPY_TYPE_NAME_(std::monostate, "None");
|
|
74
|
+
|
|
75
|
+
#undef TPY_TYPE_NAME_
|
|
76
|
+
|
|
77
|
+
} // namespace tpy
|