Skip to content

Commit 8b9f5e7

Browse files
committed
Remove del obj and add deinited
1 parent 0ca6cc7 commit 8b9f5e7

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

shared-bindings/gifio/OnDiskGif.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
#include "py/runtime.h"
3232
#include "py/objproperty.h"
33+
#include "shared/runtime/context_manager_helpers.h"
34+
#include "shared-bindings/util.h"
3335
#include "supervisor/shared/translate/translate.h"
3436
#include "shared-bindings/gifio/OnDiskGif.h"
3537

@@ -125,11 +127,34 @@ STATIC mp_obj_t gifio_ondiskgif_make_new(const mp_obj_type_t *type, size_t n_arg
125127
return MP_OBJ_FROM_PTR(self);
126128
}
127129

130+
STATIC void check_for_deinit(gifio_ondiskgif_t *self) {
131+
if (common_hal_gifio_ondiskgif_deinited(self)) {
132+
raise_deinited_error();
133+
}
134+
}
135+
136+
//| def __enter__(self) -> OnDiskGif:
137+
//| """No-op used by Context Managers."""
138+
//| ...
139+
// Provided by context manager helper.
140+
141+
//| def __exit__(self) -> None:
142+
//| """Automatically deinitializes the GIF when exiting a context. See
143+
//| :ref:`lifetime-and-contextmanagers` for more info."""
144+
//| ...
145+
STATIC mp_obj_t gifio_ondiskgif_obj___exit__(size_t n_args, const mp_obj_t *args) {
146+
(void)n_args;
147+
common_hal_gifio_ondiskgif_deinit(args[0]);
148+
return mp_const_none;
149+
}
150+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(gifio_ondiskgif___exit___obj, 4, 4, gifio_ondiskgif_obj___exit__);
151+
128152
//| width: int
129153
//| """Width of the gif. (read only)"""
130154
STATIC mp_obj_t gifio_ondiskgif_obj_get_width(mp_obj_t self_in) {
131155
gifio_ondiskgif_t *self = MP_OBJ_TO_PTR(self_in);
132156

157+
check_for_deinit(self);
133158
return MP_OBJ_NEW_SMALL_INT(common_hal_gifio_ondiskgif_get_width(self));
134159
}
135160

@@ -143,6 +168,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_width_obj,
143168
STATIC mp_obj_t gifio_ondiskgif_obj_get_height(mp_obj_t self_in) {
144169
gifio_ondiskgif_t *self = MP_OBJ_TO_PTR(self_in);
145170

171+
check_for_deinit(self);
146172
return MP_OBJ_NEW_SMALL_INT(common_hal_gifio_ondiskgif_get_height(self));
147173
}
148174

@@ -155,6 +181,8 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_height_obj,
155181
//| """The bitmap used to hold the current frame."""
156182
STATIC mp_obj_t gifio_ondiskgif_obj_get_bitmap(mp_obj_t self_in) {
157183
gifio_ondiskgif_t *self = MP_OBJ_TO_PTR(self_in);
184+
185+
check_for_deinit(self);
158186
return common_hal_gifio_ondiskgif_get_bitmap(self);
159187
}
160188

@@ -168,6 +196,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_bitmap_obj,
168196
STATIC mp_obj_t gifio_ondiskgif_obj_next_frame(mp_obj_t self_in) {
169197
gifio_ondiskgif_t *self = MP_OBJ_TO_PTR(self_in);
170198

199+
check_for_deinit(self);
171200
return mp_obj_new_float((float)common_hal_gifio_ondiskgif_next_frame(self, true) / 1000);
172201
}
173202

@@ -179,6 +208,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(gifio_ondiskgif_next_frame_obj, gifio_ondiskgif_obj_ne
179208
STATIC mp_obj_t gifio_ondiskgif_obj_get_duration(mp_obj_t self_in) {
180209
gifio_ondiskgif_t *self = MP_OBJ_TO_PTR(self_in);
181210

211+
check_for_deinit(self);
182212
return mp_obj_new_float((float)common_hal_gifio_ondiskgif_get_duration(self) / 1000);
183213
}
184214

@@ -192,6 +222,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_duration_obj,
192222
STATIC mp_obj_t gifio_ondiskgif_obj_get_frame_count(mp_obj_t self_in) {
193223
gifio_ondiskgif_t *self = MP_OBJ_TO_PTR(self_in);
194224

225+
check_for_deinit(self);
195226
return MP_OBJ_NEW_SMALL_INT(common_hal_gifio_ondiskgif_get_frame_count(self));
196227
}
197228

@@ -205,6 +236,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_frame_count_obj,
205236
STATIC mp_obj_t gifio_ondiskgif_obj_get_min_delay(mp_obj_t self_in) {
206237
gifio_ondiskgif_t *self = MP_OBJ_TO_PTR(self_in);
207238

239+
check_for_deinit(self);
208240
return mp_obj_new_float((float)common_hal_gifio_ondiskgif_get_min_delay(self) / 1000);
209241
}
210242

@@ -219,6 +251,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_min_delay_obj,
219251
STATIC mp_obj_t gifio_ondiskgif_obj_get_max_delay(mp_obj_t self_in) {
220252
gifio_ondiskgif_t *self = MP_OBJ_TO_PTR(self_in);
221253

254+
check_for_deinit(self);
222255
return mp_obj_new_float((float)common_hal_gifio_ondiskgif_get_max_delay(self) / 1000);
223256
}
224257

@@ -228,6 +261,9 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_max_delay_obj,
228261
(mp_obj_t)&gifio_ondiskgif_get_max_delay_obj);
229262

230263
STATIC const mp_rom_map_elem_t gifio_ondiskgif_locals_dict_table[] = {
264+
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&gifio_ondiskgif_deinit_obj) },
265+
{ MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) },
266+
{ MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&gifio_ondiskgif___exit___obj) },
231267
{ MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&gifio_ondiskgif_height_obj) },
232268
{ MP_ROM_QSTR(MP_QSTR_bitmap), MP_ROM_PTR(&gifio_ondiskgif_bitmap_obj) },
233269
{ MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&gifio_ondiskgif_width_obj) },

shared-bindings/gifio/OnDiskGif.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,6 @@ int32_t common_hal_gifio_ondiskgif_get_duration(gifio_ondiskgif_t *self);
4545
int32_t common_hal_gifio_ondiskgif_get_frame_count(gifio_ondiskgif_t *self);
4646
int32_t common_hal_gifio_ondiskgif_get_min_delay(gifio_ondiskgif_t *self);
4747
int32_t common_hal_gifio_ondiskgif_get_max_delay(gifio_ondiskgif_t *self);
48+
void common_hal_gifio_ondiskgif_deinit(gifio_ondiskgif_t *self);
49+
bool common_hal_gifio_ondiskgif_deinited(gifio_ondiskgif_t *self);
4850
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_ONDISKGIF_H

shared-module/gifio/OnDiskGif.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,13 @@ void common_hal_gifio_ondiskgif_construct(gifio_ondiskgif_t *self, pyb_file_obj_
154154
self->min_delay = info.iMinDelay;
155155
self->max_delay = info.iMaxDelay;
156156

157-
// mp_printf(&mp_plat_print, "GIF_init returned %d %x\n", result, bitmap->data);
157+
void common_hal_gifio_ondiskgif_deinit(gifio_ondiskgif_t *self) {
158+
self->file = NULL;
159+
self->bitmap = NULL;
160+
}
161+
162+
bool common_hal_gifio_ondiskgif_deinited(gifio_ondiskgif_t *self) {
163+
return self->bitmap == NULL;
158164
}
159165

160166
uint16_t common_hal_gifio_ondiskgif_get_height(gifio_ondiskgif_t *self) {

0 commit comments

Comments
 (0)