From c69a87e094e5e66daee8399838c8475f023ddc04 Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Thu, 25 Feb 2010 13:33:28 -0500 Subject: 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. --- tapset-mark.cxx | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'tapset-mark.cxx') diff --git a/tapset-mark.cxx b/tapset-mark.cxx index 3fd6f11f..5c5fb0ce 100644 --- a/tapset-mark.cxx +++ b/tapset-mark.cxx @@ -182,21 +182,28 @@ mark_var_expanding_visitor::visit_target_symbol (target_symbol* e) { assert(e->base_name.size() > 0 && e->base_name[0] == '$'); - if (e->addressof) - throw semantic_error("cannot take address of marker variable", e->tok); - - if (e->base_name.substr(0,4) == "$arg") - visit_target_symbol_arg (e); - else if (e->base_name == "$format" || e->base_name == "$name" - || e->base_name == "$$parms" || e->base_name == "$$vars") - visit_target_symbol_context (e); - else - throw semantic_error ("invalid target symbol for marker, $argN, $name, $format, $$parms or $$vars expected", - e->tok); + try + { + if (e->addressof) + throw semantic_error("cannot take address of marker variable", e->tok); + + if (e->base_name.substr(0,4) == "$arg") + visit_target_symbol_arg (e); + else if (e->base_name == "$format" || e->base_name == "$name" + || e->base_name == "$$parms" || e->base_name == "$$vars") + visit_target_symbol_context (e); + else + throw semantic_error ("invalid target symbol for marker, $argN, $name, $format, $$parms or $$vars expected", + e->tok); + } + catch (const semantic_error &er) + { + e->chain (new semantic_error(er)); + provide (e); + } } - mark_derived_probe::mark_derived_probe (systemtap_session &s, const string& p_n, const string& p_f, -- cgit