summaryrefslogtreecommitdiffstats
path: root/staptree.h
diff options
context:
space:
mode:
Diffstat (limited to 'staptree.h')
-rw-r--r--staptree.h84
1 files changed, 51 insertions, 33 deletions
diff --git a/staptree.h b/staptree.h
index bcde8f8b..d731f33d 100644
--- a/staptree.h
+++ b/staptree.h
@@ -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