Skip to content

Commit

Permalink
[lldb] Add interface to check if UserExpression::Parse() is cacheable (
Browse files Browse the repository at this point in the history
…#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.
  • Loading branch information
augusto2112 committed Nov 16, 2023
1 parent 1aa493f commit 4639610
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lldb/include/lldb/Expression/UserExpression.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,14 @@ class UserExpression : public Expression {
/// 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; }
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Breakpoint/BreakpointLocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 4639610

Please sign in to comment.