(builder: IRBuilder, expr: IndexExpr)
| 758 | |
| 759 | |
| 760 | def transform_index_expr(builder: IRBuilder, expr: IndexExpr) -> Value: |
| 761 | index = expr.index |
| 762 | base_type = builder.node_type(expr.base) |
| 763 | can_borrow = is_list_rprimitive(base_type) or isinstance(base_type, RVec) |
| 764 | can_borrow_base = can_borrow and is_borrow_friendly_expr(builder, index) |
| 765 | |
| 766 | # Check for dunder specialization for non-slice indexing |
| 767 | if not isinstance(index, SliceExpr): |
| 768 | specialized = apply_dunder_specialization(builder, expr.base, [index], "__getitem__", expr) |
| 769 | if specialized is not None: |
| 770 | return specialized |
| 771 | |
| 772 | base = builder.accept(expr.base, can_borrow=can_borrow_base) |
| 773 | |
| 774 | if isinstance(base.type, RTuple): |
| 775 | folded_index = constant_fold_expr(builder, index) |
| 776 | if isinstance(folded_index, int): |
| 777 | length = len(base.type.types) |
| 778 | if -length <= folded_index <= length - 1: |
| 779 | return builder.add(TupleGet(base, folded_index, expr.line)) |
| 780 | |
| 781 | if isinstance(index, SliceExpr): |
| 782 | value = try_gen_slice_op(builder, base, index) |
| 783 | if value: |
| 784 | return value |
| 785 | |
| 786 | index_reg = builder.accept(expr.index, can_borrow=can_borrow) |
| 787 | return builder.builder.get_item( |
| 788 | base, index_reg, builder.node_type(expr), expr.line, can_borrow=builder.can_borrow |
| 789 | ) |
| 790 | |
| 791 | |
| 792 | def try_constant_fold(builder: IRBuilder, expr: Expression) -> Value | None: |
no test coverage detected
searching dependent graphs…