summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2010-04-07 16:41:41 -0700
committerJosh Stone <jistone@redhat.com>2010-04-07 16:46:57 -0700
commit1af1e62d9f67237277dd771a0cb78fa6b069742d (patch)
tree7a168a6caf1649dfe2ea470d43972c65619a06ad
parentea1e477a78969d44aeea51cfc3cbd2e8ed96cfe4 (diff)
downloadsystemtap-steved-1af1e62d9f67237277dd771a0cb78fa6b069742d.tar.gz
systemtap-steved-1af1e62d9f67237277dd771a0cb78fa6b069742d.tar.xz
systemtap-steved-1af1e62d9f67237277dd771a0cb78fa6b069742d.zip
Clean up and clarify semantic_error chaining
I consolidated the copy-construction that every target_symbol::chain caller was doing. I also removed the comments that target_symbol errors might be chained due to function wildcards, because it's not true -- each derived instance gets a deep_copy of the probe body. However, @cast can still chain since it may try multiple modules to resolve the casting dereference.
-rw-r--r--staptree.cxx5
-rw-r--r--staptree.h6
-rw-r--r--tapset-mark.cxx2
-rw-r--r--tapset-procfs.cxx2
-rw-r--r--tapset-utrace.cxx2
-rw-r--r--tapsets.cxx17
6 files changed, 15 insertions, 19 deletions
diff --git a/staptree.cxx b/staptree.cxx
index 4e57ac18..f7ce128e 100644
--- a/staptree.cxx
+++ b/staptree.cxx
@@ -224,8 +224,11 @@ target_symbol::assert_no_components(const std::string& tapset)
}
-void target_symbol::chain (semantic_error *e)
+void target_symbol::chain (const semantic_error &er)
{
+ semantic_error* e = new semantic_error(er);
+ if (!e->tok1)
+ e->tok1 = this->tok;
assert (e->chain == 0);
e->chain = this->saved_conversion_error;
this->saved_conversion_error = e;
diff --git a/staptree.h b/staptree.h
index 895c6667..eff5d3cd 100644
--- a/staptree.h
+++ b/staptree.h
@@ -33,9 +33,7 @@ struct semantic_error: public std::runtime_error
semantic_error *chain;
~semantic_error () throw () {}
- semantic_error (const std::string& msg):
- runtime_error (msg), tok1 (0), tok2 (0), chain (0) {}
- semantic_error (const std::string& msg, const token* t1):
+ semantic_error (const std::string& msg, const token* t1=0):
runtime_error (msg), tok1 (t1), tok2 (0), chain (0) {}
semantic_error (const std::string& msg, const token* t1,
const std::string& m2, const token* t2):
@@ -258,7 +256,7 @@ struct target_symbol: public symbol
std::string probe_context_var; // NB: this being set implies that target_symbol is *resolved*
semantic_error* saved_conversion_error; // hand-made linked list
target_symbol(): addressof(false), saved_conversion_error (0) {}
- void chain (semantic_error* e);
+ void chain (const semantic_error& er);
void print (std::ostream& o) const;
void visit (visitor* u);
void visit_components (visitor* u);
diff --git a/tapset-mark.cxx b/tapset-mark.cxx
index c672dc7a..6e8191d7 100644
--- a/tapset-mark.cxx
+++ b/tapset-mark.cxx
@@ -198,7 +198,7 @@ mark_var_expanding_visitor::visit_target_symbol (target_symbol* e)
}
catch (const semantic_error &er)
{
- e->chain (new semantic_error(er));
+ e->chain (er);
provide (e);
}
}
diff --git a/tapset-procfs.cxx b/tapset-procfs.cxx
index c888ff74..34b2b005 100644
--- a/tapset-procfs.cxx
+++ b/tapset-procfs.cxx
@@ -520,7 +520,7 @@ procfs_var_expanding_visitor::visit_target_symbol (target_symbol* e)
}
catch (const semantic_error &er)
{
- e->chain (new semantic_error(er));
+ e->chain (er);
provide (e);
}
}
diff --git a/tapset-utrace.cxx b/tapset-utrace.cxx
index 25e0b15e..8e2573ab 100644
--- a/tapset-utrace.cxx
+++ b/tapset-utrace.cxx
@@ -601,7 +601,7 @@ utrace_var_expanding_visitor::visit_target_symbol (target_symbol* e)
}
catch (const semantic_error &er)
{
- e->chain (new semantic_error(er));
+ e->chain (er);
provide(e);
return;
}
diff --git a/tapsets.cxx b/tapsets.cxx
index 4b4fd513..4c070735 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -2683,12 +2683,7 @@ dwarf_var_expanding_visitor::visit_target_symbol (target_symbol *e)
// target_symbol to the next pass. We hope that this value ends
// up not being referenced after all, so it can be optimized out
// quietly.
- semantic_error* saveme = new semantic_error (er); // copy it
- if (! saveme->tok1) { saveme->tok1 = e->tok; } // fill in token if needed
- // NB: we can have multiple errors, since a $target variable
- // may be expanded in several different contexts:
- // function ("*") { $var }
- e->chain (saveme);
+ e->chain (er);
provide (e);
}
}
@@ -2771,9 +2766,9 @@ dwarf_cast_query::handle_query_module()
catch (const semantic_error& er)
{
// NB: we can have multiple errors, since a @cast
- // may be expanded in several different contexts:
- // function ("*") { @cast(...) }
- e.chain (new semantic_error(er));
+ // may be attempted using several different modules:
+ // @cast(ptr, "type", "module1:module2:...")
+ e.chain (er);
}
}
@@ -3998,7 +3993,7 @@ sdt_var_expanding_visitor::visit_target_symbol (target_symbol *e)
}
catch (const semantic_error &er)
{
- e->chain (new semantic_error(er));
+ e->chain (er);
provide (e);
}
}
@@ -6309,7 +6304,7 @@ tracepoint_var_expanding_visitor::visit_target_symbol (target_symbol* e)
}
catch (const semantic_error &er)
{
- e->chain (new semantic_error(er));
+ e->chain (er);
provide (e);
}
}