| //===-- SBExpressionOptions.cpp -------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "lldb/API/SBExpressionOptions.h" | |
| #include "Utils.h" | |
| #include "lldb/API/SBError.h" | |
| #include "lldb/API/SBStream.h" | |
| #include "lldb/Target/Target.h" | |
| #include "lldb/Utility/Instrumentation.h" | |
| #include "lldb/Utility/StringPool.h" | |
| using namespace lldb; | |
| using namespace lldb_private; | |
| SBExpressionOptions::SBExpressionOptions() | |
| : m_opaque_up(new EvaluateExpressionOptions()) { | |
| LLDB_INSTRUMENT_VA(this); | |
| } | |
| SBExpressionOptions::SBExpressionOptions(const SBExpressionOptions &rhs) { | |
| LLDB_INSTRUMENT_VA(this, rhs); | |
| m_opaque_up = clone(rhs.m_opaque_up); | |
| } | |
| const SBExpressionOptions & | |
| SBExpressionOptions::operator=(const SBExpressionOptions &rhs) { | |
| LLDB_INSTRUMENT_VA(this, rhs); | |
| if (this != &rhs) | |
| m_opaque_up = clone(rhs.m_opaque_up); | |
| return *this; | |
| } | |
| SBExpressionOptions::~SBExpressionOptions() = default; | |
| bool SBExpressionOptions::GetCoerceResultToId() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->DoesCoerceToId(); | |
| } | |
| void SBExpressionOptions::SetCoerceResultToId(bool coerce) { | |
| LLDB_INSTRUMENT_VA(this, coerce); | |
| m_opaque_up->SetCoerceToId(coerce); | |
| } | |
| bool SBExpressionOptions::GetUnwindOnError() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->DoesUnwindOnError(); | |
| } | |
| void SBExpressionOptions::SetUnwindOnError(bool unwind) { | |
| LLDB_INSTRUMENT_VA(this, unwind); | |
| m_opaque_up->SetUnwindOnError(unwind); | |
| } | |
| bool SBExpressionOptions::GetIgnoreBreakpoints() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->DoesIgnoreBreakpoints(); | |
| } | |
| void SBExpressionOptions::SetIgnoreBreakpoints(bool ignore) { | |
| LLDB_INSTRUMENT_VA(this, ignore); | |
| m_opaque_up->SetIgnoreBreakpoints(ignore); | |
| } | |
| lldb::DynamicValueType SBExpressionOptions::GetFetchDynamicValue() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetUseDynamic(); | |
| } | |
| void SBExpressionOptions::SetFetchDynamicValue(lldb::DynamicValueType dynamic) { | |
| LLDB_INSTRUMENT_VA(this, dynamic); | |
| m_opaque_up->SetUseDynamic(dynamic); | |
| } | |
| uint32_t SBExpressionOptions::GetTimeoutInMicroSeconds() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetTimeout() ? m_opaque_up->GetTimeout()->count() : 0; | |
| } | |
| void SBExpressionOptions::SetTimeoutInMicroSeconds(uint32_t timeout) { | |
| LLDB_INSTRUMENT_VA(this, timeout); | |
| m_opaque_up->SetTimeout(timeout == 0 ? Timeout<std::micro>(std::nullopt) | |
| : std::chrono::microseconds(timeout)); | |
| } | |
| uint32_t SBExpressionOptions::GetOneThreadTimeoutInMicroSeconds() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetOneThreadTimeout() | |
| ? m_opaque_up->GetOneThreadTimeout()->count() | |
| : 0; | |
| } | |
| void SBExpressionOptions::SetOneThreadTimeoutInMicroSeconds(uint32_t timeout) { | |
| LLDB_INSTRUMENT_VA(this, timeout); | |
| m_opaque_up->SetOneThreadTimeout(timeout == 0 | |
| ? Timeout<std::micro>(std::nullopt) | |
| : std::chrono::microseconds(timeout)); | |
| } | |
| bool SBExpressionOptions::GetTryAllThreads() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetTryAllThreads(); | |
| } | |
| void SBExpressionOptions::SetTryAllThreads(bool run_others) { | |
| LLDB_INSTRUMENT_VA(this, run_others); | |
| m_opaque_up->SetTryAllThreads(run_others); | |
| } | |
| bool SBExpressionOptions::GetStopOthers() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetStopOthers(); | |
| } | |
| void SBExpressionOptions::SetStopOthers(bool run_others) { | |
| LLDB_INSTRUMENT_VA(this, run_others); | |
| m_opaque_up->SetStopOthers(run_others); | |
| } | |
| bool SBExpressionOptions::GetTrapExceptions() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetTrapExceptions(); | |
| } | |
| void SBExpressionOptions::SetTrapExceptions(bool trap_exceptions) { | |
| LLDB_INSTRUMENT_VA(this, trap_exceptions); | |
| m_opaque_up->SetTrapExceptions(trap_exceptions); | |
| } | |
| bool SBExpressionOptions::GetStopOnFork() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetStopOnFork(); | |
| } | |
| void SBExpressionOptions::SetStopOnFork(bool stop_on_fork) { | |
| LLDB_INSTRUMENT_VA(this, stop_on_fork); | |
| m_opaque_up->SetStopOnFork(stop_on_fork); | |
| } | |
| void SBExpressionOptions::SetLanguage(lldb::LanguageType language) { | |
| LLDB_INSTRUMENT_VA(this, language); | |
| m_opaque_up->SetLanguage(language); | |
| } | |
| void SBExpressionOptions::SetLanguage(lldb::SBSourceLanguageName name, | |
| uint32_t version) { | |
| LLDB_INSTRUMENT_VA(this, name, version); | |
| m_opaque_up->SetLanguage(name, version); | |
| } | |
| void SBExpressionOptions::SetCancelCallback( | |
| lldb::ExpressionCancelCallback callback, void *baton) { | |
| LLDB_INSTRUMENT_VA(this, callback, baton); | |
| m_opaque_up->SetCancelCallback(callback, baton); | |
| } | |
| bool SBExpressionOptions::GetGenerateDebugInfo() { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetGenerateDebugInfo(); | |
| } | |
| void SBExpressionOptions::SetGenerateDebugInfo(bool b) { | |
| LLDB_INSTRUMENT_VA(this, b); | |
| return m_opaque_up->SetGenerateDebugInfo(b); | |
| } | |
| bool SBExpressionOptions::GetSuppressPersistentResult() { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetSuppressPersistentResult(); | |
| } | |
| void SBExpressionOptions::SetSuppressPersistentResult(bool b) { | |
| LLDB_INSTRUMENT_VA(this, b); | |
| return m_opaque_up->SetSuppressPersistentResult(b); | |
| } | |
| const char *SBExpressionOptions::GetPrefix() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return StringPool::GetSystemPool().Intern(m_opaque_up->GetPrefix()); | |
| } | |
| void SBExpressionOptions::SetPrefix(const char *prefix) { | |
| LLDB_INSTRUMENT_VA(this, prefix); | |
| return m_opaque_up->SetPrefix(prefix); | |
| } | |
| bool SBExpressionOptions::GetAutoApplyFixIts() { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetAutoApplyFixIts(); | |
| } | |
| void SBExpressionOptions::SetAutoApplyFixIts(bool b) { | |
| LLDB_INSTRUMENT_VA(this, b); | |
| return m_opaque_up->SetAutoApplyFixIts(b); | |
| } | |
| uint64_t SBExpressionOptions::GetRetriesWithFixIts() { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetRetriesWithFixIts(); | |
| } | |
| void SBExpressionOptions::SetRetriesWithFixIts(uint64_t retries) { | |
| LLDB_INSTRUMENT_VA(this, retries); | |
| return m_opaque_up->SetRetriesWithFixIts(retries); | |
| } | |
| bool SBExpressionOptions::GetTopLevel() { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetExecutionPolicy() == eExecutionPolicyTopLevel; | |
| } | |
| void SBExpressionOptions::SetTopLevel(bool b) { | |
| LLDB_INSTRUMENT_VA(this, b); | |
| m_opaque_up->SetExecutionPolicy(b ? eExecutionPolicyTopLevel | |
| : m_opaque_up->default_execution_policy); | |
| } | |
| bool SBExpressionOptions::GetAllowJIT() { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetExecutionPolicy() != eExecutionPolicyNever; | |
| } | |
| void SBExpressionOptions::SetAllowJIT(bool allow) { | |
| LLDB_INSTRUMENT_VA(this, allow); | |
| m_opaque_up->SetExecutionPolicy(allow ? m_opaque_up->default_execution_policy | |
| : eExecutionPolicyNever); | |
| } | |
| // FIXME: the language plugin should expression options dynamically and | |
| // we should validate here (by asking the language plugin) that the options | |
| // being set/retrieved are actually valid options. | |
| bool SBExpressionOptions::GetBooleanLanguageOption(const char *option_name, | |
| SBError &error) const { | |
| LLDB_INSTRUMENT_VA(this, option_name, error); | |
| error.Clear(); | |
| auto value_or_err = m_opaque_up->GetBooleanLanguageOption(option_name); | |
| if (!value_or_err) { | |
| error.SetErrorString(llvm::toString(value_or_err.takeError()).c_str()); | |
| return false; | |
| } | |
| return *value_or_err; | |
| } | |
| SBError SBExpressionOptions::SetBooleanLanguageOption(const char *option_name, | |
| bool value) { | |
| LLDB_INSTRUMENT_VA(this, option_name, value); | |
| SBError error; | |
| if (llvm::Error err = | |
| m_opaque_up->SetBooleanLanguageOption(option_name, value)) | |
| error.SetErrorString(llvm::toString(std::move(err)).c_str()); | |
| return error; | |
| } | |
| bool SBExpressionOptions::GetTryDILFirst() { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetTryDILFirst(); | |
| } | |
| void SBExpressionOptions::SetTryDILFirst(bool b) { | |
| LLDB_INSTRUMENT_VA(this, b); | |
| m_opaque_up->SetTryDILFirst(b); | |
| } | |
| EvaluateExpressionOptions *SBExpressionOptions::get() const { | |
| return m_opaque_up.get(); | |
| } | |
| EvaluateExpressionOptions &SBExpressionOptions::ref() const { | |
| return *m_opaque_up; | |
| } |