Skip to content

Commit 0f3388d

Browse files
committed
py/emitnative: Fix native import emitter when in viper mode.
1 parent 5a1d63f commit 0f3388d

1 file changed

Lines changed: 29 additions & 5 deletions

File tree

py/emitnative.c

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,11 +1261,35 @@ STATIC void emit_native_label_assign(emit_t *emit, mp_uint_t l) {
12611261

12621262
STATIC void emit_native_import_name(emit_t *emit, qstr qst) {
12631263
DEBUG_printf("import_name %s\n", qstr_str(qst));
1264-
vtype_kind_t vtype_fromlist;
1265-
vtype_kind_t vtype_level;
1266-
emit_pre_pop_reg_reg(emit, &vtype_fromlist, REG_ARG_2, &vtype_level, REG_ARG_3); // arg2 = fromlist, arg3 = level
1267-
assert(vtype_fromlist == VTYPE_PYOBJ);
1268-
assert(vtype_level == VTYPE_PYOBJ);
1264+
1265+
// get arguments from stack: arg2 = fromlist, arg3 = level
1266+
// if using viper types these arguments must be converted to proper objects
1267+
if (emit->do_viper_types) {
1268+
// fromlist should be None or a tuple
1269+
stack_info_t *top = peek_stack(emit, 0);
1270+
if (top->vtype == VTYPE_PTR_NONE) {
1271+
emit_pre_pop_discard(emit);
1272+
ASM_MOV_IMM_TO_REG(emit->as, (mp_uint_t)mp_const_none, REG_ARG_2);
1273+
} else {
1274+
vtype_kind_t vtype_fromlist;
1275+
emit_pre_pop_reg(emit, &vtype_fromlist, REG_ARG_2);
1276+
assert(vtype_fromlist == VTYPE_PYOBJ);
1277+
}
1278+
1279+
// level argument should be an immediate integer
1280+
top = peek_stack(emit, 0);
1281+
assert(top->vtype == VTYPE_INT && top->kind == STACK_IMM);
1282+
ASM_MOV_IMM_TO_REG(emit->as, (mp_uint_t)MP_OBJ_NEW_SMALL_INT(top->data.u_imm), REG_ARG_3);
1283+
emit_pre_pop_discard(emit);
1284+
1285+
} else {
1286+
vtype_kind_t vtype_fromlist;
1287+
vtype_kind_t vtype_level;
1288+
emit_pre_pop_reg_reg(emit, &vtype_fromlist, REG_ARG_2, &vtype_level, REG_ARG_3);
1289+
assert(vtype_fromlist == VTYPE_PYOBJ);
1290+
assert(vtype_level == VTYPE_PYOBJ);
1291+
}
1292+
12691293
emit_call_with_imm_arg(emit, MP_F_IMPORT_NAME, qst, REG_ARG_1); // arg1 = import name
12701294
emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET);
12711295
}

0 commit comments

Comments
 (0)