@@ -38,38 +38,38 @@ static mp_obj_t layer_make_new(const mp_obj_type_t *type, size_t n_args,
3838 size_t n_kw , const mp_obj_t * args ) {
3939 mp_arg_check_num (n_args , n_kw , 4 , 5 , false);
4040
41- layer_obj_t * self = mp_obj_malloc (layer_obj_t , type );
42-
43- self -> width = mp_obj_get_int (args [0 ]);
44- self -> height = mp_obj_get_int (args [1 ]);
45- self -> x = 0 ;
46- self -> y = 0 ;
47- self -> frame = 0 ;
48- self -> rotation = false;
41+ mp_uint_t width = mp_arg_validate_int_min (mp_obj_get_int (args [0 ]), 0 , MP_QSTR_width );
42+ mp_uint_t height = mp_arg_validate_int_min (mp_obj_get_int (args [1 ]), 0 , MP_QSTR_height );
4943
50- mp_buffer_info_t bufinfo ;
51- mp_get_buffer_raise (args [2 ], & bufinfo , MP_BUFFER_READ );
52- self -> graphic = bufinfo .buf ;
53- if (bufinfo .len != 2048 ) {
54- mp_raise_ValueError (MP_ERROR_TEXT ("graphic must be 2048 bytes long" ));
55- }
44+ mp_buffer_info_t graphic_bufinfo ;
45+ mp_get_buffer_raise (args [2 ], & graphic_bufinfo , MP_BUFFER_READ );
46+ mp_arg_validate_length (graphic_bufinfo .len , 2048 , MP_QSTR_graphic );
5647
57- mp_get_buffer_raise (args [3 ], & bufinfo , MP_BUFFER_READ );
58- self -> palette = bufinfo .buf ;
59- if (bufinfo .len != 32 ) {
60- mp_raise_ValueError (MP_ERROR_TEXT ("palette must be 32 bytes long" ));
61- }
48+ mp_buffer_info_t palette_bufinfo ;
49+ mp_get_buffer_raise (args [3 ], & palette_bufinfo , MP_BUFFER_READ );
50+ mp_arg_validate_length (palette_bufinfo .len , 32 , MP_QSTR_palette );
6251
52+ mp_buffer_info_t map_bufinfo = { .buf = NULL };
6353 if (n_args > 4 ) {
64- mp_get_buffer_raise (args [4 ], & bufinfo , MP_BUFFER_READ );
65- self -> map = bufinfo .buf ;
66- if (bufinfo .len < (self -> width * self -> height ) / 2 ) {
54+ mp_get_buffer_raise (args [4 ], & map_bufinfo , MP_BUFFER_READ );
55+ if (map_bufinfo .len < (width * height ) / 2 ) {
6756 mp_raise_ValueError (MP_ERROR_TEXT ("map buffer too small" ));
6857 }
69- } else {
70- self -> map = NULL ;
7158 }
7259
60+ // Only allocate after validation is finished.
61+ layer_obj_t * self = mp_obj_malloc (layer_obj_t , type );
62+
63+ self -> width = width ;
64+ self -> height = height ;
65+ self -> x = 0 ;
66+ self -> y = 0 ;
67+ self -> frame = 0 ;
68+ self -> rotation = false;
69+ self -> graphic = graphic_bufinfo .buf ;
70+ self -> palette = palette_bufinfo .buf ;
71+ self -> map = map_bufinfo .buf ;
72+
7373 return MP_OBJ_FROM_PTR (self );
7474}
7575
0 commit comments