Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions mypy/typeshed/stubs/librt/librt/strings.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,4 @@ def read_f64_be(b: bytes, index: i64, /) -> float: ...
def isspace(c: i32, /) -> bool: ...
def isdigit(c: i32, /) -> bool: ...
def isalnum(c: i32, /) -> bool: ...
def isalpha(c: i32, /) -> bool: ...
4 changes: 4 additions & 0 deletions mypyc/lib-rt/codepoint_extra_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,8 @@ static inline bool LibRTStrings_IsAlnum(int32_t c) {
return c >= 0 && Py_UNICODE_ISALNUM((Py_UCS4)c);
}

static inline bool LibRTStrings_IsAlpha(int32_t c) {
return c >= 0 && Py_UNICODE_ISALPHA((Py_UCS4)c);
}

#endif // MYPYC_CODEPOINT_EXTRA_OPS_H
4 changes: 4 additions & 0 deletions mypyc/lib-rt/strings/librt_strings.c
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,7 @@ cp_parse_i32(PyObject *arg, int32_t *out) {
DEFINE_CP_BOOL_WRAPPER(isspace, LibRTStrings_IsSpace)
DEFINE_CP_BOOL_WRAPPER(isdigit, LibRTStrings_IsDigit)
DEFINE_CP_BOOL_WRAPPER(isalnum, LibRTStrings_IsAlnum)
DEFINE_CP_BOOL_WRAPPER(isalpha, LibRTStrings_IsAlpha)

static PyMethodDef librt_strings_module_methods[] = {
{"write_i16_le", (PyCFunction) write_i16_le, METH_FASTCALL,
Expand Down Expand Up @@ -1264,6 +1265,9 @@ static PyMethodDef librt_strings_module_methods[] = {
{"isalnum", cp_isalnum, METH_O,
PyDoc_STR("Test whether a codepoint (i32) is alphanumeric.")
},
{"isalpha", cp_isalpha, METH_O,
PyDoc_STR("Test whether a codepoint (i32) is a Unicode letter.")
},
{NULL, NULL, 0, NULL}
};

Expand Down
9 changes: 9 additions & 0 deletions mypyc/primitives/librt_strings_ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -422,3 +422,12 @@
error_kind=ERR_NEVER,
dependencies=[LIBRT_STRINGS, CODEPOINT_EXTRA_OPS],
)

function_op(
name="librt.strings.isalpha",
arg_types=[int32_rprimitive],
return_type=bool_rprimitive,
c_function_name="LibRTStrings_IsAlpha",
error_kind=ERR_NEVER,
dependencies=[LIBRT_STRINGS, CODEPOINT_EXTRA_OPS],
)
14 changes: 14 additions & 0 deletions mypyc/test-data/irbuild-librt-strings.test
Original file line number Diff line number Diff line change
Expand Up @@ -373,3 +373,17 @@ def is_an(c):
L0:
r0 = LibRTStrings_IsAlnum(c)
return r0

[case testLibrtStringsIsAlphaIR]
from librt.strings import isalpha
from mypy_extensions import i32

def is_a(c: i32) -> bool:
return isalpha(c)
[out]
def is_a(c):
c :: i32
r0 :: bool
L0:
r0 = LibRTStrings_IsAlpha(c)
return r0
5 changes: 4 additions & 1 deletion mypyc/test-data/run-librt-strings.test
Original file line number Diff line number Diff line change
Expand Up @@ -1443,7 +1443,7 @@ def test_new_without_init_is_usable() -> None:
[case testLibrtStringsCodepointClassifiers_librt]
from typing import Any
from mypy_extensions import i32
from librt.strings import isspace, isdigit, isalnum
from librt.strings import isspace, isdigit, isalnum, isalpha

from testutil import assertRaises

Expand All @@ -1454,6 +1454,7 @@ def test_codepoint_classifiers() -> None:
assert not isspace(bad)
assert not isdigit(bad)
assert not isalnum(bad)
assert not isalpha(bad)
# Verify each codepoint primitive agrees with the matching str method
# across all Unicode codepoints, including the ord(chr(i)) round-trip.
# Any forces generic dispatch on the str side.
Expand All @@ -1464,6 +1465,7 @@ def test_codepoint_classifiers() -> None:
assert isspace(o) == isspace(i) == a.isspace()
assert isdigit(o) == isdigit(i) == a.isdigit()
assert isalnum(o) == isalnum(i) == a.isalnum()
assert isalpha(o) == isalpha(i) == a.isalpha()


def test_codepoint_classifiers_via_any() -> None:
Expand All @@ -1473,6 +1475,7 @@ def test_codepoint_classifiers_via_any() -> None:
(isspace, " ", "a"),
(isdigit, "5", "a"),
(isalnum, "A", " "),
(isalpha, "A", " "),
):
f: Any = fn
assert f(ord(true_input)) is True
Expand Down
Loading