| from mypyc.ir.deps import BYTES_WRITER_EXTRA_OPS, LIBRT_STRINGS, STRING_WRITER_EXTRA_OPS |
| from mypyc.ir.ops import ERR_MAGIC, ERR_MAGIC_OVERLAPPING, ERR_NEVER |
| from mypyc.ir.rtypes import ( |
| bool_rprimitive, |
| bytearray_rprimitive, |
| bytes_rprimitive, |
| bytes_writer_rprimitive, |
| float_rprimitive, |
| int16_rprimitive, |
| int32_rprimitive, |
| int64_rprimitive, |
| none_rprimitive, |
| short_int_rprimitive, |
| str_rprimitive, |
| string_writer_rprimitive, |
| uint8_rprimitive, |
| void_rtype, |
| ) |
| from mypyc.primitives.registry import custom_primitive_op, function_op, method_op |
| |
| function_op( |
| name="librt.strings.BytesWriter", |
| arg_types=[], |
| return_type=bytes_writer_rprimitive, |
| c_function_name="LibRTStrings_BytesWriter_internal", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| method_op( |
| name="getvalue", |
| arg_types=[bytes_writer_rprimitive], |
| return_type=bytes_rprimitive, |
| c_function_name="LibRTStrings_BytesWriter_getvalue_internal", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| method_op( |
| name="write", |
| arg_types=[bytes_writer_rprimitive, bytes_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_Write", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| method_op( |
| name="write", |
| arg_types=[bytes_writer_rprimitive, bytearray_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_Write", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| method_op( |
| name="append", |
| arg_types=[bytes_writer_rprimitive, uint8_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_Append", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| method_op( |
| name="truncate", |
| arg_types=[bytes_writer_rprimitive, int64_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="LibRTStrings_BytesWriter_truncate_internal", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| function_op( |
| name="builtins.len", |
| arg_types=[bytes_writer_rprimitive], |
| return_type=short_int_rprimitive, |
| c_function_name="CPyBytesWriter_Len", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # BytesWriter index adjustment - convert negative index to positive |
| bytes_writer_adjust_index_op = custom_primitive_op( |
| name="bytes_writer_adjust_index", |
| arg_types=[bytes_writer_rprimitive, int64_rprimitive], |
| return_type=int64_rprimitive, |
| c_function_name="CPyBytesWriter_AdjustIndex", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # BytesWriter range check - check if index is in valid range |
| bytes_writer_range_check_op = custom_primitive_op( |
| name="bytes_writer_range_check", |
| arg_types=[bytes_writer_rprimitive, int64_rprimitive], |
| return_type=bool_rprimitive, |
| c_function_name="CPyBytesWriter_RangeCheck", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # BytesWriter.__getitem__() - get byte at index (no bounds checking) |
| bytes_writer_get_item_unsafe_op = custom_primitive_op( |
| name="bytes_writer_get_item", |
| arg_types=[bytes_writer_rprimitive, int64_rprimitive], |
| return_type=uint8_rprimitive, |
| c_function_name="CPyBytesWriter_GetItem", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # BytesWriter.__setitem__() - set byte at index (no bounds checking) |
| bytes_writer_set_item_unsafe_op = custom_primitive_op( |
| name="bytes_writer_set_item", |
| arg_types=[bytes_writer_rprimitive, int64_rprimitive, uint8_rprimitive], |
| return_type=void_rtype, |
| c_function_name="CPyBytesWriter_SetItem", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # i16 write/read functions |
| |
| function_op( |
| name="librt.strings.write_i16_le", |
| arg_types=[bytes_writer_rprimitive, int16_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteI16LE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.write_i16_be", |
| arg_types=[bytes_writer_rprimitive, int16_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteI16BE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_i16_le", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=int16_rprimitive, |
| c_function_name="CPyBytes_ReadI16LE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_i16_be", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=int16_rprimitive, |
| c_function_name="CPyBytes_ReadI16BE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # i32 write/read functions |
| |
| function_op( |
| name="librt.strings.write_i32_le", |
| arg_types=[bytes_writer_rprimitive, int32_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteI32LE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.write_i32_be", |
| arg_types=[bytes_writer_rprimitive, int32_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteI32BE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_i32_le", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=int32_rprimitive, |
| c_function_name="CPyBytes_ReadI32LE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_i32_be", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=int32_rprimitive, |
| c_function_name="CPyBytes_ReadI32BE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # i64 write/read functions |
| |
| function_op( |
| name="librt.strings.write_i64_le", |
| arg_types=[bytes_writer_rprimitive, int64_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteI64LE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.write_i64_be", |
| arg_types=[bytes_writer_rprimitive, int64_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteI64BE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_i64_le", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=int64_rprimitive, |
| c_function_name="CPyBytes_ReadI64LE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_i64_be", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=int64_rprimitive, |
| c_function_name="CPyBytes_ReadI64BE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # f32 write/read functions |
| |
| function_op( |
| name="librt.strings.write_f32_le", |
| arg_types=[bytes_writer_rprimitive, float_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteF32LE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.write_f32_be", |
| arg_types=[bytes_writer_rprimitive, float_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteF32BE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_f32_le", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=float_rprimitive, |
| c_function_name="CPyBytes_ReadF32LE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_f32_be", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=float_rprimitive, |
| c_function_name="CPyBytes_ReadF32BE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # f64 write/read functions |
| |
| function_op( |
| name="librt.strings.write_f64_le", |
| arg_types=[bytes_writer_rprimitive, float_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteF64LE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.write_f64_be", |
| arg_types=[bytes_writer_rprimitive, float_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyBytesWriter_WriteF64BE", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_f64_le", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=float_rprimitive, |
| c_function_name="CPyBytes_ReadF64LE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="librt.strings.read_f64_be", |
| arg_types=[bytes_rprimitive, int64_rprimitive], |
| return_type=float_rprimitive, |
| c_function_name="CPyBytes_ReadF64BE", |
| error_kind=ERR_MAGIC_OVERLAPPING, |
| dependencies=[LIBRT_STRINGS, BYTES_WRITER_EXTRA_OPS], |
| ) |
| |
| # StringWriter operations |
| |
| function_op( |
| name="librt.strings.StringWriter", |
| arg_types=[], |
| return_type=string_writer_rprimitive, |
| c_function_name="LibRTStrings_StringWriter_internal", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| method_op( |
| name="getvalue", |
| arg_types=[string_writer_rprimitive], |
| return_type=str_rprimitive, |
| c_function_name="LibRTStrings_StringWriter_getvalue_internal", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| method_op( |
| name="write", |
| arg_types=[string_writer_rprimitive, str_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="LibRTStrings_StringWriter_write_internal", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| method_op( |
| name="append", |
| arg_types=[string_writer_rprimitive, int32_rprimitive], |
| return_type=none_rprimitive, |
| c_function_name="CPyStringWriter_Append", |
| error_kind=ERR_MAGIC, |
| dependencies=[LIBRT_STRINGS, STRING_WRITER_EXTRA_OPS], |
| ) |
| |
| function_op( |
| name="builtins.len", |
| arg_types=[string_writer_rprimitive], |
| return_type=short_int_rprimitive, |
| c_function_name="CPyStringWriter_Len", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, STRING_WRITER_EXTRA_OPS], |
| ) |
| |
| # StringWriter index adjustment - convert negative index to positive |
| string_writer_adjust_index_op = custom_primitive_op( |
| name="string_writer_adjust_index", |
| arg_types=[string_writer_rprimitive, int64_rprimitive], |
| return_type=int64_rprimitive, |
| c_function_name="CPyStringWriter_AdjustIndex", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, STRING_WRITER_EXTRA_OPS], |
| ) |
| |
| # StringWriter range check - check if index is in valid range |
| string_writer_range_check_op = custom_primitive_op( |
| name="string_writer_range_check", |
| arg_types=[string_writer_rprimitive, int64_rprimitive], |
| return_type=bool_rprimitive, |
| c_function_name="CPyStringWriter_RangeCheck", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, STRING_WRITER_EXTRA_OPS], |
| ) |
| |
| # StringWriter.__getitem__() - get character at index (no bounds checking) |
| string_writer_get_item_unsafe_op = custom_primitive_op( |
| name="string_writer_get_item", |
| arg_types=[string_writer_rprimitive, int64_rprimitive], |
| return_type=int32_rprimitive, |
| c_function_name="CPyStringWriter_GetItem", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS, STRING_WRITER_EXTRA_OPS], |
| ) |
| |
| |
| # Codepoint classification helpers operating on i32 codepoints |
| # (typically obtained via ord(s[i])). Negative inputs return False. |
| function_op( |
| name="librt.strings.isspace", |
| arg_types=[int32_rprimitive], |
| return_type=bool_rprimitive, |
| c_function_name="LibRTStrings_IsSpace", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| function_op( |
| name="librt.strings.isdigit", |
| arg_types=[int32_rprimitive], |
| return_type=bool_rprimitive, |
| c_function_name="LibRTStrings_IsDigit", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| function_op( |
| name="librt.strings.isalnum", |
| arg_types=[int32_rprimitive], |
| return_type=bool_rprimitive, |
| c_function_name="LibRTStrings_IsAlnum", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| 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], |
| ) |
| |
| # isidentifier checks XID_Start semantics for a single codepoint, matching |
| # str.isidentifier() on a 1-character string. The non-ASCII path allocates |
| # and aborts via CPyError_OutOfMemory on failure, so this stays ERR_NEVER. |
| function_op( |
| name="librt.strings.isidentifier", |
| arg_types=[int32_rprimitive], |
| return_type=bool_rprimitive, |
| c_function_name="LibRTStrings_IsIdentifier", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| # Codepoint case conversion. When the Unicode uppercase/lowercase of a |
| # codepoint expands to multiple codepoints (e.g. U+00DF uppercases to "SS", |
| # U+FB01 to "FI"), returns the input unchanged so the signature stays |
| # i32 -> i32; callers needing full Unicode case conversion should use |
| # str.upper() / .lower() instead. Negative inputs are returned unchanged. |
| function_op( |
| name="librt.strings.toupper", |
| arg_types=[int32_rprimitive], |
| return_type=int32_rprimitive, |
| c_function_name="LibRTStrings_ToUpper", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS], |
| ) |
| |
| function_op( |
| name="librt.strings.tolower", |
| arg_types=[int32_rprimitive], |
| return_type=int32_rprimitive, |
| c_function_name="LibRTStrings_ToLower", |
| error_kind=ERR_NEVER, |
| dependencies=[LIBRT_STRINGS], |
| ) |