diff options
Diffstat (limited to 'tools/d2c/spec.c')
-rw-r--r-- | tools/d2c/spec.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/tools/d2c/spec.c b/tools/d2c/spec.c index 7d65cab..cf1a066 100644 --- a/tools/d2c/spec.c +++ b/tools/d2c/spec.c @@ -266,7 +266,8 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a { bool result; /* Bilan à retourner */ char *keyword; /* Mot clef appelable en code */ - bool exit; /* Inclusion de sortie rapide ?*/ + bool quick_exit; /* Inclusion de sortie rapide ?*/ + bool bad_exit; /* Ajout d'une sortie d'échec ?*/ const char *new_ins; /* Nouvelle définition de nom */ result = true; @@ -304,13 +305,13 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a /* Inclusion des éventuelles règles */ - exit = false; + quick_exit = false; result &= write_decoding_rules(spec->rules, CAT_SEE, - fd, arch, subarch, spec->bits, spec->conversions, pp, &exit); + fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit); result &= write_decoding_rules(spec->rules, CAT_UNPREDICTABLE, - fd, arch, subarch, spec->bits, spec->conversions, pp, &exit); + fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit); /* Création de l'instruction en elle-même */ @@ -325,18 +326,20 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a result &= write_hook_functions(spec->hooks, fd); result &= write_decoding_rules(spec->rules, CAT_CHECKED_CALL, - fd, arch, subarch, spec->bits, spec->conversions, pp, &exit); + fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit); result &= write_decoding_rules(spec->rules, CAT_CALL, - fd, arch, subarch, spec->bits, spec->conversions, pp, &exit); + fd, arch, subarch, spec->bits, spec->conversions, pp, &quick_exit); /* Création des opérandes */ - result &= define_syntax_items(spec->syntax, fd, arch, spec->bits, spec->conversions, pp); + bad_exit = false; + + result &= define_syntax_items(spec->syntax, fd, arch, spec->bits, spec->conversions, pp, &bad_exit); /* Conclusion de la procédure */ - if (exit) + if (quick_exit) { dprintf(fd, "\t quick_exit:\n"); dprintf(fd, "\n"); @@ -346,14 +349,17 @@ bool write_encoding_spec_disass(const encoding_spec *spec, int fd, const char *a dprintf(fd, "\n"); - dprintf(fd, "\t bad_exit:\n"); + if (bad_exit) + { + dprintf(fd, "\t bad_exit:\n"); + dprintf(fd, "\n"); - dprintf(fd, "\n"); + dprintf(fd, "\t\tg_object_unref(G_OBJECT(instr));\n"); + dprintf(fd, "\t\treturn NULL;\n"); - dprintf(fd, "\t\tg_object_unref(G_OBJECT(instr));\n"); - dprintf(fd, "\t\treturn NULL;\n"); + dprintf(fd, "\n"); - dprintf(fd, "\n"); + } dprintf(fd, "\t}\n"); |