diff options
Diffstat (limited to 'src/symbol.c')
-rw-r--r-- | src/symbol.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/symbol.c b/src/symbol.c index 460f954..5f7dec2 100644 --- a/src/symbol.c +++ b/src/symbol.c | |||
@@ -297,21 +297,35 @@ collect_processor(void *data, void *proc_data) | |||
297 | return true; | 297 | return true; |
298 | } | 298 | } |
299 | 299 | ||
300 | static int | ||
301 | collect_list_entry(void *item, void *proc_data) | ||
302 | { | ||
303 | Symbol *s = item; | ||
304 | struct collect_data *cd = proc_data; | ||
305 | if (cd->sel(s)) { | ||
306 | cd->sym[cd->index] = s; | ||
307 | cd->index++; | ||
308 | } | ||
309 | return 0; | ||
310 | } | ||
311 | |||
300 | size_t | 312 | size_t |
301 | collect_symbols(Symbol ***return_sym, int (*sel)(Symbol *p), | 313 | collect_symbols(Symbol ***return_sym, int (*sel)(Symbol *p), |
302 | size_t reserved_slots) | 314 | size_t reserved_slots) |
303 | { | 315 | { |
304 | struct collect_data cdata; | 316 | struct collect_data cdata; |
305 | 317 | size_t size; | |
306 | cdata.sym = NULL; | 318 | |
319 | size = hash_get_n_entries(symbol_table) | ||
320 | + linked_list_size(static_func_list); | ||
321 | cdata.sym = xcalloc(size + reserved_slots, sizeof(*cdata.sym)); | ||
307 | cdata.index = 0; | 322 | cdata.index = 0; |
308 | cdata.sel = sel; | 323 | cdata.sel = sel; |
309 | hash_do_for_each (symbol_table, collect_processor, &cdata); | 324 | hash_do_for_each(symbol_table, collect_processor, &cdata); |
310 | cdata.sym = calloc(cdata.index + reserved_slots, sizeof(*cdata.sym)); | 325 | linked_list_iterate(&static_func_list, collect_list_entry, &cdata); |
311 | if (!cdata.sym) | 326 | |
312 | xalloc_die(); | 327 | cdata.sym = xrealloc(cdata.sym, |
313 | cdata.index = 0; | 328 | (cdata.index + reserved_slots) * sizeof(*cdata.sym)); |
314 | hash_do_for_each (symbol_table, collect_processor, &cdata); | ||
315 | *return_sym = cdata.sym; | 329 | *return_sym = cdata.sym; |
316 | return cdata.index; | 330 | return cdata.index; |
317 | } | 331 | } |
@@ -324,10 +338,7 @@ collect_functions(Symbol ***return_sym) | |||
324 | struct linked_list_entry *p; | 338 | struct linked_list_entry *p; |
325 | 339 | ||
326 | /* Count static functions */ | 340 | /* Count static functions */ |
327 | snum = 0; | 341 | snum = linked_list_size(static_func_list); |
328 | if (static_func_list) | ||
329 | for (p = linked_list_head(static_func_list); p; p = p->next) | ||
330 | snum++; | ||
331 | 342 | ||
332 | /* Collect global functions */ | 343 | /* Collect global functions */ |
333 | num = collect_symbols(&symbols, symbol_is_function, snum); | 344 | num = collect_symbols(&symbols, symbol_is_function, snum); |