@@ -1261,11 +1261,35 @@ STATIC void emit_native_label_assign(emit_t *emit, mp_uint_t l) {
12611261
12621262STATIC 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