From 3f6ae612da9e4e14b32084df8d9fccce8e4126fb Mon Sep 17 00:00:00 2001 From: Sebastien Douheret Date: Wed, 6 Mar 2013 17:21:05 +0100 Subject: add_disassembler: overwrite disassembler entry if existing --- agent/tcf/services/disassembly.c | 41 ++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/agent/tcf/services/disassembly.c b/agent/tcf/services/disassembly.c index 17648536..2a78ca5e 100644 --- a/agent/tcf/services/disassembly.c +++ b/agent/tcf/services/disassembly.c @@ -62,33 +62,42 @@ static size_t context_extension_offset = 0; #define EXT(ctx) (ctx ? ((ContextExtensionDS *)((char *)(ctx) + context_extension_offset)) : NULL) -void add_disassembler(Context * ctx, const char * isa, Disassembler disassembler) { - DisassemblerInfo * i = NULL; - ContextExtensionDS * ext = EXT(ctx); - assert(ctx == context_get_group(ctx, CONTEXT_GROUP_CPU)); - if (ext->disassemblers_cnt >= ext->disassemblers_max) { - ext->disassemblers_max += 8; - ext->disassemblers = (DisassemblerInfo *)loc_realloc(ext->disassemblers, - sizeof(DisassemblerInfo) * ext->disassemblers_max); - } - i = ext->disassemblers + ext->disassemblers_cnt++; - i->isa = loc_strdup(isa); - i->disassembler = disassembler; -} - -static Disassembler * find_disassembler(Context * ctx, const char * isa) { +static DisassemblerInfo * find_disassembler_info(Context * ctx, const char * isa) { if (isa != NULL) { unsigned i = 0; ContextExtensionDS * ext = EXT(ctx); while (i < ext->disassemblers_cnt) { if (strcmp(ext->disassemblers[i].isa, isa) == 0) - return ext->disassemblers[i].disassembler; + return &ext->disassemblers[i]; i++; } } return NULL; } +static Disassembler * find_disassembler(Context * ctx, const char * isa) { + DisassemblerInfo * i = find_disassembler_info(ctx, isa); + return i ? i->disassembler : NULL; +} + +void add_disassembler(Context * ctx, const char * isa, Disassembler disassembler) { + DisassemblerInfo * i = NULL; + ContextExtensionDS * ext = EXT(ctx); + assert(ctx == context_get_group(ctx, CONTEXT_GROUP_CPU)); + if ((i = find_disassembler_info(ctx, isa)) == NULL) { + if (ext->disassemblers_cnt >= ext->disassemblers_max) { + ext->disassemblers_max += 8; + ext->disassemblers = (DisassemblerInfo *)loc_realloc(ext->disassemblers, + sizeof(DisassemblerInfo) * ext->disassemblers_max); + } + i = ext->disassemblers + ext->disassemblers_cnt++; + } else { + if (i->isa) loc_free(i->isa); + } + i->isa = loc_strdup(isa); + i->disassembler = disassembler; +} + static void command_get_capabilities(char * token, Channel * c) { int error = 0; char id[256]; -- cgit v1.2.3