diff options
author | Frank Ch. Eigler <fche@elastic.org> | 2010-02-25 13:33:28 -0500 |
---|---|---|
committer | Frank Ch. Eigler <fche@elastic.org> | 2010-02-25 13:38:50 -0500 |
commit | c69a87e094e5e66daee8399838c8475f023ddc04 (patch) | |
tree | 4136d58cbebed28ccd40d3d983aac8179ed6ce1f /tapset-utrace.cxx | |
parent | e7227e90cd1414b2d02884617da0346134892526 (diff) | |
download | systemtap-steved-c69a87e094e5e66daee8399838c8475f023ddc04.tar.gz systemtap-steved-c69a87e094e5e66daee8399838c8475f023ddc04.tar.xz systemtap-steved-c69a87e094e5e66daee8399838c8475f023ddc04.zip |
PR11005: @defined part 2: clarify/standardize internal handling of unresolvable $variables
* staptree.cxx (target_symbol::chain): New function.
* staptree.h: Declare it.
* (*): Use it instead of hand-chaining to target_symbol->saved_conversion_error.
* tapset-mark.cxx (*::visit_target_symbol): Chain resolution error object,
do not throw.
* tapset-procfs.cxx (*::visit_target_symbol): Ditto.
* tapset-utrace.cxx (*::visit_target_symbol): Ditto.
* tapsets.cxx (*::visit_target_symbol): Ditto.
(*::visit_defined_op): Explain & enforce the above.
* testsuite/semok/thirtysix.stp: Expand.
* testsuite/systemtap.base/sdt_misc.exp: Bonus fix: make work with blddir != srcdir.
Diffstat (limited to 'tapset-utrace.cxx')
-rw-r--r-- | tapset-utrace.cxx | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/tapset-utrace.cxx b/tapset-utrace.cxx index 4820ecf9..64433a24 100644 --- a/tapset-utrace.cxx +++ b/tapset-utrace.cxx @@ -582,20 +582,29 @@ utrace_var_expanding_visitor::visit_target_symbol (target_symbol* e) { assert(e->base_name.size() > 0 && e->base_name[0] == '$'); - if (flags != UDPF_SYSCALL && flags != UDPF_SYSCALL_RETURN) - throw semantic_error ("only \"process(PATH_OR_PID).syscall\" and \"process(PATH_OR_PID).syscall.return\" probes support target symbols", - e->tok); - - if (e->addressof) - throw semantic_error("cannot take address of utrace variable", e->tok); - - if (e->base_name.substr(0,4) == "$arg" || e->base_name == "$$parms") - visit_target_symbol_arg(e); - else if (e->base_name == "$syscall" || e->base_name == "$return") - visit_target_symbol_context(e); - else - throw semantic_error ("invalid target symbol for utrace probe, $syscall, $return, $argN or $$parms expected", - e->tok); + try + { + if (flags != UDPF_SYSCALL && flags != UDPF_SYSCALL_RETURN) + throw semantic_error ("only \"process(PATH_OR_PID).syscall\" and \"process(PATH_OR_PID).syscall.return\" probes support target symbols", + e->tok); + + if (e->addressof) + throw semantic_error("cannot take address of utrace variable", e->tok); + + if (e->base_name.substr(0,4) == "$arg" || e->base_name == "$$parms") + visit_target_symbol_arg(e); + else if (e->base_name == "$syscall" || e->base_name == "$return") + visit_target_symbol_context(e); + else + throw semantic_error ("invalid target symbol for utrace probe, $syscall, $return, $argN or $$parms expected", + e->tok); + } + catch (const semantic_error &er) + { + e->chain (new semantic_error(er)); + provide(e); + return; + } } |