diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2025-04-01 00:05:16 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2025-04-01 00:05:16 (GMT) | 
| commit | bb7e4c5e6e4c51da0d9b1a33b571b0c64851c1a8 (patch) | |
| tree | 4575210322bf6838f538a4f58967c0a2a0d9cabc /plugins/pychrysalide/arch/instructions | |
| parent | 70ed4dc99c75c13797b41164959c753ffbc4572b (diff) | |
Restore most features of core instructions.
Diffstat (limited to 'plugins/pychrysalide/arch/instructions')
| -rw-r--r-- | plugins/pychrysalide/arch/instructions/Makefile.am | 3 | ||||
| -rw-r--r-- | plugins/pychrysalide/arch/instructions/constants.c | 58 | ||||
| -rw-r--r-- | plugins/pychrysalide/arch/instructions/constants.h | 5 | ||||
| -rw-r--r-- | plugins/pychrysalide/arch/instructions/raw.c | 142 | ||||
| -rw-r--r-- | plugins/pychrysalide/arch/instructions/undefined.c | 145 | ||||
| -rw-r--r-- | plugins/pychrysalide/arch/instructions/undefined.h | 4 | 
6 files changed, 156 insertions, 201 deletions
| diff --git a/plugins/pychrysalide/arch/instructions/Makefile.am b/plugins/pychrysalide/arch/instructions/Makefile.am index 65efe42..29c2a45 100644 --- a/plugins/pychrysalide/arch/instructions/Makefile.am +++ b/plugins/pychrysalide/arch/instructions/Makefile.am @@ -7,7 +7,8 @@ libpychrysaarchinstructions_la_SOURCES =	\  	raw.h raw.c								\  	undefined.h undefined.c -libpychrysaarchinstructions_la_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_INTERPRETER_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \ +libpychrysaarchinstructions_la_CFLAGS = $(LIBPYTHON_INTERPRETER_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \ +	$(TOOLKIT_CFLAGS) \  	-I$(top_srcdir)/src -DNO_IMPORT_PYGOBJECT diff --git a/plugins/pychrysalide/arch/instructions/constants.c b/plugins/pychrysalide/arch/instructions/constants.c index af7baa9..257c501 100644 --- a/plugins/pychrysalide/arch/instructions/constants.c +++ b/plugins/pychrysalide/arch/instructions/constants.c @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * constants.c - ajout des constantes de base pour les instructions   * - * Copyright (C) 2020 Cyrille Bagard + * Copyright (C) 2020-2025 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -112,3 +112,59 @@ bool define_undefined_instruction_constants(PyTypeObject *type)      return result;  } + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : arg = argument quelconque à tenter de convertir.             * +*                dst = destination des valeurs récupérées en cas de succès.   * +*                                                                             * +*  Description : Tente de convertir en constante ExpectedBehavior.            * +*                                                                             * +*  Retour      : Bilan de l'opération, voire indications supplémentaires.     * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +int convert_to_undefined_expected_behavior(PyObject *arg, void *dst) +{ +    int result;                             /* Bilan à retourner           */ +    unsigned long value;                    /* Valeur récupérée            */ + +    result = PyObject_IsInstance(arg, (PyObject *)&PyLong_Type); + +    switch (result) +    { +        case -1: +            /* L'exception est déjà fixée par Python */ +            result = 0; +            break; + +        case 0: +            PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to ExpectedBehavior"); +            break; + +        case 1: +            value = PyLong_AsUnsignedLong(arg); + +            if (value > IEB_RESERVED) +            { +                PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to ExpectedBehavior"); +                result = 0; +            } + +            else +                *((InstrExpectedBehavior *)dst) = value; + +            break; + +        default: +            assert(false); +            break; + +    } + +    return result; + +} diff --git a/plugins/pychrysalide/arch/instructions/constants.h b/plugins/pychrysalide/arch/instructions/constants.h index 2f0c587..b6ef9a4 100644 --- a/plugins/pychrysalide/arch/instructions/constants.h +++ b/plugins/pychrysalide/arch/instructions/constants.h @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * constants.h - prototypes pour l'ajout des constantes de base pour les instructions   * - * Copyright (C) 2020 Cyrille Bagard + * Copyright (C) 2020-2025 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -37,6 +37,9 @@ bool define_raw_instruction_constants(PyTypeObject *);  /* Définit les constantes liées aux comportements erratiques. */  bool define_undefined_instruction_constants(PyTypeObject *); +/* Tente de convertir en constante ExpectedBehavior. */ +int convert_to_undefined_expected_behavior(PyObject *, void *); +  #endif  /* _PLUGINS_PYCHRYSALIDE_ARCH_INSTRUCTIONS_CONSTANTS_H */ diff --git a/plugins/pychrysalide/arch/instructions/raw.c b/plugins/pychrysalide/arch/instructions/raw.c index 7e58b96..ae730e8 100644 --- a/plugins/pychrysalide/arch/instructions/raw.c +++ b/plugins/pychrysalide/arch/instructions/raw.c @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * raw.c - équivalent Python du fichier "arch/instructions/raw.h"   * - * Copyright (C) 2018-2020 Cyrille Bagard + * Copyright (C) 2018-2025 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -28,26 +28,33 @@  #include <pygobject.h> -#include <i18n.h> -#include <arch/instructions/raw.h> -#include <plugins/dt.h> +#include <arch/instructions/raw-int.h>  #include "constants.h"  #include "../instruction.h"  #include "../vmpa.h"  #include "../../access.h" +#include "../../constants.h"  #include "../../helpers.h"  #include "../../analysis/content.h" +#include "../../glibext/portion.h" -/* Accompagne la création d'une instance dérivée en Python. */ -static PyObject *py_raw_instruction_new(PyTypeObject *, PyObject *, PyObject *); +/* ------------------------ GLUE POUR CREATION DEPUIS PYTHON ------------------------ */ + + +CREATE_DYN_CONSTRUCTOR(raw_instruction, G_TYPE_RAW_INSTRUCTION);  /* Initialise une instance sur la base du dérivé de GObject. */  static int py_raw_instruction_init(PyObject *, PyObject *, PyObject *); + + +/* ------------------------ FONCTIONNALITES DE L'INSTRUCTION ------------------------ */ + +  /* Indique si le contenu de l'instruction est du bourrage. */  static PyObject *py_raw_instruction_get_padding(PyObject *, void *); @@ -62,64 +69,9 @@ static int py_raw_instruction_set_string(PyObject *, PyObject *, void *); -/****************************************************************************** -*                                                                             * -*  Paramètres  : type = type du nouvel objet à mettre en place.               * -*                args = éventuelle liste d'arguments.                         * -*                kwds = éventuel dictionnaire de valeurs mises à disposition. * -*                                                                             * -*  Description : Accompagne la création d'une instance dérivée en Python.     * -*                                                                             * -*  Retour      : Nouvel objet Python mis en place ou NULL en cas d'échec.     * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static PyObject *py_raw_instruction_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ -    PyObject *result;                       /* Objet à retourner           */ -    PyTypeObject *base;                     /* Type de base à dériver      */ -    bool first_time;                        /* Evite les multiples passages*/ -    GType gtype;                            /* Nouveau type de processeur  */ -    bool status;                            /* Bilan d'un enregistrement   */ - -    /* Validations diverses */ - -    base = get_python_raw_instruction_type(); - -    if (type == base) -        goto simple_way; - -    /* Mise en place d'un type dédié */ - -    first_time = (g_type_from_name(type->tp_name) == 0); - -    gtype = build_dynamic_type(G_TYPE_RAW_INSTRUCTION, type->tp_name, NULL, NULL, NULL); - -    if (first_time) -    { -        status = register_class_for_dynamic_pygobject(gtype, type); - -        if (!status) -        { -            result = NULL; -            goto exit; -        } - -    } - -    /* On crée, et on laisse ensuite la main à PyGObject_Type.tp_init() */ - - simple_way: - -    result = PyType_GenericNew(type, args, kwds); - - exit: - -    return result; - -} +/* ---------------------------------------------------------------------------------- */ +/*                          GLUE POUR CREATION DEPUIS PYTHON                          */ +/* ---------------------------------------------------------------------------------- */  /****************************************************************************** @@ -139,20 +91,17 @@ static PyObject *py_raw_instruction_new(PyTypeObject *type, PyObject *args, PyOb  static int py_raw_instruction_init(PyObject *self, PyObject *args, PyObject *kwds)  {      int result;                             /* Bilan à retourner           */ +    GBinaryPortion *area;                   /* Zone de contenance          */      vmpa2t *addr;                           /* Texte de lecture            */ -    unsigned long mem_size;                 /* Taille de portion brute     */ +    MemoryDataSize size;                    /* Taille de portion brute     */      unsigned long long value;               /* Valeur brute à considérer   */      GBinContent *content;                   /* Contenu à lire au besoin    */      unsigned long count;                    /* Nombre d'éléments à lister  */ -    unsigned int endian;                    /* Type de boutisme impliqué   */ +    SourceEndian endian;                    /* Type de boutisme impliqué   */      int ret;                                /* Bilan de lecture des args.  */ -    GArchInstruction *fake;                 /* Instruction à copier        */ -    GArchInstruction *instr;                /* Instruction à manipuler     */ -    size_t op_count;                        /* Nombre d'opérande à copier  */ -    size_t i;                               /* Boucle de parcours          */ -    GArchOperand *op;                       /* Opérande à transférer       */ +    GRawInstruction *instr;                 /* Instruction à manipuler     */ -    static char *kwlist[] = { "addr", "mem_size", "value", "content", "count", "endian", NULL }; +    static char *kwlist[] = { "area", "addr", "size", "value", "content", "count", "endian", NULL };  #define RAW_INSTRUCTION_DOC                                                     \      "The RawInstruction object handles data which is not (yet?) disassembled"   \ @@ -187,9 +136,14 @@ static int py_raw_instruction_init(PyObject *self, PyObject *args, PyObject *kwd      count = 0;      endian = 0; -    ret = PyArg_ParseTupleAndKeywords(args, kwds, "O&k|KO&kI", kwlist, -                                      convert_any_to_vmpa, &addr, &mem_size, -                                      &value, convert_to_binary_content, &content, &count, &endian); +    ret = PyArg_ParseTupleAndKeywords(args, kwds, "O&O&O&|KO&kO&", kwlist, +                                      convert_to_binary_portion, &area, +                                      convert_any_to_vmpa, &addr, +                                      convert_to_memory_data_size, &size, +                                      &value, +                                      convert_to_binary_content, &content, +                                      &count, +                                      convert_to_source_endian, &endian);      if (!ret) return -1;      /* Initialisation d'un objet GLib */ @@ -199,35 +153,19 @@ static int py_raw_instruction_init(PyObject *self, PyObject *args, PyObject *kwd      /* Eléments de base */ -    if (content != NULL) -        fake = g_raw_instruction_new_array(content, mem_size, count, addr, endian); -    else -        fake = g_raw_instruction_new_from_value(addr, mem_size, value); +    instr = G_RAW_INSTRUCTION(pygobject_get(self)); -    if (fake == NULL) +    if (content != NULL)      { -        PyErr_SetString(PyExc_ValueError, _("Unable to build the object with the given parameters.")); -        goto clean_exit; +        if (!g_raw_instruction_create_array(instr, area, addr, size, content, count, endian)) +            goto clean_exit;      } - -    instr = G_ARCH_INSTRUCTION(pygobject_get(self)); - -    g_arch_instruction_lock_operands(fake); - -    op_count = _g_arch_instruction_count_operands(fake); - -    for (i = 0; i < op_count; i++) +    else      { -        op = _g_arch_instruction_get_operand(fake, i); -        g_arch_instruction_attach_extra_operand(instr, op); +        if (!g_raw_instruction_create_value(instr, area, addr, size, value)) +            goto clean_exit;      } -    g_arch_instruction_unlock_operands(fake); - -    g_arch_instruction_set_range(instr, g_arch_instruction_get_range(fake)); - -    g_object_unref(G_OBJECT(fake)); -      result = 0;   clean_exit: @@ -239,6 +177,12 @@ static int py_raw_instruction_init(PyObject *self, PyObject *args, PyObject *kwd  } + +/* ---------------------------------------------------------------------------------- */ +/*                          FONCTIONNALITES DE L'INSTRUCTION                          */ +/* ---------------------------------------------------------------------------------- */ + +  /******************************************************************************  *                                                                             *  *  Paramètres  : self    = classe représentant une instruction.               * @@ -271,7 +215,6 @@ static PyObject *py_raw_instruction_get_padding(PyObject *self, void *closure)      result = state ? Py_True : Py_False;      Py_INCREF(result); -      return result;  } @@ -342,7 +285,6 @@ static PyObject *py_raw_instruction_get_string(PyObject *self, void *closure)      result = state ? Py_True : Py_False;      Py_INCREF(result); -      return result;  } diff --git a/plugins/pychrysalide/arch/instructions/undefined.c b/plugins/pychrysalide/arch/instructions/undefined.c index 1246daa..1c2bccc 100644 --- a/plugins/pychrysalide/arch/instructions/undefined.c +++ b/plugins/pychrysalide/arch/instructions/undefined.c @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * undefined.c - équivalent Python du fichier "arch/instructions/undefined.h"   * - * Copyright (C) 2019 Cyrille Bagard + * Copyright (C) 2019-2025 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -28,9 +28,7 @@  #include <pygobject.h> -#include <i18n.h>  #include <arch/instructions/undefined-int.h> -#include <plugins/dt.h>  #include "constants.h" @@ -40,75 +38,27 @@ -/* Accompagne la création d'une instance dérivée en Python. */ -static PyObject *py_undef_instruction_new(PyTypeObject *, PyObject *, PyObject *); +/* ------------------------ GLUE POUR CREATION DEPUIS PYTHON ------------------------ */ -/* Initialise une instance sur la base du dérivé de GObject. */ -static int py_undef_instruction_init(PyObject *, PyObject *, PyObject *); - -/* Indique le type de conséquences réél de l'instruction. */ -static PyObject *py_undef_instruction_get_behavior(PyObject *, void *); - - - -/****************************************************************************** -*                                                                             * -*  Paramètres  : type = type du nouvel objet à mettre en place.               * -*                args = éventuelle liste d'arguments.                         * -*                kwds = éventuel dictionnaire de valeurs mises à disposition. * -*                                                                             * -*  Description : Accompagne la création d'une instance dérivée en Python.     * -*                                                                             * -*  Retour      : Nouvel objet Python mis en place ou NULL en cas d'échec.     * -*                                                                             * -*  Remarques   : -                                                            * -*                                                                             * -******************************************************************************/ - -static PyObject *py_undef_instruction_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ -    PyObject *result;                       /* Objet à retourner           */ -    PyTypeObject *base;                     /* Type de base à dériver      */ -    bool first_time;                        /* Evite les multiples passages*/ -    GType gtype;                            /* Nouveau type de processeur  */ -    bool status;                            /* Bilan d'un enregistrement   */ - -    /* Validations diverses */ -    base = get_python_undefined_instruction_type(); +CREATE_DYN_CONSTRUCTOR(undefined_instruction, G_TYPE_UNDEFINED_INSTRUCTION); -    if (type == base) -        goto simple_way; - -    /* Mise en place d'un type dédié */ - -    first_time = (g_type_from_name(type->tp_name) == 0); - -    gtype = build_dynamic_type(G_TYPE_UNDEF_INSTRUCTION, type->tp_name, NULL, NULL, NULL); - -    if (first_time) -    { -        status = register_class_for_dynamic_pygobject(gtype, type); +/* Initialise une instance sur la base du dérivé de GObject. */ +static int py_undefined_instruction_init(PyObject *, PyObject *, PyObject *); -        if (!status) -        { -            result = NULL; -            goto exit; -        } -    } -    /* On crée, et on laisse ensuite la main à PyGObject_Type.tp_init() */ +/* ------------------------ FONCTIONNALITES DE L'INSTRUCTION ------------------------ */ - simple_way: -    result = PyType_GenericNew(type, args, kwds); +/* Indique le type de conséquences réél de l'instruction. */ +static PyObject *py_undefined_instruction_get_behavior(PyObject *, void *); - exit: -    return result; -} +/* ---------------------------------------------------------------------------------- */ +/*                          GLUE POUR CREATION DEPUIS PYTHON                          */ +/* ---------------------------------------------------------------------------------- */  /****************************************************************************** @@ -125,30 +75,27 @@ static PyObject *py_undef_instruction_new(PyTypeObject *type, PyObject *args, Py  *                                                                             *  ******************************************************************************/ -static int py_undef_instruction_init(PyObject *self, PyObject *args, PyObject *kwds) +static int py_undefined_instruction_init(PyObject *self, PyObject *args, PyObject *kwds)  { -    unsigned long behavior;                 /* Conséquence pour l'instruct°*/ +    InstrExpectedBehavior behavior;         /* Conséquence pour l'instruct°*/      int ret;                                /* Bilan de lecture des args.  */ -    GUndefInstruction *instr;               /* Instruction à manipuler     */ -    undef_extra_data_t *extra;              /* Données insérées à modifier */ +    GUndefinedInstruction *instr;           /* Instruction à manipuler     */ -    static char *kwlist[] = { "behavior", NULL }; - -#define UNDEF_INSTRUCTION_DOC                                                   \ -    "UndefInstruction represents all kinds of instructions which are"           \ +#define UNDEFINED_INSTRUCTION_DOC                                               \ +    "UndefinedInstruction represents all kinds of instructions which are"       \      " officially not part of a runnable instruction set.\n"                     \      "\n"                                                                        \      "Instances can be created using the following constructor:\n"               \      "\n"                                                                        \ -    "    UndefInstruction(behavior)"                                            \ +    "    UndefinedInstruction(behavior)"                                        \      "\n"                                                                        \      "Where behavior is a"                                                       \ -    " pychrysalide.arch.instructions.UndefInstruction.ExpectedBehavior"         \ +    " pychrysalide.arch.instructions.UndefinedInstruction.ExpectedBehavior"     \      " constant describing the state of the CPU once the instruction is run."      /* Récupération des paramètres */ -    ret = PyArg_ParseTupleAndKeywords(args, kwds, "k", kwlist, &behavior); +    ret = PyArg_ParseTuple(args, "O&", convert_to_undefined_expected_behavior, &behavior);      if (!ret) return -1;      /* Initialisation d'un objet GLib */ @@ -158,17 +105,22 @@ static int py_undef_instruction_init(PyObject *self, PyObject *args, PyObject *k      /* Eléments de base */ -    instr = G_UNDEF_INSTRUCTION(pygobject_get(self)); - -    extra = GET_UNDEF_INSTR_EXTRA(instr); +    instr = G_UNDEFINED_INSTRUCTION(pygobject_get(self)); -    extra->behavior = behavior; +    if (!g_undefined_instruction_create(instr, behavior)) +        return -1;      return 0;  } + +/* ---------------------------------------------------------------------------------- */ +/*                          FONCTIONNALITES DE L'INSTRUCTION                          */ +/* ---------------------------------------------------------------------------------- */ + +  /******************************************************************************  *                                                                             *  *  Paramètres  : self    = classe représentant une instruction.               * @@ -182,24 +134,25 @@ static int py_undef_instruction_init(PyObject *self, PyObject *args, PyObject *k  *                                                                             *  ******************************************************************************/ -static PyObject *py_undef_instruction_get_behavior(PyObject *self, void *closure) +static PyObject *py_undefined_instruction_get_behavior(PyObject *self, void *closure)  {      PyObject *result;                       /* Conversion à retourner      */ -    GUndefInstruction *instr;               /* Version native              */ +    GUndefinedInstruction *instr;           /* Version native              */      InstrExpectedBehavior behavior;         /* Comportement attendu        */ -#define UNDEF_INSTRUCTION_BEHAVIOR_ATTRIB PYTHON_GET_DEF_FULL           \ -(                                                                       \ -    behavior, py_undef_instruction,                                     \ -    "Consequence carried by the undefined instruction.\n"               \ -    "\n"                                                                \ -    "The result is provided as a"                                       \ -    " pychrysalide.arch.instructions.UndefInstruction.ExpectedBehavior" \ -    " constant."                                                        \ +#define UNDEFINED_INSTRUCTION_BEHAVIOR_ATTRIB PYTHON_GET_DEF_FULL           \ +(                                                                           \ +    behavior, py_undefined_instruction,                                     \ +    "Consequence carried by the undefined instruction.\n"                   \ +    "\n"                                                                    \ +    "The result is provided as a"                                           \ +    " pychrysalide.arch.instructions.UndefinedInstruction.ExpectedBehavior" \ +    " constant."                                                            \  ) -    instr = G_UNDEF_INSTRUCTION(pygobject_get(self)); -    behavior = g_undef_instruction_get_behavior(instr); +    instr = G_UNDEFINED_INSTRUCTION(pygobject_get(self)); + +    behavior = g_undefined_instruction_get_behavior(instr);      result = cast_with_constants_group_from_type(get_python_undefined_instruction_type(),                                                   "ExpectedBehavior", behavior); @@ -228,7 +181,7 @@ PyTypeObject *get_python_undefined_instruction_type(void)      };      static PyGetSetDef py_undefined_instruction_getseters[] = { -        UNDEF_INSTRUCTION_BEHAVIOR_ATTRIB, +        UNDEFINED_INSTRUCTION_BEHAVIOR_ATTRIB,          { NULL }      }; @@ -236,18 +189,18 @@ PyTypeObject *get_python_undefined_instruction_type(void)          PyVarObject_HEAD_INIT(NULL, 0) -        .tp_name        = "pychrysalide.arch.instructions.UndefInstruction", +        .tp_name        = "pychrysalide.arch.instructions.UndefinedInstruction",          .tp_basicsize   = sizeof(PyGObject),          .tp_flags       = Py_TPFLAGS_DEFAULT, -        .tp_doc         = UNDEF_INSTRUCTION_DOC, +        .tp_doc         = UNDEFINED_INSTRUCTION_DOC,          .tp_methods     = py_undefined_instruction_methods,          .tp_getset      = py_undefined_instruction_getseters, -        .tp_init        = py_undef_instruction_init, -        .tp_new         = py_undef_instruction_new, +        .tp_init        = py_undefined_instruction_init, +        .tp_new         = py_undefined_instruction_new,      }; @@ -260,7 +213,7 @@ PyTypeObject *get_python_undefined_instruction_type(void)  *                                                                             *  *  Paramètres  : module = module dont la définition est à compléter.          *  *                                                                             * -*  Description : Prend en charge l'objet 'pychrysalide.....UndefInstruction'. * +*  Description : Prend en charge l'objet '....UndefinedInstruction'.          *  *                                                                             *  *  Retour      : Bilan de l'opération.                                        *  *                                                                             * @@ -285,7 +238,7 @@ bool ensure_python_undefined_instruction_is_registered(void)          if (!ensure_python_arch_instruction_is_registered())              return false; -        if (!register_class_for_pygobject(dict, G_TYPE_UNDEF_INSTRUCTION, type)) +        if (!register_class_for_pygobject(dict, G_TYPE_UNDEFINED_INSTRUCTION, type))              return false;          if (!define_undefined_instruction_constants(type)) @@ -329,7 +282,7 @@ int convert_to_undefined_instruction(PyObject *arg, void *dst)              break;          case 1: -            *((GUndefInstruction **)dst) = G_UNDEF_INSTRUCTION(pygobject_get(arg)); +            *((GUndefinedInstruction **)dst) = G_UNDEFINED_INSTRUCTION(pygobject_get(arg));              break;          default: diff --git a/plugins/pychrysalide/arch/instructions/undefined.h b/plugins/pychrysalide/arch/instructions/undefined.h index 3fa0453..1453612 100644 --- a/plugins/pychrysalide/arch/instructions/undefined.h +++ b/plugins/pychrysalide/arch/instructions/undefined.h @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * undefined.h - prototypes pour l'équivalent Python du fichier "arch/instructions/undefined.h"   * - * Copyright (C) 2019 Cyrille Bagard + * Copyright (C) 2019-2025 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -34,7 +34,7 @@  /* Fournit un accès à une définition de type à diffuser. */  PyTypeObject *get_python_undefined_instruction_type(void); -/* Prend en charge l'objet 'pychrysalide.arch.instructions.UndefInstruction'. */ +/* Prend en charge l'objet 'pychrysalide.arch.instructions.UndefinedInstruction'. */  bool ensure_python_undefined_instruction_is_registered(void);  /* Tente de convertir en instruction non définie. */ | 
