diff options
| author | Vlad Vissoultchev <wqweto@gmail.com> | 2016-04-17 16:37:23 +0300 |
|---|---|---|
| committer | Vlad Vissoultchev <wqweto@gmail.com> | 2016-04-17 17:25:55 +0300 |
| commit | 224236f57c7d645c9b23d717de354df5d12b98b6 (patch) | |
| tree | 27299b0ac2b9ec69d519c87bd5d8f5842346e0df /libtcc.c | |
| parent | acc8f602e57d69e6e36c417b7b360b6dd685b64e (diff) | |
| download | tinycc-224236f57c7d645c9b23d717de354df5d12b98b6.tar.gz tinycc-224236f57c7d645c9b23d717de354df5d12b98b6.tar.bz2 | |
Improve hash performance
- better `TOK_HASH_FUNC`
- increases `hash_ident` initial size to 16k (from 8k)
- `cstr_cat` uses single `realloc` + `memcpy`
- `cstr_cat` can append terminating zero
- `tok_str_realloc` initial size to 16 (from 8)
- `parse_define` uses static `tokstr_buf`
- `next` uses static `tokstr_buf`
- fixes two latent bugs (wrong deallocations in libtcc.c:482 and
tccpp.c:2987)
Diffstat (limited to 'libtcc.c')
| -rw-r--r-- | libtcc.c | 15 |
1 files changed, 8 insertions, 7 deletions
@@ -268,6 +268,8 @@ static size_t mem_max_size; PUB_FUNC void *tcc_malloc_debug(unsigned long size, const char *file, int line) { void *ptr; + int ofs; + mem_debug_header_t *header; ptr = malloc(sizeof(mem_debug_header_t) + size); @@ -285,7 +287,8 @@ PUB_FUNC void *tcc_malloc_debug(unsigned long size, const char *file, int line) header->size = size; header->line_num = line; - strncpy(header->file_name, file, MEM_DEBUG_FILE_LEN); + ofs = strlen(file) - MEM_DEBUG_FILE_LEN; + strncpy(header->file_name, file + (ofs > 0 ? ofs : 0), MEM_DEBUG_FILE_LEN); header->file_name[MEM_DEBUG_FILE_LEN] = 0; header->next = mem_debug_chain; @@ -473,13 +476,14 @@ static void tcc_split_path(TCCState *s, void ***p_ary, int *p_nb_ary, const char if (c == '{' && p[1] && p[2] == '}') { c = p[1], p += 2; if (c == 'B') - cstr_cat(&str, s->tcc_lib_path); + cstr_cat(&str, s->tcc_lib_path, -1); } else { cstr_ccat(&str, c); } } cstr_ccat(&str, '\0'); - dynarray_add(p_ary, p_nb_ary, str.data); + dynarray_add(p_ary, p_nb_ary, tcc_strdup(str.data)); + cstr_free(&str); in = p+1; } while (*p); } @@ -1042,8 +1046,6 @@ static void tcc_cleanup(void) /* free sym_pools */ dynarray_reset(&sym_pools, &nb_sym_pools); - /* string buffer */ - cstr_free(&tokcstr); /* reset symbol stack */ sym_free_first = NULL; } @@ -2325,8 +2327,7 @@ ST_FUNC int tcc_parse_args1(TCCState *s, int argc, char **argv) case TCC_OPTION_Wl: if (pas->linker_arg.size) --pas->linker_arg.size, cstr_ccat(&pas->linker_arg, ','); - cstr_cat(&pas->linker_arg, optarg); - cstr_ccat(&pas->linker_arg, '\0'); + cstr_cat(&pas->linker_arg, optarg, 0); break; case TCC_OPTION_E: if (s->output_type) |
