summaryrefslogtreecommitdiffstats
path: root/parse.cxx
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2009-07-31 17:00:09 -0700
committerJosh Stone <jistone@redhat.com>2009-07-31 17:08:07 -0700
commitc67847a0d05f8c7207513e79378fc8d84563e109 (patch)
tree799f8f524dab1175e1a2a5ffce03774f7adc4259 /parse.cxx
parent81931eaba5dcd0727f33328bf4b0ff511b791990 (diff)
downloadsystemtap-steved-c67847a0d05f8c7207513e79378fc8d84563e109.tar.gz
systemtap-steved-c67847a0d05f8c7207513e79378fc8d84563e109.tar.xz
systemtap-steved-c67847a0d05f8c7207513e79378fc8d84563e109.zip
Make a real type for target_symbol->components
Now the dereferences on target_symbol and cast_op are tracked with a struct instead of just a generic pair. The first immediate benefit is that we can track the token for more exact error reporting. * staptree.h (target_symbol): Add a new component type. * staptree.cxx (target_symbol::component::print): New. (operator<<(ostream&, target_symbol::component&): New. (target_symbol::print): Adapt component printing. (cast_op::print): Ditto. * parse.cxx (parser::parse_target_symbol_components): Adapt to the new component construction. * dwflpp.cxx (dwflpp::find_struct_member): take the component as a parameter for a better token in error messages (dwflpp::translate_components): Adapt to the new component type. * tapsets.cxx (dwarf_var_expanding_visitor::visit_target_symbol): Don't overwrite the token in target_symbol saved errors. (tracepoint_var_expanding_visitor::visit_target_symbol_arg): Ditto.
Diffstat (limited to 'parse.cxx')
-rw-r--r--parse.cxx17
1 files changed, 8 insertions, 9 deletions
diff --git a/parse.cxx b/parse.cxx
index 29d97589..9d4a06a6 100644
--- a/parse.cxx
+++ b/parse.cxx
@@ -2571,21 +2571,20 @@ parser::parse_target_symbol_components (target_symbol* e)
{
while (true)
{
- string c;
if (peek_op ("->"))
{
- next();
- expect_ident_or_keyword (c);
- e->components.push_back
- (make_pair (target_symbol::comp_struct_member, c));
+ const token* t = next();
+ string member;
+ expect_ident_or_keyword (member);
+ e->components.push_back (target_symbol::component(t, member));
}
else if (peek_op ("["))
{
- next();
- expect_unknown (tok_number, c);
+ const token* t = next();
+ int64_t index;
+ expect_number (index);
+ e->components.push_back (target_symbol::component(t, index));
expect_op ("]");
- e->components.push_back
- (make_pair (target_symbol::comp_literal_array_index, c));
}
else
break;