diff options
author | Josh Stone <jistone@redhat.com> | 2009-02-05 13:08:44 -0800 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2009-02-10 16:45:29 -0800 |
commit | 4ed05b152284d9d4b8545f6e70c57ebdcd993f46 (patch) | |
tree | c13bd42de015fd37927b4353938bc68189676e1a /staptree.h | |
parent | 4b7b5c032203bec067abc74800cdd0a444395574 (diff) | |
download | systemtap-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.h | 54 |
1 files changed, 28 insertions, 26 deletions
@@ -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 |