py/gc: For finaliser, interpret a pointer into the heap as concrete obj.
This commit is contained in:
parent
969e4bbe6a
commit
f7782f8082
8
py/gc.c
8
py/gc.c
@ -230,16 +230,16 @@ STATIC void gc_sweep(void) {
|
|||||||
#endif
|
#endif
|
||||||
// free unmarked heads and their tails
|
// free unmarked heads and their tails
|
||||||
int free_tail = 0;
|
int free_tail = 0;
|
||||||
for (mp_uint_t block = 0; block < MP_STATE_MEM(gc_alloc_table_byte_len) * BLOCKS_PER_ATB; block++) {
|
for (size_t block = 0; block < MP_STATE_MEM(gc_alloc_table_byte_len) * BLOCKS_PER_ATB; block++) {
|
||||||
switch (ATB_GET_KIND(block)) {
|
switch (ATB_GET_KIND(block)) {
|
||||||
case AT_HEAD:
|
case AT_HEAD:
|
||||||
#if MICROPY_ENABLE_FINALISER
|
#if MICROPY_ENABLE_FINALISER
|
||||||
if (FTB_GET(block)) {
|
if (FTB_GET(block)) {
|
||||||
mp_obj_t obj = (mp_obj_t)PTR_FROM_BLOCK(block);
|
mp_obj_base_t *obj = (mp_obj_base_t*)PTR_FROM_BLOCK(block);
|
||||||
if (((mp_obj_base_t*)MP_OBJ_TO_PTR(obj))->type != NULL) {
|
if (obj->type != NULL) {
|
||||||
// if the object has a type then see if it has a __del__ method
|
// if the object has a type then see if it has a __del__ method
|
||||||
mp_obj_t dest[2];
|
mp_obj_t dest[2];
|
||||||
mp_load_method_maybe(obj, MP_QSTR___del__, dest);
|
mp_load_method_maybe(MP_OBJ_FROM_PTR(obj), MP_QSTR___del__, dest);
|
||||||
if (dest[0] != MP_OBJ_NULL) {
|
if (dest[0] != MP_OBJ_NULL) {
|
||||||
// load_method returned a method
|
// load_method returned a method
|
||||||
mp_call_method_n_kw(0, 0, dest);
|
mp_call_method_n_kw(0, 0, dest);
|
||||||
|
Loading…
Reference in New Issue
Block a user