@@ -116,6 +116,16 @@ static void preflight_pins_or_throw(uint8_t clock_pin, uint8_t *rgb_pins, uint8_
116
116
#endif
117
117
}
118
118
119
+ typedef struct {
120
+ nlr_jump_callback_node_t callback ;
121
+ mp_obj_base_t * base_ptr ;
122
+ } nlr_jump_callback_node_clear_displaybus_t ;
123
+
124
+ static void clear_display_bus (void * node_in ) {
125
+ nlr_jump_callback_node_clear_displaybus_t * node = node_in ;
126
+ node -> base_ptr -> type = & mp_type_NoneType ;
127
+ }
128
+
119
129
//| def __init__(
120
130
//| self,
121
131
//| *,
@@ -217,6 +227,13 @@ static mp_obj_t rgbmatrix_rgbmatrix_make_new(const mp_obj_type_t *type, size_t n
217
227
rgbmatrix_rgbmatrix_obj_t * self = & allocate_display_bus_or_raise ()-> rgbmatrix ;
218
228
self -> base .type = & rgbmatrix_RGBMatrix_type ;
219
229
230
+ // If an exception is thrown, ensure the display bus object's type is set
231
+ // back to the uninitialized/deinitialied type. **note that all other resource
232
+ // deallocations must be handled by the shared-module code**
233
+ nlr_jump_callback_node_clear_displaybus_t node ;
234
+ node .base_ptr = & self -> base ;
235
+ nlr_push_jump_callback (& node .callback , clear_display_bus );
236
+
220
237
uint8_t rgb_count , addr_count ;
221
238
uint8_t rgb_pins [MP_ARRAY_SIZE (self -> rgb_pins )];
222
239
uint8_t addr_pins [MP_ARRAY_SIZE (self -> addr_pins )];
@@ -254,7 +271,6 @@ static mp_obj_t rgbmatrix_rgbmatrix_make_new(const mp_obj_type_t *type, size_t n
254
271
clock_pin , latch_pin , output_enable_pin ,
255
272
args [ARG_doublebuffer ].u_bool ,
256
273
args [ARG_framebuffer ].u_obj , tile , args [ARG_serpentine ].u_bool , NULL );
257
-
258
274
claim_and_never_reset_pins (args [ARG_rgb_list ].u_obj );
259
275
claim_and_never_reset_pins (args [ARG_addr_list ].u_obj );
260
276
claim_and_never_reset_pin (args [ARG_clock_pin ].u_obj );
0 commit comments