def visit_index_expr(self, expr: IndexExpr) -> Register: base_rtype = self.node_type(expr.base) base_reg = self.accept(expr.base) target_type = self.node_type(expr) if isinstance(base_rtype, (ListRType, SequenceTupleRType, DictRType)): index_type = self.node_type(expr.index) if not isinstance(base_rtype, DictRType): assert isinstance( index_type, IntRType), 'Unsupported indexing operation' # TODO if isinstance(base_rtype, ListRType): op = PrimitiveOp.LIST_GET elif isinstance(base_rtype, DictRType): op = PrimitiveOp.DICT_GET else: op = PrimitiveOp.HOMOGENOUS_TUPLE_GET index_reg = self.accept(expr.index) if isinstance(base_rtype, DictRType): index_reg = self.box(index_reg, index_type) tmp = self.alloc_temp(ObjectRType()) self.add(PrimitiveOp(tmp, op, base_reg, index_reg)) target = self.alloc_target(target_type) return self.unbox_or_cast(tmp, target_type, target) elif isinstance(base_rtype, TupleRType): assert isinstance(expr.index, IntExpr) # TODO target = self.alloc_target(target_type) self.add( TupleGet(target, base_reg, expr.index.value, base_rtype.types[expr.index.value])) return target assert False, 'Unsupported indexing operation'
def transform_index_expr(builder: IRBuilder, expr: IndexExpr) -> Value: base = builder.accept(expr.base) if isinstance(base.type, RTuple) and isinstance(expr.index, IntExpr): return builder.add(TupleGet(base, expr.index.value, expr.line)) index_reg = builder.accept(expr.index) return builder.gen_method_call(base, '__getitem__', [index_reg], builder.node_type(expr), expr.line)
def visit_index_expr(self, expr: IndexExpr) -> Value: base = self.builder.accept(expr.base) if isinstance(base.type, RTuple) and isinstance(expr.index, IntExpr): return self.builder.add(TupleGet(base, expr.index.value, expr.line)) index_reg = self.builder.accept(expr.index) return self.builder.gen_method_call(base, '__getitem__', [index_reg], self.builder.node_type(expr), expr.line)
def test_tuple_get(self) -> None: self.assert_emit(TupleGet(self.t, 1, 0), 'cpy_r_r0 = cpy_r_t.f1;')
def get_sys_exc_info(builder: IRBuilder) -> List[Value]: exc_info = builder.primitive_op(get_exc_info_op, [], -1) return [builder.add(TupleGet(exc_info, i, -1)) for i in range(3)]
def test_tuple_get(self) -> None: self.assert_emit(TupleGet(self.m, self.n, 1, BoolRType()), 'cpy_r_m = cpy_r_n.f1;')