Skip to content

Commit 72d993d

Browse files
committed
py changes for supporting superclass constructors that take kwargs
1 parent 619bc4c commit 72d993d

34 files changed

Lines changed: 133 additions & 109 deletions

extmod/vfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ mp_obj_t mp_vfs_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
176176
// auto-detect the filesystem and create the corresponding VFS entity.
177177
// (At the moment we only support FAT filesystems.)
178178
#if MICROPY_VFS_FAT
179-
vfs_obj = mp_fat_vfs_type.make_new(&mp_fat_vfs_type, 1, 0, &vfs_obj);
179+
vfs_obj = mp_fat_vfs_type.make_new(&mp_fat_vfs_type, 1, &vfs_obj, NULL);
180180
#endif
181181
}
182182

extmod/vfs_fat.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ mp_import_stat_t fat_vfs_import_stat(void *vfs_in, const char *path) {
6565
return MP_IMPORT_STAT_NO_EXIST;
6666
}
6767

68-
STATIC mp_obj_t fat_vfs_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
69-
mp_arg_check_num(n_args, n_kw, 1, 1, false);
68+
STATIC mp_obj_t fat_vfs_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
69+
mp_arg_check_num(n_args, kw_args, 1, 1, false);
7070

7171
// create new object
7272
fs_user_mount_t *vfs = m_new_obj(fs_user_mount_t);
@@ -111,7 +111,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(fat_vfs_del_obj, fat_vfs_del);
111111

112112
STATIC mp_obj_t fat_vfs_mkfs(mp_obj_t bdev_in) {
113113
// create new object
114-
fs_user_mount_t *vfs = MP_OBJ_TO_PTR(fat_vfs_make_new(&mp_fat_vfs_type, 1, 0, &bdev_in));
114+
fs_user_mount_t *vfs = MP_OBJ_TO_PTR(fat_vfs_make_new(&mp_fat_vfs_type, 1, &bdev_in, NULL));
115115

116116
// make the filesystem
117117
uint8_t working_buf[_MAX_SS];

extmod/vfs_fat_file.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,9 @@ STATIC mp_obj_t file_open(fs_user_mount_t *vfs, const mp_obj_type_t *type, mp_ar
206206
return MP_OBJ_FROM_PTR(o);
207207
}
208208

209-
STATIC mp_obj_t file_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
209+
STATIC mp_obj_t file_obj_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
210210
mp_arg_val_t arg_vals[FILE_OPEN_NUM_ARGS];
211-
mp_arg_parse_all_kw_array(n_args, n_kw, args, FILE_OPEN_NUM_ARGS, file_open_args, arg_vals);
211+
mp_arg_parse_all(n_args, args, kw_args, FILE_OPEN_NUM_ARGS, file_open_args, arg_vals);
212212
return file_open(NULL, type, arg_vals);
213213
}
214214

py/argcheck.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,22 @@
3131

3232
#include "supervisor/shared/translate.h"
3333

34-
void mp_arg_check_num(size_t n_args, size_t n_kw, size_t n_args_min, size_t n_args_max, bool takes_kw) {
34+
35+
void mp_arg_check_num(size_t n_args, mp_map_t *kw_args, size_t n_args_min, size_t n_args_max, bool takes_kw) {
36+
size_t n_kw = 0;
37+
if (kw_args != NULL) {
38+
n_kw = kw_args->used;
39+
}
40+
mp_arg_check_num_kw_array(n_args, n_kw, n_args_min, n_args_max, takes_kw);
41+
}
42+
43+
void mp_arg_check_num_kw_array(size_t n_args, size_t n_kw, size_t n_args_min, size_t n_args_max, bool takes_kw) {
3544
// NOTE(tannewt): This prevents this function from being optimized away.
3645
// Without it, functions can crash when reading invalid args.
3746
__asm volatile ("");
3847
// TODO maybe take the function name as an argument so we can print nicer error messages
3948

40-
if (n_kw && !takes_kw) {
49+
if (n_kw > 0 && !takes_kw) {
4150
#if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
4251
mp_arg_error_terse_mismatch();
4352
#else

py/modbuiltins.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ STATIC mp_obj_t mp_builtin_sorted(size_t n_args, const mp_obj_t *args, mp_map_t
516516
if (n_args > 1) {
517517
mp_raise_TypeError(translate("must use keyword argument for key function"));
518518
}
519-
mp_obj_t self = mp_type_list.make_new(&mp_type_list, 1, 0, args);
519+
mp_obj_t self = mp_type_list.make_new(&mp_type_list, 1, args, NULL);
520520
mp_obj_list_sort(1, &self, kwargs);
521521

522522
return self;

py/obj.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ typedef struct _mp_obj_iter_buf_t {
432432
#define MP_OBJ_ITER_BUF_NSLOTS ((sizeof(mp_obj_iter_buf_t) + sizeof(mp_obj_t) - 1) / sizeof(mp_obj_t))
433433

434434
typedef void (*mp_print_fun_t)(const mp_print_t *print, mp_obj_t o, mp_print_kind_t kind);
435-
typedef mp_obj_t (*mp_make_new_fun_t)(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args);
435+
typedef mp_obj_t (*mp_make_new_fun_t)(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args);
436436
typedef mp_obj_t (*mp_call_fun_t)(mp_obj_t fun, size_t n_args, size_t n_kw, const mp_obj_t *args);
437437
typedef mp_obj_t (*mp_unary_op_fun_t)(mp_unary_op_t op, mp_obj_t);
438438
typedef mp_obj_t (*mp_binary_op_fun_t)(mp_binary_op_t op, mp_obj_t, mp_obj_t);
@@ -671,7 +671,7 @@ mp_obj_t mp_obj_new_memoryview(byte typecode, size_t nitems, void *items);
671671
mp_obj_type_t *mp_obj_get_type(mp_const_obj_t o_in);
672672
const char *mp_obj_get_type_str(mp_const_obj_t o_in);
673673
bool mp_obj_is_subclass_fast(mp_const_obj_t object, mp_const_obj_t classinfo); // arguments should be type objects
674-
mp_obj_t mp_instance_cast_to_native_base(mp_const_obj_t self_in, mp_const_obj_t native_type);
674+
mp_obj_t mp_instance_cast_to_native_base(mp_obj_t self_in, mp_const_obj_t native_type);
675675

676676
void mp_obj_print_helper(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind);
677677
void mp_obj_print(mp_obj_t o, mp_print_kind_t kind);
@@ -720,7 +720,7 @@ void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qs
720720
void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values);
721721
mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in);
722722
mp_obj_t mp_obj_exception_get_value(mp_obj_t self_in);
723-
mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args);
723+
mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args);
724724
mp_obj_t mp_alloc_emergency_exception_buf(mp_obj_t size_in);
725725
void mp_init_emergency_exception_buf(void);
726726

py/objarray.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,9 @@ STATIC mp_obj_t array_construct(char typecode, mp_obj_t initializer) {
157157
#endif
158158

159159
#if MICROPY_PY_ARRAY
160-
STATIC mp_obj_t array_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
160+
STATIC mp_obj_t array_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
161161
(void)type_in;
162-
mp_arg_check_num(n_args, n_kw, 1, 2, false);
162+
mp_arg_check_num(n_args, kw_args, 1, 2, false);
163163

164164
// get typecode
165165
const char *typecode = mp_obj_str_get_str(args[0]);
@@ -175,9 +175,9 @@ STATIC mp_obj_t array_make_new(const mp_obj_type_t *type_in, size_t n_args, size
175175
#endif
176176

177177
#if MICROPY_PY_BUILTINS_BYTEARRAY
178-
STATIC mp_obj_t bytearray_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
178+
STATIC mp_obj_t bytearray_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
179179
(void)type_in;
180-
mp_arg_check_num(n_args, n_kw, 0, 1, false);
180+
mp_arg_check_num(n_args, kw_args, 0, 1, false);
181181

182182
if (n_args == 0) {
183183
// no args: construct an empty bytearray
@@ -207,13 +207,13 @@ mp_obj_t mp_obj_new_memoryview(byte typecode, size_t nitems, void *items) {
207207
return MP_OBJ_FROM_PTR(self);
208208
}
209209

210-
STATIC mp_obj_t memoryview_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
210+
STATIC mp_obj_t memoryview_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
211211
(void)type_in;
212212

213213
// TODO possibly allow memoryview constructor to take start/stop so that one
214214
// can do memoryview(b, 4, 8) instead of memoryview(b)[4:8] (uses less RAM)
215215

216-
mp_arg_check_num(n_args, n_kw, 1, 1, false);
216+
mp_arg_check_num(n_args, kw_args, 1, 1, false);
217217

218218
mp_buffer_info_t bufinfo;
219219
mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);

py/objbool.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ STATIC void bool_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_
5050
}
5151
}
5252

53-
STATIC mp_obj_t bool_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
53+
STATIC mp_obj_t bool_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
5454
(void)type_in;
55-
mp_arg_check_num(n_args, n_kw, 0, 1, false);
55+
mp_arg_check_num(n_args, kw_args, 0, 1, false);
5656

5757
if (n_args == 0) {
5858
return mp_const_false;

py/objcomplex.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ STATIC void complex_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_
7575
}
7676
}
7777

78-
STATIC mp_obj_t complex_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
78+
STATIC mp_obj_t complex_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
7979
(void)type_in;
80-
mp_arg_check_num(n_args, n_kw, 0, 2, false);
80+
mp_arg_check_num(n_args, kw_args, 0, 2, false);
8181

8282
switch (n_args) {
8383
case 0:

py/objdict.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ STATIC void dict_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_
8181
}
8282
}
8383

84-
STATIC mp_obj_t dict_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
84+
STATIC mp_obj_t dict_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
8585
mp_obj_t dict_out = mp_obj_new_dict(0);
8686
mp_obj_dict_t *dict = MP_OBJ_TO_PTR(dict_out);
8787
dict->base.type = type;
@@ -90,11 +90,9 @@ STATIC mp_obj_t dict_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
9090
dict->map.is_ordered = 1;
9191
}
9292
#endif
93-
if (n_args > 0 || n_kw > 0) {
93+
if (n_args > 0 || kw_args != NULL) {
9494
mp_obj_t args2[2] = {dict_out, args[0]}; // args[0] is always valid, even if it's not a positional arg
95-
mp_map_t kwargs;
96-
mp_map_init_fixed_table(&kwargs, n_kw, args + n_args);
97-
dict_update(n_args + 1, args2, &kwargs); // dict_update will check that n_args + 1 == 1 or 2
95+
dict_update(n_args + 1, args2, kw_args); // dict_update will check that n_args + 1 == 1 or 2
9896
}
9997
return dict_out;
10098
}
@@ -328,7 +326,7 @@ STATIC mp_obj_t dict_update(size_t n_args, const mp_obj_t *args, mp_map_t *kwarg
328326
mp_obj_dict_t *self = MP_OBJ_TO_PTR(args[0]);
329327
mp_ensure_not_fixed(self);
330328

331-
mp_arg_check_num(n_args, kwargs->used, 1, 2, true);
329+
mp_arg_check_num(n_args, kwargs, 1, 2, true);
332330

333331
if (n_args == 2) {
334332
// given a positional argument

0 commit comments

Comments
 (0)