diff options
author | Tom Tromey <tromey@adacore.com> | 2023-04-28 08:01:54 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-05-23 13:57:53 -0600 |
commit | 562db568441ed0f7e258b843916c34572170cc6d (patch) | |
tree | 911c015433a041e3d121c62de69c8097842821f6 /gdb/expression.h | |
parent | 98d630e910c73d163a071753bfc3b9c106cd3715 (diff) | |
download | binutils-562db568441ed0f7e258b843916c34572170cc6d.zip binutils-562db568441ed0f7e258b843916c34572170cc6d.tar.gz binutils-562db568441ed0f7e258b843916c34572170cc6d.tar.bz2 |
Move innermost_block_tracker to expression.h
I think parser-defs.h should hold declarations that can be used by
parser implementations, whereas expression.h should hold declarations
that are used by code that wants to call a parser. Following this
logic, this patch moves innermost_block_tracker to expression.h.
Diffstat (limited to 'gdb/expression.h')
-rw-r--r-- | gdb/expression.h | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/gdb/expression.h b/gdb/expression.h index e6e4bec..8d351b3 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -21,6 +21,7 @@ #define EXPRESSION_H 1 #include "gdbtypes.h" +#include "symtab.h" /* While parsing expressions we need to track the innermost lexical block that we encounter. In some situations we need to track the innermost @@ -239,9 +240,51 @@ struct expression typedef std::unique_ptr<expression> expression_up; +/* When parsing expressions we track the innermost block that was + referenced. */ + +class innermost_block_tracker +{ +public: + innermost_block_tracker (innermost_block_tracker_types types + = INNERMOST_BLOCK_FOR_SYMBOLS) + : m_types (types), + m_innermost_block (NULL) + { /* Nothing. */ } + + /* Update the stored innermost block if the new block B is more inner + than the currently stored block, or if no block is stored yet. The + type T tells us whether the block B was for a symbol or for a + register. The stored innermost block is only updated if the type T is + a type we are interested in, the types we are interested in are held + in M_TYPES and set during RESET. */ + void update (const struct block *b, innermost_block_tracker_types t); + + /* Overload of main UPDATE method which extracts the block from BS. */ + void update (const struct block_symbol &bs) + { + update (bs.block, INNERMOST_BLOCK_FOR_SYMBOLS); + } + + /* Return the stored innermost block. Can be nullptr if no symbols or + registers were found during an expression parse, and so no innermost + block was defined. */ + const struct block *block () const + { + return m_innermost_block; + } + +private: + /* The type of innermost block being looked for. */ + innermost_block_tracker_types m_types; + + /* The currently stored innermost block found while parsing an + expression. */ + const struct block *m_innermost_block; +}; + /* From parse.c */ -class innermost_block_tracker; extern expression_up parse_expression (const char *, innermost_block_tracker * = nullptr, bool void_context_p = false); @@ -270,7 +313,6 @@ struct expr_completion_base extern expression_up parse_expression_for_completion (const char *, std::unique_ptr<expr_completion_base> *completer); -class innermost_block_tracker; extern expression_up parse_exp_1 (const char **, CORE_ADDR pc, const struct block *, int, innermost_block_tracker * = nullptr); |