Update copyright to LGPL on all files
[dyninst.git] / stackwalk / src / framestepper_pimple.h
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 //We have lots of PIMPL (private implementation) classes for FrameSteppers.  This file
33 //contains a "template" for the common code.  Unfortunately, this isn't a real C++ template,
34 //as actual template classes wouldn't instanciate in the right place.  Instead we'll fake
35 //a template with macros.  I'm bad, but this would otherwise be a lot of repeated code.
36
37
38 #if defined(PIMPL_CLASS)
39 //Can optionally define PIMPL_IMPL_CLASS
40 //Can optionally define PIMPL_NAME
41
42 #if defined(PIMPL_IMPL_CLASS)
43
44 PIMPL_CLASS::PIMPL_CLASS(Walker *w
45 #if defined(PIMPL_ARG1)
46                          , PIMPL_ARG1 arg1
47 #endif
48 #if defined(PIMPL_ARG2)
49                          , PIMPL_ARG2 arg2
50 #endif
51                          ) :
52   FrameStepper(w)
53 {
54 #if defined(PIMPL_NAME)
55   sw_printf("[%s:%u] - Constructing " PIMPL_NAME " at %p\n",
56             __FILE__, __LINE__, this);
57 #endif
58   impl = new PIMPL_IMPL_CLASS(w, this
59 #if defined(PIMPL_ARG1)
60                               , arg1
61 #endif
62 #if defined(PIMPL_ARG2)
63                               , arg2
64 #endif                        
65                               );
66 }
67
68 gcframe_ret_t PIMPL_CLASS::getCallerFrame(const Frame &in, Frame &out)
69 {
70   if (!impl) {
71 #if defined(PIMPL_NAME)
72     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
73               __FILE__, __LINE__);
74     setLastError(err_unsupported, PIMPL_NAME " not supported on this platform");
75     return gcf_error;
76 #else
77     return gcf_not_me;
78 #endif
79   }
80   return impl->getCallerFrame(in, out);
81 }
82
83 unsigned PIMPL_CLASS::getPriority() const
84 {
85   if (!impl) {
86 #if defined(PIMPL_NAME)
87     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
88               __FILE__, __LINE__);
89     setLastError(err_unsupported, PIMPL_NAME "not supported on this platform");
90 #endif
91     return 0;
92   }
93   return impl->getPriority();
94 }
95
96 void PIMPL_CLASS::registerStepperGroup(StepperGroup *group)
97 {
98   if (!impl) {
99 #if defined(PIMPL_NAME)
100     sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
101               __FILE__, __LINE__);
102     setLastError(err_unsupported, PIMPL_NAME "not supported on this platform");
103 #endif
104     return;
105   }
106   impl->registerStepperGroup(group);
107 }
108
109 PIMPL_CLASS::~PIMPL_CLASS()
110 {
111 #if defined(PIMPL_NAME)
112   sw_printf("[%s:%u] - Destructing " PIMPL_NAME " at %p\n", __FILE__, __LINE__, this);
113 #endif  
114   if (impl)
115     delete impl;
116   impl = NULL;
117 }
118
119 #else
120
121 PIMPL_CLASS::PIMPL_CLASS(Walker *w
122 #if defined(PIMPL_ARG1)
123                          , PIMPL_ARG1
124 #endif
125 #if defined(PIMPL_ARG2)
126                          , PIMPL_ARG2
127 #endif
128                          ) :
129   FrameStepper(w),
130   impl(NULL)
131 {
132 }
133
134 gcframe_ret_t PIMPL_CLASS::getCallerFrame(const Frame &, Frame &)
135 {
136 #if defined(PIMPL_NAME)
137   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
138             __FILE__, __LINE__);
139   setLastError(err_unsupported, PIMPL_NAME "not supported on this platform");
140   return gcf_error;
141 #else
142   return gcf_not_me;
143 #endif
144 }
145
146 unsigned PIMPL_CLASS::getPriority() const
147 {
148 #if defined(PIMPL_NAME)
149   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
150             __FILE__, __LINE__);
151   setLastError(err_unsupported, PIMPL_NAME "not supported on this platform");
152 #endif
153   return 0;
154 }
155
156 void PIMPL_CLASS::registerStepperGroup(StepperGroup *)
157 {
158 #if defined(PIMPL_NAME)
159   sw_printf("[%s:%u] - Error, " PIMPL_NAME " not implemented on this platform\n",
160             __FILE__, __LINE__);
161   setLastError(err_unsupported, PIMPL_NAME "not supported on this platform");
162 #endif
163   return;
164 }
165
166 PIMPL_CLASS::~PIMPL_CLASS()
167 {
168 }
169
170 #endif
171
172 #endif
173