| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 22d0698 commit f5aba58
8 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1663,7 +1663,7 @@ PyAPI_FUNC(PyObject *) PyUnicode_TranslateCharmap( | |||
| 1663 | 1663 | ||
| 1664 | 1664 | PyAPI_FUNC(PyObject*) PyUnicode_DecodeMBCS( | |
| 1665 | 1665 | const char *string, /* MBCS encoded string */ | |
| 1666 | - Py_ssize_t length, /* size of string */ | ||
| 1666 | + Py_ssize_t length, /* size of string */ | ||
| 1667 | 1667 | const char *errors /* error handling */ | |
| 1668 | 1668 | ); | |
| 1669 | 1669 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -29,6 +29,7 @@ | |||
| 29 | 29 | """#" | |
| 30 | 30 | ||
| 31 | 31 | import codecs | |
| 32 | + import sys | ||
| 32 | 33 | from . import aliases | |
| 33 | 34 | ||
| 34 | 35 | _cache = {} | |
@@ -151,3 +152,12 @@ def search_function(encoding): | |||
| 151 | 152 | ||
| 152 | 153 | # Register the search_function in the Python codec registry | |
| 153 | 154 | codecs.register(search_function) | |
| 155 | + | ||
| 156 | + if sys.platform == 'win32': | ||
| 157 | + def _alias_mbcs(encoding): | ||
| 158 | + import _bootlocale | ||
| 159 | + if encoding == _bootlocale.getpreferredencoding(False): | ||
| 160 | + import encodings.mbcs | ||
| 161 | + return encodings.mbcs.getregentry() | ||
| 162 | + | ||
| 163 | + codecs.register(_alias_mbcs) | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -458,6 +458,7 @@ | |||
| 458 | 458 | 'macturkish' : 'mac_turkish', | |
| 459 | 459 | ||
| 460 | 460 | # mbcs codec | |
| 461 | + 'ansi' : 'mbcs', | ||
| 461 | 462 | 'dbcs' : 'mbcs', | |
| 462 | 463 | ||
| 463 | 464 | # ptcp154 codec | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,41 @@ | |||
| 1 | + """ Python 'oem' Codec for Windows | ||
| 2 | + | ||
| 3 | + """ | ||
| 4 | + # Import them explicitly to cause an ImportError | ||
| 5 | + # on non-Windows systems | ||
| 6 | + from codecs import oem_encode, oem_decode | ||
| 7 | + # for IncrementalDecoder, IncrementalEncoder, ... | ||
| 8 | + import codecs | ||
| 9 | + | ||
| 10 | + ### Codec APIs | ||
| 11 | + | ||
| 12 | + encode = oem_encode | ||
| 13 | + | ||
| 14 | + def decode(input, errors='strict'): | ||
| 15 | + return oem_decode(input, errors, True) | ||
| 16 | + | ||
| 17 | + class IncrementalEncoder(codecs.IncrementalEncoder): | ||
| 18 | + def encode(self, input, final=False): | ||
| 19 | + return oem_encode(input, self.errors)[0] | ||
| 20 | + | ||
| 21 | + class IncrementalDecoder(codecs.BufferedIncrementalDecoder): | ||
| 22 | + _buffer_decode = oem_decode | ||
| 23 | + | ||
| 24 | + class StreamWriter(codecs.StreamWriter): | ||
| 25 | + encode = oem_encode | ||
| 26 | + | ||
| 27 | + class StreamReader(codecs.StreamReader): | ||
| 28 | + decode = oem_decode | ||
| 29 | + | ||
| 30 | + ### encodings module API | ||
| 31 | + | ||
| 32 | + def getregentry(): | ||
| 33 | + return codecs.CodecInfo( | ||
| 34 | + name='oem', | ||
| 35 | + encode=encode, | ||
| 36 | + decode=decode, | ||
| 37 | + incrementalencoder=IncrementalEncoder, | ||
| 38 | + incrementaldecoder=IncrementalDecoder, | ||
| 39 | + streamreader=StreamReader, | ||
| 40 | + streamwriter=StreamWriter, | ||
| 41 | + ) | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -423,21 +423,6 @@ def register_readline(): | |||
| 423 | 423 | ||
| 424 | 424 | sys.__interactivehook__ = register_readline | |
| 425 | 425 | ||
| 426 | - def aliasmbcs(): | ||
| 427 | - """On Windows, some default encodings are not provided by Python, | ||
| 428 | - while they are always available as "mbcs" in each locale. Make | ||
| 429 | - them usable by aliasing to "mbcs" in such a case.""" | ||
| 430 | - if sys.platform == 'win32': | ||
| 431 | - import _bootlocale, codecs | ||
| 432 | - enc = _bootlocale.getpreferredencoding(False) | ||
| 433 | - if enc.startswith('cp'): # "cp***" ? | ||
| 434 | - try: | ||
| 435 | - codecs.lookup(enc) | ||
| 436 | - except LookupError: | ||
| 437 | - import encodings | ||
| 438 | - encodings._cache[enc] = encodings._unknown | ||
| 439 | - encodings.aliases.aliases[enc] = 'mbcs' | ||
| 440 | - | ||
| 441 | 426 | CONFIG_LINE = r'^(?P<key>(\w|[-_])+)\s*=\s*(?P<value>.*)\s*$' | |
| 442 | 427 | ||
| 443 | 428 | def venv(known_paths): | |
@@ -560,7 +545,6 @@ def main(): | |||
| 560 | 545 | setcopyright() | |
| 561 | 546 | sethelper() | |
| 562 | 547 | enablerlcompleter() | |
| 563 | - aliasmbcs() | ||
| 564 | 548 | execsitecustomize() | |
| 565 | 549 | if ENABLE_USER_SITE: | |
| 566 | 550 | execusercustomize() | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -8,11 +8,6 @@ | |||
| 8 | 8 | ||
| 9 | 9 | from test import support | |
| 10 | 10 | ||
| 11 | - if sys.platform == 'win32': | ||
| 12 | - VISTA_OR_LATER = (sys.getwindowsversion().major >= 6) | ||
| 13 | - else: | ||
| 14 | - VISTA_OR_LATER = False | ||
| 15 | - | ||
| 16 | 11 | try: | |
| 17 | 12 | import ctypes | |
| 18 | 13 | except ImportError: | |
@@ -841,18 +836,13 @@ def test_encode(self): | |||
| 841 | 836 | ('abc', 'strict', b'abc'), | |
| 842 | 837 | ('\xe9\u20ac', 'strict', b'\xc3\xa9\xe2\x82\xac'), | |
| 843 | 838 | ('\U0010ffff', 'strict', b'\xf4\x8f\xbf\xbf'), | |
| 839 | + ('\udc80', 'strict', None), | ||
| 840 | + ('\udc80', 'ignore', b''), | ||
| 841 | + ('\udc80', 'replace', b'?'), | ||
| 842 | + ('\udc80', 'backslashreplace', b'\\udc80'), | ||
| 843 | + ('\udc80', 'namereplace', b'\\udc80'), | ||
| 844 | + ('\udc80', 'surrogatepass', b'\xed\xb2\x80'), | ||
| 844 | 845 | ] | |
| 845 | - if VISTA_OR_LATER: | ||
| 846 | - tests.extend(( | ||
| 847 | - ('\udc80', 'strict', None), | ||
| 848 | - ('\udc80', 'ignore', b''), | ||
| 849 | - ('\udc80', 'replace', b'?'), | ||
| 850 | - ('\udc80', 'backslashreplace', b'\\udc80'), | ||
| 851 | - ('\udc80', 'namereplace', b'\\udc80'), | ||
| 852 | - ('\udc80', 'surrogatepass', b'\xed\xb2\x80'), | ||
| 853 | - )) | ||
| 854 | - else: | ||
| 855 | - tests.append(('\udc80', 'strict', b'\xed\xb2\x80')) | ||
| 856 | 846 | for text, errors, expected in tests: | |
| 857 | 847 | if expected is not None: | |
| 858 | 848 | try: | |
@@ -879,17 +869,10 @@ def test_decode(self): | |||
| 879 | 869 | (b'[\xff]', 'ignore', '[]'), | |
| 880 | 870 | (b'[\xff]', 'replace', '[\ufffd]'), | |
| 881 | 871 | (b'[\xff]', 'surrogateescape', '[\udcff]'), | |
| 872 | + (b'[\xed\xb2\x80]', 'strict', None), | ||
| 873 | + (b'[\xed\xb2\x80]', 'ignore', '[]'), | ||
| 874 | + (b'[\xed\xb2\x80]', 'replace', '[\ufffd\ufffd\ufffd]'), | ||
| 882 | 875 | ] | |
| 883 | - if VISTA_OR_LATER: | ||
| 884 | - tests.extend(( | ||
| 885 | - (b'[\xed\xb2\x80]', 'strict', None), | ||
| 886 | - (b'[\xed\xb2\x80]', 'ignore', '[]'), | ||
| 887 | - (b'[\xed\xb2\x80]', 'replace', '[\ufffd\ufffd\ufffd]'), | ||
| 888 | - )) | ||
| 889 | - else: | ||
| 890 | - tests.extend(( | ||
| 891 | - (b'[\xed\xb2\x80]', 'strict', '[\udc80]'), | ||
| 892 | - )) | ||
| 893 | 876 | for raw, errors, expected in tests: | |
| 894 | 877 | if expected is not None: | |
| 895 | 878 | try: | |
@@ -904,7 +887,6 @@ def test_decode(self): | |||
| 904 | 887 | self.assertRaises(UnicodeDecodeError, | |
| 905 | 888 | raw.decode, 'cp65001', errors) | |
| 906 | 889 | ||
| 907 | - @unittest.skipUnless(VISTA_OR_LATER, 'require Windows Vista or later') | ||
| 908 | 890 | def test_lone_surrogates(self): | |
| 909 | 891 | self.assertRaises(UnicodeEncodeError, "\ud800".encode, "cp65001") | |
| 910 | 892 | self.assertRaises(UnicodeDecodeError, b"\xed\xa0\x80".decode, "cp65001") | |
@@ -921,7 +903,6 @@ def test_lone_surrogates(self): | |||
| 921 | 903 | self.assertEqual("[\uDC80]".encode("cp65001", "replace"), | |
| 922 | 904 | b'[?]') | |
| 923 | 905 | ||
| 924 | - @unittest.skipUnless(VISTA_OR_LATER, 'require Windows Vista or later') | ||
| 925 | 906 | def test_surrogatepass_handler(self): | |
| 926 | 907 | self.assertEqual("abc\ud800def".encode("cp65001", "surrogatepass"), | |
| 927 | 908 | b"abc\xed\xa0\x80def") | |
@@ -1951,6 +1932,8 @@ def test_basic(self): | |||
| 1951 | 1932 | ||
| 1952 | 1933 | if hasattr(codecs, "mbcs_encode"): | |
| 1953 | 1934 | all_unicode_encodings.append("mbcs") | |
| 1935 | + if hasattr(codecs, "oem_encode"): | ||
| 1936 | + all_unicode_encodings.append("oem") | ||
| 1954 | 1937 | ||
| 1955 | 1938 | # The following encoding is not tested, because it's not supposed | |
| 1956 | 1939 | # to work: | |
@@ -3119,11 +3102,10 @@ def test_multibyte_encoding(self): | |||
| 3119 | 3102 | (b'\xff\xf4\x8f\xbf\xbf', 'ignore', '\U0010ffff'), | |
| 3120 | 3103 | (b'\xff\xf4\x8f\xbf\xbf', 'replace', '\ufffd\U0010ffff'), | |
| 3121 | 3104 | )) | |
| 3122 | - if VISTA_OR_LATER: | ||
| 3123 | - self.check_encode(self.CP_UTF8, ( | ||
| 3124 | - ('[\U0010ffff\uDC80]', 'ignore', b'[\xf4\x8f\xbf\xbf]'), | ||
| 3125 | - ('[\U0010ffff\uDC80]', 'replace', b'[\xf4\x8f\xbf\xbf?]'), | ||
| 3126 | - )) | ||
| 3105 | + self.check_encode(self.CP_UTF8, ( | ||
| 3106 | + ('[\U0010ffff\uDC80]', 'ignore', b'[\xf4\x8f\xbf\xbf]'), | ||
| 3107 | + ('[\U0010ffff\uDC80]', 'replace', b'[\xf4\x8f\xbf\xbf?]'), | ||
| 3108 | + )) | ||
| 3127 | 3109 | ||
| 3128 | 3110 | def test_incremental(self): | |
| 3129 | 3111 | decoded = codecs.code_page_decode(932, b'\x82', 'strict', False) | |
@@ -3144,6 +3126,20 @@ def test_incremental(self): | |||
| 3144 | 3126 | False) | |
| 3145 | 3127 | self.assertEqual(decoded, ('abc', 3)) | |
| 3146 | 3128 | ||
| 3129 | + def test_mbcs_alias(self): | ||
| 3130 | + # Check that looking up our 'default' codepage will return | ||
| 3131 | + # mbcs when we don't have a more specific one available | ||
| 3132 | + import _bootlocale | ||
| 3133 | + def _get_fake_codepage(*a): | ||
| 3134 | + return 'cp123' | ||
| 3135 | + old_getpreferredencoding = _bootlocale.getpreferredencoding | ||
| 3136 | + _bootlocale.getpreferredencoding = _get_fake_codepage | ||
| 3137 | + try: | ||
| 3138 | + codec = codecs.lookup('cp123') | ||
| 3139 | + self.assertEqual(codec.name, 'mbcs') | ||
| 3140 | + finally: | ||
| 3141 | + _bootlocale.getpreferredencoding = old_getpreferredencoding | ||
| 3142 | + | ||
| 3147 | 3143 | ||
| 3148 | 3144 | class ASCIITest(unittest.TestCase): | |
| 3149 | 3145 | def test_encode(self): | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -625,6 +625,25 @@ _codecs_mbcs_decode_impl(PyObject *module, Py_buffer *data, | |||
| 625 | 625 | return codec_tuple(decoded, consumed); | |
| 626 | 626 | } | |
| 627 | 627 | ||
| 628 | + /*[clinic input] | ||
| 629 | + _codecs.oem_decode | ||
| 630 | + data: Py_buffer | ||
| 631 | + errors: str(accept={str, NoneType}) = NULL | ||
| 632 | + final: int(c_default="0") = False | ||
| 633 | + / | ||
| 634 | + [clinic start generated code]*/ | ||
| 635 | + | ||
| 636 | + static PyObject * | ||
| 637 | + _codecs_oem_decode_impl(PyObject *module, Py_buffer *data, | ||
| 638 | + const char *errors, int final) | ||
| 639 | + /*[clinic end generated code: output=da1617612f3fcad8 input=95b8a92c446b03cd]*/ | ||
| 640 | + { | ||
| 641 | + Py_ssize_t consumed = data->len; | ||
| 642 | + PyObject *decoded = PyUnicode_DecodeCodePageStateful(CP_OEMCP, | ||
| 643 | + data->buf, data->len, errors, final ? NULL : &consumed); | ||
| 644 | + return codec_tuple(decoded, consumed); | ||
| 645 | + } | ||
| 646 | + | ||
| 628 | 647 | /*[clinic input] | |
| 629 | 648 | _codecs.code_page_decode | |
| 630 | 649 | codepage: int | |
@@ -970,6 +989,21 @@ _codecs_mbcs_encode_impl(PyObject *module, PyObject *str, const char *errors) | |||
| 970 | 989 | PyUnicode_GET_LENGTH(str)); | |
| 971 | 990 | } | |
| 972 | 991 | ||
| 992 | + /*[clinic input] | ||
| 993 | + _codecs.oem_encode | ||
| 994 | + str: unicode | ||
| 995 | + errors: str(accept={str, NoneType}) = NULL | ||
| 996 | + / | ||
| 997 | + [clinic start generated code]*/ | ||
| 998 | + | ||
| 999 | + static PyObject * | ||
| 1000 | + _codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors) | ||
| 1001 | + /*[clinic end generated code: output=65d5982c737de649 input=3fc5f0028aad3cda]*/ | ||
| 1002 | + { | ||
| 1003 | + return codec_tuple(PyUnicode_EncodeCodePage(CP_OEMCP, str, errors), | ||
| 1004 | + PyUnicode_GET_LENGTH(str)); | ||
| 1005 | + } | ||
| 1006 | + | ||
| 973 | 1007 | /*[clinic input] | |
| 974 | 1008 | _codecs.code_page_encode | |
| 975 | 1009 | code_page: int | |
@@ -1075,6 +1109,8 @@ static PyMethodDef _codecs_functions[] = { | |||
| 1075 | 1109 | _CODECS_READBUFFER_ENCODE_METHODDEF | |
| 1076 | 1110 | _CODECS_MBCS_ENCODE_METHODDEF | |
| 1077 | 1111 | _CODECS_MBCS_DECODE_METHODDEF | |
| 1112 | + _CODECS_OEM_ENCODE_METHODDEF | ||
| 1113 | + _CODECS_OEM_DECODE_METHODDEF | ||
| 1078 | 1114 | _CODECS_CODE_PAGE_ENCODE_METHODDEF | |
| 1079 | 1115 | _CODECS_CODE_PAGE_DECODE_METHODDEF | |
| 1080 | 1116 | _CODECS_REGISTER_ERROR_METHODDEF | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -805,6 +805,45 @@ _codecs_mbcs_decode(PyObject *module, PyObject *args) | |||
| 805 | 805 | ||
| 806 | 806 | #if defined(HAVE_MBCS) | |
| 807 | 807 | ||
| 808 | + PyDoc_STRVAR(_codecs_oem_decode__doc__, | ||
| 809 | + "oem_decode($module, data, errors=None, final=False, /)\n" | ||
| 810 | + "--\n" | ||
| 811 | + "\n"); | ||
| 812 | + | ||
| 813 | + #define _CODECS_OEM_DECODE_METHODDEF \ | ||
| 814 | + {"oem_decode", (PyCFunction)_codecs_oem_decode, METH_VARARGS, _codecs_oem_decode__doc__}, | ||
| 815 | + | ||
| 816 | + static PyObject * | ||
| 817 | + _codecs_oem_decode_impl(PyObject *module, Py_buffer *data, | ||
| 818 | + const char *errors, int final); | ||
| 819 | + | ||
| 820 | + static PyObject * | ||
| 821 | + _codecs_oem_decode(PyObject *module, PyObject *args) | ||
| 822 | + { | ||
| 823 | + PyObject *return_value = NULL; | ||
| 824 | + Py_buffer data = {NULL, NULL}; | ||
| 825 | + const char *errors = NULL; | ||
| 826 | + int final = 0; | ||
| 827 | + | ||
| 828 | + if (!PyArg_ParseTuple(args, "y*|zi:oem_decode", | ||
| 829 | + &data, &errors, &final)) { | ||
| 830 | + goto exit; | ||
| 831 | + } | ||
| 832 | + return_value = _codecs_oem_decode_impl(module, &data, errors, final); | ||
| 833 | + | ||
| 834 | + exit: | ||
| 835 | + /* Cleanup for data */ | ||
| 836 | + if (data.obj) { | ||
| 837 | + PyBuffer_Release(&data); | ||
| 838 | + } | ||
| 839 | + | ||
| 840 | + return return_value; | ||
| 841 | + } | ||
| 842 | + | ||
| 843 | + #endif /* defined(HAVE_MBCS) */ | ||
| 844 | + | ||
| 845 | + #if defined(HAVE_MBCS) | ||
| 846 | + | ||
| 808 | 847 | PyDoc_STRVAR(_codecs_code_page_decode__doc__, | |
| 809 | 848 | "code_page_decode($module, codepage, data, errors=None, final=False, /)\n" | |
| 810 | 849 | "--\n" | |
@@ -1346,6 +1385,38 @@ _codecs_mbcs_encode(PyObject *module, PyObject *args) | |||
| 1346 | 1385 | ||
| 1347 | 1386 | #if defined(HAVE_MBCS) | |
| 1348 | 1387 | ||
| 1388 | + PyDoc_STRVAR(_codecs_oem_encode__doc__, | ||
| 1389 | + "oem_encode($module, str, errors=None, /)\n" | ||
| 1390 | + "--\n" | ||
| 1391 | + "\n"); | ||
| 1392 | + | ||
| 1393 | + #define _CODECS_OEM_ENCODE_METHODDEF \ | ||
| 1394 | + {"oem_encode", (PyCFunction)_codecs_oem_encode, METH_VARARGS, _codecs_oem_encode__doc__}, | ||
| 1395 | + | ||
| 1396 | + static PyObject * | ||
| 1397 | + _codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors); | ||
| 1398 | + | ||
| 1399 | + static PyObject * | ||
| 1400 | + _codecs_oem_encode(PyObject *module, PyObject *args) | ||
| 1401 | + { | ||
| 1402 | + PyObject *return_value = NULL; | ||
| 1403 | + PyObject *str; | ||
| 1404 | + const char *errors = NULL; | ||
| 1405 | + | ||
| 1406 | + if (!PyArg_ParseTuple(args, "U|z:oem_encode", | ||
| 1407 | + &str, &errors)) { | ||
| 1408 | + goto exit; | ||
| 1409 | + } | ||
| 1410 | + return_value = _codecs_oem_encode_impl(module, str, errors); | ||
| 1411 | + | ||
| 1412 | + exit: | ||
| 1413 | + return return_value; | ||
| 1414 | + } | ||
| 1415 | + | ||
| 1416 | + #endif /* defined(HAVE_MBCS) */ | ||
| 1417 | + | ||
| 1418 | + #if defined(HAVE_MBCS) | ||
| 1419 | + | ||
| 1349 | 1420 | PyDoc_STRVAR(_codecs_code_page_encode__doc__, | |
| 1350 | 1421 | "code_page_encode($module, code_page, str, errors=None, /)\n" | |
| 1351 | 1422 | "--\n" | |
@@ -1446,6 +1517,10 @@ _codecs_lookup_error(PyObject *module, PyObject *arg) | |||
| 1446 | 1517 | #define _CODECS_MBCS_DECODE_METHODDEF | |
| 1447 | 1518 | #endif /* !defined(_CODECS_MBCS_DECODE_METHODDEF) */ | |
| 1448 | 1519 | ||
| 1520 | + #ifndef _CODECS_OEM_DECODE_METHODDEF | ||
| 1521 | + #define _CODECS_OEM_DECODE_METHODDEF | ||
| 1522 | + #endif /* !defined(_CODECS_OEM_DECODE_METHODDEF) */ | ||
| 1523 | + | ||
| 1449 | 1524 | #ifndef _CODECS_CODE_PAGE_DECODE_METHODDEF | |
| 1450 | 1525 | #define _CODECS_CODE_PAGE_DECODE_METHODDEF | |
| 1451 | 1526 | #endif /* !defined(_CODECS_CODE_PAGE_DECODE_METHODDEF) */ | |
@@ -1454,7 +1529,11 @@ _codecs_lookup_error(PyObject *module, PyObject *arg) | |||
| 1454 | 1529 | #define _CODECS_MBCS_ENCODE_METHODDEF | |
| 1455 | 1530 | #endif /* !defined(_CODECS_MBCS_ENCODE_METHODDEF) */ | |
| 1456 | 1531 | ||
| 1532 | + #ifndef _CODECS_OEM_ENCODE_METHODDEF | ||
| 1533 | + #define _CODECS_OEM_ENCODE_METHODDEF | ||
| 1534 | + #endif /* !defined(_CODECS_OEM_ENCODE_METHODDEF) */ | ||
| 1535 | + | ||
| 1457 | 1536 | #ifndef _CODECS_CODE_PAGE_ENCODE_METHODDEF | |
| 1458 | 1537 | #define _CODECS_CODE_PAGE_ENCODE_METHODDEF | |
| 1459 | 1538 | #endif /* !defined(_CODECS_CODE_PAGE_ENCODE_METHODDEF) */ | |
| 1460 | - /*[clinic end generated code: output=0221e4eece62c905 input=a9049054013a1b77]*/ | ||
| 1539 | + /*[clinic end generated code: output=7874e2d559d49368 input=a9049054013a1b77]*/ | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments