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,118 @@
|
|
|
1
|
+
# heapq -- min-heap priority queue over list[T], following CPython's algorithm.
|
|
2
|
+
#
|
|
3
|
+
# Constraint: T must be copyable. `_siftup` / `_siftdown` stash and shift
|
|
4
|
+
# elements via `copy(heap[i])`, so `@nocopy` element types fail at C++
|
|
5
|
+
# compile time with a deleted-copy-constructor error. The diagnostic gap
|
|
6
|
+
# is tracked in BUGS.md; wrap a `@nocopy` payload in `Rc[T]` or `Box[T]`
|
|
7
|
+
# if you need shared ownership in a heap.
|
|
8
|
+
#
|
|
9
|
+
# Gaps vs. CPython, tracked in STDLIB_ROADMAP.md:
|
|
10
|
+
# - nsmallest/nlargest take list[T] instead of Iterable[T]
|
|
11
|
+
# (same list-literal-vs-protocol conformance gap as math.prod/fsum;
|
|
12
|
+
# TODO: switch to Iterable[T] once that blocker is resolved).
|
|
13
|
+
# - nlargest is sort-based (O(n log n)); CPython uses a size-k min-heap
|
|
14
|
+
# (O(n log k)). TODO: port the size-k-heap impl once it matters.
|
|
15
|
+
# - No `key=` arg on nsmallest/nlargest.
|
|
16
|
+
# TODO: thread `Callable[[T], K: Comparable]` through, matches CPython.
|
|
17
|
+
# - merge(*iterables, key=, reverse=) not implemented.
|
|
18
|
+
# Blocked on variadic-in-method-call codegen (same gate as math.hypot
|
|
19
|
+
# variadic) plus a generator-driven n-way iterator-heads heap.
|
|
20
|
+
#
|
|
21
|
+
# Codegen perf gap affecting this module (see TODO.md "Missed optimizations" and
|
|
22
|
+
# `docs/IR_DESIGN.md` "Open Questions" item 8):
|
|
23
|
+
# - For `T = str`, the heap's element storage is `std::string` (TPy `str` and
|
|
24
|
+
# TPy `String` share `std::string` storage and the trait machinery can't
|
|
25
|
+
# distinguish them). Push (`item: Own[T]`) lowers to `std::string&&`, so a
|
|
26
|
+
# literal `heappush(words, "cherry")` materializes a `std::string` at the
|
|
27
|
+
# call site instead of passing through a `std::string_view`. SSO covers
|
|
28
|
+
# short literals. No fix planned -- the perf gap is small in practice and
|
|
29
|
+
# every idiomatic alternative pays a real cost. See IR_DESIGN.md for the
|
|
30
|
+
# design landscape.
|
|
31
|
+
# tpy: cpp_namespace("tpystd::heapq")
|
|
32
|
+
from tpy import Int32, Comparable, Own, copy
|
|
33
|
+
|
|
34
|
+
def _siftdown[T: Comparable](heap: list[T], startpos: Int32, pos: Int32) -> None:
|
|
35
|
+
newitem: T = copy(heap[pos])
|
|
36
|
+
while pos > startpos:
|
|
37
|
+
parentpos: Int32 = (pos - 1) >> 1
|
|
38
|
+
if newitem < heap[parentpos]:
|
|
39
|
+
heap[pos] = copy(heap[parentpos])
|
|
40
|
+
pos = parentpos
|
|
41
|
+
continue
|
|
42
|
+
break
|
|
43
|
+
heap[pos] = newitem
|
|
44
|
+
|
|
45
|
+
def _siftup[T: Comparable](heap: list[T], pos: Int32) -> None:
|
|
46
|
+
endpos: Int32 = Int32(len(heap))
|
|
47
|
+
startpos: Int32 = pos
|
|
48
|
+
newitem: T = copy(heap[pos])
|
|
49
|
+
childpos: Int32 = 2 * pos + 1
|
|
50
|
+
while childpos < endpos:
|
|
51
|
+
rightpos: Int32 = childpos + 1
|
|
52
|
+
if rightpos < endpos and not heap[childpos] < heap[rightpos]:
|
|
53
|
+
childpos = rightpos
|
|
54
|
+
heap[pos] = copy(heap[childpos])
|
|
55
|
+
pos = childpos
|
|
56
|
+
childpos = 2 * pos + 1
|
|
57
|
+
heap[pos] = newitem
|
|
58
|
+
_siftdown(heap, startpos, pos)
|
|
59
|
+
|
|
60
|
+
def heappush[T: Comparable](heap: list[T], item: Own[T]) -> None:
|
|
61
|
+
heap.append(item)
|
|
62
|
+
_siftdown(heap, 0, Int32(len(heap)) - 1)
|
|
63
|
+
|
|
64
|
+
def heappop[T: Comparable](heap: list[T]) -> Own[T]:
|
|
65
|
+
lastelt = heap.pop()
|
|
66
|
+
if len(heap) == 0:
|
|
67
|
+
return lastelt
|
|
68
|
+
returnitem = copy(heap[0])
|
|
69
|
+
heap[0] = copy(lastelt)
|
|
70
|
+
_siftup(heap, 0)
|
|
71
|
+
return returnitem
|
|
72
|
+
|
|
73
|
+
def heapify[T: Comparable](x: list[T]) -> None:
|
|
74
|
+
n: Int32 = Int32(len(x))
|
|
75
|
+
i: Int32 = n // 2 - 1
|
|
76
|
+
while i >= 0:
|
|
77
|
+
_siftup(x, i)
|
|
78
|
+
i -= 1
|
|
79
|
+
|
|
80
|
+
def heapreplace[T: Comparable](heap: list[T], item: Own[T]) -> Own[T]:
|
|
81
|
+
returnitem: T = copy(heap[0])
|
|
82
|
+
heap[0] = item
|
|
83
|
+
_siftup(heap, 0)
|
|
84
|
+
return returnitem
|
|
85
|
+
|
|
86
|
+
def heappushpop[T: Comparable](heap: list[T], item: Own[T]) -> Own[T]:
|
|
87
|
+
if len(heap) > 0 and heap[0] < item:
|
|
88
|
+
result: T = copy(heap[0])
|
|
89
|
+
heap[0] = item
|
|
90
|
+
_siftup(heap, 0)
|
|
91
|
+
return result
|
|
92
|
+
return item
|
|
93
|
+
|
|
94
|
+
def nsmallest[T: Comparable](n: Int32, a: list[T]) -> Own[list[T]]:
|
|
95
|
+
h: list[T] = a.copy()
|
|
96
|
+
heapify(h)
|
|
97
|
+
result: list[T] = []
|
|
98
|
+
total: Int32 = Int32(len(h))
|
|
99
|
+
k: Int32 = n if n < total else total
|
|
100
|
+
i: Int32 = 0
|
|
101
|
+
while i < k:
|
|
102
|
+
result.append(heappop(h))
|
|
103
|
+
i += 1
|
|
104
|
+
return result
|
|
105
|
+
|
|
106
|
+
def nlargest[T: Comparable](n: Int32, a: list[T]) -> Own[list[T]]:
|
|
107
|
+
# Sort-based; a size-k heap variant (O(n log k)) is a perf follow-up.
|
|
108
|
+
h: list[T] = a.copy()
|
|
109
|
+
h.sort()
|
|
110
|
+
h.reverse()
|
|
111
|
+
result: list[T] = []
|
|
112
|
+
total: Int32 = Int32(len(h))
|
|
113
|
+
k: Int32 = n if n < total else total
|
|
114
|
+
i: Int32 = 0
|
|
115
|
+
while i < k:
|
|
116
|
+
result.append(copy(h[i]))
|
|
117
|
+
i += 1
|
|
118
|
+
return result
|
tpyc/_data/lib/tpy/io.py
ADDED
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
# io -- in-memory text/binary buffers and the IO protocol surface.
|
|
2
|
+
#
|
|
3
|
+
# v1 surface: StringIO, BytesIO, plus the IO protocols from tpy core
|
|
4
|
+
# (Readable / Writable / BinaryReadable / BinaryWritable / Seekable /
|
|
5
|
+
# Closable) which both buffer types explicitly conform to. Users can
|
|
6
|
+
# write `def f(fp: io.Writable): ...` etc. SEEK_SET/CUR/END constants
|
|
7
|
+
# are not exposed yet -- the names collide with <cstdio> macros; pass
|
|
8
|
+
# the integer values 0/1/2 to seek() as a workaround.
|
|
9
|
+
#
|
|
10
|
+
# Storage strategies:
|
|
11
|
+
# - StringIO: list[str] chunks. Fast append-at-end; mid-buffer writes
|
|
12
|
+
# and reads collapse to a single chunk first.
|
|
13
|
+
# - BytesIO: list[bytes] chunks (mirrors StringIO). bytearray would
|
|
14
|
+
# allow in-place splice but slice-assignment is not on the Python
|
|
15
|
+
# surface today, so the chunked approach is simpler.
|
|
16
|
+
#
|
|
17
|
+
# v1 divergences from CPython, all documented:
|
|
18
|
+
# - seek past end is clamped to total (CPython back-fills with NUL/0).
|
|
19
|
+
# - newline= / encoding= / errors= kwargs not supported.
|
|
20
|
+
# - read(size=-1) takes no arg today (returns "all remaining").
|
|
21
|
+
# - close() drops the buffer; CPython matches.
|
|
22
|
+
# - getvalue() does not collapse chunks (avoids unsolicited mutation).
|
|
23
|
+
#
|
|
24
|
+
# tpy: cpp_namespace("tpystd::io")
|
|
25
|
+
from typing import Iterator
|
|
26
|
+
from tpy import (
|
|
27
|
+
Int32, Own, nocopy,
|
|
28
|
+
Writable, Readable, BinaryWritable, BinaryReadable,
|
|
29
|
+
Seekable, Closable,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# NOTE: io.SEEK_SET / SEEK_CUR / SEEK_END are not exposed yet because the
|
|
34
|
+
# names collide with <cstdio> preprocessor macros. seek(whence=0|1|2) below
|
|
35
|
+
# accepts the integer values directly. The public constants need either a
|
|
36
|
+
# `#undef` shim from codegen or namespacing on the C++ side -- followup.
|
|
37
|
+
_SEEK_SET: Int32 = 0
|
|
38
|
+
_SEEK_CUR: Int32 = 1
|
|
39
|
+
_SEEK_END: Int32 = 2
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@nocopy
|
|
43
|
+
class StringIO(Writable, Readable, Seekable, Closable):
|
|
44
|
+
_chunks: list[str]
|
|
45
|
+
_pos: Int32
|
|
46
|
+
_total: Int32
|
|
47
|
+
_closed: bool
|
|
48
|
+
|
|
49
|
+
def __init__(self, initial: str = "") -> None:
|
|
50
|
+
self._chunks = []
|
|
51
|
+
if len(initial) > 0:
|
|
52
|
+
self._chunks.append(str(initial))
|
|
53
|
+
self._pos = 0
|
|
54
|
+
self._total = Int32(len(initial))
|
|
55
|
+
self._closed = False
|
|
56
|
+
|
|
57
|
+
def write(self, s: str) -> Int32:
|
|
58
|
+
self._check_open()
|
|
59
|
+
n: Int32 = Int32(len(s))
|
|
60
|
+
if n == 0:
|
|
61
|
+
return n
|
|
62
|
+
# Param `s: str` arrives as std::string_view; the chunks list stores
|
|
63
|
+
# owned strings, so wrap with `str(...)` to materialize.
|
|
64
|
+
owned: str = str(s)
|
|
65
|
+
if self._pos == self._total:
|
|
66
|
+
# Fast path: append-at-end. The dominant pattern (build payload
|
|
67
|
+
# then getvalue / read) stays O(1) per write here.
|
|
68
|
+
self._chunks.append(owned)
|
|
69
|
+
self._total = self._total + n
|
|
70
|
+
self._pos = self._total
|
|
71
|
+
return n
|
|
72
|
+
# Slow path: mid-buffer overwrite. Collapse + splice + re-store as
|
|
73
|
+
# a single chunk; subsequent appends rejoin the fast path.
|
|
74
|
+
self._collapse()
|
|
75
|
+
buf: str = self._chunks[0]
|
|
76
|
+
end: Int32 = self._pos + n
|
|
77
|
+
prefix: str = buf[:self._pos]
|
|
78
|
+
if end < Int32(len(buf)):
|
|
79
|
+
tail: str = buf[end:]
|
|
80
|
+
new_buf: str = prefix + owned + tail
|
|
81
|
+
else:
|
|
82
|
+
new_buf = prefix + owned
|
|
83
|
+
self._chunks = [new_buf]
|
|
84
|
+
self._total = Int32(len(new_buf))
|
|
85
|
+
self._pos = end
|
|
86
|
+
return n
|
|
87
|
+
|
|
88
|
+
def read(self) -> str:
|
|
89
|
+
self._check_open()
|
|
90
|
+
if self._pos >= self._total:
|
|
91
|
+
return ""
|
|
92
|
+
self._collapse()
|
|
93
|
+
out: str = self._chunks[0][self._pos:]
|
|
94
|
+
self._pos = self._total
|
|
95
|
+
return out
|
|
96
|
+
|
|
97
|
+
def readline(self) -> str:
|
|
98
|
+
self._check_open()
|
|
99
|
+
if self._pos >= self._total:
|
|
100
|
+
return ""
|
|
101
|
+
self._collapse()
|
|
102
|
+
buf: str = self._chunks[0]
|
|
103
|
+
# str.find takes no `start` arg today (per BUGS.md / surface gap):
|
|
104
|
+
# search the suffix and adjust the offset back into buf.
|
|
105
|
+
suffix: str = buf[self._pos:]
|
|
106
|
+
rel: Int32 = suffix.find("\n")
|
|
107
|
+
if rel < 0:
|
|
108
|
+
out: str = suffix
|
|
109
|
+
self._pos = self._total
|
|
110
|
+
else:
|
|
111
|
+
stop: Int32 = self._pos + rel + 1
|
|
112
|
+
out = buf[self._pos:stop]
|
|
113
|
+
self._pos = stop
|
|
114
|
+
return out
|
|
115
|
+
|
|
116
|
+
def readlines(self) -> Own[list[str]]:
|
|
117
|
+
# Inlined readline loop instead of `for line in self:` to side-step
|
|
118
|
+
# readonly auto-deduction picking the const __iter__ overload.
|
|
119
|
+
out: list[str] = []
|
|
120
|
+
while True:
|
|
121
|
+
line: str = self.readline()
|
|
122
|
+
if not line:
|
|
123
|
+
break
|
|
124
|
+
out.append(line)
|
|
125
|
+
return out
|
|
126
|
+
|
|
127
|
+
def __iter__(self) -> Iterator[str]:
|
|
128
|
+
while True:
|
|
129
|
+
line: str = self.readline()
|
|
130
|
+
if not line:
|
|
131
|
+
return
|
|
132
|
+
yield line
|
|
133
|
+
|
|
134
|
+
def getvalue(self) -> str:
|
|
135
|
+
self._check_open()
|
|
136
|
+
if len(self._chunks) == 0:
|
|
137
|
+
return ""
|
|
138
|
+
if len(self._chunks) == 1:
|
|
139
|
+
return self._chunks[0]
|
|
140
|
+
return "".join(self._chunks)
|
|
141
|
+
|
|
142
|
+
def tell(self) -> Int32:
|
|
143
|
+
self._check_open()
|
|
144
|
+
return self._pos
|
|
145
|
+
|
|
146
|
+
def seek(self, pos: Int32, whence: Int32 = 0) -> Int32:
|
|
147
|
+
self._check_open()
|
|
148
|
+
new_pos: Int32 = 0
|
|
149
|
+
if whence == _SEEK_SET:
|
|
150
|
+
new_pos = pos
|
|
151
|
+
elif whence == _SEEK_CUR:
|
|
152
|
+
new_pos = self._pos + pos
|
|
153
|
+
elif whence == _SEEK_END:
|
|
154
|
+
new_pos = self._total + pos
|
|
155
|
+
else:
|
|
156
|
+
raise ValueError("invalid whence")
|
|
157
|
+
if new_pos < 0:
|
|
158
|
+
raise ValueError("negative seek position")
|
|
159
|
+
# v1: clamp seek-past-end to total. CPython would back-fill on
|
|
160
|
+
# the next write; revisit when there's a real consumer.
|
|
161
|
+
if new_pos > self._total:
|
|
162
|
+
new_pos = self._total
|
|
163
|
+
self._pos = new_pos
|
|
164
|
+
return self._pos
|
|
165
|
+
|
|
166
|
+
def truncate(self, size: Int32 = -1) -> Int32:
|
|
167
|
+
self._check_open()
|
|
168
|
+
n: Int32 = size if size >= 0 else self._pos
|
|
169
|
+
if n >= self._total:
|
|
170
|
+
return self._total
|
|
171
|
+
self._collapse()
|
|
172
|
+
if n == 0:
|
|
173
|
+
self._chunks = []
|
|
174
|
+
else:
|
|
175
|
+
self._chunks = [self._chunks[0][:n]]
|
|
176
|
+
self._total = n
|
|
177
|
+
if self._pos > n:
|
|
178
|
+
self._pos = n
|
|
179
|
+
return n
|
|
180
|
+
|
|
181
|
+
def flush(self) -> None:
|
|
182
|
+
self._check_open()
|
|
183
|
+
|
|
184
|
+
def close(self) -> None:
|
|
185
|
+
self._closed = True
|
|
186
|
+
self._chunks = []
|
|
187
|
+
self._total = 0
|
|
188
|
+
self._pos = 0
|
|
189
|
+
|
|
190
|
+
@property
|
|
191
|
+
def closed(self) -> bool:
|
|
192
|
+
return self._closed
|
|
193
|
+
|
|
194
|
+
def readable(self) -> bool:
|
|
195
|
+
return not self._closed
|
|
196
|
+
|
|
197
|
+
def writable(self) -> bool:
|
|
198
|
+
return not self._closed
|
|
199
|
+
|
|
200
|
+
def seekable(self) -> bool:
|
|
201
|
+
return not self._closed
|
|
202
|
+
|
|
203
|
+
def __enter__(self) -> "StringIO":
|
|
204
|
+
return self
|
|
205
|
+
|
|
206
|
+
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
|
|
207
|
+
self.close()
|
|
208
|
+
|
|
209
|
+
def _collapse(self) -> None:
|
|
210
|
+
# After this, _chunks has exactly one element holding the full buffer
|
|
211
|
+
# (or is empty if total is 0).
|
|
212
|
+
if len(self._chunks) > 1:
|
|
213
|
+
self._chunks = ["".join(self._chunks)]
|
|
214
|
+
elif len(self._chunks) == 0 and self._total > 0:
|
|
215
|
+
# Defensive: invariant says this can't happen, but keep readers
|
|
216
|
+
# robust against hand-edited state.
|
|
217
|
+
self._chunks = [""]
|
|
218
|
+
|
|
219
|
+
def _check_open(self) -> None:
|
|
220
|
+
if self._closed:
|
|
221
|
+
# CPython StringIO drops the trailing period; BytesIO keeps it.
|
|
222
|
+
# We match both quirks for byte-identical cpy-phase output.
|
|
223
|
+
raise ValueError("I/O operation on closed file")
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
@nocopy
|
|
227
|
+
class BytesIO(BinaryWritable, BinaryReadable, Seekable, Closable):
|
|
228
|
+
_chunks: list[bytes]
|
|
229
|
+
_pos: Int32
|
|
230
|
+
_total: Int32
|
|
231
|
+
_closed: bool
|
|
232
|
+
|
|
233
|
+
def __init__(self, initial: bytes | None = None) -> None:
|
|
234
|
+
self._chunks = []
|
|
235
|
+
self._pos = 0
|
|
236
|
+
self._total = 0
|
|
237
|
+
if initial is not None and len(initial) > 0:
|
|
238
|
+
self._chunks.append(bytes(initial))
|
|
239
|
+
self._total = Int32(len(initial))
|
|
240
|
+
self._closed = False
|
|
241
|
+
|
|
242
|
+
def write(self, data: bytes) -> Int32:
|
|
243
|
+
self._check_open()
|
|
244
|
+
n: Int32 = Int32(len(data))
|
|
245
|
+
if n == 0:
|
|
246
|
+
return n
|
|
247
|
+
# Param `data: bytes` arrives as std::span<const uint8_t>; chunks list
|
|
248
|
+
# stores owned bytes, so wrap with `bytes(...)` to materialize.
|
|
249
|
+
owned: bytes = bytes(data)
|
|
250
|
+
if self._pos == self._total:
|
|
251
|
+
self._chunks.append(owned)
|
|
252
|
+
self._total = self._total + n
|
|
253
|
+
self._pos = self._total
|
|
254
|
+
return n
|
|
255
|
+
self._collapse()
|
|
256
|
+
buf: bytes = self._chunks[0]
|
|
257
|
+
end: Int32 = self._pos + n
|
|
258
|
+
# bytes slicing: basic_slice returns BytesView; concat needs bytes.
|
|
259
|
+
# Wrap each slice with bytes(...) so '+' resolves to bytes+bytes.
|
|
260
|
+
prefix: bytes = bytes(buf[:self._pos])
|
|
261
|
+
if end < Int32(len(buf)):
|
|
262
|
+
tail: bytes = bytes(buf[end:])
|
|
263
|
+
new_buf: bytes = prefix + owned + tail
|
|
264
|
+
else:
|
|
265
|
+
new_buf = prefix + owned
|
|
266
|
+
self._chunks = [new_buf]
|
|
267
|
+
self._total = Int32(len(new_buf))
|
|
268
|
+
self._pos = end
|
|
269
|
+
return n
|
|
270
|
+
|
|
271
|
+
def read(self) -> bytes:
|
|
272
|
+
self._check_open()
|
|
273
|
+
if self._pos >= self._total:
|
|
274
|
+
return b""
|
|
275
|
+
self._collapse()
|
|
276
|
+
out: bytes = bytes(self._chunks[0][self._pos:])
|
|
277
|
+
self._pos = self._total
|
|
278
|
+
return out
|
|
279
|
+
|
|
280
|
+
def readline(self) -> bytes:
|
|
281
|
+
self._check_open()
|
|
282
|
+
if self._pos >= self._total:
|
|
283
|
+
return b""
|
|
284
|
+
self._collapse()
|
|
285
|
+
buf: bytes = self._chunks[0]
|
|
286
|
+
# Same start-arg gap as str.find: search the suffix and adjust.
|
|
287
|
+
suffix: bytes = bytes(buf[self._pos:])
|
|
288
|
+
rel: Int32 = suffix.find(b"\n")
|
|
289
|
+
if rel < 0:
|
|
290
|
+
out: bytes = suffix
|
|
291
|
+
self._pos = self._total
|
|
292
|
+
else:
|
|
293
|
+
stop: Int32 = self._pos + rel + 1
|
|
294
|
+
out = bytes(buf[self._pos:stop])
|
|
295
|
+
self._pos = stop
|
|
296
|
+
return out
|
|
297
|
+
|
|
298
|
+
def readlines(self) -> Own[list[bytes]]:
|
|
299
|
+
out: list[bytes] = []
|
|
300
|
+
while True:
|
|
301
|
+
line: bytes = self.readline()
|
|
302
|
+
if len(line) == 0:
|
|
303
|
+
break
|
|
304
|
+
out.append(line)
|
|
305
|
+
return out
|
|
306
|
+
|
|
307
|
+
def __iter__(self) -> Iterator[bytes]:
|
|
308
|
+
while True:
|
|
309
|
+
line: bytes = self.readline()
|
|
310
|
+
if len(line) == 0:
|
|
311
|
+
return
|
|
312
|
+
yield line
|
|
313
|
+
|
|
314
|
+
def getvalue(self) -> bytes:
|
|
315
|
+
self._check_open()
|
|
316
|
+
if len(self._chunks) == 0:
|
|
317
|
+
return b""
|
|
318
|
+
if len(self._chunks) == 1:
|
|
319
|
+
return self._chunks[0]
|
|
320
|
+
return b"".join(self._chunks)
|
|
321
|
+
|
|
322
|
+
def tell(self) -> Int32:
|
|
323
|
+
self._check_open()
|
|
324
|
+
return self._pos
|
|
325
|
+
|
|
326
|
+
def seek(self, pos: Int32, whence: Int32 = 0) -> Int32:
|
|
327
|
+
self._check_open()
|
|
328
|
+
new_pos: Int32 = 0
|
|
329
|
+
if whence == _SEEK_SET:
|
|
330
|
+
new_pos = pos
|
|
331
|
+
elif whence == _SEEK_CUR:
|
|
332
|
+
new_pos = self._pos + pos
|
|
333
|
+
elif whence == _SEEK_END:
|
|
334
|
+
new_pos = self._total + pos
|
|
335
|
+
else:
|
|
336
|
+
raise ValueError("invalid whence")
|
|
337
|
+
if new_pos < 0:
|
|
338
|
+
raise ValueError("negative seek position")
|
|
339
|
+
if new_pos > self._total:
|
|
340
|
+
new_pos = self._total
|
|
341
|
+
self._pos = new_pos
|
|
342
|
+
return self._pos
|
|
343
|
+
|
|
344
|
+
def truncate(self, size: Int32 = -1) -> Int32:
|
|
345
|
+
self._check_open()
|
|
346
|
+
n: Int32 = size if size >= 0 else self._pos
|
|
347
|
+
if n >= self._total:
|
|
348
|
+
return self._total
|
|
349
|
+
self._collapse()
|
|
350
|
+
if n == 0:
|
|
351
|
+
self._chunks = []
|
|
352
|
+
else:
|
|
353
|
+
self._chunks = [bytes(self._chunks[0][:n])]
|
|
354
|
+
self._total = n
|
|
355
|
+
if self._pos > n:
|
|
356
|
+
self._pos = n
|
|
357
|
+
return n
|
|
358
|
+
|
|
359
|
+
def flush(self) -> None:
|
|
360
|
+
self._check_open()
|
|
361
|
+
|
|
362
|
+
def close(self) -> None:
|
|
363
|
+
self._closed = True
|
|
364
|
+
self._chunks = []
|
|
365
|
+
self._total = 0
|
|
366
|
+
self._pos = 0
|
|
367
|
+
|
|
368
|
+
@property
|
|
369
|
+
def closed(self) -> bool:
|
|
370
|
+
return self._closed
|
|
371
|
+
|
|
372
|
+
def readable(self) -> bool:
|
|
373
|
+
return not self._closed
|
|
374
|
+
|
|
375
|
+
def writable(self) -> bool:
|
|
376
|
+
return not self._closed
|
|
377
|
+
|
|
378
|
+
def seekable(self) -> bool:
|
|
379
|
+
return not self._closed
|
|
380
|
+
|
|
381
|
+
def __enter__(self) -> "BytesIO":
|
|
382
|
+
return self
|
|
383
|
+
|
|
384
|
+
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
|
|
385
|
+
self.close()
|
|
386
|
+
|
|
387
|
+
def _collapse(self) -> None:
|
|
388
|
+
if len(self._chunks) > 1:
|
|
389
|
+
self._chunks = [b"".join(self._chunks)]
|
|
390
|
+
elif len(self._chunks) == 0 and self._total > 0:
|
|
391
|
+
self._chunks = [b""]
|
|
392
|
+
|
|
393
|
+
def _check_open(self) -> None:
|
|
394
|
+
if self._closed:
|
|
395
|
+
raise ValueError("I/O operation on closed file.")
|