mirror of
https://github.com/intel/llvm.git
synced 2026-01-20 10:58:11 +08:00
[lldb] Add interface to check if UserExpression::Parse() is cacheable (#66826)
When setting conditional breakpoints, we currently assume that a call to UserExpression::Parse() can be cached and resued multiple times. This may not be true for every user expression. Add a new method so subclasses of UserExpression can customize if they are parseable or not.
This commit is contained in:
@@ -192,6 +192,14 @@ public:
|
||||
/// expression. Text() should contain the definition of this function.
|
||||
const char *FunctionName() override { return "$__lldb_expr"; }
|
||||
|
||||
/// Returns whether the call to Parse on this user expression is cacheable.
|
||||
/// This function exists to provide an escape hatch for supporting languages
|
||||
/// where parsing an expression in the exact same context is unsafe. For
|
||||
/// example, languages where generic functions aren't monomorphized, but
|
||||
/// implement some other mechanism to represent generic values, may be unsafe
|
||||
/// to cache, as the concrete type substitution may be different in every
|
||||
/// expression evaluation.
|
||||
virtual bool IsParseCacheable() { return true; }
|
||||
/// Return the language that should be used when parsing. To use the
|
||||
/// default, return eLanguageTypeUnknown.
|
||||
lldb::LanguageType Language() const override { return m_language; }
|
||||
|
||||
@@ -250,6 +250,7 @@ bool BreakpointLocation::ConditionSaysStop(ExecutionContext &exe_ctx,
|
||||
DiagnosticManager diagnostics;
|
||||
|
||||
if (condition_hash != m_condition_hash || !m_user_expression_sp ||
|
||||
!m_user_expression_sp->IsParseCacheable() ||
|
||||
!m_user_expression_sp->MatchesContext(exe_ctx)) {
|
||||
LanguageType language = eLanguageTypeUnknown;
|
||||
// See if we can figure out the language from the frame, otherwise use the
|
||||
|
||||
Reference in New Issue
Block a user