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
22
ARCANE_BEGIN_NAMESPACE
23
24
/*---------------------------------------------------------------------------*/
25
/*---------------------------------------------------------------------------*/
26
/*!
27
* \internal
28
* \brief FunctorWithAddress associé à une méthode d'une classe \a T.
29
*/
30
template
<
typename
T>
31
class
FunctorWithAddressT
32
:
public
IFunctorWithAddress
33
{
34
public
:
35
36
typedef
void (T::*FuncPtr)();
//!< Type du pointeur sur la méthode
37
38
public
:
39
40
//! Constructeur
41
FunctorWithAddressT
(T*
object
,
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é
50
void
executeFunctor
()
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
102
ARCANE_END_NAMESPACE
103
104
/*---------------------------------------------------------------------------*/
105
/*---------------------------------------------------------------------------*/
106
107
#endif
108
Arcane::FunctorWithAddressT
Definition
FunctorWithAddress.h:33
Arcane::FunctorWithAddressT::m_function
FuncPtr m_function
Pointeur vers la méthode associée.
Definition
FunctorWithAddress.h:95
Arcane::FunctorWithAddressT::FunctorWithAddressT
FunctorWithAddressT(T *object, FuncPtr funcptr)
Constructeur.
Definition
FunctorWithAddress.h:41
Arcane::FunctorWithAddressT::executeFunctor
void executeFunctor()
Exécute la méthode associé
Definition
FunctorWithAddress.h:50
Arcane::FunctorWithAddressT::m_object
T * m_object
Objet associé.
Definition
FunctorWithAddress.h:96
Arcane::IFunctorWithAddress
Interface d'un fonctor.
Definition
IFunctorWithAddress.h:33
arcane
utils
FunctorWithAddress.h
Généré le Lundi 18 Novembre 2024 02:56:54 pour Arcane par
1.9.8