* only make objects long lived if they are on the GC heap
This commit is contained in:
parent
c000567d88
commit
f13ba7e8d9
10
py/gc.c
10
py/gc.c
@ -53,9 +53,6 @@
|
|||||||
// detect untraced object still in use
|
// detect untraced object still in use
|
||||||
#define CLEAR_ON_SWEEP (0)
|
#define CLEAR_ON_SWEEP (0)
|
||||||
|
|
||||||
#define WORDS_PER_BLOCK ((MICROPY_BYTES_PER_GC_BLOCK) / BYTES_PER_WORD)
|
|
||||||
#define BYTES_PER_BLOCK (MICROPY_BYTES_PER_GC_BLOCK)
|
|
||||||
|
|
||||||
// ATB = allocation table byte
|
// ATB = allocation table byte
|
||||||
// 0b00 = FREE -- free block
|
// 0b00 = FREE -- free block
|
||||||
// 0b01 = HEAD -- head of a chain of blocks
|
// 0b01 = HEAD -- head of a chain of blocks
|
||||||
@ -209,13 +206,6 @@ bool gc_is_locked(void) {
|
|||||||
return MP_STATE_MEM(gc_lock_depth) != 0;
|
return MP_STATE_MEM(gc_lock_depth) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ptr should be of type void*
|
|
||||||
#define VERIFY_PTR(ptr) ( \
|
|
||||||
((uintptr_t)(ptr) & (BYTES_PER_BLOCK - 1)) == 0 /* must be aligned on a block */ \
|
|
||||||
&& ptr >= (void*)MP_STATE_MEM(gc_pool_start) /* must be above start of pool */ \
|
|
||||||
&& ptr < (void*)MP_STATE_MEM(gc_pool_end) /* must be below end of pool */ \
|
|
||||||
)
|
|
||||||
|
|
||||||
#ifndef TRACE_MARK
|
#ifndef TRACE_MARK
|
||||||
#if DEBUG_PRINT
|
#if DEBUG_PRINT
|
||||||
#define TRACE_MARK(block, ptr) DEBUG_printf("gc_mark(%p)\n", ptr)
|
#define TRACE_MARK(block, ptr) DEBUG_printf("gc_mark(%p)\n", ptr)
|
||||||
|
11
py/gc.h
11
py/gc.h
@ -29,8 +29,19 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "py/mpconfig.h"
|
#include "py/mpconfig.h"
|
||||||
|
#include "py/mpstate.h"
|
||||||
#include "py/misc.h"
|
#include "py/misc.h"
|
||||||
|
|
||||||
|
#define WORDS_PER_BLOCK ((MICROPY_BYTES_PER_GC_BLOCK) / BYTES_PER_WORD)
|
||||||
|
#define BYTES_PER_BLOCK (MICROPY_BYTES_PER_GC_BLOCK)
|
||||||
|
|
||||||
|
// ptr should be of type void*
|
||||||
|
#define VERIFY_PTR(ptr) ( \
|
||||||
|
((uintptr_t)(ptr) & (BYTES_PER_BLOCK - 1)) == 0 /* must be aligned on a block */ \
|
||||||
|
&& ptr >= (void*)MP_STATE_MEM(gc_pool_start) /* must be above start of pool */ \
|
||||||
|
&& ptr < (void*)MP_STATE_MEM(gc_pool_end) /* must be below end of pool */ \
|
||||||
|
)
|
||||||
|
|
||||||
void gc_init(void *start, void *end);
|
void gc_init(void *start, void *end);
|
||||||
void gc_deinit(void);
|
void gc_deinit(void);
|
||||||
|
|
||||||
|
@ -126,6 +126,11 @@ mp_obj_t make_obj_long_lived(mp_obj_t obj, uint8_t max_depth){
|
|||||||
if (obj == NULL) {
|
if (obj == NULL) {
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
// If not in the GC pool, do nothing. This can happen (at least) when
|
||||||
|
// there are frozen mp_type_bytes objects in ROM.
|
||||||
|
if (!VERIFY_PTR((void *)obj)) {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
if (MP_OBJ_IS_TYPE(obj, &mp_type_fun_bc)) {
|
if (MP_OBJ_IS_TYPE(obj, &mp_type_fun_bc)) {
|
||||||
mp_obj_fun_bc_t *fun_bc = MP_OBJ_TO_PTR(obj);
|
mp_obj_fun_bc_t *fun_bc = MP_OBJ_TO_PTR(obj);
|
||||||
return MP_OBJ_FROM_PTR(make_fun_bc_long_lived(fun_bc, max_depth));
|
return MP_OBJ_FROM_PTR(make_fun_bc_long_lived(fun_bc, max_depth));
|
||||||
|
Loading…
Reference in New Issue
Block a user