summaryrefslogtreecommitdiffstats
path: root/staptree.h
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-02-05 13:08:44 -0800
committerJosh Stone <jistone@redhat.com>2009-02-10 16:45:29 -0800
commit4ed05b152284d9d4b8545f6e70c57ebdcd993f46 (patch)
treec13bd42de015fd37927b4353938bc68189676e1a /staptree.h
parent4b7b5c032203bec067abc74800cdd0a444395574 (diff)
downloadsystemtap-steved-4ed05b152284d9d4b8545f6e70c57ebdcd993f46.tar.gz
systemtap-steved-4ed05b152284d9d4b8545f6e70c57ebdcd993f46.tar.xz
systemtap-steved-4ed05b152284d9d4b8545f6e70c57ebdcd993f46.zip
Simplify require() and provide()
* staptree.h (require, provide): Simplify stack operations with less pointer magic, and move to be deep_copy_visitor members. * staptree.h (deep_copy_visitor::deep_copy): Templatize * staptree.cxx, tapsets.cxx: Refactor require/provide callers
Diffstat (limited to 'staptree.h')
-rw-r--r--staptree.h54
1 files changed, 28 insertions, 26 deletions
diff --git a/staptree.h b/staptree.h
index 8c37776f..29196828 100644
--- a/staptree.h
+++ b/staptree.h
@@ -818,11 +818,30 @@ struct throwing_visitor: public visitor
struct deep_copy_visitor: public visitor
{
- std::stack<void *> targets;
+ template <typename T> T require (T src)
+ {
+ T dst = NULL;
+ if (src != NULL)
+ {
+ src->visit(this);
+ assert(!targets.empty());
+ dst = static_cast<T>(targets.top());
+ targets.pop();
+ assert(dst);
+ }
+ return dst;
+ }
+
+ template <typename T> void provide (T src)
+ {
+ targets.push(static_cast<void*>(src));
+ }
- static expression *deep_copy (expression *s);
- static statement *deep_copy (statement *s);
- static block *deep_copy (block *s);
+ template <typename T> static T deep_copy (T e)
+ {
+ deep_copy_visitor v;
+ return v.require (e);
+ }
virtual void visit_block (block *s);
virtual void visit_embeddedcode (embeddedcode *s);
@@ -856,30 +875,13 @@ struct deep_copy_visitor: public visitor
virtual void visit_print_format (print_format* e);
virtual void visit_stat_op (stat_op* e);
virtual void visit_hist_op (hist_op* e);
-};
-template <typename T> void
-require (deep_copy_visitor* v, T* dst, T src)
-{
- *dst = NULL;
- if (src != NULL)
- {
- v->targets.push(static_cast<void* >(dst));
- src->visit(v);
- v->targets.pop();
- assert(*dst);
- }
-}
-
-template <> void
-require <indexable *> (deep_copy_visitor* v, indexable** dst, indexable* src);
+private:
+ std::stack<void *> targets;
+};
-template <typename T> void
-provide (deep_copy_visitor* v, T src)
-{
- assert(!v->targets.empty());
- *(static_cast<T*>(v->targets.top())) = src;
-}
+template <> indexable*
+deep_copy_visitor::require <indexable*> (indexable* src);
#endif // STAPTREE_H