|
49 | 49 | RTuple,
|
50 | 50 | RType,
|
51 | 51 | bool_rprimitive,
|
| 52 | + bytes_rprimitive, |
52 | 53 | c_int_rprimitive,
|
53 | 54 | dict_rprimitive,
|
54 | 55 | int16_rprimitive,
|
|
83 | 84 | join_formatted_strings,
|
84 | 85 | tokenizer_format_call,
|
85 | 86 | )
|
| 87 | +from mypyc.primitives.bytes_ops import ( |
| 88 | + bytes_decode_ascii_strict, |
| 89 | + bytes_decode_latin1_strict, |
| 90 | + bytes_decode_utf8_strict, |
| 91 | +) |
86 | 92 | from mypyc.primitives.dict_ops import (
|
87 | 93 | dict_items_op,
|
88 | 94 | dict_keys_op,
|
@@ -740,6 +746,47 @@ def str_encode_fast_path(builder: IRBuilder, expr: CallExpr, callee: RefExpr) ->
|
740 | 746 | return None
|
741 | 747 |
|
742 | 748 |
|
| 749 | +@specialize_function("decode", bytes_rprimitive) |
| 750 | +def bytes_decode_fast_path(builder: IRBuilder, expr: CallExpr, callee: RefExpr) -> Value | None: |
| 751 | + if not isinstance(callee, MemberExpr): |
| 752 | + return None |
| 753 | + |
| 754 | + encoding = "utf8" |
| 755 | + |
| 756 | + if len(expr.arg_kinds) > 0 and isinstance(expr.args[0], StrExpr): |
| 757 | + if expr.arg_kinds[0] == ARG_NAMED: |
| 758 | + if expr.arg_names[0] == "encoding": |
| 759 | + encoding = expr.args[0].value |
| 760 | + elif expr.arg_kinds[0] == ARG_POS: |
| 761 | + encoding = expr.args[0].value |
| 762 | + else: |
| 763 | + return None |
| 764 | + |
| 765 | + if len(expr.arg_kinds) > 1 and isinstance(expr.args[1], StrExpr): |
| 766 | + if expr.arg_kinds[1] == ARG_NAMED: |
| 767 | + if expr.arg_names[1] == "encoding": |
| 768 | + encoding = expr.args[1].value |
| 769 | + else: |
| 770 | + return None |
| 771 | + |
| 772 | + normalized = encoding.lower().replace("-", "").replace("_", "") |
| 773 | + |
| 774 | + if normalized in ("utf8", "utf", "u8", "cp65001"): |
| 775 | + return builder.primitive_op( |
| 776 | + bytes_decode_utf8_strict, [builder.accept(callee.expr)], expr.line |
| 777 | + ) |
| 778 | + elif normalized in ("ascii", "usascii", "646"): |
| 779 | + return builder.primitive_op( |
| 780 | + bytes_decode_ascii_strict, [builder.accept(callee.expr)], expr.line |
| 781 | + ) |
| 782 | + elif normalized in ("latin1", "latin", "iso88591", "cp819", "8859", "l1"): |
| 783 | + return builder.primitive_op( |
| 784 | + bytes_decode_latin1_strict, [builder.accept(callee.expr)], expr.line |
| 785 | + ) |
| 786 | + |
| 787 | + return None |
| 788 | + |
| 789 | + |
743 | 790 | @specialize_function("mypy_extensions.i64")
|
744 | 791 | def translate_i64(builder: IRBuilder, expr: CallExpr, callee: RefExpr) -> Value | None:
|
745 | 792 | if len(expr.args) != 1 or expr.arg_kinds[0] != ARG_POS:
|
|
0 commit comments