--- rpl/src/types.c 2017/06/29 12:33:35 1.84 +++ rpl/src/types.c 2017/06/29 14:54:42 1.85 @@ -19,7 +19,7 @@ ================================================================================ */ -#define DEBUG_ERREURS + #include "rpl-conv.h" @@ -56,6 +56,8 @@ recherche_type(struct_processus *s_etat_ integer8 profondeur_initiale; integer8 sauvegarde_niveau_courant; integer8 sauvegarde_longueur_definitions_chainees; + integer8 (*__type_new)(struct_processus + *s_etat_processus, void **arg); struct_liste_chainee *l_base_liste_fonctions; struct_liste_chainee *l_base_liste_decomposition; @@ -117,6 +119,7 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).test_instruction = 'Y'; (*s_etat_processus).traitement_interruptible = 'N'; +uprintf(".%s.\n", (*s_etat_processus).instruction_courante); analyse(s_etat_processus, NULL); (*s_etat_processus).test_instruction = registre_test; @@ -260,6 +263,54 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).instruction_valide = registre_instruction_valide; +/* +-------------------------------------------------------------------------------- + Types externes +-------------------------------------------------------------------------------- +*/ + + l_element_courant = (*s_etat_processus).s_bibliotheques; + + while(l_element_courant != NULL) + { + if ((__type_new = dlsym((*((struct_bibliotheque *) + (*l_element_courant).donnee)).descripteur, "__type_new")) + != NULL) + { + if (((*s_objet).extension_type = __type_new(s_etat_processus, + &element)) != 0) + { + // Le type peut être converti. + + (*s_objet).objet = element; + (*s_objet).type = EXT; + + if (empilement(s_etat_processus, + &((*s_etat_processus).l_base_pile), s_objet) + == d_erreur) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + (*s_etat_processus).traitement_interruptible = + registre_interruption; + return; + } + + (*s_etat_processus).traitement_interruptible = + registre_interruption; + return; + } + } + + l_element_courant = (*l_element_courant).suivant; + } + +/* +-------------------------------------------------------------------------------- + Types internes +-------------------------------------------------------------------------------- +*/ + switch(*((*s_etat_processus).instruction_courante)) { @@ -3650,9 +3701,6 @@ recherche_type(struct_processus *s_etat_ (*s_etat_processus).traitement_interruptible = registre_interruption; return; - -extention_type: - return; }