Convert expressions into bytes literal objects with the guidance of FormatOps. Return None when fails.
(
builder: IRBuilder, format_ops: list[FormatOp], exprs: list[Expression], line: int
)
| 209 | |
| 210 | |
| 211 | def convert_format_expr_to_bytes( |
| 212 | builder: IRBuilder, format_ops: list[FormatOp], exprs: list[Expression], line: int |
| 213 | ) -> list[Value] | None: |
| 214 | """Convert expressions into bytes literal objects with the guidance |
| 215 | of FormatOps. Return None when fails.""" |
| 216 | if len(format_ops) != len(exprs): |
| 217 | return None |
| 218 | |
| 219 | converted = [] |
| 220 | for x, format_op in zip(exprs, format_ops): |
| 221 | node_type = builder.node_type(x) |
| 222 | # conversion type 's' is an alias of 'b' in bytes formatting |
| 223 | if format_op == FormatOp.BYTES or format_op == FormatOp.STR: |
| 224 | if is_bytes_rprimitive(node_type): |
| 225 | var_bytes = builder.accept(x) |
| 226 | else: |
| 227 | return None |
| 228 | elif format_op == FormatOp.INT: |
| 229 | if isinstance(folded := constant_fold_expr(builder, x), int): |
| 230 | var_bytes = builder.load_literal_value(str(folded).encode("ascii")) |
| 231 | elif is_int_rprimitive(node_type) or is_short_int_rprimitive(node_type): |
| 232 | var_bytes = builder.call_c(int_to_ascii_op, [builder.accept(x)], line) |
| 233 | else: |
| 234 | return None |
| 235 | converted.append(var_bytes) |
| 236 | return converted |
| 237 | |
| 238 | |
| 239 | def join_formatted_bytes( |
no test coverage detected
searching dependent graphs…