Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
FunctorWithAddress.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Functor.h (C) 2000-2005 */
9/* */
10/* Fonctor. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_FUNCTOR_WITH_ADDRESS_H
13#define ARCANE_UTILS_FUNCTOR_WITH_ADDRESS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/IFunctorWithAddress.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22ARCANE_BEGIN_NAMESPACE
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26/*!
27 * \internal
28 * \brief FunctorWithAddress associé à une méthode d'une classe \a T.
29 */
30template<typename T>
33{
34 public:
35
36 typedef void (T::*FuncPtr)(); //!< Type du pointeur sur la méthode
37
38 public:
39
40 //! Constructeur
42 FuncPtr funcptr): m_function(funcptr),
43 m_object(object){}
44
45 virtual ~FunctorWithAddressT() { }
46
47 protected:
48
49 //! Exécute la méthode associé
51 {
52 (m_object->*m_function)();
53 }
54
55 /*!
56 * \internal
57 * \brief Retourne l'adresse de la méthode associé.
58 * \warning Cette méthode ne doit être appelée que par HYODA
59 * et n'est pas valide sur toutes les plate-formes.
60 */
61 void* functorAddress()
62 {
63 //GG: NE PAS FAIRE CELA, car trop dependant de la plateforme
64#if defined(__x86_64__) && defined(ARCANE_OS_LINUX)
65 long unsigned int *func=(long unsigned int*)&m_function;
66 //printf("\t\33[7m m_object @%p, m_function @%p=0x%lx 0x%lx (sizeof=%ld)\33[m\n\r", m_object, func, *func, *(func+1), sizeof(m_function));
67 // Par exemple pour la fonction d'un module utilisateur (depuis executeFunctor):
68 // rcx = 0x79
69 // rdx = this
70 // rax = *(m_object)
71 // rdi = m_function.__delta (=0)
72 // movl (%rax,%rdi,1),%rax => m_object->$vtable (@ offset 0)
73 // rax = m_object->$vtable
74 // rdi=m_function.__delta+m_object ( = 0+m_object)
75 // movl -1(%rcx,%rax,1),%rcx => rcx=0x004280c0!
76 long unsigned int pfn=*func;
77 long unsigned int of7=(pfn-1)>>3;
78 //long unsigned int delta=*(func+1);
79 long unsigned int *module_vtable=(long unsigned int*)((long unsigned int*)&(*m_object))[0];
80 //printf("\t\33[7mpfn=0x%lx, delta=0x%lx module_vtable @ %p\33[m\n\r", pfn,delta,module_vtable);
81 //for(int i=0;i<20;++i) printf("\t\t\33[7vtable[%ld]=0x%lx\33[m\n\r",i,module_vtable[i]);
82 // Si le bit de poid faible est à 1, c'est qu'il y a af
83 if ((pfn&1)==1){
84 //printf("\t\t\33[7mfunctorAddress @ 0x%lx\33[m\n\r",module_vtable[of7]);
85 return (void*) module_vtable[of7];
86 }
87 return (void*) pfn;
88#else
89 return 0;
90#endif
91
92 }
93
94 public:
95 FuncPtr m_function; //!< Pointeur vers la méthode associée.
96 T* m_object; //!< Objet associé.
97};
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102ARCANE_END_NAMESPACE
103
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
106
107#endif
108
FuncPtr m_function
Pointeur vers la méthode associée.
FunctorWithAddressT(T *object, FuncPtr funcptr)
Constructeur.
void executeFunctor()
Exécute la méthode associé
Interface d'un fonctor.