Exemplo n.º 1
0
    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'
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
 def test_tuple_get(self) -> None:
     self.assert_emit(TupleGet(self.t, 1, 0), 'cpy_r_r0 = cpy_r_t.f1;')
Exemplo n.º 5
0
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)]
Exemplo n.º 6
0
 def test_tuple_get(self) -> None:
     self.assert_emit(TupleGet(self.m, self.n, 1, BoolRType()),
                      'cpy_r_m = cpy_r_n.f1;')