Skip to content

Commit 11f19bc

Browse files
committed
pybricks.parameters.Color: fix dictionary getting GCed
The colors dictionary was not accessible via root pointers and was getting GCed. This adds it to the root pointers. Also allocate enough values for the color constants during init so that we don't have to keep reallocating memory. Fixes: pybricks/support#314
1 parent d1cce9a commit 11f19bc

File tree

5 files changed

+11
-9
lines changed

5 files changed

+11
-9
lines changed

bricks/ev3dev/mpconfigport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ struct _mp_bluetooth_btstack_root_pointers_t;
385385
#endif
386386

387387
#define MICROPY_PORT_ROOT_POINTERS \
388+
mp_obj_dict_t *pb_type_Color_dict; \
388389
const char *readline_hist[50]; \
389390
void *mmap_region_head; \
390391
MICROPY_BLUETOOTH_ROOT_POINTERS \

bricks/ev3rt/mpconfigport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
{ MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&mp_builtin_open_obj) },*/
9797

9898
#define MICROPY_PORT_ROOT_POINTERS \
99+
mp_obj_dict_t *pb_type_Color_dict; \
99100

100101
//////////////////////////////////////////
101102
// Do not change anything beyond this line

bricks/nxt/mpconfigport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ extern const struct _mp_obj_module_t pb_package_pybricks;
136136
#define MP_STATE_PORT MP_STATE_VM
137137

138138
#define MICROPY_PORT_ROOT_POINTERS \
139+
mp_obj_dict_t *pb_type_Color_dict; \
139140
const char *readline_hist[8];
140141

141142
#include "../pybricks_config.h"

bricks/stm32/configport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ static inline mp_uint_t disable_irq(void) {
163163
#define MP_STATE_PORT MP_STATE_VM
164164

165165
#define MICROPY_PORT_ROOT_POINTERS \
166+
mp_obj_dict_t *pb_type_Color_dict; \
166167
const char *readline_hist[8];
167168

168169
#include "../pybricks_config.h"

pybricks/parameters/pb_type_color.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,9 @@ static mp_obj_t pb_type_Color_make_new_helper(mp_int_t h, mp_int_t s, mp_int_t v
117117
return MP_OBJ_FROM_PTR(self);
118118
}
119119

120-
// Create and reset dict to hold default colors and those added by user
121-
STATIC mp_obj_dict_t *colors;
122-
123120
void pb_type_Color_reset(void) {
124121
// Set default contents of Color class
125-
colors = mp_obj_new_dict(0);
122+
mp_obj_dict_t *colors = mp_obj_new_dict(13);
126123
mp_obj_dict_store(MP_OBJ_FROM_PTR(colors), MP_ROM_QSTR(MP_QSTR_RED), MP_OBJ_FROM_PTR(&pb_Color_RED_obj));
127124
mp_obj_dict_store(MP_OBJ_FROM_PTR(colors), MP_ROM_QSTR(MP_QSTR_BROWN), MP_OBJ_FROM_PTR(&pb_Color_BROWN_obj));
128125
mp_obj_dict_store(MP_OBJ_FROM_PTR(colors), MP_ROM_QSTR(MP_QSTR_ORANGE), MP_OBJ_FROM_PTR(&pb_Color_ORANGE_obj));
@@ -136,19 +133,20 @@ void pb_type_Color_reset(void) {
136133
mp_obj_dict_store(MP_OBJ_FROM_PTR(colors), MP_ROM_QSTR(MP_QSTR_GRAY), MP_OBJ_FROM_PTR(&pb_Color_GRAY_obj));
137134
mp_obj_dict_store(MP_OBJ_FROM_PTR(colors), MP_ROM_QSTR(MP_QSTR_WHITE), MP_OBJ_FROM_PTR(&pb_Color_WHITE_obj));
138135
mp_obj_dict_store(MP_OBJ_FROM_PTR(colors), MP_ROM_QSTR(MP_QSTR_NONE), MP_OBJ_FROM_PTR(&pb_Color_NONE_obj));
136+
MP_STATE_VM(pb_type_Color_dict) = colors;
139137
}
140138

141139
void pb_type_Color_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
142140

143141
// If we're the class itself, use dict printer
144142
if (MP_OBJ_TO_PTR(self_in) == &pb_type_Color_obj) {
145-
mp_type_dict.print(print, colors, kind);
143+
mp_type_dict.print(print, MP_STATE_VM(pb_type_Color_dict), kind);
146144
return;
147145
}
148146

149147
// Otherwise, print name of color, if available
150-
mp_map_elem_t *color_elems = colors->map.table;
151-
for (size_t i = 0; i < colors->map.alloc; i++) {
148+
mp_map_elem_t *color_elems = MP_STATE_VM(pb_type_Color_dict)->map.table;
149+
for (size_t i = 0; i < MP_STATE_VM(pb_type_Color_dict)->map.alloc; i++) {
152150
mp_map_elem_t *element = &color_elems[i];
153151
if (self_in == element->value && MP_OBJ_IS_QSTR(element->key)) {
154152
mp_printf(print, "Color.%q", MP_OBJ_QSTR_VALUE(element->key));
@@ -174,7 +172,7 @@ STATIC mp_obj_t pb_type_Color_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t
174172
}
175173

176174
// Treat it like a dictionary
177-
return mp_type_dict.subscr(colors, index, value);
175+
return mp_type_dict.subscr(MP_STATE_VM(pb_type_Color_dict), index, value);
178176
}
179177

180178
STATIC mp_obj_t pb_type_Color_getiter(mp_obj_t self_in, mp_obj_iter_buf_t *iter_buf) {
@@ -185,7 +183,7 @@ STATIC mp_obj_t pb_type_Color_getiter(mp_obj_t self_in, mp_obj_iter_buf_t *iter_
185183
}
186184

187185
// Treat it like a dictionary
188-
return mp_type_dict.getiter(colors, iter_buf);
186+
return mp_type_dict.getiter(MP_STATE_VM(pb_type_Color_dict), iter_buf);
189187
}
190188

191189
STATIC void pb_type_Color_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {

0 commit comments

Comments
 (0)