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,410 @@
|
|
|
1
|
+
# base64 -- RFC 4648 binary-to-text encodings (b64, b32, b16).
|
|
2
|
+
#
|
|
3
|
+
# Gaps vs. CPython:
|
|
4
|
+
# - b85/a85 encodings not implemented (rare; separate algorithms).
|
|
5
|
+
# - memoryview input not accepted: depends on TPy builtin `memoryview`,
|
|
6
|
+
# which is itself missing (see STDLIB_ROADMAP.md builtins section).
|
|
7
|
+
# - `b64decode(..., validate=False)` is stricter than CPython on
|
|
8
|
+
# degenerate padding. CPython's `binascii.a2b_base64` silently eats
|
|
9
|
+
# excess padding bytes: `b64decode(b"====") == b""`,
|
|
10
|
+
# `b64decode(b"TWFu=") == b"Man"`. This implementation raises
|
|
11
|
+
# ValueError in those cases (padding-length guard is unconditional).
|
|
12
|
+
# Valid inputs decode identically; only pathological inputs differ.
|
|
13
|
+
#
|
|
14
|
+
# Performance TODO -- benchmark vs. optimal C and close the gap.
|
|
15
|
+
# Current release-build numbers (1 MB payload, 50-iter avg, debug build
|
|
16
|
+
# excluded): TPy encode 540 MB/s, decode 500 MB/s; CPython `binascii`
|
|
17
|
+
# (hand-tuned C) encode 720 MB/s, decode 740 MB/s -- roughly 1.3-1.5x
|
|
18
|
+
# slower. Small-payload (32 B token) decode already beats CPython
|
|
19
|
+
# (lower per-call overhead). Low-hanging fruit to close the bulk gap:
|
|
20
|
+
# 1. Elide bounds checks on `data[i]`/`data[i+1]`/... when the loop
|
|
21
|
+
# guard (`i + 3 <= n`) proves in-range. Needs value-range analysis
|
|
22
|
+
# to flow across the if/while. Generic compiler work; helps every
|
|
23
|
+
# stdlib byte-level loop. Tracked in TODO.md.
|
|
24
|
+
# 2. Pre-size the output bytearray to the known final length instead
|
|
25
|
+
# of growing via push_back. Needs `bytearray.reserve()` (not yet
|
|
26
|
+
# exposed).
|
|
27
|
+
# 3. Fuse the `_filter_b64_input` + `_b64_decode` passes in lax mode
|
|
28
|
+
# (validate=False) -- single walk, skip non-alphabet chars as
|
|
29
|
+
# encountered.
|
|
30
|
+
# 4. `encodebytes`: inline the 76-char line wrap into the encode loop
|
|
31
|
+
# instead of encoding once and re-walking to insert `\n`.
|
|
32
|
+
# Compare against CPython on representative payloads before claiming a
|
|
33
|
+
# fix works -- aim for parity with binascii on 1 MB, superior on small
|
|
34
|
+
# inputs.
|
|
35
|
+
# tpy: cpp_namespace("tpystd::base64")
|
|
36
|
+
from typing import overload
|
|
37
|
+
from tpy import Int32, UInt8
|
|
38
|
+
|
|
39
|
+
_B64_STD: bytes = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
|
|
40
|
+
_B64_URL: bytes = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
|
|
41
|
+
_B32_ALPHA: bytes = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
|
|
42
|
+
_B16_ALPHA: bytes = b"0123456789ABCDEF"
|
|
43
|
+
|
|
44
|
+
_PAD: Int32 = 61 # '='
|
|
45
|
+
_CHAR_PLUS: Int32 = 43
|
|
46
|
+
_CHAR_SLASH: Int32 = 47
|
|
47
|
+
_CHAR_MINUS: Int32 = 45
|
|
48
|
+
_CHAR_UNDER: Int32 = 95
|
|
49
|
+
|
|
50
|
+
def _b64_encode(data: bytes, alphabet: bytes) -> bytes:
|
|
51
|
+
n: Int32 = Int32(len(data))
|
|
52
|
+
result: bytearray = bytearray()
|
|
53
|
+
i: Int32 = 0
|
|
54
|
+
while i + 3 <= n:
|
|
55
|
+
b0: Int32 = Int32(data[i])
|
|
56
|
+
b1: Int32 = Int32(data[i + 1])
|
|
57
|
+
b2: Int32 = Int32(data[i + 2])
|
|
58
|
+
result.append(alphabet[b0 >> 2])
|
|
59
|
+
result.append(alphabet[((b0 & 0x03) << 4) | (b1 >> 4)])
|
|
60
|
+
result.append(alphabet[((b1 & 0x0F) << 2) | (b2 >> 6)])
|
|
61
|
+
result.append(alphabet[b2 & 0x3F])
|
|
62
|
+
i += 3
|
|
63
|
+
rem: Int32 = n - i
|
|
64
|
+
if rem == 1:
|
|
65
|
+
r0: Int32 = Int32(data[i])
|
|
66
|
+
result.append(alphabet[r0 >> 2])
|
|
67
|
+
result.append(alphabet[(r0 & 0x03) << 4])
|
|
68
|
+
result.append(UInt8(_PAD))
|
|
69
|
+
result.append(UInt8(_PAD))
|
|
70
|
+
elif rem == 2:
|
|
71
|
+
s0: Int32 = Int32(data[i])
|
|
72
|
+
s1: Int32 = Int32(data[i + 1])
|
|
73
|
+
result.append(alphabet[s0 >> 2])
|
|
74
|
+
result.append(alphabet[((s0 & 0x03) << 4) | (s1 >> 4)])
|
|
75
|
+
result.append(alphabet[(s1 & 0x0F) << 2])
|
|
76
|
+
result.append(UInt8(_PAD))
|
|
77
|
+
return bytes(result)
|
|
78
|
+
|
|
79
|
+
def _b64_char_to_value(c: Int32, c62: Int32, c63: Int32) -> Int32:
|
|
80
|
+
if c >= 65 and c <= 90:
|
|
81
|
+
return c - 65
|
|
82
|
+
if c >= 97 and c <= 122:
|
|
83
|
+
return c - 97 + 26
|
|
84
|
+
if c >= 48 and c <= 57:
|
|
85
|
+
return c - 48 + 52
|
|
86
|
+
if c == c62:
|
|
87
|
+
return 62
|
|
88
|
+
if c == c63:
|
|
89
|
+
return 63
|
|
90
|
+
raise ValueError("Invalid base64 character")
|
|
91
|
+
|
|
92
|
+
def _b64_decode(data: bytes, c62: Int32, c63: Int32) -> bytes:
|
|
93
|
+
n: Int32 = Int32(len(data))
|
|
94
|
+
if n % 4 != 0:
|
|
95
|
+
raise ValueError("Invalid base64-encoded data length")
|
|
96
|
+
result: bytearray = bytearray()
|
|
97
|
+
i: Int32 = 0
|
|
98
|
+
while i < n:
|
|
99
|
+
c0: Int32 = Int32(data[i])
|
|
100
|
+
c1: Int32 = Int32(data[i + 1])
|
|
101
|
+
c2: Int32 = Int32(data[i + 2])
|
|
102
|
+
c3: Int32 = Int32(data[i + 3])
|
|
103
|
+
d0: Int32 = _b64_char_to_value(c0, c62, c63)
|
|
104
|
+
d1: Int32 = _b64_char_to_value(c1, c62, c63)
|
|
105
|
+
if c2 == _PAD:
|
|
106
|
+
if c3 != _PAD or i + 4 != n:
|
|
107
|
+
raise ValueError("Invalid base64 padding")
|
|
108
|
+
result.append(UInt8(((d0 << 2) | (d1 >> 4)) & 0xFF))
|
|
109
|
+
elif c3 == _PAD:
|
|
110
|
+
if i + 4 != n:
|
|
111
|
+
raise ValueError("Invalid base64 padding")
|
|
112
|
+
e2: Int32 = _b64_char_to_value(c2, c62, c63)
|
|
113
|
+
result.append(UInt8(((d0 << 2) | (d1 >> 4)) & 0xFF))
|
|
114
|
+
result.append(UInt8((((d1 & 0x0F) << 4) | (e2 >> 2)) & 0xFF))
|
|
115
|
+
else:
|
|
116
|
+
f2: Int32 = _b64_char_to_value(c2, c62, c63)
|
|
117
|
+
f3: Int32 = _b64_char_to_value(c3, c62, c63)
|
|
118
|
+
result.append(UInt8(((d0 << 2) | (d1 >> 4)) & 0xFF))
|
|
119
|
+
result.append(UInt8((((d1 & 0x0F) << 4) | (f2 >> 2)) & 0xFF))
|
|
120
|
+
result.append(UInt8((((f2 & 0x03) << 6) | f3) & 0xFF))
|
|
121
|
+
i += 4
|
|
122
|
+
return bytes(result)
|
|
123
|
+
|
|
124
|
+
def _build_altchars_alphabet(altchars: bytes) -> bytes:
|
|
125
|
+
if len(altchars) != 2:
|
|
126
|
+
raise ValueError("altchars must be 2 bytes")
|
|
127
|
+
buf: bytearray = bytearray()
|
|
128
|
+
i: Int32 = 0
|
|
129
|
+
while i < 62:
|
|
130
|
+
buf.append(_B64_STD[i])
|
|
131
|
+
i += 1
|
|
132
|
+
buf.append(altchars[0])
|
|
133
|
+
buf.append(altchars[1])
|
|
134
|
+
return bytes(buf)
|
|
135
|
+
|
|
136
|
+
def _filter_b64_input(data: bytes, c62: Int32, c63: Int32) -> bytes:
|
|
137
|
+
# CPython's validate=False default silently drops non-alphabet chars
|
|
138
|
+
# (matching RFC 4648's MIME-mode leniency). Keep padding chars.
|
|
139
|
+
buf: bytearray = bytearray()
|
|
140
|
+
n: Int32 = Int32(len(data))
|
|
141
|
+
i: Int32 = 0
|
|
142
|
+
while i < n:
|
|
143
|
+
c: Int32 = Int32(data[i])
|
|
144
|
+
keep: bool = False
|
|
145
|
+
if c >= 65 and c <= 90:
|
|
146
|
+
keep = True
|
|
147
|
+
elif c >= 97 and c <= 122:
|
|
148
|
+
keep = True
|
|
149
|
+
elif c >= 48 and c <= 57:
|
|
150
|
+
keep = True
|
|
151
|
+
elif c == c62 or c == c63 or c == _PAD:
|
|
152
|
+
keep = True
|
|
153
|
+
if keep:
|
|
154
|
+
buf.append(UInt8(c))
|
|
155
|
+
i += 1
|
|
156
|
+
return bytes(buf)
|
|
157
|
+
|
|
158
|
+
def b64encode(data: bytes, altchars: bytes | None = None) -> bytes:
|
|
159
|
+
if altchars is None:
|
|
160
|
+
return _b64_encode(data, _B64_STD)
|
|
161
|
+
return _b64_encode(data, _build_altchars_alphabet(altchars))
|
|
162
|
+
|
|
163
|
+
@overload
|
|
164
|
+
def b64decode(data: bytes, altchars: bytes | None = None, validate: bool = False) -> bytes:
|
|
165
|
+
c62: Int32 = _CHAR_PLUS
|
|
166
|
+
c63: Int32 = _CHAR_SLASH
|
|
167
|
+
if altchars is not None:
|
|
168
|
+
if len(altchars) != 2:
|
|
169
|
+
raise ValueError("altchars must be 2 bytes")
|
|
170
|
+
c62 = Int32(altchars[0])
|
|
171
|
+
c63 = Int32(altchars[1])
|
|
172
|
+
if validate:
|
|
173
|
+
return _b64_decode(data, c62, c63)
|
|
174
|
+
return _b64_decode(_filter_b64_input(data, c62, c63), c62, c63)
|
|
175
|
+
|
|
176
|
+
@overload
|
|
177
|
+
def b64decode(data: str, altchars: bytes | None = None, validate: bool = False) -> bytes:
|
|
178
|
+
return b64decode(data.encode(), altchars, validate)
|
|
179
|
+
|
|
180
|
+
def standard_b64encode(data: bytes) -> bytes:
|
|
181
|
+
return _b64_encode(data, _B64_STD)
|
|
182
|
+
|
|
183
|
+
@overload
|
|
184
|
+
def standard_b64decode(data: bytes) -> bytes:
|
|
185
|
+
return _b64_decode(_filter_b64_input(data, _CHAR_PLUS, _CHAR_SLASH), _CHAR_PLUS, _CHAR_SLASH)
|
|
186
|
+
|
|
187
|
+
@overload
|
|
188
|
+
def standard_b64decode(data: str) -> bytes:
|
|
189
|
+
return standard_b64decode(data.encode())
|
|
190
|
+
|
|
191
|
+
def urlsafe_b64encode(data: bytes) -> bytes:
|
|
192
|
+
return _b64_encode(data, _B64_URL)
|
|
193
|
+
|
|
194
|
+
@overload
|
|
195
|
+
def urlsafe_b64decode(data: bytes) -> bytes:
|
|
196
|
+
return _b64_decode(_filter_b64_input(data, _CHAR_MINUS, _CHAR_UNDER), _CHAR_MINUS, _CHAR_UNDER)
|
|
197
|
+
|
|
198
|
+
@overload
|
|
199
|
+
def urlsafe_b64decode(data: str) -> bytes:
|
|
200
|
+
return urlsafe_b64decode(data.encode())
|
|
201
|
+
|
|
202
|
+
def b16encode(data: bytes) -> bytes:
|
|
203
|
+
n: Int32 = Int32(len(data))
|
|
204
|
+
result: bytearray = bytearray()
|
|
205
|
+
i: Int32 = 0
|
|
206
|
+
while i < n:
|
|
207
|
+
b: Int32 = Int32(data[i])
|
|
208
|
+
result.append(_B16_ALPHA[b >> 4])
|
|
209
|
+
result.append(_B16_ALPHA[b & 0x0F])
|
|
210
|
+
i += 1
|
|
211
|
+
return bytes(result)
|
|
212
|
+
|
|
213
|
+
def _b16_char_to_value(c: Int32, casefold: bool) -> Int32:
|
|
214
|
+
if c >= 48 and c <= 57:
|
|
215
|
+
return c - 48
|
|
216
|
+
if c >= 65 and c <= 70:
|
|
217
|
+
return c - 65 + 10
|
|
218
|
+
if casefold and c >= 97 and c <= 102:
|
|
219
|
+
return c - 97 + 10
|
|
220
|
+
raise ValueError("Invalid base16 character")
|
|
221
|
+
|
|
222
|
+
@overload
|
|
223
|
+
def b16decode(data: bytes, casefold: bool = False) -> bytes:
|
|
224
|
+
n: Int32 = Int32(len(data))
|
|
225
|
+
if n % 2 != 0:
|
|
226
|
+
raise ValueError("Invalid base16-encoded data length")
|
|
227
|
+
result: bytearray = bytearray()
|
|
228
|
+
i: Int32 = 0
|
|
229
|
+
while i < n:
|
|
230
|
+
hi: Int32 = _b16_char_to_value(Int32(data[i]), casefold)
|
|
231
|
+
lo: Int32 = _b16_char_to_value(Int32(data[i + 1]), casefold)
|
|
232
|
+
result.append(UInt8(((hi << 4) | lo) & 0xFF))
|
|
233
|
+
i += 2
|
|
234
|
+
return bytes(result)
|
|
235
|
+
|
|
236
|
+
@overload
|
|
237
|
+
def b16decode(data: str, casefold: bool = False) -> bytes:
|
|
238
|
+
return b16decode(data.encode(), casefold)
|
|
239
|
+
|
|
240
|
+
def b32encode(data: bytes) -> bytes:
|
|
241
|
+
# 5 input bytes (40 bits) -> 8 output chars (5 bits each).
|
|
242
|
+
n: Int32 = Int32(len(data))
|
|
243
|
+
result: bytearray = bytearray()
|
|
244
|
+
i: Int32 = 0
|
|
245
|
+
while i + 5 <= n:
|
|
246
|
+
b0: Int32 = Int32(data[i])
|
|
247
|
+
b1: Int32 = Int32(data[i + 1])
|
|
248
|
+
b2: Int32 = Int32(data[i + 2])
|
|
249
|
+
b3: Int32 = Int32(data[i + 3])
|
|
250
|
+
b4: Int32 = Int32(data[i + 4])
|
|
251
|
+
result.append(_B32_ALPHA[(b0 >> 3) & 0x1F])
|
|
252
|
+
result.append(_B32_ALPHA[((b0 & 0x07) << 2) | (b1 >> 6)])
|
|
253
|
+
result.append(_B32_ALPHA[(b1 >> 1) & 0x1F])
|
|
254
|
+
result.append(_B32_ALPHA[((b1 & 0x01) << 4) | (b2 >> 4)])
|
|
255
|
+
result.append(_B32_ALPHA[((b2 & 0x0F) << 1) | (b3 >> 7)])
|
|
256
|
+
result.append(_B32_ALPHA[(b3 >> 2) & 0x1F])
|
|
257
|
+
result.append(_B32_ALPHA[((b3 & 0x03) << 3) | (b4 >> 5)])
|
|
258
|
+
result.append(_B32_ALPHA[b4 & 0x1F])
|
|
259
|
+
i += 5
|
|
260
|
+
rem: Int32 = n - i
|
|
261
|
+
if rem > 0:
|
|
262
|
+
# CPython's b32encode pads input with zero bytes to 5-byte boundary,
|
|
263
|
+
# emits 8 output chars, then replaces trailing positions with '=' by
|
|
264
|
+
# rem-based count: 1->6 pads, 2->4, 3->3, 4->1.
|
|
265
|
+
t0: Int32 = Int32(data[i])
|
|
266
|
+
t1: Int32 = 0
|
|
267
|
+
t2: Int32 = 0
|
|
268
|
+
t3: Int32 = 0
|
|
269
|
+
if rem >= 2:
|
|
270
|
+
t1 = Int32(data[i + 1])
|
|
271
|
+
if rem >= 3:
|
|
272
|
+
t2 = Int32(data[i + 2])
|
|
273
|
+
if rem >= 4:
|
|
274
|
+
t3 = Int32(data[i + 3])
|
|
275
|
+
result.append(_B32_ALPHA[(t0 >> 3) & 0x1F])
|
|
276
|
+
result.append(_B32_ALPHA[((t0 & 0x07) << 2) | (t1 >> 6)])
|
|
277
|
+
if rem == 1:
|
|
278
|
+
result.append(UInt8(_PAD))
|
|
279
|
+
result.append(UInt8(_PAD))
|
|
280
|
+
result.append(UInt8(_PAD))
|
|
281
|
+
result.append(UInt8(_PAD))
|
|
282
|
+
result.append(UInt8(_PAD))
|
|
283
|
+
result.append(UInt8(_PAD))
|
|
284
|
+
return bytes(result)
|
|
285
|
+
result.append(_B32_ALPHA[(t1 >> 1) & 0x1F])
|
|
286
|
+
result.append(_B32_ALPHA[((t1 & 0x01) << 4) | (t2 >> 4)])
|
|
287
|
+
if rem == 2:
|
|
288
|
+
result.append(UInt8(_PAD))
|
|
289
|
+
result.append(UInt8(_PAD))
|
|
290
|
+
result.append(UInt8(_PAD))
|
|
291
|
+
result.append(UInt8(_PAD))
|
|
292
|
+
return bytes(result)
|
|
293
|
+
result.append(_B32_ALPHA[((t2 & 0x0F) << 1) | (t3 >> 7)])
|
|
294
|
+
if rem == 3:
|
|
295
|
+
result.append(UInt8(_PAD))
|
|
296
|
+
result.append(UInt8(_PAD))
|
|
297
|
+
result.append(UInt8(_PAD))
|
|
298
|
+
return bytes(result)
|
|
299
|
+
result.append(_B32_ALPHA[(t3 >> 2) & 0x1F])
|
|
300
|
+
result.append(_B32_ALPHA[(t3 & 0x03) << 3])
|
|
301
|
+
result.append(UInt8(_PAD))
|
|
302
|
+
return bytes(result)
|
|
303
|
+
|
|
304
|
+
def _b32_char_to_value(c: Int32) -> Int32:
|
|
305
|
+
if c >= 65 and c <= 90:
|
|
306
|
+
return c - 65
|
|
307
|
+
if c >= 50 and c <= 55: # '2'-'7'
|
|
308
|
+
return c - 50 + 26
|
|
309
|
+
raise ValueError("Invalid base32 character")
|
|
310
|
+
|
|
311
|
+
def _b32_preprocess(data: bytes, casefold: bool, map01: bytes | None) -> bytes:
|
|
312
|
+
n: Int32 = Int32(len(data))
|
|
313
|
+
buf: bytearray = bytearray()
|
|
314
|
+
map_target: Int32 = 0
|
|
315
|
+
if map01 is not None:
|
|
316
|
+
# RFC 4648 section 2.4 recommends 'I' or 'L' as targets, but CPython
|
|
317
|
+
# accepts any single byte -- match that.
|
|
318
|
+
if len(map01) != 1:
|
|
319
|
+
raise ValueError("map01 must be a single byte")
|
|
320
|
+
map_target = Int32(map01[0])
|
|
321
|
+
i: Int32 = 0
|
|
322
|
+
while i < n:
|
|
323
|
+
c: Int32 = Int32(data[i])
|
|
324
|
+
if casefold and c >= 97 and c <= 122:
|
|
325
|
+
c = c - 32 # to upper
|
|
326
|
+
if map01 is not None:
|
|
327
|
+
if c == 48: # '0' -> 'O'
|
|
328
|
+
c = 79
|
|
329
|
+
elif c == 49: # '1' -> map_target
|
|
330
|
+
c = map_target
|
|
331
|
+
buf.append(UInt8(c))
|
|
332
|
+
i += 1
|
|
333
|
+
return bytes(buf)
|
|
334
|
+
|
|
335
|
+
@overload
|
|
336
|
+
def b32decode(data: bytes, casefold: bool = False, map01: bytes | None = None) -> bytes:
|
|
337
|
+
if casefold or map01 is not None:
|
|
338
|
+
return _b32decode_impl(_b32_preprocess(data, casefold, map01))
|
|
339
|
+
return _b32decode_impl(data)
|
|
340
|
+
|
|
341
|
+
@overload
|
|
342
|
+
def b32decode(data: str, casefold: bool = False, map01: bytes | None = None) -> bytes:
|
|
343
|
+
return b32decode(data.encode(), casefold, map01)
|
|
344
|
+
|
|
345
|
+
def _b32decode_impl(data: bytes) -> bytes:
|
|
346
|
+
n: Int32 = Int32(len(data))
|
|
347
|
+
if n % 8 != 0:
|
|
348
|
+
raise ValueError("Invalid base32-encoded data length")
|
|
349
|
+
result: bytearray = bytearray()
|
|
350
|
+
i: Int32 = 0
|
|
351
|
+
while i < n:
|
|
352
|
+
# Count pads in this 8-char block (only trailing are valid).
|
|
353
|
+
pad: Int32 = 0
|
|
354
|
+
j: Int32 = 7
|
|
355
|
+
while j >= 0 and Int32(data[i + j]) == _PAD:
|
|
356
|
+
pad += 1
|
|
357
|
+
j -= 1
|
|
358
|
+
if pad != 0 and pad != 1 and pad != 3 and pad != 4 and pad != 6:
|
|
359
|
+
raise ValueError("Invalid base32 padding")
|
|
360
|
+
if pad > 0 and i + 8 != n:
|
|
361
|
+
raise ValueError("Invalid base32 padding")
|
|
362
|
+
# Decode non-pad chars.
|
|
363
|
+
vals: list[Int32] = [0, 0, 0, 0, 0, 0, 0, 0]
|
|
364
|
+
k: Int32 = 0
|
|
365
|
+
while k < 8 - pad:
|
|
366
|
+
vals[k] = _b32_char_to_value(Int32(data[i + k]))
|
|
367
|
+
k += 1
|
|
368
|
+
result.append(UInt8(((vals[0] << 3) | (vals[1] >> 2)) & 0xFF))
|
|
369
|
+
if pad == 6:
|
|
370
|
+
i += 8
|
|
371
|
+
continue
|
|
372
|
+
result.append(UInt8((((vals[1] & 0x03) << 6) | (vals[2] << 1) | (vals[3] >> 4)) & 0xFF))
|
|
373
|
+
if pad == 4:
|
|
374
|
+
i += 8
|
|
375
|
+
continue
|
|
376
|
+
result.append(UInt8((((vals[3] & 0x0F) << 4) | (vals[4] >> 1)) & 0xFF))
|
|
377
|
+
if pad == 3:
|
|
378
|
+
i += 8
|
|
379
|
+
continue
|
|
380
|
+
result.append(UInt8((((vals[4] & 0x01) << 7) | (vals[5] << 2) | (vals[6] >> 3)) & 0xFF))
|
|
381
|
+
if pad == 1:
|
|
382
|
+
i += 8
|
|
383
|
+
continue
|
|
384
|
+
result.append(UInt8((((vals[6] & 0x07) << 5) | vals[7]) & 0xFF))
|
|
385
|
+
i += 8
|
|
386
|
+
return bytes(result)
|
|
387
|
+
|
|
388
|
+
_NEWLINE: Int32 = 10 # '\n'
|
|
389
|
+
_MIME_LINE: Int32 = 76 # MIME line length for encodebytes
|
|
390
|
+
|
|
391
|
+
def encodebytes(data: bytes) -> bytes:
|
|
392
|
+
# MIME-style: standard base64 with a newline every 76 output chars and
|
|
393
|
+
# a trailing newline. For empty input, returns b'' (no newline).
|
|
394
|
+
encoded: bytes = _b64_encode(data, _B64_STD)
|
|
395
|
+
n: Int32 = Int32(len(encoded))
|
|
396
|
+
result: bytearray = bytearray()
|
|
397
|
+
i: Int32 = 0
|
|
398
|
+
while i < n:
|
|
399
|
+
j: Int32 = 0
|
|
400
|
+
while j < _MIME_LINE and i < n:
|
|
401
|
+
result.append(encoded[i])
|
|
402
|
+
i += 1
|
|
403
|
+
j += 1
|
|
404
|
+
result.append(UInt8(_NEWLINE))
|
|
405
|
+
return bytes(result)
|
|
406
|
+
|
|
407
|
+
def decodebytes(data: bytes) -> bytes:
|
|
408
|
+
# MIME-style: tolerate newlines and whitespace in input.
|
|
409
|
+
return b64decode(data)
|
|
410
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# bisect -- array bisection algorithms
|
|
2
|
+
# tpy: cpp_namespace("tpystd::bisect")
|
|
3
|
+
from tpy import Int32, Comparable, copy
|
|
4
|
+
|
|
5
|
+
def bisect_left[T: Comparable](a: list[T], x: T) -> Int32:
|
|
6
|
+
lo: Int32 = 0
|
|
7
|
+
hi: Int32 = Int32(len(a))
|
|
8
|
+
while lo < hi:
|
|
9
|
+
mid: Int32 = (lo + hi) // 2
|
|
10
|
+
if a[mid] < x:
|
|
11
|
+
lo = mid + 1
|
|
12
|
+
else:
|
|
13
|
+
hi = mid
|
|
14
|
+
return lo
|
|
15
|
+
|
|
16
|
+
def bisect_right[T: Comparable](a: list[T], x: T) -> Int32:
|
|
17
|
+
lo: Int32 = 0
|
|
18
|
+
hi: Int32 = Int32(len(a))
|
|
19
|
+
while lo < hi:
|
|
20
|
+
mid: Int32 = (lo + hi) // 2
|
|
21
|
+
if x < a[mid]:
|
|
22
|
+
hi = mid
|
|
23
|
+
else:
|
|
24
|
+
lo = mid + 1
|
|
25
|
+
return lo
|
|
26
|
+
|
|
27
|
+
def insort_left[T: Comparable](a: list[T], x: T) -> None:
|
|
28
|
+
i: Int32 = bisect_left(a, x)
|
|
29
|
+
a.insert(i, copy(x))
|
|
30
|
+
|
|
31
|
+
def insort_right[T: Comparable](a: list[T], x: T) -> None:
|
|
32
|
+
i: Int32 = bisect_right(a, x)
|
|
33
|
+
a.insert(i, copy(x))
|
|
34
|
+
|
|
35
|
+
def bisect[T: Comparable](a: list[T], x: T) -> Int32:
|
|
36
|
+
return bisect_right(a, x)
|
|
37
|
+
|
|
38
|
+
def insort[T: Comparable](a: list[T], x: T) -> None:
|
|
39
|
+
insort_right(a, x)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# tpy: native_module
|
|
2
|
+
# tpy: cpp_namespace("tpystd::builtins")
|
|
3
|
+
from tpy._builtins import (
|
|
4
|
+
BaseException, Exception, ValueError, OSError, FileNotFoundError,
|
|
5
|
+
AttributeError, AssertionError, IndexError, KeyError,
|
|
6
|
+
ArithmeticError, ZeroDivisionError, OverflowError,
|
|
7
|
+
TypeError, NotImplementedError, RuntimeError, MemoryError, StopIteration,
|
|
8
|
+
StopAsyncIteration, TimeoutError,
|
|
9
|
+
Range, range,
|
|
10
|
+
len, repr, hash, chr, ord, abs, min, max, pow, divmod, next, iter, round, print, input, isinstance, getattr, setattr, delattr, hasattr,
|
|
11
|
+
all, any, sum, sorted, bin, hex, oct, enumerate, reversed, zip, map, filter,
|
|
12
|
+
bytes, bytearray,
|
|
13
|
+
bool, int, float, str, slice,
|
|
14
|
+
list, dict, dict_keys, dict_values, dict_items,
|
|
15
|
+
set,
|
|
16
|
+
TextIO, BinaryIO, open, open_text, open_binary,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
# Types (always available as annotations via implicit `import builtins`
|
|
21
|
+
# semantics, matching CPython -- the parser auto-resolves any name in
|
|
22
|
+
# this __all__ against `builtins` without requiring `from builtins import`
|
|
23
|
+
# in user code).
|
|
24
|
+
"int", "float", "bool", "str", "bytes", "bytearray", "None",
|
|
25
|
+
"tuple", "basic_slice", "slice", "type",
|
|
26
|
+
"Exception", "ValueError", "OSError", "FileNotFoundError", "BaseException",
|
|
27
|
+
"AttributeError", "AssertionError", "IndexError", "KeyError",
|
|
28
|
+
"ArithmeticError", "ZeroDivisionError", "OverflowError",
|
|
29
|
+
"TypeError", "NotImplementedError", "RuntimeError", "MemoryError",
|
|
30
|
+
"list", "dict", "dict_keys", "dict_values", "dict_items", "set",
|
|
31
|
+
"Range", "range",
|
|
32
|
+
"len", "repr", "hash", "chr", "ord", "abs", "min", "max", "pow", "divmod", "next", "iter", "round",
|
|
33
|
+
"print", "input", "isinstance", "getattr", "setattr", "delattr", "hasattr",
|
|
34
|
+
"all", "any", "sum", "sorted", "bin", "hex", "oct", "enumerate", "reversed", "zip",
|
|
35
|
+
"map", "filter",
|
|
36
|
+
"StopIteration", "StopAsyncIteration", "TimeoutError",
|
|
37
|
+
"TextIO", "BinaryIO", "open", "open_text", "open_binary",
|
|
38
|
+
]
|