diff options
author | graydon <graydon> | 2005-07-29 01:47:56 +0000 |
---|---|---|
committer | graydon <graydon> | 2005-07-29 01:47:56 +0000 |
commit | 77de5e9eca19f041e85681439f41ea35d30a37c9 (patch) | |
tree | 0d4ec2f749ace9659df8f1082f1a8a8e2797e148 /staptree.h | |
parent | b2d5d95caa573e486b6503406b688da824cd20a9 (diff) | |
download | systemtap-steved-77de5e9eca19f041e85681439f41ea35d30a37c9.tar.gz systemtap-steved-77de5e9eca19f041e85681439f41ea35d30a37c9.tar.xz systemtap-steved-77de5e9eca19f041e85681439f41ea35d30a37c9.zip |
2005-07-28 Graydon Hoare <graydon@redhat.com>
* elaborate.cxx (derived_probe::derived_probe): Accept NULL probe.
* staptree.cxx (provide, require): Move from here...
* staptree.h: to here, and virtualize deep-copy methods.
* translate.cxx
(c_unparser::emit_common_header): Include loc2c-runtime.h
* tapsets.cxx
(dwflpp::iterate_over_modules): Use new, faster getmodules loop.
(dwflpp::literal_stmt_for_local): New method, call loc2c.
(var_expanding_copy_visitor): New struct which expands $-vars.
(dwarf_derived_probe): Rebuild this->body using var expander.
(query_function): Refactor logic a bit for speed.
* loc2c.{c,h}: Copies (with minor changes) of Roland's work
from elfutils CVS.
* Makefile.am (AM_CFLAGS): Set to elfutils-style.
(stap_SOURCES): Add loc2c.c.
* Makefile.in: Regenerate.
2005-07-28 Graydon Hoare <graydon@redhat.com>
* loc2c-runtime.h: New file from elfutils CVS.
Diffstat (limited to 'staptree.h')
-rw-r--r-- | staptree.h | 84 |
1 files changed, 51 insertions, 33 deletions
@@ -22,7 +22,7 @@ struct semantic_error: public std::runtime_error const token* tok1; const std::string msg2; const token* tok2; - + ~semantic_error () throw () {} semantic_error (const std::string& msg): runtime_error (msg), tok1 (0), tok2 (0) {} @@ -544,37 +544,55 @@ struct deep_copy_visitor: public visitor static statement *deep_copy (statement *s); static block *deep_copy (block *s); - - void visit_block (block *s); - void visit_embeddedcode (embeddedcode *s); - void visit_null_statement (null_statement *s); - void visit_expr_statement (expr_statement *s); - void visit_if_statement (if_statement* s); - void visit_for_loop (for_loop* s); - void visit_foreach_loop (foreach_loop* s); - void visit_return_statement (return_statement* s); - void visit_delete_statement (delete_statement* s); - void visit_next_statement (next_statement* s); - void visit_break_statement (break_statement* s); - void visit_continue_statement (continue_statement* s); - void visit_literal_string (literal_string* e); - void visit_literal_number (literal_number* e); - void visit_binary_expression (binary_expression* e); - void visit_unary_expression (unary_expression* e); - void visit_pre_crement (pre_crement* e); - void visit_post_crement (post_crement* e); - void visit_logical_or_expr (logical_or_expr* e); - void visit_logical_and_expr (logical_and_expr* e); - void visit_array_in (array_in* e); - void visit_comparison (comparison* e); - void visit_concatenation (concatenation* e); - void visit_ternary_expression (ternary_expression* e); - void visit_assignment (assignment* e); - void visit_symbol (symbol* e); - void visit_arrayindex (arrayindex* e); - void visit_functioncall (functioncall* e); -}; - - + + virtual void visit_block (block *s); + virtual void visit_embeddedcode (embeddedcode *s); + virtual void visit_null_statement (null_statement *s); + virtual void visit_expr_statement (expr_statement *s); + virtual void visit_if_statement (if_statement* s); + virtual void visit_for_loop (for_loop* s); + virtual void visit_foreach_loop (foreach_loop* s); + virtual void visit_return_statement (return_statement* s); + virtual void visit_delete_statement (delete_statement* s); + virtual void visit_next_statement (next_statement* s); + virtual void visit_break_statement (break_statement* s); + virtual void visit_continue_statement (continue_statement* s); + virtual void visit_literal_string (literal_string* e); + virtual void visit_literal_number (literal_number* e); + virtual void visit_binary_expression (binary_expression* e); + virtual void visit_unary_expression (unary_expression* e); + virtual void visit_pre_crement (pre_crement* e); + virtual void visit_post_crement (post_crement* e); + virtual void visit_logical_or_expr (logical_or_expr* e); + virtual void visit_logical_and_expr (logical_and_expr* e); + virtual void visit_array_in (array_in* e); + virtual void visit_comparison (comparison* e); + virtual void visit_concatenation (concatenation* e); + virtual void visit_ternary_expression (ternary_expression* e); + virtual void visit_assignment (assignment* e); + virtual void visit_symbol (symbol* e); + virtual void visit_arrayindex (arrayindex* e); + virtual void visit_functioncall (functioncall* e); +}; + +template <typename T> static 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 <typename T> static void +provide (deep_copy_visitor* v, T src) +{ + assert(!v->targets.empty()); + *(static_cast<T*>(v->targets.top())) = src; +} #endif // STAPTREE_H |