Skip to content

Commit a319ac2

Browse files
committed
uheap: Switch to using gc_nbytes to measure allcoation size so we stop undercounting.
1 parent a8fbad5 commit a319ac2

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

shared-module/uheap/__init__.c

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,16 @@ static uint32_t object_size(uint8_t indent_level, mp_obj_t obj);
5454

5555
static uint32_t int_size(uint8_t indent_level, mp_obj_t obj) {
5656
if (MP_OBJ_IS_SMALL_INT(obj)) {
57-
return sizeof(mp_obj_t);
57+
return 0;
5858
}
5959
if (!VERIFY_PTR(obj)) {
6060
return 0;
6161
}
6262
#if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_MPZ
6363
mp_obj_int_t* i = MP_OBJ_TO_PTR(obj);
64-
return sizeof(mp_obj_int_t) + i->mpz.len * sizeof(mpz_dig_t);
64+
return gc_nbytes(obj) + gc_nbytes(i->mpz.dig);
6565
#else
66-
return sizeof(mp_obj_int_t);
66+
return gc_nbytes(obj);
6767
#endif
6868
}
6969

@@ -76,17 +76,17 @@ static uint32_t string_size(uint8_t indent_level, mp_obj_t obj) {
7676
}
7777
indent(indent_level);
7878
mp_printf(&mp_plat_print, "%s\n", s);
79-
return qstr_len(qs);
79+
return 0;
8080
} else { // MP_OBJ_IS_TYPE(o, &mp_type_str)
8181
mp_obj_str_t* s = MP_OBJ_TO_PTR(obj);
82-
return sizeof(mp_obj_str_t) + s->len * sizeof(const byte);
82+
return gc_nbytes(s) + gc_nbytes(s->data);
8383
}
8484
}
8585

8686
static uint32_t map_size(uint8_t indent_level, const mp_map_t *map) {
87-
uint32_t total_size = 0;
87+
uint32_t total_size = gc_nbytes(map->table);
8888
for (int i = 0; i < map->used; i++) {
89-
uint32_t this_size = sizeof(mp_map_elem_t);
89+
uint32_t this_size = 0;
9090
indent(indent_level);
9191
if (map->table[i].key != NULL) {
9292
mp_print_str(&mp_plat_print, "key: ");
@@ -103,12 +103,11 @@ static uint32_t map_size(uint8_t indent_level, const mp_map_t *map) {
103103
total_size += this_size;
104104
}
105105

106-
total_size += sizeof(mp_map_elem_t) * (map->alloc - map->used);
107106
return total_size;
108107
}
109108

110109
static uint32_t dict_size(uint8_t indent_level, mp_obj_dict_t *dict) {
111-
uint32_t total_size = sizeof(mp_obj_dict_t);
110+
uint32_t total_size = gc_nbytes(dict);
112111

113112
indent(indent_level);
114113
mp_printf(&mp_plat_print, "Dictionary @%x\n", dict);
@@ -133,7 +132,7 @@ static uint32_t function_size(uint8_t indent_level, mp_obj_t obj) {
133132
return 0;
134133
} else if (MP_OBJ_IS_TYPE(obj, &mp_type_fun_bc)) {
135134
mp_obj_fun_bc_t* fn = MP_OBJ_TO_PTR(obj);
136-
uint32_t total_size = gc_nbytes(fn->bytecode) + gc_nbytes(fn->const_table);
135+
uint32_t total_size = gc_nbytes(fn) + gc_nbytes(fn->bytecode) + gc_nbytes(fn->const_table);
137136
#if MICROPY_DEBUG_PRINTERS
138137
mp_printf(&mp_plat_print, "BYTECODE START\n");
139138
mp_bytecode_print(fn, fn->bytecode, gc_nbytes(fn->bytecode), fn->const_table);
@@ -157,18 +156,27 @@ static uint32_t function_size(uint8_t indent_level, mp_obj_t obj) {
157156
}
158157

159158
static uint32_t array_size(uint8_t indent_level, mp_obj_array_t *array) {
160-
uint32_t total_size = sizeof(mp_obj_array_t);
159+
uint32_t total_size = gc_nbytes(array);
160+
161+
uint32_t item_size = gc_nbytes(array->items);
162+
total_size += item_size;
163+
indent(indent_level);
164+
mp_printf(&mp_plat_print, "Array of size: %u\n\n", item_size);
165+
166+
return total_size;
167+
}
168+
169+
static uint32_t memoryview_size(uint8_t indent_level, mp_obj_array_t *array) {
170+
uint32_t total_size = gc_nbytes(array);
161171

162-
int typecode_size = mp_binary_get_size('@', array->typecode, NULL);
163-
total_size += typecode_size * (array->free + array->len);
164172
indent(indent_level);
165-
mp_printf(&mp_plat_print, "Array of size: %u\n\n", (array->free + array->len));
173+
mp_printf(&mp_plat_print, "memoryview\n");
166174

167175
return total_size;
168176
}
169177

170178
static uint32_t type_size(uint8_t indent_level, mp_obj_type_t *type) {
171-
uint32_t total_size = sizeof(mp_obj_type_t);
179+
uint32_t total_size = gc_nbytes(type);
172180

173181
// mp_obj_base_t base;
174182
// qstr name;
@@ -218,15 +226,15 @@ static uint32_t type_size(uint8_t indent_level, mp_obj_type_t *type) {
218226

219227

220228
static uint32_t instance_size(uint8_t indent_level, mp_obj_instance_t *instance) {
221-
uint32_t total_size = sizeof(mp_obj_instance_t);
229+
uint32_t total_size = gc_nbytes(instance);
222230

223231
total_size += map_size(indent_level, &instance->members);
224232

225233
return total_size;
226234
}
227235

228236
static uint32_t module_size(uint8_t indent_level, mp_obj_module_t *module) {
229-
uint32_t total_size = sizeof(mp_obj_module_t);
237+
uint32_t total_size = gc_nbytes(module);
230238

231239
indent(indent_level);
232240
mp_printf(&mp_plat_print, ".globals\n");
@@ -264,7 +272,9 @@ static uint32_t object_size(uint8_t indent_level, mp_obj_t obj) {
264272
return type_size(indent_level, MP_OBJ_TO_PTR(obj));
265273
} else if (type == &mp_type_bytearray || type == &mp_type_array) {
266274
return array_size(indent_level, MP_OBJ_TO_PTR(obj));
267-
} else if (MP_OBJ_IS_OBJ(obj) && VERIFY_PTR(type)) {
275+
} else if (type == &mp_type_memoryview) {
276+
return memoryview_size(indent_level, MP_OBJ_TO_PTR(obj));
277+
} else if (MP_OBJ_IS_OBJ(obj) && VERIFY_PTR(type)) {
268278
return instance_size(indent_level, MP_OBJ_TO_PTR(obj));
269279
}
270280

0 commit comments

Comments
 (0)