(builder: IRBuilder, expr: CallExpr, callee: RefExpr)
| 1305 | |
| 1306 | @specialize_function("to_bytes", int_rprimitive) |
| 1307 | def specialize_int_to_bytes(builder: IRBuilder, expr: CallExpr, callee: RefExpr) -> Value | None: |
| 1308 | # int.to_bytes(length, byteorder, signed=False) |
| 1309 | if any(kind not in (ARG_POS, ARG_NAMED) for kind in expr.arg_kinds): |
| 1310 | return None |
| 1311 | if not isinstance(callee, MemberExpr): |
| 1312 | return None |
| 1313 | length_expr: Expression | None = None |
| 1314 | byteorder_expr: Expression | None = None |
| 1315 | signed_expr: Expression | None = None |
| 1316 | positional_index = 0 |
| 1317 | for name, arg in zip(expr.arg_names, expr.args): |
| 1318 | if name is None: |
| 1319 | if positional_index == 0: |
| 1320 | length_expr = arg |
| 1321 | elif positional_index == 1: |
| 1322 | byteorder_expr = arg |
| 1323 | elif positional_index == 2: |
| 1324 | signed_expr = arg |
| 1325 | else: |
| 1326 | return None |
| 1327 | positional_index += 1 |
| 1328 | elif name == "length": |
| 1329 | if length_expr is not None: |
| 1330 | return None |
| 1331 | length_expr = arg |
| 1332 | elif name == "byteorder": |
| 1333 | if byteorder_expr is not None: |
| 1334 | return None |
| 1335 | byteorder_expr = arg |
| 1336 | elif name == "signed": |
| 1337 | if signed_expr is not None: |
| 1338 | return None |
| 1339 | signed_expr = arg |
| 1340 | else: |
| 1341 | return None |
| 1342 | if length_expr is None or byteorder_expr is None: |
| 1343 | return None |
| 1344 | |
| 1345 | signed_is_bool = True |
| 1346 | if signed_expr is not None: |
| 1347 | signed_is_bool = is_bool_rprimitive(builder.node_type(signed_expr)) |
| 1348 | if not ( |
| 1349 | is_int_rprimitive(builder.node_type(length_expr)) |
| 1350 | and is_str_rprimitive(builder.node_type(byteorder_expr)) |
| 1351 | and signed_is_bool |
| 1352 | ): |
| 1353 | return None |
| 1354 | |
| 1355 | self_arg = builder.accept(callee.expr) |
| 1356 | length_arg = builder.accept(length_expr) |
| 1357 | if signed_expr is None: |
| 1358 | signed_arg = builder.false() |
| 1359 | else: |
| 1360 | signed_arg = builder.accept(signed_expr) |
| 1361 | if isinstance(byteorder_expr, StrExpr): |
| 1362 | if byteorder_expr.value == "little": |
| 1363 | return builder.call_c( |
| 1364 | int_to_little_endian_op, [self_arg, length_arg, signed_arg], expr.line |
nothing calls this directly
no test coverage detected
searching dependent graphs…