diff options
Diffstat (limited to 'src/decomp/instruction.c')
-rw-r--r-- | src/decomp/instruction.c | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/src/decomp/instruction.c b/src/decomp/instruction.c index 2d42e71..3a9917a 100644 --- a/src/decomp/instruction.c +++ b/src/decomp/instruction.c @@ -79,29 +79,63 @@ static void g_dec_instruction_init(GDecInstruction *instr) /****************************************************************************** * * -* Paramètres : instr = première instruction à venir visiter. * -* process = procédure à appeler à chaque instruction visitée. * -* data = données quelconques associées au visiteur. * -* order = précise le sens de la visite. * +* Paramètres : instr = première instruction à venir visiter. * +* callback = procédure à appeler à chaque instruction visitée. * +* flags = moments des appels à réaliser en retour. * +* data = données quelconques associées au visiteur. * * * * Description : Visite un ensemble hiérarchique d'instructions décompilées. * * * -* Retour : - * +* Retour : true si le parcours a été jusqu'à son terme, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_dec_instruction_visit(GDecInstruction *instr, dec_instr_visitor_cb callback, DecInstrVisitFlags flags, void *data) +{ + bool result; /* Bilan à retourner */ + + result = true; + + if (flags & DVF_ENTER) + result = callback(instr, DVF_ENTER, data); + + if (result && instr->visit) + result = instr->visit(instr, callback, flags, data); + + if (result && (flags & DVF_EXIT)) + result = callback(instr, DVF_EXIT, data); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : instr = première instruction à venir ausculter. * +* old = instruction décompilée à venir remplacer. * +* new = instruction décompilée à utiliser dorénavant. * +* * +* Description : Remplace une instruction décompilée par une autre. * +* * +* Retour : true si un remplacement a été effectué, false sinon. * * * * Remarques : - * * * ******************************************************************************/ -void g_dec_instruction_visit(GDecInstruction *instr, process_decomp_fc process, void *data, bool order) +bool g_dec_instruction_replace(GDecInstruction *instr, GDecInstruction *old, GDecInstruction *new) { - if (order) - process(instr, data); + bool result; /* Bilan à retourner */ - if (instr->visit) - instr->visit(instr, process, data, order); + if (instr->replace != NULL) + result = instr->replace(instr, old, new); + else + result = false; - if (!order) - process(instr, data); + return result; } |